aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/execProcnode.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/executor/execProcnode.c')
-rw-r--r--src/backend/executor/execProcnode.c28
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).
*/