summaryrefslogtreecommitdiff
path: root/src/backend/commands/prepare.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands/prepare.c')
-rw-r--r--src/backend/commands/prepare.c49
1 files changed, 24 insertions, 25 deletions
diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c
index 98894372fa7..ece9802dc41 100644
--- a/src/backend/commands/prepare.c
+++ b/src/backend/commands/prepare.c
@@ -6,7 +6,7 @@
* Copyright (c) 2002, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/prepare.c,v 1.10 2002/12/13 19:45:51 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/prepare.c,v 1.11 2002/12/15 16:17:42 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -15,7 +15,6 @@
#include "commands/prepare.h"
#include "executor/executor.h"
#include "utils/guc.h"
-#include "optimizer/planmain.h"
#include "optimizer/planner.h"
#include "rewrite/rewriteHandler.h"
#include "tcop/pquery.h"
@@ -50,7 +49,6 @@ static void InitQueryHashTable(void);
static void StoreQuery(const char *stmt_name, List *query_list,
List *plan_list, List *argtype_list);
static QueryHashEntry *FetchQuery(const char *plan_name);
-static void RunQuery(QueryDesc *qdesc);
/*
@@ -96,33 +94,37 @@ ExecuteQuery(ExecuteStmt *stmt, CommandDest outputDest)
*query_list,
*plan_list;
ParamListInfo paramLI = NULL;
+ EState *estate;
/* Look it up in the hash table */
entry = FetchQuery(stmt->name);
- /* Make working copies the executor can safely scribble on */
- query_list = (List *) copyObject(entry->query_list);
- plan_list = (List *) copyObject(entry->plan_list);
+ query_list = entry->query_list;
+ plan_list = entry->plan_list;
Assert(length(query_list) == length(plan_list));
+ /*
+ * Need an EState to evaluate parameters; must not delete it till end
+ * of query, in case parameters are pass-by-reference.
+ */
+ estate = CreateExecutorState();
+
/* Evaluate parameters, if any */
if (entry->argtype_list != NIL)
{
int nargs = length(entry->argtype_list);
int i = 0;
List *exprstates;
- ExprContext *econtext = MakeExprContext(NULL, CurrentMemoryContext);
/* Parser should have caught this error, but check */
if (nargs != length(stmt->params))
elog(ERROR, "ExecuteQuery: wrong number of arguments");
- fix_opfuncids((Node *) stmt->params);
-
- exprstates = (List *) ExecInitExpr((Expr *) stmt->params, NULL);
+ exprstates = (List *) ExecPrepareExpr((Expr *) stmt->params, estate);
- paramLI = (ParamListInfo) palloc0((nargs + 1) * sizeof(ParamListInfoData));
+ paramLI = (ParamListInfo)
+ palloc0((nargs + 1) * sizeof(ParamListInfoData));
foreach(l, exprstates)
{
@@ -130,7 +132,7 @@ ExecuteQuery(ExecuteStmt *stmt, CommandDest outputDest)
bool isNull;
paramLI[i].value = ExecEvalExprSwitchContext(n,
- econtext,
+ GetPerTupleExprContext(estate),
&isNull,
NULL);
paramLI[i].kind = PARAM_NUM;
@@ -173,7 +175,13 @@ ExecuteQuery(ExecuteStmt *stmt, CommandDest outputDest)
qdesc->dest = None;
}
- RunQuery(qdesc);
+ ExecutorStart(qdesc);
+
+ ExecutorRun(qdesc, ForwardScanDirection, 0L);
+
+ ExecutorEnd(qdesc);
+
+ FreeQueryDesc(qdesc);
if (log_executor_stats)
ShowUsage("EXECUTOR STATISTICS");
@@ -188,7 +196,9 @@ ExecuteQuery(ExecuteStmt *stmt, CommandDest outputDest)
CommandCounterIncrement();
}
- /* No need to pfree memory, MemoryContext will be reset */
+ FreeExecutorState(estate);
+
+ /* No need to pfree other memory, MemoryContext will be reset */
}
/*
@@ -334,17 +344,6 @@ FetchQueryParams(const char *plan_name)
}
/*
- * Actually execute a prepared query.
- */
-static void
-RunQuery(QueryDesc *qdesc)
-{
- ExecutorStart(qdesc);
- ExecutorRun(qdesc, ForwardScanDirection, 0L);
- ExecutorEnd(qdesc);
-}
-
-/*
* Implements the 'DEALLOCATE' utility statement: deletes the
* specified plan from storage.
*