Clobbered parameter names via DECLARE in PL/PgSQL - Mailing list pgsql-hackers

From Brendan Jurd
Subject Clobbered parameter names via DECLARE in PL/PgSQL
Date
Msg-id CADxJZo0K7nC97CeFQPUhHEkZkm2dW9CBMag1V4zfHp2SB_QiNA@mail.gmail.com
Whole thread Raw
Responses 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>)
List 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 by date:

Previous
From: Hitoshi Harada
Date:
Subject: Re: Last gasp
Next
From: Pavel Stehule
Date:
Subject: Re: Clobbered parameter names via DECLARE in PL/PgSQL