Thread: 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.
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
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.
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