Re: Bug #668: cursors with params: mismatched parentheses;
| От | Tom Lane |
|---|---|
| Тема | Re: Bug #668: cursors with params: mismatched parentheses; |
| Дата | |
| Msg-id | 26546.1022007245@sss.pgh.pa.us обсуждение исходный текст |
| Ответ на | Bug #668: cursors with params: mismatched parentheses; (pgsql-bugs@postgresql.org) |
| Список | pgsql-bugs |
pgsql-bugs@postgresql.org writes:
> cursors with parameters do not seems to work. Is that implemented?
Sigh. They used to work, but I seem to have broken 'em with a
last-minute 7.2 fix. (Wish we had better regression tests for plpgsql.)
A fix against 7.2.* is attached.
regards, tom lane
*** src/pl/plpgsql/src/gram.y.orig Thu Nov 29 17:57:37 2001
--- src/pl/plpgsql/src/gram.y Tue May 21 14:50:18 2002
***************
*** 4,10 ****
* procedural language
*
* IDENTIFICATION
! * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.29 2001/11/29 22:57:37 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
--- 4,10 ----
* procedural language
*
* IDENTIFICATION
! * $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,1343 ****
if (tok != '(')
{
plpgsql_error_lineno = yylineno;
! elog(ERROR, "cursor %s has arguments", $3->refname);
}
new->argquery = read_sql_stmt("SELECT ");
! /* Remove the trailing right paren,
! * because we want "select 1, 2", not
! * "select (1, 2)".
*/
cp = new->argquery->query;
! cp += strlen(cp);
! --cp;
if (*cp != ')')
{
plpgsql_error_lineno = yylineno;
--- 1327,1370 ----
if (tok != '(')
{
plpgsql_error_lineno = yylineno;
! 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 ");
!
! /*
! * Now remove the leading and trailing parens,
! * because we want "select 1, 2", not
! * "select (1, 2)".
*/
cp = new->argquery->query;
!
! 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;
В списке pgsql-bugs по дате отправления: