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 */
@@ -127,10 +130,16 @@ _PG_init(void)
127130}
128131#endif
129132
133+ /* Request additional shared resources */
134+ RequestAddinShmemSpace (pathman_memsize ());
135+ RequestAddinLWLocks (3 );
136+
130137set_rel_pathlist_hook_original = set_rel_pathlist_hook ;
131138set_rel_pathlist_hook = pathman_set_rel_pathlist_hook ;
132139shmem_startup_hook_original = shmem_startup_hook ;
133140shmem_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 ;
134143planner_hook_original = planner_hook ;
135144planner_hook = pathman_planner_hook ;
136145}
@@ -140,6 +149,7 @@ _PG_fini(void)
140149{
141150set_rel_pathlist_hook = set_rel_pathlist_hook_original ;
142151shmem_startup_hook = shmem_startup_hook_original ;
152+ post_parse_analyze_hook = post_parse_analyze_hook_original ;
143153planner_hook = planner_hook_original ;
144154}
145155
@@ -182,6 +192,20 @@ get_cmp_func(Oid type1, Oid type2)
182192return cmp_func ;
183193}
184194
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+
185209/*
186210 * Planner hook. It disables inheritance for tables that have been partitioned
187211 * by pathman to prevent standart PostgreSQL partitioning mechanism from
@@ -193,11 +217,6 @@ pathman_planner_hook(Query *parse, int cursorOptions, ParamListInfo boundParams)
193217PlannedStmt * result ;
194218ListCell * lc ;
195219
196- if (initialization_needed )
197- {
198- load_config ();
199- }
200-
201220inheritance_disabled = false;
202221switch (parse -> commandType )
203222{
@@ -325,9 +344,6 @@ handle_modification_query(Query *parse)
325344static void
326345pathman_shmem_startup (void )
327346{
328- /* Initialize locks */
329- RequestAddinLWLocks (3 );
330-
331347/* Allocate shared memory objects */
332348LWLockAcquire (AddinShmemInitLock ,LW_EXCLUSIVE );
333349init_dsm_config ();