From: =?UTF-8?q?=C3=81lvaro=20Herrera?= 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 --m4rixdodkhrlzpzv--