mirror of
https://github.com/postgres/postgres.git
synced 2025-05-18 17:41:14 +03:00
Avoid scribbling on original parsetree during DECLARE CURSOR. This
prevents problems when the DECLARE is in a portal and is executed repeatedly, as is possible in v3 protocol. Per analysis by Oliver Jowett, though I didn't use his patch exactly.
This commit is contained in:
parent
f5778c63e5
commit
0b9f48daf2
@ -14,7 +14,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/portalcmds.c,v 1.24 2003/08/24 21:02:43 petere Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/portalcmds.c,v 1.24.2.1 2004/11/28 22:16:49 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -61,13 +61,22 @@ PerformCursorOpen(DeclareCursorStmt *stmt)
|
|||||||
if (!(stmt->options & CURSOR_OPT_HOLD))
|
if (!(stmt->options & CURSOR_OPT_HOLD))
|
||||||
RequireTransactionChain((void *) stmt, "DECLARE CURSOR");
|
RequireTransactionChain((void *) stmt, "DECLARE CURSOR");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Because the planner is not cool about not scribbling on its input,
|
||||||
|
* we make a preliminary copy of the source querytree. This prevents
|
||||||
|
* problems in the case that the DECLARE CURSOR is in a portal and is
|
||||||
|
* executed repeatedly. XXX the planner really shouldn't modify its
|
||||||
|
* input ... FIXME someday.
|
||||||
|
*/
|
||||||
|
query = copyObject(stmt->query);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The query has been through parse analysis, but not rewriting or
|
* The query has been through parse analysis, but not rewriting or
|
||||||
* planning as yet. Note that the grammar ensured we have a SELECT
|
* planning as yet. Note that the grammar ensured we have a SELECT
|
||||||
* query, so we are not expecting rule rewriting to do anything
|
* query, so we are not expecting rule rewriting to do anything
|
||||||
* strange.
|
* strange.
|
||||||
*/
|
*/
|
||||||
rewritten = QueryRewrite((Query *) stmt->query);
|
rewritten = QueryRewrite(query);
|
||||||
if (length(rewritten) != 1 || !IsA(lfirst(rewritten), Query))
|
if (length(rewritten) != 1 || !IsA(lfirst(rewritten), Query))
|
||||||
elog(ERROR, "unexpected rewrite result");
|
elog(ERROR, "unexpected rewrite result");
|
||||||
query = (Query *) lfirst(rewritten);
|
query = (Query *) lfirst(rewritten);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user