2222#include "optimizer/planner.h"
2323#include "optimizer/restrictinfo.h"
2424#include "optimizer/cost.h"
25+ #include "parser/analyze.h"
2526#include "parser/parsetree.h"
2627#include "utils/hsearch.h"
2728#include "utils/tqual.h"
@@ -56,6 +57,7 @@ typedef struct
5657/* Original hooks */
5758static set_rel_pathlist_hook_type set_rel_pathlist_hook_original = NULL ;
5859static shmem_startup_hook_type shmem_startup_hook_original = NULL ;
60+ static post_parse_analyze_hook_type post_parse_analyze_hook_original = NULL ;
5961static planner_hook_type planner_hook_original = NULL ;
6062
6163/* pg module functions */
@@ -65,6 +67,7 @@ void _PG_fini(void);
6567/* Hook functions */
6668static void pathman_shmem_startup (void );
6769static void pathman_set_rel_pathlist_hook (PlannerInfo * root ,RelOptInfo * rel ,Index rti ,RangeTblEntry * rte );
70+ void pathman_post_parse_analysis_hook (ParseState * pstate ,Query * query );
6871static PlannedStmt * pathman_planner_hook (Query * parse ,int cursorOptions ,ParamListInfo boundParams );
6972
7073/* Utility functions */
@@ -135,6 +138,8 @@ _PG_init(void)
135138set_rel_pathlist_hook = pathman_set_rel_pathlist_hook ;
136139shmem_startup_hook_original = shmem_startup_hook ;
137140shmem_startup_hook = pathman_shmem_startup ;
141+ post_parse_analyze_hook_original = post_parse_analyze_hook ;
142+ post_parse_analyze_hook = pathman_post_parse_analysis_hook ;
138143planner_hook_original = planner_hook ;
139144planner_hook = pathman_planner_hook ;
140145}
@@ -144,6 +149,7 @@ _PG_fini(void)
144149{
145150set_rel_pathlist_hook = set_rel_pathlist_hook_original ;
146151shmem_startup_hook = shmem_startup_hook_original ;
152+ post_parse_analyze_hook = post_parse_analyze_hook_original ;
147153planner_hook = planner_hook_original ;
148154}
149155
@@ -186,6 +192,20 @@ get_cmp_func(Oid type1, Oid type2)
186192return cmp_func ;
187193}
188194
195+ /*
196+ * Post parse analysis hook. It makes sure the config is loaded before executing
197+ * any statement, including utility commands
198+ */
199+ void
200+ pathman_post_parse_analysis_hook (ParseState * pstate ,Query * query )
201+ {
202+ if (initialization_needed )
203+ load_config ();
204+
205+ if (post_parse_analyze_hook_original )
206+ post_parse_analyze_hook_original (pstate ,query );
207+ }
208+
189209/*
190210 * Planner hook. It disables inheritance for tables that have been partitioned
191211 * by pathman to prevent standart PostgreSQL partitioning mechanism from
@@ -197,11 +217,6 @@ pathman_planner_hook(Query *parse, int cursorOptions, ParamListInfo boundParams)
197217PlannedStmt * result ;
198218ListCell * lc ;
199219
200- if (initialization_needed )
201- {
202- load_config ();
203- }
204-
205220inheritance_disabled = false;
206221switch (parse -> commandType )
207222{