Patch for cursors with multiple parameters - Mailing list pgsql-patches

From Ian Lance Taylor
Subject Patch for cursors with multiple parameters
Date
Msg-id 20010606070211.10196.qmail@daffy.airs.com
Whole thread Raw
Responses Re: Patch for cursors with multiple parameters
List pgsql-patches
The recent cursor patch does not quite support cursors with multiple
parameters.

Here is a test case:

==================================================
CREATE TABLE customer (
    firstname CHAR(15),
    lastname  CHAR(20),
    id INTEGER );

INSERT INTO customer VALUES ('Penelope' , 'Cruz', 1);
INSERT INTO customer VALUES ('Gloria' , 'Ferrer', 2);
INSERT INTO customer VALUES ('Shalma' , 'Hayek', 3);

DROP FUNCTION cursor_test1();

CREATE FUNCTION cursor_test1() RETURNS INTEGER AS'
DECLARE
   c1  CURSOR  (low_i INTEGER , top_i INTEGER) IS
          SELECT * FROM customer WHERE id >= low_i AND id <= top_i;
    fn VARCHAR;
    ln VARCHAR;
    id INTEGER;
BEGIN
OPEN c1(2,3);
FETCH c1 INTO fn , ln, id;
RAISE NOTICE ''The record is % % %'', id, fn,ln;
RETURN 1;
END;
' LANGUAGE 'plpgsql';

SELECT cursor_test1();
DROP TABLE customer;
==================================================

This should print something like

NOTICE:  The record is 2 Gloria          Ferrer

Instead, I get this:

ERROR:  parser: parse error at or near ""

When the cursor code evaluates
    OPEN c1(2,3)
it tries to evaluate
    SELECT (2,3)
That produces a parse error.

I have no real idea whether this should be a parse error or not.  Note
that
    SELECT 2,3
does work; it returns a two column table, as one would expect.  Since
I get the parse error in both 7.0.3 and current CVS sources, I assume
that it should be a parse error, and that the cursor code is
incorrect.  Here is a hack patch which fixes the problem.

Ian

Index: gram.y
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v
retrieving revision 1.20
diff -u -p -r1.20 gram.y
--- gram.y    2001/05/31 17:15:40    1.20
+++ gram.y    2001/06/06 06:56:49
@@ -1404,6 +1405,8 @@ stmt_open        : K_OPEN lno cursor_varptr
                         {
                             if ($3->cursor_explicit_argrow >= 0)
                             {
+                                char   *cp;
+
                                 tok = yylex();

                                 if (tok != '(')
@@ -1412,7 +1415,20 @@ stmt_open        : K_OPEN lno cursor_varptr
                                     elog(ERROR, "cursor %s has arguments", $3->refname);
                                 }

-                                new->argquery = read_sqlstmt(';', ";", "SELECT (");
+                                new->argquery = read_sqlstmt(';', ";", "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_comperrinfo();
+                                    elog(ERROR, "missing )");
+                                }
+                                *cp = '\0';
                             }
                             else
                             {

pgsql-patches by date:

Previous
From: Ian Lance Taylor
Date:
Subject: Cursor support buffer patch
Next
From: Tom Lane
Date:
Subject: Re: Cursor support buffer patch