Re: Bug #668: cursors with params: mismatched parentheses;

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: rambo(at)portoweb(dot)com(dot)br, pgsql-bugs(at)postgresql(dot)org
Subject: Re: Bug #668: cursors with params: mismatched parentheses;
Date: 2002-05-21 18:54:05
Message-ID: 26546.1022007245@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

pgsql-bugs(at)postgresql(dot)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;

In response to

Browse pgsql-bugs by date

  From Date Subject
Next Message pgsql-bugs 2002-05-22 12:41:17 Bug #671: server corrupt
Previous Message Lecessi, Ralph 2002-05-21 17:30:27 Re: Bug #669: gawk: cmd. line:2: (END OF FILE)