diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/optimizer/plan/planner.c | 14 | ||||
-rw-r--r-- | src/include/optimizer/planner.h | 13 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index c250433a2ef..e8ea78c0c97 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -73,6 +73,12 @@ bool enable_distinct_reordering = true; /* Hook for plugins to get control in planner() */ planner_hook_type planner_hook = NULL; +/* Hook for plugins to get control after PlannerGlobal is initialized */ +planner_setup_hook_type planner_setup_hook = NULL; + +/* Hook for plugins to get control before PlannerGlobal is discarded */ +planner_shutdown_hook_type planner_shutdown_hook = NULL; + /* Hook for plugins to get control when grouping_planner() plans upper rels */ create_upper_paths_hook_type create_upper_paths_hook = NULL; @@ -456,6 +462,10 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions, tuple_fraction = 0.0; } + /* Allow plugins to take control after we've initialized "glob" */ + if (planner_setup_hook) + (*planner_setup_hook) (glob, parse, query_string, &tuple_fraction, es); + /* primary planning entry point (may recurse for subqueries) */ root = subquery_planner(glob, parse, NULL, NULL, false, tuple_fraction, NULL); @@ -635,6 +645,10 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions, result->jitFlags |= PGJIT_DEFORM; } + /* Allow plugins to take control before we discard "glob" */ + if (planner_shutdown_hook) + (*planner_shutdown_hook) (glob, parse, query_string, result); + if (glob->partition_directory != NULL) DestroyPartitionDirectory(glob->partition_directory); diff --git a/src/include/optimizer/planner.h b/src/include/optimizer/planner.h index c7ab466f5f1..55d9b7940aa 100644 --- a/src/include/optimizer/planner.h +++ b/src/include/optimizer/planner.h @@ -32,6 +32,19 @@ typedef PlannedStmt *(*planner_hook_type) (Query *parse, ExplainState *es); extern PGDLLIMPORT planner_hook_type planner_hook; +/* Hook for plugins to get control after PlannerGlobal is initialized */ +typedef void (*planner_setup_hook_type) (PlannerGlobal *glob, Query *parse, + const char *query_string, + double *tuple_fraction, + ExplainState *es); +extern PGDLLIMPORT planner_setup_hook_type planner_setup_hook; + +/* Hook for plugins to get control before PlannerGlobal is discarded */ +typedef void (*planner_shutdown_hook_type) (PlannerGlobal *glob, Query *parse, + const char *query_string, + PlannedStmt *pstmt); +extern PGDLLIMPORT planner_shutdown_hook_type planner_shutdown_hook; + /* Hook for plugins to get control when grouping_planner() plans upper rels */ typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, |