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,9 +636,26 @@ 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. */ @@ -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; + } } /* diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index e35e4c2bd81..48385d16f31 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/nodes/execnodes.h,v 1.108 2003/11/29 22:41:06 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/nodes/execnodes.h,v 1.109 2003/12/18 22:23:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -481,6 +481,13 @@ typedef struct FuncExprState */ bool setHasSetArg; /* some argument returns a set */ + /* + * Flag to remember whether we have registered a shutdown callback for + * this FuncExprState. We do so only if setArgsValid has been true at + * least once (since all the callback is for is to clear setArgsValid). + */ + bool shutdown_reg; /* a shutdown callback is registered */ + /* * Current argument data for a set-valued function; contains valid * data only if setArgsValid is true.