mirror of
https://github.com/postgres/postgres.git
synced 2025-07-31 22:04:40 +03:00
Back-patch copyOject fix for EXPLAIN/PREPARE.
This commit is contained in:
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1994-5, Regents of the University of California
|
* Portions Copyright (c) 1994-5, Regents of the University of California
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.117 2003/10/17 01:14:26 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.117.2.1 2004/12/13 00:17:52 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -74,6 +74,16 @@ ExplainQuery(ExplainStmt *stmt, DestReceiver *dest)
|
|||||||
List *rewritten;
|
List *rewritten;
|
||||||
List *l;
|
List *l;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 EXPLAIN is in a portal or plpgsql
|
||||||
|
* function and is executed repeatedly. (See also the same hack in
|
||||||
|
* DECLARE CURSOR and PREPARE.) XXX the planner really shouldn't
|
||||||
|
* modify its input ... FIXME someday.
|
||||||
|
*/
|
||||||
|
query = copyObject(query);
|
||||||
|
|
||||||
/* prepare for projection of tuples */
|
/* prepare for projection of tuples */
|
||||||
tstate = begin_tup_output_tupdesc(dest, ExplainResultDesc(stmt));
|
tstate = begin_tup_output_tupdesc(dest, ExplainResultDesc(stmt));
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
* Copyright (c) 2002-2003, PostgreSQL Global Development Group
|
* Copyright (c) 2002-2003, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/prepare.c,v 1.23.4.1 2004/12/03 21:26:52 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/prepare.c,v 1.23.4.2 2004/12/13 00:17:52 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -48,6 +48,7 @@ void
|
|||||||
PrepareQuery(PrepareStmt *stmt)
|
PrepareQuery(PrepareStmt *stmt)
|
||||||
{
|
{
|
||||||
const char *commandTag;
|
const char *commandTag;
|
||||||
|
Query *query;
|
||||||
List *query_list,
|
List *query_list,
|
||||||
*plan_list;
|
*plan_list;
|
||||||
|
|
||||||
@ -87,8 +88,18 @@ PrepareQuery(PrepareStmt *stmt)
|
|||||||
* the query.
|
* the query.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 PREPARE is in a portal or plpgsql
|
||||||
|
* function and is executed repeatedly. (See also the same hack in
|
||||||
|
* DECLARE CURSOR and EXPLAIN.) XXX the planner really shouldn't
|
||||||
|
* modify its input ... FIXME someday.
|
||||||
|
*/
|
||||||
|
query = copyObject(stmt->query);
|
||||||
|
|
||||||
/* Rewrite the query. The result could be 0, 1, or many queries. */
|
/* Rewrite the query. The result could be 0, 1, or many queries. */
|
||||||
query_list = QueryRewrite(stmt->query);
|
query_list = QueryRewrite(query);
|
||||||
|
|
||||||
/* Generate plans for queries. Snapshot is already set. */
|
/* Generate plans for queries. Snapshot is already set. */
|
||||||
plan_list = pg_plan_queries(query_list, false);
|
plan_list = pg_plan_queries(query_list, false);
|
||||||
|
Reference in New Issue
Block a user