mirror of https://github.com/postgres/postgres
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:
parent
fd97cf4df0
commit
726220fb9f
|
@ -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>
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue