Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-hackers by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group