aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/sets.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-12-13 19:46:01 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-12-13 19:46:01 +0000
commit3a4f7dde16ad81b2319b9a4924a6023710a2fefd (patch)
tree248cf66fd94d40072b5ba8bb8e5437a6ea8399e5 /src/backend/utils/adt/sets.c
parent77b7a740f95250af7d78f69e9c906c3e53f32e7b (diff)
downloadpostgresql-3a4f7dde16ad81b2319b9a4924a6023710a2fefd.tar.gz
postgresql-3a4f7dde16ad81b2319b9a4924a6023710a2fefd.zip
Phase 3 of read-only-plans project: ExecInitExpr now builds expression
execution state trees, and ExecEvalExpr takes an expression state tree not an expression plan tree. The plan tree is now read-only as far as the executor is concerned. Next step is to begin actually exploiting this property.
Diffstat (limited to 'src/backend/utils/adt/sets.c')
-rw-r--r--src/backend/utils/adt/sets.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/src/backend/utils/adt/sets.c b/src/backend/utils/adt/sets.c
index 3c4838c0fe7..6cb06735b15 100644
--- a/src/backend/utils/adt/sets.c
+++ b/src/backend/utils/adt/sets.c
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/sets.c,v 1.54 2002/09/04 20:31:29 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/sets.c,v 1.55 2002/12/13 19:45:56 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -24,7 +24,6 @@
#include "catalog/pg_namespace.h"
#include "catalog/pg_proc.h"
#include "executor/executor.h"
-#include "utils/fcache.h"
#include "utils/fmgroids.h"
#include "utils/sets.h"
#include "utils/syscache.h"
@@ -143,7 +142,7 @@ Datum
seteval(PG_FUNCTION_ARGS)
{
Oid funcoid = PG_GETARG_OID(0);
- FunctionCachePtr fcache;
+ FuncExprState *fcache;
Datum result;
bool isNull;
ExprDoneCond isDone;
@@ -152,10 +151,27 @@ seteval(PG_FUNCTION_ARGS)
* If this is the first call, we need to set up the fcache for the
* target set's function.
*/
- fcache = (FunctionCachePtr) fcinfo->flinfo->fn_extra;
+ fcache = (FuncExprState *) fcinfo->flinfo->fn_extra;
if (fcache == NULL)
{
- fcache = init_fcache(funcoid, 0, fcinfo->flinfo->fn_mcxt);
+ MemoryContext oldcontext;
+ FuncExpr *func;
+
+ oldcontext = MemoryContextSwitchTo(fcinfo->flinfo->fn_mcxt);
+
+ func = makeNode(FuncExpr);
+ func->funcid = funcoid;
+ func->funcresulttype = InvalidOid; /* nothing will look at this */
+ func->funcretset = true;
+ func->funcformat = COERCE_EXPLICIT_CALL;
+ func->args = NIL; /* there are no arguments */
+
+ fcache = (FuncExprState *) ExecInitExpr((Expr *) func, NULL);
+
+ MemoryContextSwitchTo(oldcontext);
+
+ init_fcache(funcoid, fcache, fcinfo->flinfo->fn_mcxt);
+
fcinfo->flinfo->fn_extra = (void *) fcache;
}
@@ -169,23 +185,11 @@ seteval(PG_FUNCTION_ARGS)
isDone = ExprSingleResult;
result = ExecMakeFunctionResult(fcache,
- NIL,
NULL, /* no econtext, see above */
&isNull,
&isDone);
/*
- * If we're done with the results of this set function, get rid of its
- * func cache so that we will start from the top next time. (Can you
- * say "memory leak"? This feature is a crock anyway...)
- */
- if (isDone != ExprMultipleResult)
- {
- pfree(fcache);
- fcinfo->flinfo->fn_extra = NULL;
- }
-
- /*
* Return isNull/isDone status.
*/
fcinfo->isnull = isNull;