[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