[EMAIL PROTECTED] 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;
---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?
http://www.postgresql.org/users-lounge/docs/faq.html
