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.
This commit is contained in:
parent
ed8e5143c2
commit
54840eca2e
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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 */
|
/* Initialize additional info */
|
||||||
fcache->setArgsValid = false;
|
fcache->setArgsValid = false;
|
||||||
|
fcache->shutdown_reg = false;
|
||||||
fcache->func.fn_expr = (Node *) fcache->xprstate.expr;
|
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.
|
* Evaluate arguments for a function.
|
||||||
*/
|
*/
|
||||||
@ -827,6 +844,14 @@ ExecMakeFunctionResult(FuncExprState *fcache,
|
|||||||
memcpy(&fcache->setArgs, &fcinfo, sizeof(fcinfo));
|
memcpy(&fcache->setArgs, &fcinfo, sizeof(fcinfo));
|
||||||
fcache->setHasSetArg = hasSetArg;
|
fcache->setHasSetArg = hasSetArg;
|
||||||
fcache->setArgsValid = true;
|
fcache->setArgsValid = true;
|
||||||
|
/* Register cleanup callback if we didn't already */
|
||||||
|
if (!fcache->shutdown_reg)
|
||||||
|
{
|
||||||
|
RegisterExprContextCallback(econtext,
|
||||||
|
ShutdownFuncExpr,
|
||||||
|
PointerGetDatum(fcache));
|
||||||
|
fcache->shutdown_reg = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* 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 */
|
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
|
* Current argument data for a set-valued function; contains valid
|
||||||
* data only if setArgsValid is true.
|
* data only if setArgsValid is true.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user