mirror of
https://github.com/postgres/postgres.git
synced 2025-04-22 23:02:54 +03:00
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
|
||||
* $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;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user