BUG #8568: PLPGSQL Documentation For CASE Is incorrect

Started by Joshua D. Burnsover 12 years ago4 messagesbugs
Jump to latest
#1Joshua D. Burns
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.

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Joshua D. Burns (#1)
Re: BUG #8568: PLPGSQL Documentation For CASE Is incorrect

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

#3David G. Johnston
david.g.johnston@gmail.com
In reply to: Joshua D. Burns (#1)
Re: BUG #8568: PLPGSQL Documentation For CASE Is incorrect

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

#4Pavel Stehule
pavel.stehule@gmail.com
In reply to: David G. Johnston (#3)
Re: BUG #8568: PLPGSQL Documentation For CASE Is incorrect

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

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