@@ -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,27 +878,41 @@ pgws_planner_hook(Query *parse,
865
878
int cursorOptions ,
866
879
ParamListInfo boundParams )
867
880
{
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 ;
873
885
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 ,
879
892
#if PG_VERSION_NUM >= 130000
880
- query_string ,
893
+ query_string ,
881
894
#endif
882
- cursorOptions , boundParams );
883
-
884
- return standard_planner (parse ,
895
+ cursorOptions , boundParams );
896
+ else
897
+ result = standard_planner (parse ,
885
898
#if PG_VERSION_NUM >= 130000
886
- query_string ,
899
+ query_string ,
887
900
#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 ;
889
916
}
890
917
891
918
/*
@@ -894,29 +921,67 @@ pgws_planner_hook(Query *parse,
894
921
static void
895
922
pgws_ExecutorStart (QueryDesc * queryDesc , int eflags )
896
923
{
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 ;
905
927
906
928
if (prev_ExecutorStart )
907
929
prev_ExecutorStart (queryDesc , eflags );
908
930
else
909
931
standard_ExecutorStart (queryDesc , eflags );
910
932
}
911
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
+
912
976
/*
913
977
* ExecutorEnd hook: clear queryId
914
978
*/
915
979
static void
916
980
pgws_ExecutorEnd (QueryDesc * queryDesc )
917
981
{
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 );
920
985
921
986
if (prev_ExecutorEnd )
922
987
prev_ExecutorEnd (queryDesc );
0 commit comments