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 по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: Bug #669: gawk: cmd. line:2: (END OF FILE)
Следующее
От: pgsql-bugs@postgresql.org
Дата:
Сообщение: Bug #671: server corrupt