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)
135138	set_rel_pathlist_hook  =  pathman_set_rel_pathlist_hook ;
136139	shmem_startup_hook_original  =  shmem_startup_hook ;
137140	shmem_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 ;
138143	planner_hook_original  =  planner_hook ;
139144	planner_hook  =  pathman_planner_hook ;
140145}
@@ -144,6 +149,7 @@ _PG_fini(void)
144149{
145150	set_rel_pathlist_hook  =  set_rel_pathlist_hook_original ;
146151	shmem_startup_hook  =  shmem_startup_hook_original ;
152+ 	post_parse_analyze_hook  =  post_parse_analyze_hook_original ;
147153	planner_hook  =  planner_hook_original ;
148154}
149155
@@ -186,6 +192,20 @@ get_cmp_func(Oid type1, Oid type2)
186192	return  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)
197217	PlannedStmt 	  * result ;
198218	ListCell 	  * lc ;
199219
200- 	if  (initialization_needed )
201- 	{
202- 		load_config ();
203- 	}
204- 
205220	inheritance_disabled  =  false;
206221	switch (parse -> commandType )
207222	{
0 commit comments