@@ -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
6873 int 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)
395404 planner_hook = pgws_planner_hook ;
396405 prev_ExecutorStart = ExecutorStart_hook ;
397406 ExecutorStart_hook = pgws_ExecutorStart ;
407+ prev_ExecutorRun = ExecutorRun_hook ;
408+ ExecutorRun_hook = pgws_ExecutorRun ;
409+ prev_ExecutorFinish = ExecutorFinish_hook ;
410+ ExecutorFinish_hook = pgws_ExecutorFinish ;
398411 prev_ExecutorEnd = ExecutorEnd_hook ;
399412 ExecutorEnd_hook = pgws_ExecutorEnd ;
400413}
@@ -865,23 +878,41 @@ pgws_planner_hook(Query *parse,
865878 int cursorOptions ,
866879 ParamListInfo boundParams )
867880{
881+ PlannedStmt * result ;
868882 int i = MyProc - ProcGlobal -> allProcs ;
869- if (! pgws_proc_queryids [ i ] )
883+ if (nesting_level == 0 )
870884 pgws_proc_queryids [i ] = parse -> queryId ;
871885
872- /* Invoke original hook if needed */
873- if (planner_hook_next )
874- 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 ,
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+ 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 ;
885916}
886917
887918/*
@@ -891,7 +922,7 @@ static void
891922pgws_ExecutorStart (QueryDesc * queryDesc , int eflags )
892923{
893924 int i = MyProc - ProcGlobal -> allProcs ;
894- if (! pgws_proc_queryids [ i ] )
925+ if (nesting_level == 0 )
895926 pgws_proc_queryids [i ] = queryDesc -> plannedstmt -> queryId ;
896927
897928 if (prev_ExecutorStart )
@@ -900,13 +931,57 @@ pgws_ExecutorStart(QueryDesc *queryDesc, int eflags)
900931 standard_ExecutorStart (queryDesc , eflags );
901932}
902933
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+
903976/*
904977 * ExecutorEnd hook: clear queryId
905978 */
906979static void
907980pgws_ExecutorEnd (QueryDesc * queryDesc )
908981{
909- 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 );
910985
911986 if (prev_ExecutorEnd )
912987 prev_ExecutorEnd (queryDesc );
0 commit comments