BUG #8568: PLPGSQL Documentation For CASE Is incorrect
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.
--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs
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
--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs
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.
--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs
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:
Show quoted text
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