From 6cae5f3ebfdad3c354b839e0a5d7836875051199 Mon Sep 17 00:00:00 2001
From: "Chao Li (Evan)" <lic@highgo.com>
Date: Wed, 9 Sep 2026 16:14:48 +0800
Subject: [PATCH v2 2/2] Fix command reporting for REPACK using sequential scan
 and sort

pg_stat_progress_cluster uses repack_index_relid to translate REPACK
into CLUSTER or VACUUM FULL. However, this field was set only when an
index scan was used. When REPACK followed an index's ordering using a
sequential scan and sort, the view incorrectly reported VACUUM FULL.

Initialize the field from the requested ordering index when starting
progress reporting, independently of the scan method. Update the
documentation to describe the field's meaning and explain how REPACK
is translated in the compatibility view.

Suggested-by: Fujii Masao <masao.fujii@gmail.com>
Author: Chao Li <lic@highgo.com>
Reviewed-by: Fujii Masao <masao.fujii@gmail.com>
Discussion: https://postgr.es/m/CAN4CZFMzy2V_wvRCBW5K8=wVCk1-C7nq=8otXO=u+s_1KZHqyA@mail.gmail.com
---
 doc/src/sgml/monitoring.sgml             | 13 +++++++------
 src/backend/access/heap/heapam_handler.c | 12 ++----------
 src/backend/commands/repack.c            |  8 +++++++-
 3 files changed, 16 insertions(+), 17 deletions(-)

diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml
index b403fb990a7..48db5aec350 100644
--- a/doc/src/sgml/monitoring.sgml
+++ b/doc/src/sgml/monitoring.sgml
@@ -6787,8 +6787,9 @@ FROM pg_stat_get_backend_idset() AS backendid;
        The command that is running. Either <command>CLUSTER</command> or
        <command>VACUUM FULL</command>.
        Because this view exists for backwards-compatibility purposes only,
-       it will translate any <command>REPACK</command> command into one of
-       these other two.
+       it will translate a <command>REPACK</command> command into
+       <command>CLUSTER</command> if index ordering is requested,
+       or <command>VACUUM FULL</command> otherwise.
       </para></entry>
      </row>
 
@@ -6806,8 +6807,8 @@ FROM pg_stat_get_backend_idset() AS backendid;
        <structfield>cluster_index_relid</structfield> <type>oid</type>
       </para>
       <para>
-       If the table is being scanned using an index, this is the OID of the
-       index being used; otherwise, it is zero.
+       OID of the index defining the order of the rewritten table, or zero
+       if no index ordering is requested.
       </para></entry>
      </row>
 
@@ -7480,8 +7481,8 @@ FROM pg_stat_get_backend_idset() AS backendid;
        <structfield>repack_index_relid</structfield> <type>oid</type>
       </para>
       <para>
-       If the table is being scanned using an index, this is the OID of the
-       index being used; otherwise, it is zero.
+       OID of the index defining the order of the rewritten table, or zero
+       if no index ordering is requested.
       </para></entry>
      </row>
 
diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c
index 0f24a132564..dd2218bbbaf 100644
--- a/src/backend/access/heap/heapam_handler.c
+++ b/src/backend/access/heap/heapam_handler.c
@@ -660,16 +660,8 @@ heapam_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap,
 	 */
 	if (OldIndex != NULL && !use_sort)
 	{
-		const int	ci_index[] = {
-			PROGRESS_REPACK_PHASE,
-			PROGRESS_REPACK_INDEX_RELID
-		};
-		int64		ci_val[2];
-
-		/* Set phase and OIDOldIndex to columns */
-		ci_val[0] = PROGRESS_REPACK_PHASE_INDEX_SCAN_HEAP;
-		ci_val[1] = RelationGetRelid(OldIndex);
-		pgstat_progress_update_multi_param(2, ci_index, ci_val);
+		pgstat_progress_update_param(PROGRESS_REPACK_PHASE,
+									 PROGRESS_REPACK_PHASE_INDEX_SCAN_HEAP);
 
 		tableScan = NULL;
 		heapScan = NULL;
diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c
index 57f28f1a420..6f7c37c39b2 100644
--- a/src/backend/commands/repack.c
+++ b/src/backend/commands/repack.c
@@ -511,6 +511,11 @@ cluster_rel(RepackCommand cmd, Relation OldHeap, Oid indexOid,
 	bool		recheck = ((params->options & CLUOPT_RECHECK) != 0);
 	bool		concurrent = ((params->options & CLUOPT_CONCURRENT) != 0);
 	Oid			ident_idx = InvalidOid;
+	const int	progress_index[] = {
+		PROGRESS_REPACK_COMMAND,
+		PROGRESS_REPACK_INDEX_RELID
+	};
+	const int64 progress_values[] = {cmd, indexOid};
 
 	/* Determine the lock mode to use. */
 	lmode = RepackLockLevel(concurrent);
@@ -526,7 +531,8 @@ cluster_rel(RepackCommand cmd, Relation OldHeap, Oid indexOid,
 	CHECK_FOR_INTERRUPTS();
 
 	pgstat_progress_start_command(PROGRESS_COMMAND_REPACK, tableOid);
-	pgstat_progress_update_param(PROGRESS_REPACK_COMMAND, cmd);
+	/* Report the ordering index even when using a sequential scan and sort. */
+	pgstat_progress_update_multi_param(2, progress_index, progress_values);
 
 	/*
 	 * Switch to the table owner's userid, so that any index functions are run
-- 
2.50.1 (Apple Git-155)

