@@ -95,6 +95,35 @@ static void pgws_ProcessUtility(PlannedStmt *pstmt,
9595#endif
9696 );
9797
98+ /*---- GUC variables ----*/
99+
100+ typedef enum
101+ {
102+ PGWS_PROFILE_QUERIES_NONE , /* profile no statements */
103+ PGWS_PROFILE_QUERIES_TOP , /* only top level statements */
104+ PGWS_PROFILE_QUERIES_ALL /* all statements, including nested ones */
105+ } PGWSTrackLevel ;
106+
107+ static const struct config_enum_entry pgws_profile_queries_options [] =
108+ {
109+ {"none" , PGWS_PROFILE_QUERIES_NONE , false},
110+ {"off" , PGWS_PROFILE_QUERIES_NONE , false},
111+ {"no" , PGWS_PROFILE_QUERIES_NONE , false},
112+ {"false" , PGWS_PROFILE_QUERIES_NONE , false},
113+ {"0" , PGWS_PROFILE_QUERIES_NONE , false},
114+ {"top" , PGWS_PROFILE_QUERIES_TOP , false},
115+ {"on" , PGWS_PROFILE_QUERIES_TOP , false},
116+ {"yes" , PGWS_PROFILE_QUERIES_TOP , false},
117+ {"true" , PGWS_PROFILE_QUERIES_TOP , false},
118+ {"1" , PGWS_PROFILE_QUERIES_TOP , false},
119+ {"all" , PGWS_PROFILE_QUERIES_ALL , false},
120+ {NULL , 0 , false}
121+ };
122+
123+ #define pgws_enabled (level ) \
124+ ((pgws_collector_hdr->profileQueries == PGWS_PROFILE_QUERIES_ALL) || \
125+ (pgws_collector_hdr->profileQueries == PGWS_PROFILE_QUERIES_TOP && (level) == 0))
126+
98127/*
99128 * Calculate max processes count.
100129 *
@@ -185,6 +214,14 @@ shmem_int_guc_check_hook(int *newval, void **extra, GucSource source)
185214 return true;
186215}
187216
217+ static bool
218+ shmem_enum_guc_check_hook (int * newval , void * * extra , GucSource source )
219+ {
220+ if (UsedShmemSegAddr == NULL )
221+ return false;
222+ return true;
223+ }
224+
188225static bool
189226shmem_bool_guc_check_hook (bool * newval , void * * extra , GucSource source )
190227{
@@ -260,8 +297,8 @@ setup_gucs()
260297 else if (!strcmp (name , "pg_wait_sampling.profile_queries" ))
261298 {
262299 profile_queries_found = true;
263- var -> _bool .variable = & pgws_collector_hdr -> profileQueries ;
264- pgws_collector_hdr -> profileQueries = true ;
300+ var -> _enum .variable = & pgws_collector_hdr -> profileQueries ;
301+ pgws_collector_hdr -> profileQueries = PGWS_PROFILE_QUERIES_TOP ;
265302 }
266303 else if (!strcmp (name , "pg_wait_sampling.sample_cpu" ))
267304 {
@@ -296,10 +333,10 @@ setup_gucs()
296333 PGC_SUSET , 0 , shmem_bool_guc_check_hook , NULL , NULL );
297334
298335 if (!profile_queries_found )
299- DefineCustomBoolVariable ("pg_wait_sampling.profile_queries" ,
336+ DefineCustomEnumVariable ("pg_wait_sampling.profile_queries" ,
300337 "Sets whether profile should be collected per query." , NULL ,
301- & pgws_collector_hdr -> profileQueries , true ,
302- PGC_SUSET , 0 , shmem_bool_guc_check_hook , NULL , NULL );
338+ & pgws_collector_hdr -> profileQueries , PGWS_PROFILE_QUERIES_TOP , pgws_profile_queries_options ,
339+ PGC_SUSET , 0 , shmem_enum_guc_check_hook , NULL , NULL );
303340
304341 if (!sample_cpu_found )
305342 DefineCustomBoolVariable ("pg_wait_sampling.sample_cpu" ,
@@ -354,6 +391,8 @@ pgws_shmem_startup(void)
354391
355392 pgws_collector_hdr = shm_toc_allocate (toc , sizeof (CollectorShmqHeader ));
356393 shm_toc_insert (toc , 0 , pgws_collector_hdr );
394+ /* needed to please check_GUC_init */
395+ pgws_collector_hdr -> profileQueries = PGWS_PROFILE_QUERIES_TOP ;
357396 pgws_collector_mq = shm_toc_allocate (toc , COLLECTOR_QUEUE_SIZE );
358397 shm_toc_insert (toc , 1 , pgws_collector_mq );
359398 pgws_proc_queryids = shm_toc_allocate (toc ,
@@ -933,10 +972,15 @@ pgws_planner_hook(Query *parse,
933972 int cursorOptions ,
934973 ParamListInfo boundParams )
935974{
936- PlannedStmt * result ;
937- int i = MyProc - ProcGlobal -> allProcs ;
938- if (nesting_level == 0 )
975+ PlannedStmt * result ;
976+ int i = MyProc - ProcGlobal -> allProcs ;
977+ uint64 save_queryId = 0 ;
978+
979+ if (pgws_enabled (nesting_level ))
980+ {
981+ save_queryId = pgws_proc_queryids [i ];
939982 pgws_proc_queryids [i ] = parse -> queryId ;
983+ }
940984
941985 nesting_level ++ ;
942986 PG_TRY ();
@@ -957,12 +1001,16 @@ pgws_planner_hook(Query *parse,
9571001 nesting_level -- ;
9581002 if (nesting_level == 0 )
9591003 pgws_proc_queryids [i ] = UINT64CONST (0 );
1004+ else if (pgws_enabled (nesting_level ))
1005+ pgws_proc_queryids [i ] = save_queryId ;
9601006 }
9611007 PG_CATCH ();
9621008 {
9631009 nesting_level -- ;
9641010 if (nesting_level == 0 )
9651011 pgws_proc_queryids [i ] = UINT64CONST (0 );
1012+ else if (pgws_enabled (nesting_level ))
1013+ pgws_proc_queryids [i ] = save_queryId ;
9661014 PG_RE_THROW ();
9671015 }
9681016 PG_END_TRY ();
@@ -977,9 +1025,8 @@ static void
9771025pgws_ExecutorStart (QueryDesc * queryDesc , int eflags )
9781026{
9791027 int i = MyProc - ProcGlobal -> allProcs ;
980- if (nesting_level == 0 )
1028+ if (pgws_enabled ( nesting_level ) )
9811029 pgws_proc_queryids [i ] = queryDesc -> plannedstmt -> queryId ;
982-
9831030 if (prev_ExecutorStart )
9841031 prev_ExecutorStart (queryDesc , eflags );
9851032 else
@@ -991,6 +1038,9 @@ pgws_ExecutorRun(QueryDesc *queryDesc,
9911038 ScanDirection direction ,
9921039 uint64 count , bool execute_once )
9931040{
1041+ int i = MyProc - ProcGlobal -> allProcs ;
1042+ uint64 save_queryId = pgws_proc_queryids [i ];
1043+
9941044 nesting_level ++ ;
9951045 PG_TRY ();
9961046 {
@@ -999,10 +1049,18 @@ pgws_ExecutorRun(QueryDesc *queryDesc,
9991049 else
10001050 standard_ExecutorRun (queryDesc , direction , count , execute_once );
10011051 nesting_level -- ;
1052+ if (nesting_level == 0 )
1053+ pgws_proc_queryids [i ] = UINT64CONST (0 );
1054+ else
1055+ pgws_proc_queryids [i ] = save_queryId ;
10021056 }
10031057 PG_CATCH ();
10041058 {
10051059 nesting_level -- ;
1060+ if (nesting_level == 0 )
1061+ pgws_proc_queryids [i ] = UINT64CONST (0 );
1062+ else
1063+ pgws_proc_queryids [i ] = save_queryId ;
10061064 PG_RE_THROW ();
10071065 }
10081066 PG_END_TRY ();
@@ -1011,6 +1069,9 @@ pgws_ExecutorRun(QueryDesc *queryDesc,
10111069static void
10121070pgws_ExecutorFinish (QueryDesc * queryDesc )
10131071{
1072+ int i = MyProc - ProcGlobal -> allProcs ;
1073+ uint64 save_queryId = pgws_proc_queryids [i ];
1074+
10141075 nesting_level ++ ;
10151076 PG_TRY ();
10161077 {
@@ -1019,10 +1080,15 @@ pgws_ExecutorFinish(QueryDesc *queryDesc)
10191080 else
10201081 standard_ExecutorFinish (queryDesc );
10211082 nesting_level -- ;
1083+ if (nesting_level == 0 )
1084+ pgws_proc_queryids [i ] = UINT64CONST (0 );
1085+ else
1086+ pgws_proc_queryids [i ] = save_queryId ;
10221087 }
10231088 PG_CATCH ();
10241089 {
10251090 nesting_level -- ;
1091+ pgws_proc_queryids [i ] = save_queryId ;
10261092 PG_RE_THROW ();
10271093 }
10281094 PG_END_TRY ();
@@ -1061,10 +1127,14 @@ pgws_ProcessUtility(PlannedStmt *pstmt,
10611127#endif
10621128 )
10631129{
1064- int i = MyProc - ProcGlobal -> allProcs ;
1130+ int i = MyProc - ProcGlobal -> allProcs ;
1131+ uint64 save_queryId = 0 ;
10651132
1066- if (nesting_level == 0 )
1133+ if (pgws_enabled (nesting_level ))
1134+ {
1135+ save_queryId = pgws_proc_queryids [i ];
10671136 pgws_proc_queryids [i ] = pstmt -> queryId ;
1137+ }
10681138
10691139 nesting_level ++ ;
10701140 PG_TRY ();
@@ -1098,12 +1168,16 @@ pgws_ProcessUtility(PlannedStmt *pstmt,
10981168 nesting_level -- ;
10991169 if (nesting_level == 0 )
11001170 pgws_proc_queryids [i ] = UINT64CONST (0 );
1171+ else if (pgws_enabled (nesting_level ))
1172+ pgws_proc_queryids [i ] = save_queryId ;
11011173 }
11021174 PG_CATCH ();
11031175 {
11041176 nesting_level -- ;
11051177 if (nesting_level == 0 )
11061178 pgws_proc_queryids [i ] = UINT64CONST (0 );
1179+ else if (pgws_enabled (nesting_level ))
1180+ pgws_proc_queryids [i ] = save_queryId ;
11071181 PG_RE_THROW ();
11081182 }
11091183 PG_END_TRY ();
0 commit comments