2012/4/15 Brendan Jurd <dire...@gmail.com>: > Hello hackers, > > It turns out that in a PL/PgSQL function, you can DECLARE a variable > using the same name as one of the function parameters. This has the > effect of clobbering the parameter, for example: > > CREATE OR REPLACE FUNCTION declare_clobber(foo int) > RETURNS int LANGUAGE plpgsql AS $$ > DECLARE > foo text; > BEGIN > RETURN foo; > END; > $$; > > SELECT declare_clobber(1); > ==> NULL > > On the other hand, PL/PgSQL does protect against duplicate definitions > within DECLARE: > > CREATE OR REPLACE FUNCTION declare_clobber(foo int) > RETURNS int LANGUAGE plpgsql AS $$ > DECLARE > foo int; > foo text; > BEGIN > RETURN foo; > END; > $$; > ==> ERROR: duplicate declaration at or near "foo" > > And it also protects against using a DECLAREd name as a parameter alias: > > CREATE OR REPLACE FUNCTION declare_clobber(foo int) > RETURNS int LANGUAGE plpgsql AS $$ > DECLARE > bar int; > bar ALIAS FOR $1; > BEGIN > RETURN bar; > END; > $$; > ==> ERROR: duplicate declaration at or near "bar" > > I would suggest that if the user DECLAREs a variable with the same > name as a parameter, it is very evidently a programming error, and we > should raise the same "duplicate declaration" error. I haven't yet > looked at how difficult this would be to fix, but if there are no > objections I would like to attempt a patch. >
I disagree - variables and parameters are in different namespace so you can exactly identify variable and parameter. More - it is compatibility break. If plpgsql_check_function exists, then this check can be implemented as warning. Regards Pavel > Cheers, > BJ > > -- > Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-hackers -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers