From c6d5042a0ad0d77bac91300b5d5218552f536968 Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@paquier.xyz>
Date: Mon, 30 Sep 2024 10:06:32 +0900
Subject: [PATCH] Expand assertion check for query ID in executor

track_activities and debug_query_strind problems.  Blah.
---
 src/backend/executor/execMain.c   | 18 +++++++++++++++---
 src/test/regress/expected/guc.out | 21 +++++++++++++++++++++
 src/test/regress/sql/guc.sql      | 12 ++++++++++++
 3 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index 728cdee480..85f697aaa1 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -71,6 +71,18 @@ ExecutorEnd_hook_type ExecutorEnd_hook = NULL;
 /* Hook for plugin to get control in ExecCheckPermissions() */
 ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook = NULL;
 
+/*
+ * Check that the query ID is set, which is something that happens only
+ * if compute_query_id is enabled (or a module forced it), if track_activities
+ * is enabled, and if a client provided a query string to map with the query
+ * ID set.
+ */
+#define EXEC_CHECK_QUERY_ID \
+do { \
+	Assert(!IsQueryIdEnabled() || !pgstat_track_activities ||		\
+		   !debug_query_string || pgstat_get_my_query_id() != 0);	\
+} while(0)
+
 /* decls for local routines only used within this module */
 static void InitPlan(QueryDesc *queryDesc, int eflags);
 static void CheckValidRowMarkRel(Relation rel, RowMarkType markType);
@@ -297,7 +309,7 @@ ExecutorRun(QueryDesc *queryDesc,
 			bool execute_once)
 {
 	/* If enabled, the query ID should be set. */
-	Assert(!IsQueryIdEnabled() || pgstat_get_my_query_id() != 0);
+	EXEC_CHECK_QUERY_ID;
 
 	if (ExecutorRun_hook)
 		(*ExecutorRun_hook) (queryDesc, direction, count, execute_once);
@@ -408,7 +420,7 @@ void
 ExecutorFinish(QueryDesc *queryDesc)
 {
 	/* If enabled, the query ID should be set. */
-	Assert(!IsQueryIdEnabled() || pgstat_get_my_query_id() != 0);
+	EXEC_CHECK_QUERY_ID;
 
 	if (ExecutorFinish_hook)
 		(*ExecutorFinish_hook) (queryDesc);
@@ -471,7 +483,7 @@ void
 ExecutorEnd(QueryDesc *queryDesc)
 {
 	/* If enabled, the query ID should be set. */
-	Assert(!IsQueryIdEnabled() || pgstat_get_my_query_id() != 0);
+	EXEC_CHECK_QUERY_ID;
 
 	if (ExecutorEnd_hook)
 		(*ExecutorEnd_hook) (queryDesc);
diff --git a/src/test/regress/expected/guc.out b/src/test/regress/expected/guc.out
index 455b6d6c0c..14edb42704 100644
--- a/src/test/regress/expected/guc.out
+++ b/src/test/regress/expected/guc.out
@@ -824,6 +824,27 @@ set default_with_oids to f;
 -- Should not allow to set it to true.
 set default_with_oids to t;
 ERROR:  tables declared WITH OIDS are not supported
+-- Test that disabling track_activities disables query ID reporting in
+-- pg_stat_activity.
+SET compute_query_id = on;
+SET track_activities = on;
+SELECT query_id IS NOT NULL AS qid_set FROM pg_stat_activity
+  WHERE pid = pg_backend_pid();
+ qid_set 
+---------
+ t
+(1 row)
+
+SET track_activities = off;
+SELECT query_id IS NOT NULL AS qid_set FROM pg_stat_activity
+  WHERE pid = pg_backend_pid();
+ qid_set 
+---------
+ f
+(1 row)
+
+RESET track_activities;
+RESET compute_query_id;
 -- Test GUC categories and flag patterns
 SELECT pg_settings_get_flags(NULL);
  pg_settings_get_flags 
diff --git a/src/test/regress/sql/guc.sql b/src/test/regress/sql/guc.sql
index dc79761955..2be7ab2940 100644
--- a/src/test/regress/sql/guc.sql
+++ b/src/test/regress/sql/guc.sql
@@ -319,6 +319,18 @@ set default_with_oids to f;
 -- Should not allow to set it to true.
 set default_with_oids to t;
 
+-- Test that disabling track_activities disables query ID reporting in
+-- pg_stat_activity.
+SET compute_query_id = on;
+SET track_activities = on;
+SELECT query_id IS NOT NULL AS qid_set FROM pg_stat_activity
+  WHERE pid = pg_backend_pid();
+SET track_activities = off;
+SELECT query_id IS NOT NULL AS qid_set FROM pg_stat_activity
+  WHERE pid = pg_backend_pid();
+RESET track_activities;
+RESET compute_query_id;
+
 -- Test GUC categories and flag patterns
 SELECT pg_settings_get_flags(NULL);
 SELECT pg_settings_get_flags('does_not_exist');
-- 
2.45.2

