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.
This commit is contained in:
Tom Lane 2005-04-05 18:05:46 +00:00
parent fd97cf4df0
commit 726220fb9f
2 changed files with 18 additions and 30 deletions

View File

@ -1,5 +1,5 @@
<!--
$PostgreSQL: pgsql/doc/src/sgml/plpgsql.sgml,v 1.63 2005/04/05 06:22:14 tgl Exp $
$PostgreSQL: pgsql/doc/src/sgml/plpgsql.sgml,v 1.64 2005/04/05 18:05:45 tgl Exp $
-->
<chapter id="plpgsql">
@ -2179,19 +2179,21 @@ DECLARE
</para>
<sect3>
<title><command>OPEN FOR SELECT</command></title>
<title><command>OPEN FOR</command> <replaceable>query</replaceable></title>
<synopsis>
OPEN <replaceable>unbound_cursor</replaceable> FOR SELECT ...;
OPEN <replaceable>unbound_cursor</replaceable> FOR <replaceable>query</replaceable> ;
</synopsis>
<para>
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
<type>refcursor</> variable). The <command>SELECT</command> query
is treated in the same way as other <command>SELECT</command>
statements in <application>PL/pgSQL</>: <application>PL/pgSQL</>
<type>refcursor</> variable). The query must be a
<command>SELECT</command>, or something else that returns rows
(such as <command>EXPLAIN</>). The query
is treated in the same way as other SQL commands in
<application>PL/pgSQL</>: <application>PL/pgSQL</>
variable names are substituted, and the query plan is cached for
possible reuse.
</para>
@ -2216,7 +2218,7 @@ OPEN <replaceable>unbound_cursor</replaceable> FOR EXECUTE <replaceable class="c
execute. The cursor cannot be open already, and it must have been
declared as an unbound cursor (that is, as a simple
<type>refcursor</> variable). The query is specified as a string
expression in the same way as in the <command>EXECUTE</command>
expression, in the same way as in the <command>EXECUTE</command>
command. As usual, this gives flexibility so the query can vary
from one run to the next.
</para>

View File

@ -4,7 +4,7 @@
* procedural language
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.67 2005/04/05 06:22:16 tgl Exp $
* $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.68 2005/04/05 18:05:46 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@ -1276,7 +1276,6 @@ stmt_open : K_OPEN lno cursor_varptr
if ($3->cursor_explicit_expr == NULL)
{
tok = yylex();
if (tok != K_FOR)
{
plpgsql_error_lineno = $2;
@ -1288,26 +1287,15 @@ stmt_open : K_OPEN lno cursor_varptr
}
tok = yylex();
switch (tok)
if (tok == K_EXECUTE)
{
case K_SELECT:
case '(':
plpgsql_push_back_token(tok);
new->query = read_sql_stmt("");
break;
case K_EXECUTE:
new->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();