@@ -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,27 +878,41 @@ pgws_planner_hook(Query *parse,
865878int cursorOptions ,
866879ParamListInfo boundParams )
867880{
868- if (MyProc )
869- {
870- int i = MyProc - ProcGlobal -> allProcs ;
871- if (!pgws_proc_queryids [i ])
872- pgws_proc_queryids [i ]= parse -> queryId ;
881+ PlannedStmt * result ;
882+ int i = MyProc - ProcGlobal -> allProcs ;
883+ if (nesting_level == 0 )
884+ pgws_proc_queryids [i ]= parse -> queryId ;
873885
874- }
875-
876- /* Invoke original hook if needed */
877- if (planner_hook_next )
878- return planner_hook_next (parse ,
886+ nesting_level ++ ;
887+ PG_TRY ();
888+ {
889+ /* Invoke original hook if needed */
890+ if (planner_hook_next )
891+ result = planner_hook_next (parse ,
879892#if PG_VERSION_NUM >=130000
880- query_string ,
893+ query_string ,
881894#endif
882- cursorOptions ,boundParams );
883-
884- return standard_planner (parse ,
895+ cursorOptions ,boundParams );
896+ else
897+ result = standard_planner (parse ,
885898#if PG_VERSION_NUM >=130000
886- query_string ,
899+ query_string ,
887900#endif
888- cursorOptions ,boundParams );
901+ cursorOptions ,boundParams );
902+ nesting_level -- ;
903+ if (nesting_level == 0 )
904+ pgws_proc_queryids [i ]= UINT64CONST (0 );
905+ }
906+ PG_CATCH ();
907+ {
908+ nesting_level -- ;
909+ if (nesting_level == 0 )
910+ pgws_proc_queryids [i ]= UINT64CONST (0 );
911+ PG_RE_THROW ();
912+ }
913+ PG_END_TRY ();
914+
915+ return result ;
889916}
890917
891918/*
@@ -894,29 +921,67 @@ pgws_planner_hook(Query *parse,
894921static void
895922pgws_ExecutorStart (QueryDesc * queryDesc ,int eflags )
896923{
897- int i ;
898-
899- if (MyProc )
900- {
901- i = MyProc - ProcGlobal -> allProcs ;
902- if (!pgws_proc_queryids [i ])
903- pgws_proc_queryids [i ]= queryDesc -> plannedstmt -> queryId ;
904- }
924+ int i = MyProc - ProcGlobal -> allProcs ;
925+ if (nesting_level == 0 )
926+ pgws_proc_queryids [i ]= queryDesc -> plannedstmt -> queryId ;
905927
906928if (prev_ExecutorStart )
907929prev_ExecutorStart (queryDesc ,eflags );
908930else
909931standard_ExecutorStart (queryDesc ,eflags );
910932}
911933
934+ static void
935+ pgws_ExecutorRun (QueryDesc * queryDesc ,
936+ ScanDirection direction ,
937+ uint64 count ,bool execute_once )
938+ {
939+ nesting_level ++ ;
940+ PG_TRY ();
941+ {
942+ if (prev_ExecutorRun )
943+ prev_ExecutorRun (queryDesc ,direction ,count ,execute_once );
944+ else
945+ standard_ExecutorRun (queryDesc ,direction ,count ,execute_once );
946+ nesting_level -- ;
947+ }
948+ PG_CATCH ();
949+ {
950+ nesting_level -- ;
951+ PG_RE_THROW ();
952+ }
953+ PG_END_TRY ();
954+ }
955+
956+ static void
957+ pgws_ExecutorFinish (QueryDesc * queryDesc )
958+ {
959+ nesting_level ++ ;
960+ PG_TRY ();
961+ {
962+ if (prev_ExecutorFinish )
963+ prev_ExecutorFinish (queryDesc );
964+ else
965+ standard_ExecutorFinish (queryDesc );
966+ nesting_level -- ;
967+ }
968+ PG_CATCH ();
969+ {
970+ nesting_level -- ;
971+ PG_RE_THROW ();
972+ }
973+ PG_END_TRY ();
974+ }
975+
912976/*
913977 * ExecutorEnd hook: clear queryId
914978 */
915979static void
916980pgws_ExecutorEnd (QueryDesc * queryDesc )
917981{
918- if (MyProc )
919- pgws_proc_queryids [MyProc - ProcGlobal -> allProcs ]= UINT64CONST (0 );
982+ int i = MyProc - ProcGlobal -> allProcs ;
983+ if (nesting_level == 0 )
984+ pgws_proc_queryids [i ]= UINT64CONST (0 );
920985
921986if (prev_ExecutorEnd )
922987prev_ExecutorEnd (queryDesc );