diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index f890e2bc66336aa7c9238ed2ec7d91fef1e0d200..edad1401e452d8f4821b1ab2a6213ddf567d310c 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -2520,7 +2520,7 @@ pgstat_beshutdown_hook(int code, Datum arg)
  * pgstat_report_activity() -
  *
  *	Called from tcop/postgres.c to report what the backend is actually doing
- *	(usually "<IDLE>" or the start of the query to be executed).
+ *	(but note cmd_str can be NULL for certain cases).
  *
  * All updates of the status entry follow the protocol of bumping
  * st_changecount before and after.  We use a volatile pointer here to
@@ -2540,29 +2540,32 @@ pgstat_report_activity(BackendState state, const char *cmd_str)
 	if (!beentry)
 		return;
 
-	/*
-	 * To minimize the time spent modifying the entry, fetch all the needed
-	 * data first.
-	 */
-	current_timestamp = GetCurrentTimestamp();
-
-	if (!pgstat_track_activities && beentry->st_state != STATE_DISABLED)
+	if (!pgstat_track_activities)
 	{
-		/*
-		 * Track activities is disabled, but we have a non-disabled state set.
-		 * That means the status changed - so as our last update, tell the
-		 * collector that we disabled it and will no longer update.
-		 */
-		beentry->st_changecount++;
-		beentry->st_state = STATE_DISABLED;
-		beentry->st_state_start_timestamp = current_timestamp;
-		beentry->st_changecount++;
-		Assert((beentry->st_changecount & 1) == 0);
+		if (beentry->st_state != STATE_DISABLED)
+		{
+			/*
+			 * track_activities is disabled, but we last reported a
+			 * non-disabled state.  As our final update, change the state and
+			 * clear fields we will not be updating anymore.
+			 */
+			beentry->st_changecount++;
+			beentry->st_state = STATE_DISABLED;
+			beentry->st_state_start_timestamp = 0;
+			beentry->st_activity[0] = '\0';
+			beentry->st_activity_start_timestamp = 0;
+			/* st_xact_start_timestamp and st_waiting are also disabled */
+			beentry->st_xact_start_timestamp = 0;
+			beentry->st_waiting = false;
+			beentry->st_changecount++;
+			Assert((beentry->st_changecount & 1) == 0);
+		}
 		return;
 	}
 
 	/*
-	 * Fetch more data before we start modifying the entry
+	 * To minimize the time spent modifying the entry, fetch all the needed
+	 * data first.
 	 */
 	start_timestamp = GetCurrentStatementStartTimestamp();
 	if (cmd_str != NULL)
@@ -2570,6 +2573,7 @@ pgstat_report_activity(BackendState state, const char *cmd_str)
 		len = pg_mbcliplen(cmd_str, strlen(cmd_str),
 						   pgstat_track_activity_query_size - 1);
 	}
+	current_timestamp = GetCurrentTimestamp();
 
 	/*
 	 * Now update the status entry
diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c
index 7c0705abcc9eb355e2df71b5ec9e11e81ce9f7ec..6f2514748572c8bfd91d56d33964078136a8e8ad 100644
--- a/src/backend/utils/adt/pgstatfuncs.c
+++ b/src/backend/utils/adt/pgstatfuncs.c
@@ -665,15 +665,8 @@ pg_stat_get_activity(PG_FUNCTION_ARGS)
 					nulls[4] = true;
 					break;
 			}
-			if (beentry->st_state == STATE_UNDEFINED ||
-				beentry->st_state == STATE_DISABLED)
-			{
-				values[5] = CStringGetTextDatum("");
-			}
-			else
-			{
-				values[5] = CStringGetTextDatum(beentry->st_activity);
-			}
+
+			values[5] = CStringGetTextDatum(beentry->st_activity);
 			values[6] = BoolGetDatum(beentry->st_waiting);
 
 			if (beentry->st_xact_start_timestamp != 0)