Clobbered parameter names via DECLARE in PL/PgSQL
От | Brendan Jurd |
---|---|
Тема | Clobbered parameter names via DECLARE in PL/PgSQL |
Дата | |
Msg-id | CADxJZo0K7nC97CeFQPUhHEkZkm2dW9CBMag1V4zfHp2SB_QiNA@mail.gmail.com обсуждение исходный текст |
Ответы |
Re: Clobbered parameter names via DECLARE in PL/PgSQL
Re: Clobbered parameter names via DECLARE in PL/PgSQL |
Список | pgsql-hackers |
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. Cheers, BJ
В списке pgsql-hackers по дате отправления: