aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2010-03-03 01:53:17 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2010-03-03 01:53:17 +0000
commit77e0d7b3eb0270fa48dc3e9b42b71618033f7ed5 (patch)
treec549d3609bd36cb50d1c8581496bd0c3f437a9de
parent7c55be792b6a59b3524041e63e976fd0c2dea38c (diff)
downloadpostgresql-77e0d7b3eb0270fa48dc3e9b42b71618033f7ed5.tar.gz
postgresql-77e0d7b3eb0270fa48dc3e9b42b71618033f7ed5.zip
Instead of trying (and failing) to allow <<label>> at the end of a DECLARE
section, throw an error message saying explicitly that the label must go before DECLARE. Per investigation of a recent pgsql-novice question, this code did not work as intended in any modern PG version, maybe not ever. Allowing such a thing would only create ambiguity anyway, so it seems better to remove it than fix it.
-rw-r--r--src/pl/plpgsql/src/gram.y30
1 files changed, 17 insertions, 13 deletions
diff --git a/src/pl/plpgsql/src/gram.y b/src/pl/plpgsql/src/gram.y
index fbe1786791a..e866d10a65a 100644
--- a/src/pl/plpgsql/src/gram.y
+++ b/src/pl/plpgsql/src/gram.y
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.141 2010/03/02 16:14:39 tgl Exp $
+ * $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.142 2010/03/03 01:53:17 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -170,7 +170,6 @@ static List *read_raise_options(void);
%type <datum> decl_cursor_args
%type <list> decl_cursor_arglist
%type <nsitem> decl_aliasitem
-%type <str> decl_stmts decl_stmt
%type <expr> expr_until_semi expr_until_rightbracket
%type <expr> expr_until_then expr_until_loop opt_expr_until_when
@@ -386,10 +385,7 @@ decl_sect : opt_block_label
| opt_block_label decl_start decl_stmts
{
plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_NORMAL;
- if ($3 != NULL)
- $$.label = $3;
- else
- $$.label = $1;
+ $$.label = $1;
/* Remember variables declared in decl_stmts */
$$.n_initvars = plpgsql_add_initdatums(&($$.initvarnos));
}
@@ -408,17 +404,25 @@ decl_start : K_DECLARE
;
decl_stmts : decl_stmts decl_stmt
- { $$ = $2; }
| decl_stmt
- { $$ = $1; }
;
-decl_stmt : LESS_LESS any_identifier GREATER_GREATER
- { $$ = $2; }
+decl_stmt : decl_statement
| K_DECLARE
- { $$ = NULL; }
- | decl_statement
- { $$ = NULL; }
+ {
+ /* We allow useless extra DECLAREs */
+ }
+ | LESS_LESS any_identifier GREATER_GREATER
+ {
+ /*
+ * Throw a helpful error if user tries to put block
+ * label just before BEGIN, instead of before DECLARE.
+ */
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("block label must be placed before DECLARE, not after"),
+ parser_errposition(@1)));
+ }
;
decl_statement : decl_varname decl_const decl_datatype decl_notnull decl_defval