Clobbered parameter names via DECLARE in PL/PgSQL

From: Brendan Jurd <direvus(at)gmail(dot)com>
To: pgsql-hackers(at)postgresql(dot)org
Subject: Clobbered parameter names via DECLARE in PL/PgSQL
Date: 2012-04-15 07:49:30
Message-ID: CADxJZo0K7nC97CeFQPUhHEkZkm2dW9CBMag1V4zfHp2SB_QiNA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Pavel Stehule 2012-04-15 07:55:24 Re: Clobbered parameter names via DECLARE in PL/PgSQL
Previous Message Hitoshi Harada 2012-04-15 06:29:29 Re: Last gasp