@@ -43,9 +43,14 @@ static bool shmem_initialized = false;
43
43
44
44
/* Hooks */
45
45
static ExecutorStart_hook_type prev_ExecutorStart = NULL ;
46
+ static ExecutorRun_hook_type prev_ExecutorRun = NULL ;
47
+ static ExecutorFinish_hook_type prev_ExecutorFinish = NULL ;
46
48
static ExecutorEnd_hook_type prev_ExecutorEnd = NULL ;
47
49
static planner_hook_type planner_hook_next = NULL ;
48
50
51
+ /* Current nesting depth of planner/Executor calls */
52
+ static int nesting_level = 0 ;
53
+
49
54
/* Pointers to shared memory objects */
50
55
shm_mq * pgws_collector_mq = NULL ;
51
56
uint64 * pgws_proc_queryids = NULL ;
@@ -67,6 +72,10 @@ static PlannedStmt *pgws_planner_hook(Query *parse,
67
72
#endif
68
73
int cursorOptions , ParamListInfo boundParams );
69
74
static 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 );
70
79
static void pgws_ExecutorEnd (QueryDesc * queryDesc );
71
80
72
81
/*
@@ -395,6 +404,10 @@ _PG_init(void)
395
404
planner_hook = pgws_planner_hook ;
396
405
prev_ExecutorStart = ExecutorStart_hook ;
397
406
ExecutorStart_hook = pgws_ExecutorStart ;
407
+ prev_ExecutorRun = ExecutorRun_hook ;
408
+ ExecutorRun_hook = pgws_ExecutorRun ;
409
+ prev_ExecutorFinish = ExecutorFinish_hook ;
410
+ ExecutorFinish_hook = pgws_ExecutorFinish ;
398
411
prev_ExecutorEnd = ExecutorEnd_hook ;
399
412
ExecutorEnd_hook = pgws_ExecutorEnd ;
400
413
}
@@ -865,23 +878,41 @@ pgws_planner_hook(Query *parse,
865
878
int cursorOptions ,
866
879
ParamListInfo boundParams )
867
880
{
881
+ PlannedStmt * result ;
868
882
int i = MyProc - ProcGlobal -> allProcs ;
869
- if (! pgws_proc_queryids [ i ] )
883
+ if (nesting_level == 0 )
870
884
pgws_proc_queryids [i ] = parse -> queryId ;
871
885
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 ,
875
892
#if PG_VERSION_NUM >= 130000
876
- query_string ,
893
+ query_string ,
877
894
#endif
878
- cursorOptions , boundParams );
879
-
880
- return standard_planner (parse ,
895
+ cursorOptions , boundParams );
896
+ else
897
+ result = standard_planner (parse ,
881
898
#if PG_VERSION_NUM >= 130000
882
- query_string ,
899
+ query_string ,
883
900
#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 ;
885
916
}
886
917
887
918
/*
@@ -891,7 +922,7 @@ static void
891
922
pgws_ExecutorStart (QueryDesc * queryDesc , int eflags )
892
923
{
893
924
int i = MyProc - ProcGlobal -> allProcs ;
894
- if (! pgws_proc_queryids [ i ] )
925
+ if (nesting_level == 0 )
895
926
pgws_proc_queryids [i ] = queryDesc -> plannedstmt -> queryId ;
896
927
897
928
if (prev_ExecutorStart )
@@ -900,13 +931,57 @@ pgws_ExecutorStart(QueryDesc *queryDesc, int eflags)
900
931
standard_ExecutorStart (queryDesc , eflags );
901
932
}
902
933
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
+
903
976
/*
904
977
* ExecutorEnd hook: clear queryId
905
978
*/
906
979
static void
907
980
pgws_ExecutorEnd (QueryDesc * queryDesc )
908
981
{
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 );
910
985
911
986
if (prev_ExecutorEnd )
912
987
prev_ExecutorEnd (queryDesc );
0 commit comments