Re: BUG #1956: Plpgsql top-level DECLARE does not share scope - Mailing list pgsql-bugs

From Bruce Momjian
Subject Re: BUG #1956: Plpgsql top-level DECLARE does not share scope
Date
Msg-id 200510130332.j9D3WKd10020@candle.pha.pa.us
Whole thread Raw
In response to BUG #1956: Plpgsql top-level DECLARE does not share scope with CREATE FUNCTION  ("Karl O. Pinc" <kop@meme.com>)
Responses Re: BUG #1956: Plpgsql top-level DECLARE does not share
List pgsql-bugs
Interesting. If I define this in C:

    int x(int y)
    {
        char *y;
    }

I get a warning:

    x.c: In function `x':
    x.c:3: warning: declaration of `y' shadows a parameter

but no error.  We tend to follow the C conventions, so perhaps we should
throw a warning, but I can't think of any cases where we throw a warning
in plpgsql because we compile it once on first call.

I am thinking this falls in the "don't do that" category.

---------------------------------------------------------------------------

Karl O. Pinc wrote:
>
> The following bug has been logged online:
>
> Bug reference:      1956
> Logged by:          Karl O. Pinc
> Email address:      kop@meme.com
> PostgreSQL version: 8.0.3
> Operating system:   Linux
> Description:        Plpgsql  top-level DECLARE does not share scope with
> CREATE FUNCTION
> Details:
>
> Depending on how you want to look at it, this is not really a bug.  It does
> produce odd results though.
>
> The ALIASes for function parameters that get created as part of the plpgsql
> CREATE FUNCTION do not share scope (namespace?) with the top-level DECLARE
> of the function.  As a result, you inadvertently make your function
> arguments 'disappear' by "re-declaring" them in the top-level DECLARE.  I
> haven't put any deep thought into this, but offhand this 'feature' seems to
> have no utility but does have the ability to cause problems.  Hence, this
> report.
>
> It would be nice if somebody who has deep thoughts on this would think
> them.
>
> I would expect the below to produce an error when creating foo(int).  The
> error would complain about trying to declare the same thing with two
> different types.  Instead we see the result below.
>
> create function foo (arg int)
> returns int
> language plpgsql
> as $$
> declare
>   arg text;
> begin
>   return bar(arg);
> end;
> $$;
>
> create function bar (arg int)
> returns int
> language plpgsql
> as $$
> begin
>   return arg + 1;
> end;
> $$;
>
> babase=# select foo(1);
> ERROR:  function bar(text) does not exist
> HINT:  No function matches the given name and argument types. You may need
> to add explicit type casts.
> CONTEXT:  SQL statement "SELECT  bar( $1 )"
> PL/pgSQL function "foo" line 4 at return
>
> Regards,
> Karl O. Pinc
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: if posting/reading through Usenet, please send an appropriate
>        subscribe-nomail command to majordomo@postgresql.org so that your
>        message can get through to the mailing list cleanly
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

pgsql-bugs by date:

Previous
From: Tom Lane
Date:
Subject: Re: BUG #1953: trigger action on delete
Next
From: "David Wheeler"
Date:
Subject: BUG #1959: readline error exiting psql