From 8e8427064a9680617d9ba55902d101880df683a1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=81lvaro=20Herrera?= <alvherre@kurilemu.de>
Date: Sat, 31 Jan 2026 16:01:56 +0100
Subject: [PATCH 2/2] Apply the same technique to PrintNewControlValues too

---
 src/bin/pg_resetwal/entries.h     |  60 +++++++--------
 src/bin/pg_resetwal/pg_resetwal.c | 121 ++++++++++++++++++++----------
 2 files changed, 110 insertions(+), 71 deletions(-)

diff --git a/src/bin/pg_resetwal/entries.h b/src/bin/pg_resetwal/entries.h
index 6b7686da83a..25f2c49b3a8 100644
--- a/src/bin/pg_resetwal/entries.h
+++ b/src/bin/pg_resetwal/entries.h
@@ -1,62 +1,62 @@
-CONTROLDATA_LINE("pg_control version number",
+CONTROLDATA_LINE(CD_CONTROL_VERSION, "pg_control version number",
 				 "%u", ControlFile.pg_control_version)
-CONTROLDATA_LINE("Catalog version number",
+CONTROLDATA_LINE(CD_CATALOG_VERSION, "Catalog version number",
 				 "%u", ControlFile.catalog_version_no)
-CONTROLDATA_LINE("Database system identifier",
+CONTROLDATA_LINE(CD_SYSTEM_IDENTIFIER, "Database system identifier",
 				 "%" PRIu64, ControlFile.system_identifier)
-CONTROLDATA_LINE("Latest checkpoint's TimeLineID",
+CONTROLDATA_LINE(CD_CKPT_TIMELINE, "Latest checkpoint's TimeLineID",
 				 "%u", ControlFile.checkPointCopy.ThisTimeLineID)
-CONTROLDATA_LINE("Latest checkpoint's full_page_writes",
+CONTROLDATA_LINE(CD_CKPT_FPW, "Latest checkpoint's full_page_writes",
 				 "%s", (ControlFile.checkPointCopy.fullPageWrites ? _("on") : _("off")))
-CONTROLDATA_LINE("Latest checkpoint's NextXID",
+CONTROLDATA_LINE(CD_CKPT_NEXTXID, "Latest checkpoint's NextXID",
 				 "%u:%u", EpochFromFullTransactionId(ControlFile.checkPointCopy.nextXid), XidFromFullTransactionId(ControlFile.checkPointCopy.nextXid))
-CONTROLDATA_LINE("Latest checkpoint's NextOID",
+CONTROLDATA_LINE(CD_CKPT_NEXTOID, "Latest checkpoint's NextOID",
 				 "%u", ControlFile.checkPointCopy.nextOid)
-CONTROLDATA_LINE("Latest checkpoint's NextMultiXactId",
+CONTROLDATA_LINE(CD_CKPT_NEXTMXID, "Latest checkpoint's NextMultiXactId",
 				 "%u", ControlFile.checkPointCopy.nextMulti)
-CONTROLDATA_LINE("Latest checkpoint's NextMultiOffset",
+CONTROLDATA_LINE(CD_CKPT_NEXTMXOFF, "Latest checkpoint's NextMultiOffset",
 				 "%" PRIu64, ControlFile.checkPointCopy.nextMultiOffset)
-CONTROLDATA_LINE("Latest checkpoint's oldestXID",
+CONTROLDATA_LINE(CD_CKPT_OLDESTXID, "Latest checkpoint's oldestXID",
 				 "%u", ControlFile.checkPointCopy.oldestXid)
-CONTROLDATA_LINE("Latest checkpoint's oldestXID's DB",
+CONTROLDATA_LINE(CD_CKPT_OLDESTXID_DB, "Latest checkpoint's oldestXID's DB",
 				 "%u", ControlFile.checkPointCopy.oldestXidDB)
-CONTROLDATA_LINE("Latest checkpoint's oldestActiveXID",
+CONTROLDATA_LINE(CD_CKPT_OLDEST_ACTIVEXID, "Latest checkpoint's oldestActiveXID",
 				 "%u", ControlFile.checkPointCopy.oldestActiveXid)
-CONTROLDATA_LINE("Latest checkpoint's oldestMultiXid",
+CONTROLDATA_LINE(CD_CKPT_OLDEST_MULTI, "Latest checkpoint's oldestMultiXid",
 				 "%u", ControlFile.checkPointCopy.oldestMulti)
-CONTROLDATA_LINE("Latest checkpoint's oldestMulti's DB",
+CONTROLDATA_LINE(CD_CKPT_OLDEST_MULTI_DB, "Latest checkpoint's oldestMulti's DB",
 				 "%u", ControlFile.checkPointCopy.oldestMultiDB)
-CONTROLDATA_LINE("Latest checkpoint's oldestCommitTsXid",
+CONTROLDATA_LINE(CD_CKPT_OLDEST_COMMITTS_XID, "Latest checkpoint's oldestCommitTsXid",
 				 "%u", ControlFile.checkPointCopy.oldestCommitTsXid)
-CONTROLDATA_LINE("Latest checkpoint's newestCommitTsXid",
+CONTROLDATA_LINE(CD_CKPT_NEWEST_COMMITTS_XID, "Latest checkpoint's newestCommitTsXid",
 				 "%u", ControlFile.checkPointCopy.newestCommitTsXid)
-CONTROLDATA_LINE("Maximum data alignment",
+CONTROLDATA_LINE(CD_MAXALIGN, "Maximum data alignment",
 				 "%u", ControlFile.maxAlign)
-CONTROLDATA_LINE("Database block size",
+CONTROLDATA_LINE(CD_BLCKSZ, "Database block size",
 				 "%u", ControlFile.blcksz)
-CONTROLDATA_LINE("Blocks per segment of large relation",
+CONTROLDATA_LINE(CD_RELSEG_SZ, "Blocks per segment of large relation",
 				 "%u", ControlFile.relseg_size)
-CONTROLDATA_LINE("Pages per SLRU segment",
+CONTROLDATA_LINE(CD_SLRU_PPS, "Pages per SLRU segment",
 				 "%u", ControlFile.slru_pages_per_segment)
-CONTROLDATA_LINE("WAL block size",
+CONTROLDATA_LINE(CD_WAL_BLCKSZ, "WAL block size",
 				 "%u", ControlFile.xlog_blcksz)
-CONTROLDATA_LINE("Bytes per WAL segment",
+CONTROLDATA_LINE(CD_WAL_SEGSIZE, "Bytes per WAL segment",
 				 "%u", ControlFile.xlog_seg_size)
-CONTROLDATA_LINE("Maximum length of identifiers",
+CONTROLDATA_LINE(CD_WAL_NAMEDATALEN, "Maximum length of identifiers",
 				 "%u", ControlFile.nameDataLen)
-CONTROLDATA_LINE("Maximum columns in an index",
+CONTROLDATA_LINE(CD_INDEX_MAX_KEYS, "Maximum columns in an index",
 				 "%u", ControlFile.indexMaxKeys)
-CONTROLDATA_LINE("Maximum size of a TOAST chunk",
+CONTROLDATA_LINE(CD_TOAST_MAXCHUNKSZ, "Maximum size of a TOAST chunk",
 				 "%u", ControlFile.toast_max_chunk_size)
-CONTROLDATA_LINE("Size of a large-object chunk",
+CONTROLDATA_LINE(CD_LO_BLKSZ, "Size of a large-object chunk",
 				 "%u", ControlFile.loblksize)
 
 /* This is no longer configurable, but users may still expect to see it: */
-CONTROLDATA_LINE("Date/time type storage",
+CONTROLDATA_LINE(CD_DATETIME_INT64, "Date/time type storage",
 				 "%s", _("64-bit integers"))
-CONTROLDATA_LINE("Float8 argument passing",
+CONTROLDATA_LINE(CD_FLOAT8_ARGS, "Float8 argument passing",
 				 "%s", ControlFile.float8ByVal ? _("by value") : _("by reference"))
-CONTROLDATA_LINE("Data page checksum version",
+CONTROLDATA_LINE(CD_CHECKSUMS, "Data page checksum version",
 				 "%u", ControlFile.data_checksum_version)
-CONTROLDATA_LINE("Default char data signedness",
+CONTROLDATA_LINE(CD_CHAR_SIGNEDNESS, "Default char data signedness",
 				 "%s", ControlFile.default_char_signedness ? _("signed") : _("unsigned"))
diff --git a/src/bin/pg_resetwal/pg_resetwal.c b/src/bin/pg_resetwal/pg_resetwal.c
index fb17b6f80e0..23bf1c62183 100644
--- a/src/bin/pg_resetwal/pg_resetwal.c
+++ b/src/bin/pg_resetwal/pg_resetwal.c
@@ -55,6 +55,7 @@
 #include "common/restricted_token.h"
 #include "common/string.h"
 #include "fe_utils/option_utils.h"
+#include "fe_utils/simple_list.h"
 #include "fe_utils/version.h"
 #include "getopt_long.h"
 #include "mb/pg_wchar.h"
@@ -119,6 +120,14 @@ static int	internal_wcswidth(const char *pwcs, size_t len, int encoding);
 static uint32 strtouint32_strict(const char *restrict s, char **restrict endptr, int base);
 static uint64 strtouint64_strict(const char *restrict s, char **restrict endptr, int base);
 
+/* Define the string enums */
+#define CONTROLDATA_LINE(symbol, description, fmt, ...)			\
+	symbol,
+enum ControldataStrings {
+#include "entries.h"
+};
+#undef CONTROLDATA_LINE
+
 
 int
 main(int argc, char *argv[])
@@ -768,7 +777,7 @@ PrintControlValues(bool guessed)
 	 * First, determine the maximum length of the description of all entries,
 	 * some or all of which might be translated.
 	 */
-#define CONTROLDATA_LINE(description, fmt, ...)			\
+#define CONTROLDATA_LINE(symbol, description, fmt, ...)			\
 	thislen = internal_wcswidth(_(description),			\
 								strlen(_(description)),	\
 								encoding);				\
@@ -781,7 +790,7 @@ PrintControlValues(bool guessed)
 	 * Print each line: the possibly-translated description, then some padding
 	 * spaces according to its display width, then the value.
 	 */
-#define CONTROLDATA_LINE(description, fmt, ...)			\
+#define CONTROLDATA_LINE(symbol, description, fmt, ...)			\
 	{													\
 		int		thisstrlen;								\
 														\
@@ -807,69 +816,99 @@ static void
 PrintNewControlValues(void)
 {
 	char		fname[MAXFNAMELEN];
+	int			encoding = pg_get_encoding_from_locale(NULL, true);
+	SimpleOidList	toprint = {NULL, NULL};
+	int			maxlen = 0;
+	int			thislen;
 
 	/* This will be always printed in order to keep format same. */
 	printf(_("\n\nValues to be changed:\n\n"));
 
-	XLogFileName(fname, ControlFile.checkPointCopy.ThisTimeLineID,
-				 newXlogSegNo, WalSegSz);
-	printf(_("First log segment after reset:        %s\n"), fname);
-
 	if (mxids_given)
 	{
-		printf(_("NextMultiXactId:                      %u\n"),
-			   ControlFile.checkPointCopy.nextMulti);
-		printf(_("OldestMultiXid:                       %u\n"),
-			   ControlFile.checkPointCopy.oldestMulti);
-		printf(_("OldestMulti's DB:                     %u\n"),
-			   ControlFile.checkPointCopy.oldestMultiDB);
+		simple_oid_list_append(&toprint, CD_CKPT_NEXTMXID);
+		simple_oid_list_append(&toprint, CD_CKPT_OLDEST_MULTI);
+		simple_oid_list_append(&toprint, CD_CKPT_OLDEST_MULTI_DB);
 	}
 
 	if (next_mxoff_given)
-	{
-		printf(_("NextMultiOffset:                      %" PRIu64 "\n"),
-			   ControlFile.checkPointCopy.nextMultiOffset);
-	}
+		simple_oid_list_append(&toprint, CD_CKPT_NEXTMXOFF);
 
 	if (next_oid_given)
-	{
-		printf(_("NextOID:                              %u\n"),
-			   ControlFile.checkPointCopy.nextOid);
-	}
+		simple_oid_list_append(&toprint, CD_CKPT_NEXTOID);
 
 	if (next_xid_given)
-	{
-		printf(_("NextXID:                              %u\n"),
-			   XidFromFullTransactionId(ControlFile.checkPointCopy.nextXid));
-	}
+		simple_oid_list_append(&toprint, CD_CKPT_NEXTXID);
 
 	if (oldest_xid_given)
 	{
-		printf(_("OldestXID:                            %u\n"),
-			   ControlFile.checkPointCopy.oldestXid);
-		printf(_("OldestXID's DB:                       %u\n"),
-			   ControlFile.checkPointCopy.oldestXidDB);
-	}
-
-	if (next_xid_epoch_given)
-	{
-		printf(_("NextXID epoch:                        %u\n"),
-			   EpochFromFullTransactionId(ControlFile.checkPointCopy.nextXid));
+		simple_oid_list_append(&toprint, CD_CKPT_OLDESTXID);
+		simple_oid_list_append(&toprint, CD_CKPT_OLDESTXID_DB);
 	}
 
 	if (commit_ts_xids_given)
 	{
-		printf(_("oldestCommitTsXid:                    %u\n"),
-			   ControlFile.checkPointCopy.oldestCommitTsXid);
-		printf(_("newestCommitTsXid:                    %u\n"),
-			   ControlFile.checkPointCopy.newestCommitTsXid);
+		simple_oid_list_append(&toprint, CD_CKPT_OLDEST_COMMITTS_XID);
+		simple_oid_list_append(&toprint, CD_CKPT_NEWEST_COMMITTS_XID);
 	}
 
 	if (wal_segsize_given)
-	{
-		printf(_("Bytes per WAL segment:                %u\n"),
-			   ControlFile.xlog_seg_size);
+		simple_oid_list_append(&toprint, CD_WAL_SEGSIZE);
+
+#define CONTROLDATA_LINE(symbol, description, fmt, ...)			\
+	if (simple_oid_list_member(&toprint, symbol))				\
+	{															\
+	thislen = internal_wcswidth(_(description),					\
+								strlen(_(description)),			\
+								encoding);						\
+	if (thislen > maxlen)										\
+		maxlen = thislen;										\
 	}
+#include "entries.h"
+#undef CONTROLDATA_LINE
+
+
+	XLogFileName(fname, ControlFile.checkPointCopy.ThisTimeLineID,
+				 newXlogSegNo, WalSegSz);
+
+	/* We print this one inconditionally */
+	{
+		char *str = "First log segment after reset";
+		thislen = internal_wcswidth(_(str), strlen(_(str)), encoding);
+		if (thislen > maxlen)
+			maxlen = thislen;
+		printf("%s:%*s%s\n", _(str), maxlen - thislen + 2, " ", fname);
+	}
+
+	/* We print the XID epoch in a degenerate case */
+	if (next_xid_epoch_given)
+	{
+		char *str = "NextXID epoch";
+		thislen = internal_wcswidth(_(str), strlen(_(str)), encoding);
+		if (thislen > maxlen)
+			maxlen = thislen;
+		printf("%s:%*s%u\n", _(str), maxlen - thislen + 2, " ",
+			   EpochFromFullTransactionId(ControlFile.checkPointCopy.nextXid));
+
+	}
+
+#define CONTROLDATA_LINE(symbol, description, fmt, ...)			\
+	if (simple_oid_list_member(&toprint, symbol))				\
+	{													\
+		int		thisstrlen;								\
+														\
+		thisstrlen = strlen(_(description));			\
+		thislen = internal_wcswidth(_(description),		\
+									thisstrlen,			\
+									encoding);			\
+		printf("%s:%*s" fmt "\n",						\
+			   _(description),							\
+			   maxlen - thislen + 2,					\
+			   " ",										\
+			   __VA_ARGS__);							\
+	}
+#include "entries.h"
+#undef CONTROLDATA_LINE
 }
 
 
-- 
2.47.3

