Thread: BUG #6067: In PL/pgsql, EXISTS(SELECT ... INTO...) fails

BUG #6067: In PL/pgsql, EXISTS(SELECT ... INTO...) fails

From
"David Fetter"
Date:
The following bug has been logged online:

Bug reference:      6067
Logged by:          David Fetter
Email address:      dfetter@vmware.com
PostgreSQL version: 9.0.4
Operating system:   Linux
Description:        In PL/pgsql, EXISTS(SELECT ... INTO...) fails
Details:

Here's some example code that reproduces the problem:

CREATE OR REPLACE FUNCTION foo()
RETURNS void
LANGUAGE plpgsql
AS $$
DECLARE
    i int;
BEGIN
    IF EXISTS (SELECT 1 INTO STRICT i) THEN
        RAISE NOTICE '%', a;
    END IF;
    RETURN;
END;
$$;
ERROR:  syntax error at or near "i"
LINE 8:     IF EXISTS (SELECT 1 INTO STRICT i) THEN
                                            ^

This came up in a case where there was an IF block that checked some
conditions before checking whether there was a row.  If it found a row, it
was supposed to use it in an EXCEPTION.  Instead, I had to do the query
unconditionally, check the FOUND block in a separate nested IF statement,
and generally uglify the code.

Not everybody in IRC agreed that this is a bug, though.

Re: BUG #6067: In PL/pgsql, EXISTS(SELECT ... INTO...) fails

From
Pavel Stehule
Date:
Hello

2011/6/18 David Fetter <dfetter@vmware.com>:
>
> The following bug has been logged online:
>
> Bug reference: =C2=A0 =C2=A0 =C2=A06067
> Logged by: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0David Fetter
> Email address: =C2=A0 =C2=A0 =C2=A0dfetter@vmware.com
> PostgreSQL version: 9.0.4
> Operating system: =C2=A0 Linux
> Description: =C2=A0 =C2=A0 =C2=A0 =C2=A0In PL/pgsql, EXISTS(SELECT ... IN=
TO...) fails
> Details:
>
> Here's some example code that reproduces the problem:
>
> CREATE OR REPLACE FUNCTION foo()
> RETURNS void
> LANGUAGE plpgsql
> AS $$
> DECLARE
> =C2=A0 =C2=A0i int;
> BEGIN
> =C2=A0 =C2=A0IF EXISTS (SELECT 1 INTO STRICT i) THEN
> =C2=A0 =C2=A0 =C2=A0 =C2=A0RAISE NOTICE '%', a;
> =C2=A0 =C2=A0END IF;
> =C2=A0 =C2=A0RETURN;
> END;
> $$;
> ERROR: =C2=A0syntax error at or near "i"
> LINE 8: =C2=A0 =C2=A0 IF EXISTS (SELECT 1 INTO STRICT i) THEN

You cannot to use PLpgSQL's addition "INTO" inside SQL statement. This
is not bug. INTO and STRICT are not SQL keywords, so they cannot be
used inside SQL expression.

Regards

Pavel Stehule

> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0^
>
> This came up in a case where there was an IF block that checked some
> conditions before checking whether there was a row. =C2=A0If it found a r=
ow, it
> was supposed to use it in an EXCEPTION. =C2=A0Instead, I had to do the qu=
ery
> unconditionally, check the FOUND block in a separate nested IF statement,
> and generally uglify the code.
>
> Not everybody in IRC agreed that this is a bug, though.
>
> --
> Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-bugs
>

Re: BUG #6067: In PL/pgsql, EXISTS(SELECT ... INTO...) fails

From
Tom Lane
Date:
"David Fetter" <dfetter@vmware.com> writes:
>     IF EXISTS (SELECT 1 INTO STRICT i) THEN
>         RAISE NOTICE '%', a;
>     END IF;

Umm ... are you just complaining that the error message isn't very
helpful, or are you actually expecting that to do something useful?
If the latter, what exactly?  I'm particularly confused by your use
of the STRICT option here, because if we did support that, I would
expect the STRICT to throw an error if there were not exactly one
matching row, making the EXISTS test 100% pointless.

But the short answer is that we don't support INTO in sub-selects,
and in general I doubt that we ever will, since in most cases the
behavior wouldn't be very well-defined.  It might be worth a TODO
to provide a better error message than "syntax error", though.

            regards, tom lane

Re: BUG #6067: In PL/pgsql, EXISTS(SELECT ... INTO...) fails

From
Bruce Momjian
Date:
Tom Lane wrote:
> "David Fetter" <dfetter@vmware.com> writes:
> >     IF EXISTS (SELECT 1 INTO STRICT i) THEN
> >         RAISE NOTICE '%', a;
> >     END IF;
>
> Umm ... are you just complaining that the error message isn't very
> helpful, or are you actually expecting that to do something useful?
> If the latter, what exactly?  I'm particularly confused by your use
> of the STRICT option here, because if we did support that, I would
> expect the STRICT to throw an error if there were not exactly one
> matching row, making the EXISTS test 100% pointless.
>
> But the short answer is that we don't support INTO in sub-selects,
> and in general I doubt that we ever will, since in most cases the
> behavior wouldn't be very well-defined.  It might be worth a TODO
> to provide a better error message than "syntax error", though.

Is it worth documenting, fixing, or adding this to the TODO list?

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +

Re: BUG #6067: In PL/pgsql, EXISTS(SELECT ... INTO...) fails

From
Robert Haas
Date:
On Tue, Nov 29, 2011 at 9:32 PM, Bruce Momjian <bruce@momjian.us> wrote:
> Tom Lane wrote:
>> "David Fetter" <dfetter@vmware.com> writes:
>> > =A0 =A0 IF EXISTS (SELECT 1 INTO STRICT i) THEN
>> > =A0 =A0 =A0 =A0 RAISE NOTICE '%', a;
>> > =A0 =A0 END IF;
>>
>> Umm ... are you just complaining that the error message isn't very
>> helpful, or are you actually expecting that to do something useful?
>> If the latter, what exactly? =A0I'm particularly confused by your use
>> of the STRICT option here, because if we did support that, I would
>> expect the STRICT to throw an error if there were not exactly one
>> matching row, making the EXISTS test 100% pointless.
>>
>> But the short answer is that we don't support INTO in sub-selects,
>> and in general I doubt that we ever will, since in most cases the
>> behavior wouldn't be very well-defined. =A0It might be worth a TODO
>> to provide a better error message than "syntax error", though.
>
> Is it worth documenting, fixing, or adding this to the TODO list?

At most I would say we could try to improve the error message.

--=20
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

Re: BUG #6067: In PL/pgsql, EXISTS(SELECT ... INTO...) fails

From
Bruce Momjian
Date:
On Wed, Nov 30, 2011 at 03:36:11PM -0500, Robert Haas wrote:
> On Tue, Nov 29, 2011 at 9:32 PM, Bruce Momjian <bruce@momjian.us> wrote:
> > Tom Lane wrote:
> >> "David Fetter" <dfetter@vmware.com> writes:
> >> >     IF EXISTS (SELECT 1 INTO STRICT i) THEN
> >> >         RAISE NOTICE '%', a;
> >> >     END IF;
> >>
> >> Umm ... are you just complaining that the error message isn't very
> >> helpful, or are you actually expecting that to do something useful?
> >> If the latter, what exactly?  I'm particularly confused by your use
> >> of the STRICT option here, because if we did support that, I would
> >> expect the STRICT to throw an error if there were not exactly one
> >> matching row, making the EXISTS test 100% pointless.
> >>
> >> But the short answer is that we don't support INTO in sub-selects,
> >> and in general I doubt that we ever will, since in most cases the
> >> behavior wouldn't be very well-defined.  It might be worth a TODO
> >> to provide a better error message than "syntax error", though.
> >
> > Is it worth documenting, fixing, or adding this to the TODO list?
>
> At most I would say we could try to improve the error message.

I researched this and it seems to complex to improve the error message.
I am afraid it would have to bleed into the main backend parser.

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +