diff --git a/src/backend/executor/execProcnode.c b/src/backend/executor/execProcnode.c index 554244f..7533cb2 100644 --- a/src/backend/executor/execProcnode.c +++ b/src/backend/executor/execProcnode.c @@ -117,7 +117,6 @@ #include "nodes/nodeFuncs.h" #include "miscadmin.h" - /* ------------------------------------------------------------------------ * ExecInitNode * @@ -363,6 +362,9 @@ ExecInitNode(Plan *node, EState *estate, int eflags) return result; } +/* Hooks for plugins to pre/post process ExecProcNode */ +PreExecProcNode_hook_type preExecProcNode_hook = NULL; +PostExecProcNode_hook_type postExecProcNode_hook = NULL; /* ---------------------------------------------------------------- * ExecProcNode @@ -380,6 +382,9 @@ ExecProcNode(PlanState *node) if (node->chgParam != NULL) /* something changed */ ExecReScan(node); /* let ReScan handle this */ + if (preExecProcNode_hook) + preExecProcNode_hook(node); + if (node->instrument) InstrStartNode(node->instrument); @@ -540,6 +545,9 @@ ExecProcNode(PlanState *node) if (node->instrument) InstrStopNode(node->instrument, TupIsNull(result) ? 0.0 : 1.0); + if (postExecProcNode_hook) + postExecProcNode_hook(node, result); + return result; } diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index 39521ed..9acbff7 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -95,6 +95,12 @@ extern PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook; typedef bool (*ExecutorCheckPerms_hook_type) (List *, bool); extern PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook; +/* Hook for plugins to pre/post process ExecProcNode() */ +typedef void (*PreExecProcNode_hook_type) (PlanState *node); +typedef void (*PostExecProcNode_hook_type) (PlanState *node, TupleTableSlot *result); +extern PGDLLIMPORT PreExecProcNode_hook_type preExecProcNode_hook; +extern PGDLLIMPORT PostExecProcNode_hook_type postExecProcNode_hook; + /* * prototypes from functions in execAmi.c