diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-12-18 22:23:42 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-12-18 22:23:42 +0000 |
commit | 54840eca2ed26f9f5619553a69e46813a922bd24 (patch) | |
tree | 22b7a3da963871d83956ae3f577daadfe382214b /src/backend/executor | |
parent | ed8e5143c24d513dd1b74fa5376613237d4a6803 (diff) | |
download | postgresql-54840eca2ed26f9f5619553a69e46813a922bd24.tar.gz postgresql-54840eca2ed26f9f5619553a69e46813a922bd24.zip |
Use a shutdown callback to clear setArgsValid in a FuncExprState that is
evaluating a set-valued function. This fixes some additional problems
with rescanning partially-evaluated SRFs.
Diffstat (limited to 'src/backend/executor')
-rw-r--r-- | src/backend/executor/execQual.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c index 8317d38ea87..0377f9f4104 100644 --- a/src/backend/executor/execQual.c +++ b/src/backend/executor/execQual.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.151 2003/11/29 19:51:48 pgsql Exp $ + * $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.152 2003/12/18 22:23:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -636,10 +636,27 @@ init_fcache(Oid foid, FuncExprState *fcache, MemoryContext fcacheCxt) /* Initialize additional info */ fcache->setArgsValid = false; + fcache->shutdown_reg = false; fcache->func.fn_expr = (Node *) fcache->xprstate.expr; } /* + * callback function in case a FuncExpr returning a set needs to be shut down + * before it has been run to completion + */ +static void +ShutdownFuncExpr(Datum arg) +{ + FuncExprState *fcache = (FuncExprState *) DatumGetPointer(arg); + + /* Clear any active set-argument state */ + fcache->setArgsValid = false; + + /* execUtils will deregister the callback... */ + fcache->shutdown_reg = false; +} + +/* * Evaluate arguments for a function. */ static ExprDoneCond @@ -827,6 +844,14 @@ ExecMakeFunctionResult(FuncExprState *fcache, memcpy(&fcache->setArgs, &fcinfo, sizeof(fcinfo)); fcache->setHasSetArg = hasSetArg; fcache->setArgsValid = true; + /* Register cleanup callback if we didn't already */ + if (!fcache->shutdown_reg) + { + RegisterExprContextCallback(econtext, + ShutdownFuncExpr, + PointerGetDatum(fcache)); + fcache->shutdown_reg = true; + } } /* |