diff --git a/src/backend/access/hash/hash.c b/src/backend/access/hash/hash.c
index 5cc30da..1cbd336 100644
--- a/src/backend/access/hash/hash.c
+++ b/src/backend/access/hash/hash.c
@@ -166,7 +166,8 @@ hashbuild(Relation heap, Relation index, IndexInfo *indexInfo)
 	reltuples = table_index_build_scan(heap, index, indexInfo, true, true,
 									   hashbuildCallback,
 									   (void *) &buildstate, NULL);
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_TUPLES_TOTAL,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_TUPLES_TOTAL,
 								 buildstate.indtuples);
 
 	if (buildstate.spool)
diff --git a/src/backend/access/hash/hashsort.c b/src/backend/access/hash/hashsort.c
index 293f80f..98653d4 100644
--- a/src/backend/access/hash/hashsort.c
+++ b/src/backend/access/hash/hashsort.c
@@ -145,7 +145,8 @@ _h_indexbuild(HSpool *hspool, Relation heapRel)
 
 		_hash_doinsert(hspool->index, itup, heapRel);
 
-		pgstat_progress_update_param(PROGRESS_CREATEIDX_TUPLES_DONE,
+		pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+									 PROGRESS_CREATEIDX_TUPLES_DONE,
 									 ++tups_done);
 	}
 }
diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c
index fc19f40..6f086b1 100644
--- a/src/backend/access/heap/heapam_handler.c
+++ b/src/backend/access/heap/heapam_handler.c
@@ -759,7 +759,8 @@ heapam_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap,
 		/* Set phase and OIDOldIndex to columns */
 		ci_val[0] = PROGRESS_CLUSTER_PHASE_INDEX_SCAN_HEAP;
 		ci_val[1] = RelationGetRelid(OldIndex);
-		pgstat_progress_update_multi_param(2, ci_index, ci_val);
+		pgstat_progress_update_multi_param(PROGRESS_COMMAND_CLUSTER,
+										   2, ci_index, ci_val);
 
 		tableScan = NULL;
 		heapScan = NULL;
@@ -769,7 +770,8 @@ heapam_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap,
 	else
 	{
 		/* In scan-and-sort mode and also VACUUM FULL, set phase */
-		pgstat_progress_update_param(PROGRESS_CLUSTER_PHASE,
+		pgstat_progress_update_param(PROGRESS_COMMAND_CLUSTER,
+									 PROGRESS_CLUSTER_PHASE,
 									 PROGRESS_CLUSTER_PHASE_SEQ_SCAN_HEAP);
 
 		tableScan = table_beginscan(OldHeap, SnapshotAny, 0, (ScanKey) NULL);
@@ -777,7 +779,8 @@ heapam_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap,
 		indexScan = NULL;
 
 		/* Set total heap blocks */
-		pgstat_progress_update_param(PROGRESS_CLUSTER_TOTAL_HEAP_BLKS,
+		pgstat_progress_update_param(PROGRESS_COMMAND_CLUSTER,
+									 PROGRESS_CLUSTER_TOTAL_HEAP_BLKS,
 									 heapScan->rs_nblocks);
 	}
 
@@ -816,7 +819,8 @@ heapam_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap,
 			 * In scan-and-sort mode and also VACUUM FULL, set heap blocks
 			 * scanned
 			 */
-			pgstat_progress_update_param(PROGRESS_CLUSTER_HEAP_BLKS_SCANNED,
+			pgstat_progress_update_param(PROGRESS_COMMAND_CLUSTER,
+										 PROGRESS_CLUSTER_HEAP_BLKS_SCANNED,
 										 heapScan->rs_cblock + 1);
 		}
 
@@ -898,7 +902,8 @@ heapam_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap,
 			 * In scan-and-sort mode, report increase in number of tuples
 			 * scanned
 			 */
-			pgstat_progress_update_param(PROGRESS_CLUSTER_HEAP_TUPLES_SCANNED,
+			pgstat_progress_update_param(PROGRESS_COMMAND_CLUSTER,
+										 PROGRESS_CLUSTER_HEAP_TUPLES_SCANNED,
 										 *num_tuples);
 		}
 		else
@@ -918,7 +923,8 @@ heapam_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap,
 			 */
 			ct_val[0] = *num_tuples;
 			ct_val[1] = *num_tuples;
-			pgstat_progress_update_multi_param(2, ct_index, ct_val);
+			pgstat_progress_update_multi_param(PROGRESS_COMMAND_CLUSTER,
+											   2, ct_index, ct_val);
 		}
 	}
 
@@ -938,13 +944,15 @@ heapam_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap,
 		double		n_tuples = 0;
 
 		/* Report that we are now sorting tuples */
-		pgstat_progress_update_param(PROGRESS_CLUSTER_PHASE,
+		pgstat_progress_update_param(PROGRESS_COMMAND_CLUSTER,
+									 PROGRESS_CLUSTER_PHASE,
 									 PROGRESS_CLUSTER_PHASE_SORT_TUPLES);
 
 		tuplesort_performsort(tuplesort);
 
 		/* Report that we are now writing new heap */
-		pgstat_progress_update_param(PROGRESS_CLUSTER_PHASE,
+		pgstat_progress_update_param(PROGRESS_COMMAND_CLUSTER,
+									 PROGRESS_CLUSTER_PHASE,
 									 PROGRESS_CLUSTER_PHASE_WRITE_NEW_HEAP);
 
 		for (;;)
@@ -963,7 +971,8 @@ heapam_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap,
 									 values, isnull,
 									 rwstate);
 			/* Report n_tuples */
-			pgstat_progress_update_param(PROGRESS_CLUSTER_HEAP_TUPLES_WRITTEN,
+			pgstat_progress_update_param(PROGRESS_COMMAND_CLUSTER,
+										 PROGRESS_CLUSTER_HEAP_TUPLES_WRITTEN,
 										 n_tuples);
 		}
 
@@ -1276,7 +1285,8 @@ heapam_index_build_range_scan(Relation heapRelation,
 		else
 			nblocks = hscan->rs_nblocks;
 
-		pgstat_progress_update_param(PROGRESS_SCAN_BLOCKS_TOTAL,
+		pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+									 PROGRESS_SCAN_BLOCKS_TOTAL,
 									 nblocks);
 	}
 
@@ -1319,7 +1329,8 @@ heapam_index_build_range_scan(Relation heapRelation,
 
 			if (blocks_done != previous_blkno)
 			{
-				pgstat_progress_update_param(PROGRESS_SCAN_BLOCKS_DONE,
+				pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+											 PROGRESS_SCAN_BLOCKS_DONE,
 											 blocks_done);
 				previous_blkno = blocks_done;
 			}
@@ -1681,7 +1692,8 @@ heapam_index_build_range_scan(Relation heapRelation,
 		else
 			blks_done = hscan->rs_nblocks;
 
-		pgstat_progress_update_param(PROGRESS_SCAN_BLOCKS_DONE,
+		pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+									 PROGRESS_SCAN_BLOCKS_DONE,
 									 blks_done);
 	}
 
@@ -1762,7 +1774,8 @@ heapam_index_validate_scan(Relation heapRelation,
 								 false);	/* syncscan not OK */
 	hscan = (HeapScanDesc) scan;
 
-	pgstat_progress_update_param(PROGRESS_SCAN_BLOCKS_TOTAL,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_SCAN_BLOCKS_TOTAL,
 								 hscan->rs_nblocks);
 
 	/*
@@ -1781,7 +1794,8 @@ heapam_index_validate_scan(Relation heapRelation,
 		if ((previous_blkno == InvalidBlockNumber) ||
 			(hscan->rs_cblock != previous_blkno))
 		{
-			pgstat_progress_update_param(PROGRESS_SCAN_BLOCKS_DONE,
+			pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+										 PROGRESS_SCAN_BLOCKS_DONE,
 										 hscan->rs_cblock);
 			previous_blkno = hscan->rs_cblock;
 		}
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index a3c4a1d..b7d4840 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -268,7 +268,7 @@ heap_vacuum_rel(Relation onerel, VacuumParams *params,
 						get_database_name(MyDatabaseId),
 						get_namespace_name(RelationGetNamespace(onerel)),
 						RelationGetRelationName(onerel))));
-		pgstat_progress_end_command();
+		pgstat_progress_end_command(PROGRESS_COMMAND_VACUUM);
 		return;
 	}
 
@@ -314,7 +314,8 @@ heap_vacuum_rel(Relation onerel, VacuumParams *params,
 		lazy_truncate_heap(onerel, vacrelstats);
 
 	/* Report that we are now doing final cleanup */
-	pgstat_progress_update_param(PROGRESS_VACUUM_PHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_VACUUM,
+								 PROGRESS_VACUUM_PHASE,
 								 PROGRESS_VACUUM_PHASE_FINAL_CLEANUP);
 
 	/*
@@ -367,7 +368,7 @@ heap_vacuum_rel(Relation onerel, VacuumParams *params,
 						 onerel->rd_rel->relisshared,
 						 new_live_tuples,
 						 vacrelstats->new_dead_tuples);
-	pgstat_progress_end_command();
+	pgstat_progress_end_command(PROGRESS_COMMAND_VACUUM);
 
 	/* and log the action if appropriate */
 	if (IsAutoVacuumWorkerProcess() && params->log_min_duration >= 0)
@@ -560,7 +561,8 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
 	initprog_val[0] = PROGRESS_VACUUM_PHASE_SCAN_HEAP;
 	initprog_val[1] = nblocks;
 	initprog_val[2] = vacrelstats->max_dead_tuples;
-	pgstat_progress_update_multi_param(3, initprog_index, initprog_val);
+	pgstat_progress_update_multi_param(PROGRESS_COMMAND_VACUUM,
+									   3, initprog_index, initprog_val);
 
 	/*
 	 * Except when aggressive is set, we want to skip pages that are
@@ -656,7 +658,8 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
 #define FORCE_CHECK_PAGE() \
 		(blkno == nblocks - 1 && should_attempt_truncation(params, vacrelstats))
 
-		pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno);
+		pgstat_progress_update_param(PROGRESS_COMMAND_VACUUM,
+									 PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno);
 
 		if (blkno == next_unskippable_block)
 		{
@@ -762,7 +765,8 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
 			vacuum_log_cleanup_info(onerel, vacrelstats);
 
 			/* Report that we are now vacuuming indexes */
-			pgstat_progress_update_param(PROGRESS_VACUUM_PHASE,
+			pgstat_progress_update_param(PROGRESS_COMMAND_VACUUM,
+										 PROGRESS_VACUUM_PHASE,
 										 PROGRESS_VACUUM_PHASE_VACUUM_INDEX);
 
 			/* Remove index entries */
@@ -779,7 +783,8 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
 			 */
 			hvp_val[0] = PROGRESS_VACUUM_PHASE_VACUUM_HEAP;
 			hvp_val[1] = vacrelstats->num_index_scans + 1;
-			pgstat_progress_update_multi_param(2, hvp_index, hvp_val);
+			pgstat_progress_update_multi_param(PROGRESS_COMMAND_VACUUM,
+											   2, hvp_index, hvp_val);
 
 			/* Remove tuples from heap */
 			lazy_vacuum_heap(onerel, vacrelstats);
@@ -800,7 +805,8 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
 			next_fsm_block_to_vacuum = blkno;
 
 			/* Report that we are once again scanning the heap */
-			pgstat_progress_update_param(PROGRESS_VACUUM_PHASE,
+			pgstat_progress_update_param(PROGRESS_COMMAND_VACUUM,
+										 PROGRESS_VACUUM_PHASE,
 										 PROGRESS_VACUUM_PHASE_SCAN_HEAP);
 		}
 
@@ -1389,7 +1395,8 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
 	}
 
 	/* report that everything is scanned and vacuumed */
-	pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno);
+	pgstat_progress_update_param(PROGRESS_COMMAND_VACUUM,
+								 PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno);
 
 	pfree(frozen);
 
@@ -1430,7 +1437,8 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
 		vacuum_log_cleanup_info(onerel, vacrelstats);
 
 		/* Report that we are now vacuuming indexes */
-		pgstat_progress_update_param(PROGRESS_VACUUM_PHASE,
+		pgstat_progress_update_param(PROGRESS_COMMAND_VACUUM,
+									 PROGRESS_VACUUM_PHASE,
 									 PROGRESS_VACUUM_PHASE_VACUUM_INDEX);
 
 		/* Remove index entries */
@@ -1442,10 +1450,12 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
 		/* Report that we are now vacuuming the heap */
 		hvp_val[0] = PROGRESS_VACUUM_PHASE_VACUUM_HEAP;
 		hvp_val[1] = vacrelstats->num_index_scans + 1;
-		pgstat_progress_update_multi_param(2, hvp_index, hvp_val);
+		pgstat_progress_update_multi_param(PROGRESS_COMMAND_VACUUM,
+										   2, hvp_index, hvp_val);
 
 		/* Remove tuples from heap */
-		pgstat_progress_update_param(PROGRESS_VACUUM_PHASE,
+		pgstat_progress_update_param(PROGRESS_COMMAND_VACUUM,
+									 PROGRESS_VACUUM_PHASE,
 									 PROGRESS_VACUUM_PHASE_VACUUM_HEAP);
 		lazy_vacuum_heap(onerel, vacrelstats);
 		vacrelstats->num_index_scans++;
@@ -1459,8 +1469,10 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
 		FreeSpaceMapVacuumRange(onerel, next_fsm_block_to_vacuum, blkno);
 
 	/* report all blocks vacuumed; and that we're cleaning up */
-	pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_VACUUMED, blkno);
-	pgstat_progress_update_param(PROGRESS_VACUUM_PHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_VACUUM,
+								 PROGRESS_VACUUM_HEAP_BLKS_VACUUMED, blkno);
+	pgstat_progress_update_param(PROGRESS_COMMAND_VACUUM,
+								 PROGRESS_VACUUM_PHASE,
 								 PROGRESS_VACUUM_PHASE_INDEX_CLEANUP);
 
 	/* Do post-vacuum cleanup and statistics update for each index */
@@ -1597,7 +1609,8 @@ lazy_vacuum_page(Relation onerel, BlockNumber blkno, Buffer buffer,
 	TransactionId visibility_cutoff_xid;
 	bool		all_frozen;
 
-	pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_VACUUMED, blkno);
+	pgstat_progress_update_param(PROGRESS_COMMAND_VACUUM,
+								 PROGRESS_VACUUM_HEAP_BLKS_VACUUMED, blkno);
 
 	START_CRIT_SECTION();
 
@@ -1880,7 +1893,8 @@ lazy_truncate_heap(Relation onerel, LVRelStats *vacrelstats)
 	pg_rusage_init(&ru0);
 
 	/* Report that we are now truncating */
-	pgstat_progress_update_param(PROGRESS_VACUUM_PHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_VACUUM,
+								 PROGRESS_VACUUM_PHASE,
 								 PROGRESS_VACUUM_PHASE_TRUNCATE);
 
 	/*
@@ -2186,7 +2200,8 @@ lazy_record_dead_tuple(LVRelStats *vacrelstats,
 	{
 		vacrelstats->dead_tuples[vacrelstats->num_dead_tuples] = *itemptr;
 		vacrelstats->num_dead_tuples++;
-		pgstat_progress_update_param(PROGRESS_VACUUM_NUM_DEAD_TUPLES,
+		pgstat_progress_update_param(PROGRESS_COMMAND_VACUUM,
+									 PROGRESS_VACUUM_NUM_DEAD_TUPLES,
 									 vacrelstats->num_dead_tuples);
 	}
 }
diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c
index 4cfd528..028afb1 100644
--- a/src/backend/access/nbtree/nbtree.c
+++ b/src/backend/access/nbtree/nbtree.c
@@ -1024,7 +1024,8 @@ btvacuumscan(IndexVacuumInfo *info, IndexBulkDeleteResult *stats,
 			UnlockRelationForExtension(rel, ExclusiveLock);
 
 		if (info->report_progress)
-			pgstat_progress_update_param(PROGRESS_SCAN_BLOCKS_TOTAL,
+			pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+										 PROGRESS_SCAN_BLOCKS_TOTAL,
 										 num_pages);
 
 		/* Quit if we've scanned the whole relation */
@@ -1035,7 +1036,8 @@ btvacuumscan(IndexVacuumInfo *info, IndexBulkDeleteResult *stats,
 		{
 			btvacuumpage(&vstate, blkno, blkno);
 			if (info->report_progress)
-				pgstat_progress_update_param(PROGRESS_SCAN_BLOCKS_DONE,
+				pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+											 PROGRESS_SCAN_BLOCKS_DONE,
 											 blkno);
 		}
 	}
diff --git a/src/backend/access/nbtree/nbtsort.c b/src/backend/access/nbtree/nbtsort.c
index d0b9013..a4582cc 100644
--- a/src/backend/access/nbtree/nbtsort.c
+++ b/src/backend/access/nbtree/nbtsort.c
@@ -397,7 +397,8 @@ _bt_spools_heapscan(Relation heap, Relation index, BTBuildState *buildstate,
 	buildstate->spool = btspool;
 
 	/* Report table scan phase started */
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_SUBPHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_SUBPHASE,
 								 PROGRESS_BTREE_PHASE_INDEXBUILD_TABLESCAN);
 
 	/* Attempt to launch parallel worker scan when required */
@@ -508,7 +509,8 @@ _bt_spools_heapscan(Relation heap, Relation index, BTBuildState *buildstate,
 			0, 0
 		};
 
-		pgstat_progress_update_multi_param(3, index, val);
+		pgstat_progress_update_multi_param(PROGRESS_COMMAND_CREATE_INDEX,
+										   3, index, val);
 	}
 
 	/* okay, all heap tuples are spooled */
@@ -559,12 +561,14 @@ _bt_leafbuild(BTSpool *btspool, BTSpool *btspool2)
 	}
 #endif							/* BTREE_BUILD_STATS */
 
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_SUBPHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_SUBPHASE,
 								 PROGRESS_BTREE_PHASE_PERFORMSORT_1);
 	tuplesort_performsort(btspool->sortstate);
 	if (btspool2)
 	{
-		pgstat_progress_update_param(PROGRESS_CREATEIDX_SUBPHASE,
+		pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+									 PROGRESS_CREATEIDX_SUBPHASE,
 									 PROGRESS_BTREE_PHASE_PERFORMSORT_2);
 		tuplesort_performsort(btspool2->sortstate);
 	}
@@ -584,7 +588,8 @@ _bt_leafbuild(BTSpool *btspool, BTSpool *btspool2)
 	wstate.btws_pages_written = 0;
 	wstate.btws_zeropage = NULL;	/* until needed */
 
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_SUBPHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_SUBPHASE,
 								 PROGRESS_BTREE_PHASE_LEAF_LOAD);
 	_bt_load(&wstate, btspool, btspool2);
 }
@@ -1259,7 +1264,8 @@ _bt_load(BTWriteState *wstate, BTSpool *btspool, BTSpool *btspool2)
 			}
 
 			/* Report progress */
-			pgstat_progress_update_param(PROGRESS_CREATEIDX_TUPLES_DONE,
+			pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+										 PROGRESS_CREATEIDX_TUPLES_DONE,
 										 ++tuples_done);
 		}
 		pfree(sortKeys);
@@ -1277,7 +1283,8 @@ _bt_load(BTWriteState *wstate, BTSpool *btspool, BTSpool *btspool2)
 			_bt_buildadd(wstate, state, itup);
 
 			/* Report progress */
-			pgstat_progress_update_param(PROGRESS_CREATEIDX_TUPLES_DONE,
+			pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+										 PROGRESS_CREATEIDX_TUPLES_DONE,
 										 ++tuples_done);
 		}
 	}
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index c87524e..fe30835 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -2584,7 +2584,8 @@ AbortTransaction(void)
 
 	/* Clear wait information and command progress indicator */
 	pgstat_report_wait_end();
-	pgstat_progress_end_command();
+
+	pgstat_progress_end_command(PROGRESS_COMMAND_INVALID);
 
 	/* Clean up buffer I/O and buffer context locks, too */
 	AbortBufferIO();
@@ -4896,7 +4897,7 @@ AbortSubTransaction(void)
 	LWLockReleaseAll();
 
 	pgstat_report_wait_end();
-	pgstat_progress_end_command();
+	pgstat_progress_end_command(PROGRESS_COMMAND_INVALID);
 	AbortBufferIO();
 	UnlockBuffers();
 
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 795597b..ac15986 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -2779,7 +2779,8 @@ index_build(Relation heapRelation,
 			0, 0, 0, 0
 		};
 
-		pgstat_progress_update_multi_param(6, index, val);
+		pgstat_progress_update_multi_param(PROGRESS_COMMAND_CREATE_INDEX,
+										   6, index, val);
 	}
 
 	/*
@@ -3083,7 +3084,8 @@ validate_index(Oid heapId, Oid indexId, Snapshot snapshot)
 			0, 0, 0, 0
 		};
 
-		pgstat_progress_update_multi_param(5, index, val);
+		pgstat_progress_update_multi_param(PROGRESS_COMMAND_CREATE_INDEX,
+										   5, index, val);
 	}
 
 	/* Open and lock the parent heap relation */
@@ -3150,14 +3152,16 @@ validate_index(Oid heapId, Oid indexId, Snapshot snapshot)
 			0, 0
 		};
 
-		pgstat_progress_update_multi_param(3, index, val);
+		pgstat_progress_update_multi_param(PROGRESS_COMMAND_CREATE_INDEX,
+										   3, index, val);
 	}
 	tuplesort_performsort(state.tuplesort);
 
 	/*
 	 * Now scan the heap and "merge" it with the index
 	 */
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_PHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_PHASE,
 								 PROGRESS_CREATEIDX_PHASE_VALIDATE_TABLESCAN);
 	table_index_validate_scan(heapRelation,
 							  indexRelation,
@@ -3340,9 +3344,11 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence,
 
 	pgstat_progress_start_command(PROGRESS_COMMAND_CREATE_INDEX,
 								  heapId);
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_COMMAND,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_COMMAND,
 								 PROGRESS_CREATEIDX_COMMAND_REINDEX);
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_INDEX_OID,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_INDEX_OID,
 								 indexId);
 
 	/*
@@ -3351,7 +3357,8 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence,
 	 */
 	iRel = index_open(indexId, AccessExclusiveLock);
 
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_ACCESS_METHOD_OID,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_ACCESS_METHOD_OID,
 								 iRel->rd_rel->relam);
 
 	/*
@@ -3505,7 +3512,7 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence,
 				 errdetail_internal("%s",
 									pg_rusage_show(&ru0))));
 
-	pgstat_progress_end_command();
+	pgstat_progress_end_command(PROGRESS_COMMAND_CREATE_INDEX);
 
 	/* Close rels, but keep locks */
 	index_close(iRel, NoLock);
@@ -3631,7 +3638,8 @@ reindex_relation(Oid relid, int flags, int options)
 			Assert(!ReindexIsProcessingIndex(indexOid));
 
 			/* Set index rebuild count */
-			pgstat_progress_update_param(PROGRESS_CLUSTER_INDEX_REBUILD_COUNT,
+			pgstat_progress_update_param(PROGRESS_COMMAND_CLUSTER,
+										 PROGRESS_CLUSTER_INDEX_REBUILD_COUNT,
 										 i);
 			i++;
 		}
diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c
index ebaec4f..7f276e0 100644
--- a/src/backend/commands/cluster.c
+++ b/src/backend/commands/cluster.c
@@ -274,10 +274,12 @@ cluster_rel(Oid tableOid, Oid indexOid, int options)
 
 	pgstat_progress_start_command(PROGRESS_COMMAND_CLUSTER, tableOid);
 	if (OidIsValid(indexOid))
-		pgstat_progress_update_param(PROGRESS_CLUSTER_COMMAND,
+		pgstat_progress_update_param(PROGRESS_COMMAND_CLUSTER,
+									 PROGRESS_CLUSTER_COMMAND,
 									 PROGRESS_CLUSTER_COMMAND_CLUSTER);
 	else
-		pgstat_progress_update_param(PROGRESS_CLUSTER_COMMAND,
+		pgstat_progress_update_param(PROGRESS_COMMAND_CLUSTER,
+									 PROGRESS_CLUSTER_COMMAND,
 									 PROGRESS_CLUSTER_COMMAND_VACUUM_FULL);
 
 	/*
@@ -291,7 +293,7 @@ cluster_rel(Oid tableOid, Oid indexOid, int options)
 	/* If the table has gone away, we can skip processing it */
 	if (!OldHeap)
 	{
-		pgstat_progress_end_command();
+		pgstat_progress_end_command(PROGRESS_COMMAND_CLUSTER);
 		return;
 	}
 
@@ -312,7 +314,7 @@ cluster_rel(Oid tableOid, Oid indexOid, int options)
 		if (!pg_class_ownercheck(tableOid, GetUserId()))
 		{
 			relation_close(OldHeap, AccessExclusiveLock);
-			pgstat_progress_end_command();
+			pgstat_progress_end_command(PROGRESS_COMMAND_CLUSTER);
 			return;
 		}
 
@@ -327,7 +329,7 @@ cluster_rel(Oid tableOid, Oid indexOid, int options)
 		if (RELATION_IS_OTHER_TEMP(OldHeap))
 		{
 			relation_close(OldHeap, AccessExclusiveLock);
-			pgstat_progress_end_command();
+			pgstat_progress_end_command(PROGRESS_COMMAND_CLUSTER);
 			return;
 		}
 
@@ -339,7 +341,7 @@ cluster_rel(Oid tableOid, Oid indexOid, int options)
 			if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(indexOid)))
 			{
 				relation_close(OldHeap, AccessExclusiveLock);
-				pgstat_progress_end_command();
+				pgstat_progress_end_command(PROGRESS_COMMAND_CLUSTER);
 				return;
 			}
 
@@ -350,7 +352,7 @@ cluster_rel(Oid tableOid, Oid indexOid, int options)
 			if (!HeapTupleIsValid(tuple))	/* probably can't happen */
 			{
 				relation_close(OldHeap, AccessExclusiveLock);
-				pgstat_progress_end_command();
+				pgstat_progress_end_command(PROGRESS_COMMAND_CLUSTER);
 				return;
 			}
 			indexForm = (Form_pg_index) GETSTRUCT(tuple);
@@ -358,7 +360,7 @@ cluster_rel(Oid tableOid, Oid indexOid, int options)
 			{
 				ReleaseSysCache(tuple);
 				relation_close(OldHeap, AccessExclusiveLock);
-				pgstat_progress_end_command();
+				pgstat_progress_end_command(PROGRESS_COMMAND_CLUSTER);
 				return;
 			}
 			ReleaseSysCache(tuple);
@@ -413,7 +415,7 @@ cluster_rel(Oid tableOid, Oid indexOid, int options)
 		!RelationIsPopulated(OldHeap))
 	{
 		relation_close(OldHeap, AccessExclusiveLock);
-		pgstat_progress_end_command();
+		pgstat_progress_end_command(PROGRESS_COMMAND_CLUSTER);
 		return;
 	}
 
@@ -430,7 +432,7 @@ cluster_rel(Oid tableOid, Oid indexOid, int options)
 
 	/* NB: rebuild_relation does table_close() on OldHeap */
 
-	pgstat_progress_end_command();
+	pgstat_progress_end_command(PROGRESS_COMMAND_CLUSTER);
 }
 
 /*
@@ -1353,7 +1355,8 @@ finish_heap_swap(Oid OIDOldHeap, Oid OIDNewHeap,
 	int			i;
 
 	/* Report that we are now swapping relation files */
-	pgstat_progress_update_param(PROGRESS_CLUSTER_PHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CLUSTER,
+								 PROGRESS_CLUSTER_PHASE,
 								 PROGRESS_CLUSTER_PHASE_SWAP_REL_FILES);
 
 	/* Zero out possible results from swapped_relation_files */
@@ -1404,13 +1407,15 @@ finish_heap_swap(Oid OIDOldHeap, Oid OIDNewHeap,
 		reindex_flags |= REINDEX_REL_FORCE_INDEXES_PERMANENT;
 
 	/* Report that we are now reindexing relations */
-	pgstat_progress_update_param(PROGRESS_CLUSTER_PHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CLUSTER,
+								 PROGRESS_CLUSTER_PHASE,
 								 PROGRESS_CLUSTER_PHASE_REBUILD_INDEX);
 
 	reindex_relation(OIDOldHeap, reindex_flags, 0);
 
 	/* Report that we are now doing clean up */
-	pgstat_progress_update_param(PROGRESS_CLUSTER_PHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CLUSTER,
+								 PROGRESS_CLUSTER_PHASE,
 								 PROGRESS_CLUSTER_PHASE_FINAL_CLEANUP);
 
 	/*
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index cbac314..a746d4a 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -347,7 +347,8 @@ WaitForOlderSnapshots(TransactionId limitXmin, bool progress)
 										  PROC_IS_AUTOVACUUM | PROC_IN_VACUUM,
 										  &n_old_snapshots);
 	if (progress)
-		pgstat_progress_update_param(PROGRESS_WAITFOR_TOTAL, n_old_snapshots);
+		pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+									 PROGRESS_WAITFOR_TOTAL, n_old_snapshots);
 
 	for (i = 0; i < n_old_snapshots; i++)
 	{
@@ -388,14 +389,16 @@ WaitForOlderSnapshots(TransactionId limitXmin, bool progress)
 			{
 				PGPROC	   *holder = BackendIdGetProc(old_snapshots[i].backendId);
 
-				pgstat_progress_update_param(PROGRESS_WAITFOR_CURRENT_PID,
+				pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+											 PROGRESS_WAITFOR_CURRENT_PID,
 											 holder->pid);
 			}
 			VirtualXactLock(old_snapshots[i], true);
 		}
 
 		if (progress)
-			pgstat_progress_update_param(PROGRESS_WAITFOR_DONE, i + 1);
+			pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+										 PROGRESS_WAITFOR_DONE, i + 1);
 	}
 }
 
@@ -491,7 +494,8 @@ DefineIndex(Oid relationId,
 	{
 		pgstat_progress_start_command(PROGRESS_COMMAND_CREATE_INDEX,
 									  relationId);
-		pgstat_progress_update_param(PROGRESS_CREATEIDX_COMMAND,
+		pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+									 PROGRESS_CREATEIDX_COMMAND,
 									 stmt->concurrent ?
 									 PROGRESS_CREATEIDX_COMMAND_CREATE_CONCURRENTLY :
 									 PROGRESS_CREATEIDX_COMMAND_CREATE);
@@ -500,7 +504,8 @@ DefineIndex(Oid relationId,
 	/*
 	 * No index OID to report yet
 	 */
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_INDEX_OID,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_INDEX_OID,
 								 InvalidOid);
 
 	/*
@@ -724,7 +729,8 @@ DefineIndex(Oid relationId,
 	accessMethodId = accessMethodForm->oid;
 	amRoutine = GetIndexAmRoutine(accessMethodForm->amhandler);
 
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_ACCESS_METHOD_OID,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_ACCESS_METHOD_OID,
 								 accessMethodId);
 
 	if (stmt->unique && !amRoutine->amcanunique)
@@ -1007,7 +1013,7 @@ DefineIndex(Oid relationId,
 
 		/* If this is the top-level index, we're done */
 		if (!OidIsValid(parentIndexId))
-			pgstat_progress_end_command();
+			pgstat_progress_end_command(PROGRESS_COMMAND_CREATE_INDEX);
 
 		return address;
 	}
@@ -1034,7 +1040,8 @@ DefineIndex(Oid relationId,
 			TupleDesc	parentDesc;
 			Oid		   *opfamOids;
 
-			pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_TOTAL,
+			pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+										 PROGRESS_CREATEIDX_PARTITIONS_TOTAL,
 										 nparts);
 
 			memcpy(part_oids, partdesc->oids, sizeof(Oid) * nparts);
@@ -1214,7 +1221,8 @@ DefineIndex(Oid relationId,
 								skip_build, quiet);
 				}
 
-				pgstat_progress_update_param(PROGRESS_CREATEIDX_PARTITIONS_DONE,
+				pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+											 PROGRESS_CREATEIDX_PARTITIONS_DONE,
 											 i + 1);
 				pfree(attmap);
 			}
@@ -1250,7 +1258,7 @@ DefineIndex(Oid relationId,
 		 */
 		table_close(rel, NoLock);
 		if (!OidIsValid(parentIndexId))
-			pgstat_progress_end_command();
+			pgstat_progress_end_command(PROGRESS_COMMAND_CREATE_INDEX);
 		return address;
 	}
 
@@ -1261,7 +1269,7 @@ DefineIndex(Oid relationId,
 
 		/* If this is the top-level index, we're done. */
 		if (!OidIsValid(parentIndexId))
-			pgstat_progress_end_command();
+			pgstat_progress_end_command(PROGRESS_COMMAND_CREATE_INDEX);
 
 		return address;
 	}
@@ -1301,7 +1309,8 @@ DefineIndex(Oid relationId,
 	/*
 	 * The index is now visible, so we can report the OID.
 	 */
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_INDEX_OID,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_INDEX_OID,
 								 indexRelationId);
 
 	/*
@@ -1320,7 +1329,8 @@ DefineIndex(Oid relationId,
 	 * exclusive lock on our table.  The lock code will detect deadlock and
 	 * error out properly.
 	 */
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_PHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_PHASE,
 								 PROGRESS_CREATEIDX_PHASE_WAIT_1);
 	WaitForLockers(heaplocktag, ShareLock, true);
 
@@ -1363,7 +1373,8 @@ DefineIndex(Oid relationId,
 	 * We once again wait until no transaction can have the table open with
 	 * the index marked as read-only for updates.
 	 */
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_PHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_PHASE,
 								 PROGRESS_CREATEIDX_PHASE_WAIT_2);
 	WaitForLockers(heaplocktag, ShareLock, true);
 
@@ -1422,7 +1433,8 @@ DefineIndex(Oid relationId,
 	 * before the reference snap was taken, we have to wait out any
 	 * transactions that might have older snapshots.
 	 */
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_PHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_PHASE,
 								 PROGRESS_CREATEIDX_PHASE_WAIT_3);
 	WaitForOlderSnapshots(limitXmin, true);
 
@@ -1446,7 +1458,7 @@ DefineIndex(Oid relationId,
 	 */
 	UnlockRelationIdForSession(&heaprelid, ShareUpdateExclusiveLock);
 
-	pgstat_progress_end_command();
+	pgstat_progress_end_command(PROGRESS_COMMAND_CREATE_INDEX);
 
 	return address;
 }
@@ -2939,11 +2951,14 @@ ReindexRelationConcurrently(Oid relationOid, int options)
 
 		pgstat_progress_start_command(PROGRESS_COMMAND_CREATE_INDEX,
 									  RelationGetRelid(heapRel));
-		pgstat_progress_update_param(PROGRESS_CREATEIDX_COMMAND,
+		pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+									 PROGRESS_CREATEIDX_COMMAND,
 									 PROGRESS_CREATEIDX_COMMAND_REINDEX_CONCURRENTLY);
-		pgstat_progress_update_param(PROGRESS_CREATEIDX_INDEX_OID,
+		pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+									 PROGRESS_CREATEIDX_INDEX_OID,
 									 indexId);
-		pgstat_progress_update_param(PROGRESS_CREATEIDX_ACCESS_METHOD_OID,
+		pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+									 PROGRESS_CREATEIDX_ACCESS_METHOD_OID,
 									 indexRel->rd_rel->relam);
 
 		/* Choose a temporary relation name for the new index */
@@ -3040,7 +3055,8 @@ ReindexRelationConcurrently(Oid relationOid, int options)
 	 * DefineIndex() for more details.
 	 */
 
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_PHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_PHASE,
 								 PROGRESS_CREATEIDX_PHASE_WAIT_1);
 	WaitForLockersMultiple(lockTags, ShareLock, true);
 	CommitTransactionCommand();
@@ -3084,7 +3100,8 @@ ReindexRelationConcurrently(Oid relationOid, int options)
 	 * for more details.
 	 */
 
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_PHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_PHASE,
 								 PROGRESS_CREATEIDX_PHASE_WAIT_2);
 	WaitForLockersMultiple(lockTags, ShareLock, true);
 	CommitTransactionCommand();
@@ -3134,7 +3151,8 @@ ReindexRelationConcurrently(Oid relationOid, int options)
 		 * just before the reference snap was taken, we have to wait out any
 		 * transactions that might have older snapshots.
 		 */
-		pgstat_progress_update_param(PROGRESS_CREATEIDX_PHASE,
+		pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+									 PROGRESS_CREATEIDX_PHASE,
 									 PROGRESS_CREATEIDX_PHASE_WAIT_3);
 		WaitForOlderSnapshots(limitXmin, true);
 
@@ -3207,7 +3225,8 @@ ReindexRelationConcurrently(Oid relationOid, int options)
 	 * index_drop() for more details.
 	 */
 
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_PHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_PHASE,
 								 PROGRESS_CREATEIDX_PHASE_WAIT_4);
 	WaitForLockersMultiple(lockTags, AccessExclusiveLock, true);
 
@@ -3231,7 +3250,8 @@ ReindexRelationConcurrently(Oid relationOid, int options)
 	 * Drop the old indexes.
 	 */
 
-	pgstat_progress_update_param(PROGRESS_CREATEIDX_PHASE,
+	pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+								 PROGRESS_CREATEIDX_PHASE,
 								 PROGRESS_CREATEIDX_PHASE_WAIT_4);
 	WaitForLockersMultiple(lockTags, AccessExclusiveLock, true);
 
@@ -3308,7 +3328,7 @@ ReindexRelationConcurrently(Oid relationOid, int options)
 
 	MemoryContextDelete(private_context);
 
-	pgstat_progress_end_command();
+	pgstat_progress_end_command(PROGRESS_COMMAND_CREATE_INDEX);
 
 	return true;
 }
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index 099e14d..f32c597 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -3203,6 +3203,9 @@ pgstat_progress_start_command(ProgressCommandType cmdtype, Oid relid)
 	if (!beentry || !pgstat_track_activities)
 		return;
 
+    if (beentry->st_progress_command != PROGRESS_COMMAND_INVALID)
+		return;
+
 	PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
 	beentry->st_progress_command = cmdtype;
 	beentry->st_progress_command_target = relid;
@@ -3217,7 +3220,7 @@ pgstat_progress_start_command(ProgressCommandType cmdtype, Oid relid)
  *-----------
  */
 void
-pgstat_progress_update_param(int index, int64 val)
+pgstat_progress_update_param(ProgressCommandType cmdtype, int index, int64 val)
 {
 	volatile PgBackendStatus *beentry = MyBEEntry;
 
@@ -3226,9 +3229,12 @@ pgstat_progress_update_param(int index, int64 val)
 	if (!beentry || !pgstat_track_activities)
 		return;
 
-	PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
-	beentry->st_progress_param[index] = val;
-	PGSTAT_END_WRITE_ACTIVITY(beentry);
+	if (cmdtype == PROGRESS_COMMAND_INVALID || beentry->st_progress_command == cmdtype)
+	{
+		PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
+		beentry->st_progress_param[index] = val;
+		PGSTAT_END_WRITE_ACTIVITY(beentry);
+	}
 }
 
 /*-----------
@@ -3239,7 +3245,8 @@ pgstat_progress_update_param(int index, int64 val)
  *-----------
  */
 void
-pgstat_progress_update_multi_param(int nparam, const int *index,
+pgstat_progress_update_multi_param(ProgressCommandType cmdtype,
+								   int nparam, const int *index,
 								   const int64 *val)
 {
 	volatile PgBackendStatus *beentry = MyBEEntry;
@@ -3248,16 +3255,19 @@ pgstat_progress_update_multi_param(int nparam, const int *index,
 	if (!beentry || !pgstat_track_activities || nparam == 0)
 		return;
 
-	PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
-
-	for (i = 0; i < nparam; ++i)
+	if (cmdtype == PROGRESS_COMMAND_INVALID || beentry->st_progress_command == cmdtype)
 	{
-		Assert(index[i] >= 0 && index[i] < PGSTAT_NUM_PROGRESS_PARAM);
+		PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
 
-		beentry->st_progress_param[index[i]] = val[i];
-	}
+		for (i = 0; i < nparam; ++i)
+		{
+			Assert(index[i] >= 0 && index[i] < PGSTAT_NUM_PROGRESS_PARAM);
 
-	PGSTAT_END_WRITE_ACTIVITY(beentry);
+			beentry->st_progress_param[index[i]] = val[i];
+		}
+
+		PGSTAT_END_WRITE_ACTIVITY(beentry);
+	}
 }
 
 /*-----------
@@ -3268,7 +3278,7 @@ pgstat_progress_update_multi_param(int nparam, const int *index,
  *-----------
  */
 void
-pgstat_progress_end_command(void)
+pgstat_progress_end_command(ProgressCommandType cmdtype)
 {
 	volatile PgBackendStatus *beentry = MyBEEntry;
 
@@ -3278,6 +3288,9 @@ pgstat_progress_end_command(void)
 	if (beentry->st_progress_command == PROGRESS_COMMAND_INVALID)
 		return;
 
+	if (beentry->st_progress_command != cmdtype)
+		return;
+
 	PGSTAT_BEGIN_WRITE_ACTIVITY(beentry);
 	beentry->st_progress_command = PROGRESS_COMMAND_INVALID;
 	beentry->st_progress_command_target = InvalidOid;
diff --git a/src/backend/storage/lmgr/lmgr.c b/src/backend/storage/lmgr/lmgr.c
index f838b0f..52efd31 100644
--- a/src/backend/storage/lmgr/lmgr.c
+++ b/src/backend/storage/lmgr/lmgr.c
@@ -885,7 +885,8 @@ WaitForLockersMultiple(List *locktags, LOCKMODE lockmode, bool progress)
 	}
 
 	if (progress)
-		pgstat_progress_update_param(PROGRESS_WAITFOR_TOTAL, total);
+		pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+									 PROGRESS_WAITFOR_TOTAL, total);
 
 	/*
 	 * Note: GetLockConflicts() never reports our own xid, hence we need not
@@ -908,14 +909,16 @@ WaitForLockersMultiple(List *locktags, LOCKMODE lockmode, bool progress)
 			{
 				PGPROC	   *holder = BackendIdGetProc(lockholders->backendId);
 
-				pgstat_progress_update_param(PROGRESS_WAITFOR_CURRENT_PID,
+				pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+											 PROGRESS_WAITFOR_CURRENT_PID,
 											 holder->pid);
 			}
 			VirtualXactLock(*lockholders, true);
 			lockholders++;
 
 			if (progress)
-				pgstat_progress_update_param(PROGRESS_WAITFOR_DONE, ++done);
+				pgstat_progress_update_param(PROGRESS_COMMAND_CREATE_INDEX,
+											 PROGRESS_WAITFOR_DONE, ++done);
 		}
 	}
 	if (progress)
@@ -929,7 +932,8 @@ WaitForLockersMultiple(List *locktags, LOCKMODE lockmode, bool progress)
 			0, 0, 0
 		};
 
-		pgstat_progress_update_multi_param(3, index, values);
+		pgstat_progress_update_multi_param(PROGRESS_COMMAND_CREATE_INDEX,
+										   3, index, values);
 	}
 
 	list_free_deep(holders);
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 0a3ad3a..a5c3ca2 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -1288,10 +1288,12 @@ extern const char *pgstat_get_backend_desc(BackendType backendType);
 
 extern void pgstat_progress_start_command(ProgressCommandType cmdtype,
 										  Oid relid);
-extern void pgstat_progress_update_param(int index, int64 val);
-extern void pgstat_progress_update_multi_param(int nparam, const int *index,
+extern void pgstat_progress_update_param(ProgressCommandType cmdtype,
+										 int index, int64 val);
+extern void pgstat_progress_update_multi_param(ProgressCommandType cmdtype,
+											   int nparam, const int *index,
 											   const int64 *val);
-extern void pgstat_progress_end_command(void);
+extern void pgstat_progress_end_command(ProgressCommandType cmdtype);
 
 extern PgStat_TableStatus *find_tabstat_entry(Oid rel_id);
 extern PgStat_BackendFunctionEntry *find_funcstat_entry(Oid func_id);
