diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2002-05-21 18:50:18 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2002-05-21 18:50:18 +0000 |
commit | ce362bf8bee14c8589aa10649a1e3e516ed9e3e7 (patch) | |
tree | 709fb29173d5131f4eb1528b1a74fb0e31d3237a /src | |
parent | 490b12d53e9216a7f699fd83d94bf13b5db11f0f (diff) |
Repair OPEN cursor(args), which I broke on 11/29/01 with a change to
be smarter about parentheses in read_sql_construct(). Sigh.
Diffstat (limited to 'src')
-rw-r--r-- | src/pl/plpgsql/src/gram.y | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/src/pl/plpgsql/src/gram.y b/src/pl/plpgsql/src/gram.y index 913d381144b..b3a86236e5a 100644 --- a/src/pl/plpgsql/src/gram.y +++ b/src/pl/plpgsql/src/gram.y @@ -4,7 +4,7 @@ * procedural language * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.29 2001/11/29 22:57:37 tgl Exp $ + * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.29.2.1 2002/05/21 18:50:18 tgl Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -1327,17 +1327,44 @@ stmt_open : K_OPEN lno cursor_varptr if (tok != '(') { plpgsql_error_lineno = yylineno; - elog(ERROR, "cursor %s has arguments", $3->refname); + elog(ERROR, "cursor %s has arguments", + $3->refname); } + /* + * Push back the '(', else read_sql_stmt + * will complain about unbalanced parens. + */ + plpgsql_push_back_token(tok); + new->argquery = read_sql_stmt("SELECT "); - /* Remove the trailing right paren, - * because we want "select 1, 2", not - * "select (1, 2)". + + /* + * Now remove the leading and trailing parens, + * because we want "select 1, 2", not + * "select (1, 2)". */ cp = new->argquery->query; - cp += strlen(cp); - --cp; + + if (strncmp(cp, "SELECT", 6) != 0) + { + plpgsql_error_lineno = yylineno; + elog(ERROR, "expected 'SELECT (', got '%s' (internal error)", + new->argquery->query); + } + cp += 6; + while (*cp == ' ') /* could be more than 1 space here */ + cp++; + if (*cp != '(') + { + plpgsql_error_lineno = yylineno; + elog(ERROR, "expected 'SELECT (', got '%s' (internal error)", + new->argquery->query); + } + *cp = ' '; + + cp += strlen(cp) - 1; + if (*cp != ')') { plpgsql_error_lineno = yylineno; |