[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

Reply via email to