From 61e82b773e1c21dcb50a298bb205449ff17c90dc Mon Sep 17 00:00:00 2001
From: Ilya Gladyshev <ilya.v.gladyshev@gmail.com>
Date: Sun, 21 Jul 2024 01:40:15 +0100
Subject: [PATCH v2 2/2] partition_relid column for create index progress

---
 doc/src/sgml/monitoring.sgml         |  9 +++++++++
 src/backend/catalog/system_views.sql |  3 ++-
 src/backend/commands/indexcmds.c     | 18 +++++++++++++-----
 src/include/commands/progress.h      |  1 +
 src/test/regress/expected/rules.out  |  3 ++-
 5 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml
index 00bb423288..595f19a8f8 100644
--- a/doc/src/sgml/monitoring.sgml
+++ b/doc/src/sgml/monitoring.sgml
@@ -6006,6 +6006,15 @@ FROM pg_stat_get_backend_idset() AS backendid;
        <literal>0</literal> when the index is not partitioned.
       </para></entry>
      </row>
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+       <structfield>partition_relid</structfield> <type>bigint</type>
+      </para>
+      <para>
+       OID of the partition on which the index is currently being created.
+       <literal>0</literal> when the index is not partitioned.
+      </para></entry>
+     </row>
     </tbody>
    </tgroup>
   </table>
diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql
index 19cabc9a47..00b7f3bda8 100644
--- a/src/backend/catalog/system_views.sql
+++ b/src/backend/catalog/system_views.sql
@@ -1280,7 +1280,8 @@ CREATE VIEW pg_stat_progress_create_index AS
         S.param12 AS tuples_total,
         S.param13 AS tuples_done,
         S.param14 AS partitions_total,
-        S.param15 AS partitions_done
+        S.param15 AS partitions_done,
+        S.param18 AS partition_relid
     FROM pg_stat_get_progress_info('CREATE INDEX') AS S
         LEFT JOIN pg_database D ON S.datid = D.oid;
 
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index d4c1811f50..284f7a919a 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -617,6 +617,10 @@ DefineIndex(Oid tableId,
 									 PROGRESS_CREATEIDX_COMMAND_CREATE_CONCURRENTLY :
 									 PROGRESS_CREATEIDX_COMMAND_CREATE);
 	}
+	else
+	{
+		pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITION_RELID, tableId);
+	}
 
 	/*
 	 * No index OID to report yet
@@ -3486,9 +3490,10 @@ ReindexRelationConcurrently(const ReindexStmt *stmt, Oid relationOid, const Rein
 		PROGRESS_CREATEIDX_COMMAND,
 		PROGRESS_CREATEIDX_PHASE,
 		PROGRESS_CREATEIDX_INDEX_OID,
-		PROGRESS_CREATEIDX_ACCESS_METHOD_OID
+		PROGRESS_CREATEIDX_ACCESS_METHOD_OID,
+		PROGRESS_CREATEIDX_PARTITION_RELID
 	};
-	int64		progress_vals[4];
+	int64		progress_vals[5];
 
 	/*
 	 * Create a memory context that will survive forced transaction commits we
@@ -3832,7 +3837,8 @@ ReindexRelationConcurrently(const ReindexStmt *stmt, Oid relationOid, const Rein
 		progress_vals[1] = 0;	/* initializing */
 		progress_vals[2] = idx->indexId;
 		progress_vals[3] = idx->amId;
-		pgstat_progress_update_multi_param(4, progress_index, progress_vals);
+		progress_vals[4] = partition ? idx->tableId : 0;
+		pgstat_progress_update_multi_param(5, progress_index, progress_vals);
 
 		/* Choose a temporary relation name for the new index */
 		concurrentName = ChooseRelationName(get_rel_name(idx->indexId),
@@ -4007,7 +4013,8 @@ ReindexRelationConcurrently(const ReindexStmt *stmt, Oid relationOid, const Rein
 		progress_vals[1] = PROGRESS_CREATEIDX_PHASE_BUILD;
 		progress_vals[2] = newidx->indexId;
 		progress_vals[3] = newidx->amId;
-		pgstat_progress_update_multi_param(4, progress_index, progress_vals);
+		progress_vals[4] = partition ? newidx->tableId : 0;
+		pgstat_progress_update_multi_param(5, progress_index, progress_vals);
 
 		/* Perform concurrent build of new index */
 		index_concurrently_build(newidx->tableId, newidx->indexId);
@@ -4072,7 +4079,8 @@ ReindexRelationConcurrently(const ReindexStmt *stmt, Oid relationOid, const Rein
 		progress_vals[1] = PROGRESS_CREATEIDX_PHASE_VALIDATE_IDXSCAN;
 		progress_vals[2] = newidx->indexId;
 		progress_vals[3] = newidx->amId;
-		pgstat_progress_update_multi_param(4, progress_index, progress_vals);
+		progress_vals[4] = partition ? newidx->tableId : 0;
+		pgstat_progress_update_multi_param(5, progress_index, progress_vals);
 
 		validate_index(newidx->tableId, newidx->indexId, snapshot);
 
diff --git a/src/include/commands/progress.h b/src/include/commands/progress.h
index 5616d64523..6cd8b41a4c 100644
--- a/src/include/commands/progress.h
+++ b/src/include/commands/progress.h
@@ -89,6 +89,7 @@
 #define PROGRESS_CREATEIDX_PARTITIONS_TOTAL		13
 #define PROGRESS_CREATEIDX_PARTITIONS_DONE		14
 /* 15 and 16 reserved for "block number" metrics */
+#define PROGRESS_CREATEIDX_PARTITION_RELID		17
 
 /* Phases of CREATE INDEX (as advertised via PROGRESS_CREATEIDX_PHASE) */
 #define PROGRESS_CREATEIDX_PHASE_WAIT_1			1
diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out
index 4c789279e5..2bcb72c014 100644
--- a/src/test/regress/expected/rules.out
+++ b/src/test/regress/expected/rules.out
@@ -2027,7 +2027,8 @@ pg_stat_progress_create_index| SELECT s.pid,
     s.param12 AS tuples_total,
     s.param13 AS tuples_done,
     s.param14 AS partitions_total,
-    s.param15 AS partitions_done
+    s.param15 AS partitions_done,
+    s.param18 AS partition_relid
    FROM (pg_stat_get_progress_info('CREATE INDEX'::text) s(pid, datid, relid, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20)
      LEFT JOIN pg_database d ON ((s.datid = d.oid)));
 pg_stat_progress_vacuum| SELECT s.pid,
-- 
2.43.0

