Обсуждение: BUG #8568: PLPGSQL Documentation For CASE Is incorrect

Поиск
Список
Период
Сортировка

BUG #8568: PLPGSQL Documentation For CASE Is incorrect

От
joshuadburns@hotmail.com
Дата:
The following bug has been logged on the website:

Bug reference:      8568
Logged by:          Joshua D. Burns
Email address:      joshuadburns@hotmail.com
PostgreSQL version: 9.3.1
Operating system:   Linux
Description:

Documentation Sections Affected:
* 8.4: 38.6
* 9.0, 9.1 & 9.2: 39.6
* 9.3 & devel: 40.6


Example Documentation URL:
http://www.postgresql.org/docs/9.3/static/plpgsql-control-structures.html


Every example within the PLPGSQL "control structures" documentation states
that the proper syntax for closing a "CASE" statement is to use "END CASE;"
however in reality, on every version of PostgreSQL I can my hands on, "END
CASE;" throws the following exception:


  ERROR:  syntax error at or near "CASE"
  LINE 9:   END CASE;


However if I use "END;" in place of "END CASE;", the script executes as
expected. This leads me to believe the documentation for "CASE" statements
across all current versions of the documentation, are incorrect.


=====================================
Example CASE statement with END CASE;
-------------------------------------
DO LANGUAGE "plpgsql" $BODY$
DECLARE my_var INTEGER := 2; BEGIN
  RAISE NOTICE
    '%',
    CASE
      WHEN my_var = 1 THEN 'one'
      WHEN my_var = 2 THEN 'two'
      WHEN my_var = 3 THEN 'three'
    END CASE;
END $BODY$;
=====================================
Results In Unexpected Behavior:
  ERROR:  syntax error at or near "CASE"
  LINE 9:   END CASE;


=====================================
Example CASE statement using END;
-------------------------------------
DO LANGUAGE "plpgsql" $BODY$
DECLARE my_var INTEGER := 2; BEGIN
  RAISE NOTICE
    '%',
    CASE
      WHEN my_var = 1 THEN 'one'
      WHEN my_var = 2 THEN 'two'
      WHEN my_var = 3 THEN 'three'
    END;
END $BODY$;
-------------------------------------
Results In Expected Behavior:
  NOTICE:  two


I haven't checked, but this could also affect IF statements, specifically
"END IF;" vs. "END;" as well.

Re: BUG #8568: PLPGSQL Documentation For CASE Is incorrect

От
Tom Lane
Дата:
joshuadburns@hotmail.com writes:
> Every example within the PLPGSQL "control structures" documentation states
> that the proper syntax for closing a "CASE" statement is to use "END CASE;"

Which it is.

> =====================================
> Example CASE statement with END CASE;
> -------------------------------------
> DO LANGUAGE "plpgsql" $BODY$
> DECLARE my_var INTEGER := 2; BEGIN
>   RAISE NOTICE
>     '%',
>     CASE
>       WHEN my_var = 1 THEN 'one'
>       WHEN my_var = 2 THEN 'two'
>       WHEN my_var = 3 THEN 'three'
>     END CASE;
> END $BODY$;

This is not a case statement, it's a case expression (used within a RAISE
statement).  That's documented under the main SQL grammar, and there
you just say END.  Yeah, I know it's not terribly consistent.

            regards, tom lane

Re: BUG #8568: PLPGSQL Documentation For CASE Is incorrect

От
David Johnston
Дата:
joshuadburns wrote
> Every example within the PLPGSQL "control structures" documentation states
> that the proper syntax for closing a "CASE" statement is to use "END
> CASE;"
> however in reality, on every version of PostgreSQL I can my hands on, "END
> CASE;" throws the following exception:

User error, though understandable.

pl/pgsql CASE requires "END CASE", SQL CASE just uses "END"

DO $$
DECLARE val integer;
BEGIN
val := 2;

CASE val
WHEN 1 THEN RAISE NOTICE 'Got 1';
WHEN 2 THEN RAISE NOTICE 'Got 2';
END CASE;

END;
$$;

Your examples were making use of SQL "CASE" expressions which do not accept
"END CASE" but "END".

A pl/pgsql CASE must be the first token of an expression (using the term
loosely) since its purpose is to act as flow-control.  The sames goes for
IF.

There are a number of constructs and keywords in pl/pgsql that behave
slightly differently than their counter-parts in pure SQL.

David J.




--
View this message in context:
http://postgresql.1045698.n5.nabble.com/BUG-8568-PLPGSQL-Documentation-For-CASE-Is-incorrect-tp5776314p5776318.html
Sent from the PostgreSQL - bugs mailing list archive at Nabble.com.

Re: BUG #8568: PLPGSQL Documentation For CASE Is incorrect

От
Pavel Stehule
Дата:
Dne 30.10.2013 1:29 "David Johnston" <polobo@yahoo.com> napsal(a):
>
> joshuadburns wrote
> > Every example within the PLPGSQL "control structures" documentation
states
> > that the proper syntax for closing a "CASE" statement is to use "END
> > CASE;"
> > however in reality, on every version of PostgreSQL I can my hands on,
"END
> > CASE;" throws the following exception:
>
> User error, though understandable.
>
> pl/pgsql CASE requires "END CASE", SQL CASE just uses "END"
>
> DO $$
> DECLARE val integer;
> BEGIN
> val := 2;
>
> CASE val
> WHEN 1 THEN RAISE NOTICE 'Got 1';
> WHEN 2 THEN RAISE NOTICE 'Got 2';
> END CASE;
>
> END;
> $$;
>
> Your examples were making use of SQL "CASE" expressions which do not
accept
> "END CASE" but "END".
>
> A pl/pgsql CASE must be the first token of an expression (using the term
> loosely) since its purpose is to act as flow-control.  The sames goes for
> IF.

It is just wrong. Plpgsql statements cannot be nested inside expression.

Plpgsql doesn't know only expression statemenst yet, so first token is
statement reserved keyword ever.

>
> There are a number of constructs and keywords in pl/pgsql that behave
> slightly differently than their counter-parts in pure SQL.
>
> David J.
>
>
>
>
> --
> View this message in context:
http://postgresql.1045698.n5.nabble.com/BUG-8568-PLPGSQL-Documentation-For-CASE-Is-incorrect-tp5776314p5776318.html
> Sent from the PostgreSQL - bugs mailing list archive at Nabble.com.
>
>
> --
> Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-bugs