From: Tom Lane Date: Tue, 5 Apr 2005 18:05:46 +0000 (+0000) Subject: Adjust grammar for plpgsql's OPEN command so that a cursor can be X-Git-Tag: REL8_1_0BETA1~1061 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=726220fb9faad7dc6ec32990f52180f4c9b6966e;p=postgresql Adjust grammar for plpgsql's OPEN command so that a cursor can be OPENed on non-SELECT commands such as EXPLAIN or SHOW (anything that returns tuples is allowed). This flexibility already existed for bound cursors, but OPEN was artificially restricting what it would take. Per a gripe some months back. --- diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml index bd6f0254c3..3ea1ac19b2 100644 --- a/doc/src/sgml/plpgsql.sgml +++ b/doc/src/sgml/plpgsql.sgml @@ -1,5 +1,5 @@ @@ -2179,19 +2179,21 @@ DECLARE - <command>OPEN FOR SELECT</command> + <command>OPEN FOR</command> <replaceable>query</replaceable> -OPEN unbound_cursor FOR SELECT ...; +OPEN unbound_cursor FOR query ; - The cursor variable is opened and given the specified query to + The cursor variable is opened and given the specified query to execute. The cursor cannot be open already, and it must have been declared as an unbound cursor (that is, as a simple - refcursor variable). The SELECT query - is treated in the same way as other SELECT - statements in PL/pgSQL: PL/pgSQL + refcursor variable). The query must be a + SELECT, or something else that returns rows + (such as EXPLAIN). The query + is treated in the same way as other SQL commands in + PL/pgSQL: PL/pgSQL variable names are substituted, and the query plan is cached for possible reuse. @@ -2216,7 +2218,7 @@ OPEN unbound_cursor FOR EXECUTE dynquery = read_sql_stmt("SELECT "); - break; - - default: - plpgsql_error_lineno = $2; - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("syntax error at \"%s\"", - yytext))); + new->dynquery = read_sql_stmt("SELECT "); + } + else + { + plpgsql_push_back_token(tok); + new->query = read_sql_stmt(""); } - } else { @@ -1316,7 +1304,6 @@ stmt_open : K_OPEN lno cursor_varptr char *cp; tok = yylex(); - if (tok != '(') { plpgsql_error_lineno = plpgsql_scanner_lineno(); @@ -1369,7 +1356,6 @@ stmt_open : K_OPEN lno cursor_varptr else { tok = yylex(); - if (tok == '(') { plpgsql_error_lineno = plpgsql_scanner_lineno();