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: