Skip to content

Commit 3842323

Browse files
committed
Ensure set-returning functions in the targetlist of a plan node will be
shut down cleanly if the plan node is ReScanned before the SRFs are run to completion. This fixes the problem for SQL-language functions, but still need work on functions using the SRF_XXX() macros.
1 parent 125d69c commit 3842323

File tree

3 files changed

+41
-9
lines changed

3 files changed

+41
-9
lines changed

src/backend/executor/execAmi.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
9-
* $PostgreSQL: pgsql/src/backend/executor/execAmi.c,v 1.76 2003/11/29 19:51:48 pgsql Exp $
9+
* $PostgreSQL: pgsql/src/backend/executor/execAmi.c,v 1.77 2003/12/18 20:21:37 tgl Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -39,13 +39,20 @@
3939
#include "executor/nodeUnique.h"
4040

4141

42-
/* ----------------------------------------------------------------
43-
* ExecReScan
42+
/*
43+
* ExecReScan
44+
* Reset a plan node so that its output can be re-scanned.
45+
*
46+
* Note that if the plan node has parameters that have changed value,
47+
* the output might be different from last time.
4448
*
45-
* takes the new expression context as an argument, so that
46-
* index scans needn't have their scan keys updated separately
47-
* - marcel 09/20/94
48-
* ----------------------------------------------------------------
49+
* The second parameter is currently only used to pass a NestLoop plan's
50+
* econtext down to its inner child plan, in case that is an indexscan that
51+
* needs access to variables of the current outer tuple. (The handling of
52+
* this parameter is currently pretty inconsistent: some callers pass NULL
53+
* and some pass down their parent's value; so don't rely on it in other
54+
* situations. It'd probably be better to remove the whole thing and use
55+
* the generalized parameter mechanism instead.)
4956
*/
5057
void
5158
ExecReScan(PlanState *node, ExprContext *exprCtxt)
@@ -85,6 +92,11 @@ ExecReScan(PlanState *node, ExprContext *exprCtxt)
8592
UpdateChangedParamSet(node->righttree, node->chgParam);
8693
}
8794

95+
/* Shut down any SRFs in the plan node's targetlist */
96+
if (node->ps_ExprContext)
97+
ReScanExprContext(node->ps_ExprContext);
98+
99+
/* And do node-type-specific processing */
88100
switch (nodeTag(node))
89101
{
90102
case T_ResultState:

src/backend/executor/execUtils.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/executor/execUtils.c,v 1.107 2003/11/29 19:51:48 pgsql Exp $
11+
* $PostgreSQL: pgsql/src/backend/executor/execUtils.c,v 1.108 2003/12/18 20:21:37 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -18,6 +18,7 @@
1818
* FreeExecutorState
1919
* CreateExprContext
2020
* FreeExprContext
21+
* ReScanExprContext
2122
*
2223
* ExecAssignExprContext Common code for plan node init routines.
2324
* ExecAssignResultType
@@ -352,6 +353,24 @@ FreeExprContext(ExprContext *econtext)
352353
pfree(econtext);
353354
}
354355

356+
/*
357+
* ReScanExprContext
358+
*
359+
* Reset an expression context in preparation for a rescan of its
360+
* plan node. This requires calling any registered shutdown callbacks,
361+
* since any partially complete set-returning-functions must be canceled.
362+
*
363+
* Note we make no assumption about the caller's memory context.
364+
*/
365+
void
366+
ReScanExprContext(ExprContext *econtext)
367+
{
368+
/* Call any registered callbacks */
369+
ShutdownExprContext(econtext);
370+
/* And clean up the memory used */
371+
MemoryContextReset(econtext->ecxt_per_tuple_memory);
372+
}
373+
355374
/*
356375
* Build a per-output-tuple ExprContext for an EState.
357376
*

src/include/executor/executor.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/include/executor/executor.h,v 1.103 2003/11/29 22:41:01 pgsql Exp $
10+
* $PostgreSQL: pgsql/src/include/executor/executor.h,v 1.104 2003/12/18 20:21:37 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -201,6 +201,7 @@ extern EState *CreateExecutorState(void);
201201
extern void FreeExecutorState(EState *estate);
202202
extern ExprContext *CreateExprContext(EState *estate);
203203
extern void FreeExprContext(ExprContext *econtext);
204+
extern void ReScanExprContext(ExprContext *econtext);
204205

205206
#define ResetExprContext(econtext) \
206207
MemoryContextReset((econtext)->ecxt_per_tuple_memory)

0 commit comments

Comments
 (0)