@@ -43,9 +43,14 @@ static bool shmem_initialized = false;
4343
4444/* Hooks */
4545static ExecutorStart_hook_type prev_ExecutorStart = NULL ;
46+ static ExecutorRun_hook_type prev_ExecutorRun = NULL ;
47+ static ExecutorFinish_hook_type prev_ExecutorFinish = NULL ;
4648static ExecutorEnd_hook_type prev_ExecutorEnd = NULL ;
4749static planner_hook_type planner_hook_next = NULL ;
4850
51+ /* Current nesting depth of planner/Executor calls */
52+ static int nesting_level = 0 ;
53+
4954/* Pointers to shared memory objects */
5055shm_mq * pgws_collector_mq = NULL ;
5156uint64 * pgws_proc_queryids = NULL ;
@@ -67,6 +72,10 @@ static PlannedStmt *pgws_planner_hook(Query *parse,
6772#endif
6873int cursorOptions ,ParamListInfo boundParams );
6974static void pgws_ExecutorStart (QueryDesc * queryDesc ,int eflags );
75+ static void pgws_ExecutorRun (QueryDesc * queryDesc ,
76+ ScanDirection direction ,
77+ uint64 count ,bool execute_once );
78+ static void pgws_ExecutorFinish (QueryDesc * queryDesc );
7079static void pgws_ExecutorEnd (QueryDesc * queryDesc );
7180
7281/*
@@ -395,6 +404,10 @@ _PG_init(void)
395404planner_hook = pgws_planner_hook ;
396405prev_ExecutorStart = ExecutorStart_hook ;
397406ExecutorStart_hook = pgws_ExecutorStart ;
407+ prev_ExecutorRun = ExecutorRun_hook ;
408+ ExecutorRun_hook = pgws_ExecutorRun ;
409+ prev_ExecutorFinish = ExecutorFinish_hook ;
410+ ExecutorFinish_hook = pgws_ExecutorFinish ;
398411prev_ExecutorEnd = ExecutorEnd_hook ;
399412ExecutorEnd_hook = pgws_ExecutorEnd ;
400413}
@@ -865,23 +878,37 @@ pgws_planner_hook(Query *parse,
865878int cursorOptions ,
866879ParamListInfo boundParams )
867880{
881+ PlannedStmt * result ;
868882int i = MyProc - ProcGlobal -> allProcs ;
869- if (! pgws_proc_queryids [ i ] )
883+ if (nesting_level == 0 )
870884pgws_proc_queryids [i ]= parse -> queryId ;
871885
872886/* Invoke original hook if needed */
873- if (planner_hook_next )
874- return planner_hook_next (parse ,
887+ nesting_level ++ ;
888+ PG_TRY ();
889+ {
890+ if (planner_hook_next )
891+ result = planner_hook_next (parse ,
875892#if PG_VERSION_NUM >=130000
876- query_string ,
893+ query_string ,
877894#endif
878- cursorOptions ,boundParams );
879-
880- return standard_planner (parse ,
895+ cursorOptions ,boundParams );
896+ else
897+ result = standard_planner (parse ,
881898#if PG_VERSION_NUM >=130000
882- query_string ,
899+ query_string ,
883900#endif
884- cursorOptions ,boundParams );
901+ cursorOptions ,boundParams );
902+ }
903+ PG_FINALLY ();
904+ {
905+ nesting_level -- ;
906+ if (nesting_level == 0 )
907+ pgws_proc_queryids [i ]= UINT64CONST (0 );
908+ }
909+ PG_END_TRY ();
910+
911+ return result ;
885912}
886913
887914/*
@@ -891,7 +918,7 @@ static void
891918pgws_ExecutorStart (QueryDesc * queryDesc ,int eflags )
892919{
893920int i = MyProc - ProcGlobal -> allProcs ;
894- if (! pgws_proc_queryids [ i ] )
921+ if (nesting_level == 0 )
895922pgws_proc_queryids [i ]= queryDesc -> plannedstmt -> queryId ;
896923
897924if (prev_ExecutorStart )
@@ -900,13 +927,53 @@ pgws_ExecutorStart(QueryDesc *queryDesc, int eflags)
900927standard_ExecutorStart (queryDesc ,eflags );
901928}
902929
930+ static void
931+ pgws_ExecutorRun (QueryDesc * queryDesc ,
932+ ScanDirection direction ,
933+ uint64 count ,bool execute_once )
934+ {
935+ nesting_level ++ ;
936+ PG_TRY ();
937+ {
938+ if (prev_ExecutorRun )
939+ prev_ExecutorRun (queryDesc ,direction ,count ,execute_once );
940+ else
941+ standard_ExecutorRun (queryDesc ,direction ,count ,execute_once );
942+ }
943+ PG_FINALLY ();
944+ {
945+ nesting_level -- ;
946+ }
947+ PG_END_TRY ();
948+ }
949+
950+ static void
951+ pgws_ExecutorFinish (QueryDesc * queryDesc )
952+ {
953+ nesting_level ++ ;
954+ PG_TRY ();
955+ {
956+ if (prev_ExecutorFinish )
957+ prev_ExecutorFinish (queryDesc );
958+ else
959+ standard_ExecutorFinish (queryDesc );
960+ }
961+ PG_FINALLY ();
962+ {
963+ nesting_level -- ;
964+ }
965+ PG_END_TRY ();
966+ }
967+
903968/*
904969 * ExecutorEnd hook: clear queryId
905970 */
906971static void
907972pgws_ExecutorEnd (QueryDesc * queryDesc )
908973{
909- pgws_proc_queryids [MyProc - ProcGlobal -> allProcs ]= UINT64CONST (0 );
974+ int i = MyProc - ProcGlobal -> allProcs ;
975+ if (nesting_level == 0 )
976+ pgws_proc_queryids [i ]= UINT64CONST (0 );
910977
911978if (prev_ExecutorEnd )
912979prev_ExecutorEnd (queryDesc );