diff options
Diffstat (limited to 'src/backend/executor/execProcnode.c')
-rw-r--r-- | src/backend/executor/execProcnode.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/src/backend/executor/execProcnode.c b/src/backend/executor/execProcnode.c index 9befca90161..fcb8b569999 100644 --- a/src/backend/executor/execProcnode.c +++ b/src/backend/executor/execProcnode.c @@ -370,12 +370,7 @@ ExecInitNode(Plan *node, EState *estate, int eflags) break; } - /* - * Add a wrapper around the ExecProcNode callback that checks stack depth - * during the first execution. - */ - result->ExecProcNodeReal = result->ExecProcNode; - result->ExecProcNode = ExecProcNodeFirst; + ExecSetExecProcNode(result, result->ExecProcNode); /* * Initialize any initPlans present in this node. The planner put them in @@ -402,6 +397,27 @@ ExecInitNode(Plan *node, EState *estate, int eflags) /* + * If a node wants to change its ExecProcNode function after ExecInitNode() + * has finished, it should do so with this function. That way any wrapper + * functions can be reinstalled, without the node having to know how that + * works. + */ +void +ExecSetExecProcNode(PlanState *node, ExecProcNodeMtd function) +{ + /* + * Add a wrapper around the ExecProcNode callback that checks stack depth + * during the first execution and maybe adds an instrumentation + * wrapper. When the callback is changed after execution has already begun + * that means we'll superflously execute ExecProcNodeFirst, but that seems + * ok. + */ + node->ExecProcNodeReal = function; + node->ExecProcNode = ExecProcNodeFirst; +} + + +/* * ExecProcNode wrapper that performs some one-time checks, before calling * the relevant node method (possibly via an instrumentation wrapper). */ |