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  (Pavel Stehule <pavel.stehule@gmail.com>)
Re: Clobbered parameter names via DECLARE in PL/PgSQL  (Andrew Dunstan <andrew@dunslane.net>)
Список 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 по дате отправления:

Предыдущее
От: Hitoshi Harada
Дата:
Сообщение: Re: Last gasp
Следующее
От: Pavel Stehule
Дата:
Сообщение: Re: Clobbered parameter names via DECLARE in PL/PgSQL