]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Standardize LSN formatting by zero padding
authorÁlvaro Herrera <alvherre@kurilemu.de>
Mon, 7 Jul 2025 11:57:43 +0000 (13:57 +0200)
committerÁlvaro Herrera <alvherre@kurilemu.de>
Mon, 7 Jul 2025 11:57:43 +0000 (13:57 +0200)
This commit standardizes the output format for LSNs to ensure consistent
representation across various tools and messages.  Previously, LSNs were
inconsistently printed as `%X/%X` in some contexts, while others used
zero-padding.  This often led to confusion when comparing.

To address this, the LSN format is now uniformly set to `%X/%08X`,
ensuring the lower 32-bit part is always zero-padded to eight
hexadecimal digits.

Author: Japin Li <japinli@hotmail.com>
Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com>
Reviewed-by: Álvaro Herrera <alvherre@kurilemu.de>
Discussion: https://postgr.es/m/ME0P300MB0445CA53CA0E4B8C1879AF84B641A@ME0P300MB0445.AUSP300.PROD.OUTLOOK.COM

67 files changed:
contrib/amcheck/verify_nbtree.c
contrib/pageinspect/expected/gist.out
contrib/pageinspect/expected/page.out
contrib/pageinspect/rawpage.c
contrib/pg_walinspect/expected/pg_walinspect.out
contrib/pg_walinspect/pg_walinspect.c
doc/src/sgml/catalogs.sgml
doc/src/sgml/logical-replication.sgml
doc/src/sgml/logicaldecoding.sgml
doc/src/sgml/pageinspect.sgml
doc/src/sgml/pglogicalinspect.sgml
doc/src/sgml/pgwalinspect.sgml
doc/src/sgml/test-decoding.sgml
src/backend/access/rmgrdesc/replorigindesc.c
src/backend/access/rmgrdesc/xactdesc.c
src/backend/access/rmgrdesc/xlogdesc.c
src/backend/access/transam/timeline.c
src/backend/access/transam/twophase.c
src/backend/access/transam/xlog.c
src/backend/access/transam/xlogbackup.c
src/backend/access/transam/xlogprefetcher.c
src/backend/access/transam/xlogreader.c
src/backend/access/transam/xlogrecovery.c
src/backend/access/transam/xlogutils.c
src/backend/backup/backup_manifest.c
src/backend/backup/basebackup_copy.c
src/backend/backup/basebackup_incremental.c
src/backend/commands/subscriptioncmds.c
src/backend/postmaster/walsummarizer.c
src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
src/backend/replication/logical/logical.c
src/backend/replication/logical/origin.c
src/backend/replication/logical/slotsync.c
src/backend/replication/logical/snapbuild.c
src/backend/replication/logical/tablesync.c
src/backend/replication/logical/worker.c
src/backend/replication/repl_gram.y
src/backend/replication/repl_scanner.l
src/backend/replication/slot.c
src/backend/replication/slotfuncs.c
src/backend/replication/syncrep.c
src/backend/replication/walreceiver.c
src/backend/replication/walsender.c
src/backend/storage/ipc/standby.c
src/backend/utils/adt/pg_lsn.c
src/bin/pg_basebackup/pg_basebackup.c
src/bin/pg_basebackup/pg_createsubscriber.c
src/bin/pg_basebackup/pg_receivewal.c
src/bin/pg_basebackup/pg_recvlogical.c
src/bin/pg_basebackup/receivelog.c
src/bin/pg_basebackup/streamutil.c
src/bin/pg_combinebackup/backup_label.c
src/bin/pg_combinebackup/pg_combinebackup.c
src/bin/pg_combinebackup/write_manifest.c
src/bin/pg_controldata/pg_controldata.c
src/bin/pg_rewind/libpq_source.c
src/bin/pg_rewind/parsexlog.c
src/bin/pg_rewind/pg_rewind.c
src/bin/pg_rewind/timeline.c
src/bin/pg_verifybackup/pg_verifybackup.c
src/bin/pg_waldump/pg_waldump.c
src/common/parse_manifest.c
src/include/access/xlogdefs.h
src/test/recovery/t/016_min_consistency.pl
src/test/regress/expected/numeric.out
src/test/regress/expected/pg_lsn.out
src/test/regress/expected/subscription.out

index f11c43a0ed7974085a3007a3ecc696b5b078354b..0949c88983ac2cabf04cce5002212ea0a472e2f3 100644 (file)
@@ -913,7 +913,7 @@ bt_report_duplicate(BtreeCheckState *state,
                        (errcode(ERRCODE_INDEX_CORRUPTED),
                         errmsg("index uniqueness is violated for index \"%s\"",
                                        RelationGetRelationName(state->rel)),
-                        errdetail("Index %s%s and%s%s (point to heap %s and %s) page lsn=%X/%X.",
+                        errdetail("Index %s%s and%s%s (point to heap %s and %s) page lsn=%X/%08X.",
                                           itid, pposting, nitid, pnposting, htid, nhtid,
                                           LSN_FORMAT_ARGS(state->targetlsn))));
 }
@@ -1058,7 +1058,7 @@ bt_leftmost_ignoring_half_dead(BtreeCheckState *state,
                                        (errcode(ERRCODE_NO_DATA),
                                         errmsg_internal("harmless interrupted page deletion detected in index \"%s\"",
                                                                         RelationGetRelationName(state->rel)),
-                                        errdetail_internal("Block=%u right block=%u page lsn=%X/%X.",
+                                        errdetail_internal("Block=%u right block=%u page lsn=%X/%08X.",
                                                                                reached, reached_from,
                                                                                LSN_FORMAT_ARGS(pagelsn))));
 
@@ -1283,7 +1283,7 @@ bt_target_page_check(BtreeCheckState *state)
                                        (errcode(ERRCODE_INDEX_CORRUPTED),
                                         errmsg("wrong number of high key index tuple attributes in index \"%s\"",
                                                        RelationGetRelationName(state->rel)),
-                                        errdetail_internal("Index block=%u natts=%u block type=%s page lsn=%X/%X.",
+                                        errdetail_internal("Index block=%u natts=%u block type=%s page lsn=%X/%08X.",
                                                                                state->targetblock,
                                                                                BTreeTupleGetNAtts(itup, state->rel),
                                                                                P_ISLEAF(topaque) ? "heap" : "index",
@@ -1332,7 +1332,7 @@ bt_target_page_check(BtreeCheckState *state)
                                        (errcode(ERRCODE_INDEX_CORRUPTED),
                                         errmsg("index tuple size does not equal lp_len in index \"%s\"",
                                                        RelationGetRelationName(state->rel)),
-                                        errdetail_internal("Index tid=(%u,%u) tuple size=%zu lp_len=%u page lsn=%X/%X.",
+                                        errdetail_internal("Index tid=(%u,%u) tuple size=%zu lp_len=%u page lsn=%X/%08X.",
                                                                                state->targetblock, offset,
                                                                                tupsize, ItemIdGetLength(itemid),
                                                                                LSN_FORMAT_ARGS(state->targetlsn)),
@@ -1356,7 +1356,7 @@ bt_target_page_check(BtreeCheckState *state)
                                        (errcode(ERRCODE_INDEX_CORRUPTED),
                                         errmsg("wrong number of index tuple attributes in index \"%s\"",
                                                        RelationGetRelationName(state->rel)),
-                                        errdetail_internal("Index tid=%s natts=%u points to %s tid=%s page lsn=%X/%X.",
+                                        errdetail_internal("Index tid=%s natts=%u points to %s tid=%s page lsn=%X/%08X.",
                                                                                itid,
                                                                                BTreeTupleGetNAtts(itup, state->rel),
                                                                                P_ISLEAF(topaque) ? "heap" : "index",
@@ -1406,7 +1406,7 @@ bt_target_page_check(BtreeCheckState *state)
                                        (errcode(ERRCODE_INDEX_CORRUPTED),
                                         errmsg("could not find tuple using search from root page in index \"%s\"",
                                                        RelationGetRelationName(state->rel)),
-                                        errdetail_internal("Index tid=%s points to heap tid=%s page lsn=%X/%X.",
+                                        errdetail_internal("Index tid=%s points to heap tid=%s page lsn=%X/%08X.",
                                                                                itid, htid,
                                                                                LSN_FORMAT_ARGS(state->targetlsn))));
                }
@@ -1435,7 +1435,7 @@ bt_target_page_check(BtreeCheckState *state)
                                                        (errcode(ERRCODE_INDEX_CORRUPTED),
                                                         errmsg_internal("posting list contains misplaced TID in index \"%s\"",
                                                                                         RelationGetRelationName(state->rel)),
-                                                        errdetail_internal("Index tid=%s posting list offset=%d page lsn=%X/%X.",
+                                                        errdetail_internal("Index tid=%s posting list offset=%d page lsn=%X/%08X.",
                                                                                                itid, i,
                                                                                                LSN_FORMAT_ARGS(state->targetlsn))));
                                }
@@ -1488,7 +1488,7 @@ bt_target_page_check(BtreeCheckState *state)
                                        (errcode(ERRCODE_INDEX_CORRUPTED),
                                         errmsg("index row size %zu exceeds maximum for index \"%s\"",
                                                        tupsize, RelationGetRelationName(state->rel)),
-                                        errdetail_internal("Index tid=%s points to %s tid=%s page lsn=%X/%X.",
+                                        errdetail_internal("Index tid=%s points to %s tid=%s page lsn=%X/%08X.",
                                                                                itid,
                                                                                P_ISLEAF(topaque) ? "heap" : "index",
                                                                                htid,
@@ -1595,7 +1595,7 @@ bt_target_page_check(BtreeCheckState *state)
                                        (errcode(ERRCODE_INDEX_CORRUPTED),
                                         errmsg("high key invariant violated for index \"%s\"",
                                                        RelationGetRelationName(state->rel)),
-                                        errdetail_internal("Index tid=%s points to %s tid=%s page lsn=%X/%X.",
+                                        errdetail_internal("Index tid=%s points to %s tid=%s page lsn=%X/%08X.",
                                                                                itid,
                                                                                P_ISLEAF(topaque) ? "heap" : "index",
                                                                                htid,
@@ -1641,9 +1641,7 @@ bt_target_page_check(BtreeCheckState *state)
                                        (errcode(ERRCODE_INDEX_CORRUPTED),
                                         errmsg("item order invariant violated for index \"%s\"",
                                                        RelationGetRelationName(state->rel)),
-                                        errdetail_internal("Lower index tid=%s (points to %s tid=%s) "
-                                                                               "higher index tid=%s (points to %s tid=%s) "
-                                                                               "page lsn=%X/%X.",
+                                        errdetail_internal("Lower index tid=%s (points to %s tid=%s) higher index tid=%s (points to %s tid=%s) page lsn=%X/%08X.",
                                                                                itid,
                                                                                P_ISLEAF(topaque) ? "heap" : "index",
                                                                                htid,
@@ -1760,7 +1758,7 @@ bt_target_page_check(BtreeCheckState *state)
                                                (errcode(ERRCODE_INDEX_CORRUPTED),
                                                 errmsg("cross page item order invariant violated for index \"%s\"",
                                                                RelationGetRelationName(state->rel)),
-                                                errdetail_internal("Last item on page tid=(%u,%u) page lsn=%X/%X.",
+                                                errdetail_internal("Last item on page tid=(%u,%u) page lsn=%X/%08X.",
                                                                                        state->targetblock, offset,
                                                                                        LSN_FORMAT_ARGS(state->targetlsn))));
                        }
@@ -1813,7 +1811,7 @@ bt_target_page_check(BtreeCheckState *state)
                                                                (errcode(ERRCODE_INDEX_CORRUPTED),
                                                                 errmsg("right block of leaf block is non-leaf for index \"%s\"",
                                                                                RelationGetRelationName(state->rel)),
-                                                                errdetail_internal("Block=%u page lsn=%X/%X.",
+                                                                errdetail_internal("Block=%u page lsn=%X/%08X.",
                                                                                                        state->targetblock,
                                                                                                        LSN_FORMAT_ARGS(state->targetlsn))));
 
@@ -2237,7 +2235,7 @@ bt_child_highkey_check(BtreeCheckState *state,
                                        (errcode(ERRCODE_INDEX_CORRUPTED),
                                         errmsg("the first child of leftmost target page is not leftmost of its level in index \"%s\"",
                                                        RelationGetRelationName(state->rel)),
-                                        errdetail_internal("Target block=%u child block=%u target page lsn=%X/%X.",
+                                        errdetail_internal("Target block=%u child block=%u target page lsn=%X/%08X.",
                                                                                state->targetblock, blkno,
                                                                                LSN_FORMAT_ARGS(state->targetlsn))));
 
@@ -2323,7 +2321,7 @@ bt_child_highkey_check(BtreeCheckState *state,
                                                                (errcode(ERRCODE_INDEX_CORRUPTED),
                                                                 errmsg("child high key is greater than rightmost pivot key on target level in index \"%s\"",
                                                                                RelationGetRelationName(state->rel)),
-                                                                errdetail_internal("Target block=%u child block=%u target page lsn=%X/%X.",
+                                                                errdetail_internal("Target block=%u child block=%u target page lsn=%X/%08X.",
                                                                                                        state->targetblock, blkno,
                                                                                                        LSN_FORMAT_ARGS(state->targetlsn))));
                                        pivotkey_offset = P_HIKEY;
@@ -2353,7 +2351,7 @@ bt_child_highkey_check(BtreeCheckState *state,
                                                        (errcode(ERRCODE_INDEX_CORRUPTED),
                                                         errmsg("can't find left sibling high key in index \"%s\"",
                                                                        RelationGetRelationName(state->rel)),
-                                                        errdetail_internal("Target block=%u child block=%u target page lsn=%X/%X.",
+                                                        errdetail_internal("Target block=%u child block=%u target page lsn=%X/%08X.",
                                                                                                state->targetblock, blkno,
                                                                                                LSN_FORMAT_ARGS(state->targetlsn))));
                                itup = state->lowkey;
@@ -2365,7 +2363,7 @@ bt_child_highkey_check(BtreeCheckState *state,
                                                (errcode(ERRCODE_INDEX_CORRUPTED),
                                                 errmsg("mismatch between parent key and child high key in index \"%s\"",
                                                                RelationGetRelationName(state->rel)),
-                                                errdetail_internal("Target block=%u child block=%u target page lsn=%X/%X.",
+                                                errdetail_internal("Target block=%u child block=%u target page lsn=%X/%08X.",
                                                                                        state->targetblock, blkno,
                                                                                        LSN_FORMAT_ARGS(state->targetlsn))));
                        }
@@ -2505,7 +2503,7 @@ bt_child_check(BtreeCheckState *state, BTScanInsert targetkey,
                                (errcode(ERRCODE_INDEX_CORRUPTED),
                                 errmsg("downlink to deleted page found in index \"%s\"",
                                                RelationGetRelationName(state->rel)),
-                                errdetail_internal("Parent block=%u child block=%u parent page lsn=%X/%X.",
+                                errdetail_internal("Parent block=%u child block=%u parent page lsn=%X/%08X.",
                                                                        state->targetblock, childblock,
                                                                        LSN_FORMAT_ARGS(state->targetlsn))));
 
@@ -2546,7 +2544,7 @@ bt_child_check(BtreeCheckState *state, BTScanInsert targetkey,
                                        (errcode(ERRCODE_INDEX_CORRUPTED),
                                         errmsg("down-link lower bound invariant violated for index \"%s\"",
                                                        RelationGetRelationName(state->rel)),
-                                        errdetail_internal("Parent block=%u child index tid=(%u,%u) parent page lsn=%X/%X.",
+                                        errdetail_internal("Parent block=%u child index tid=(%u,%u) parent page lsn=%X/%08X.",
                                                                                state->targetblock, childblock, offset,
                                                                                LSN_FORMAT_ARGS(state->targetlsn))));
        }
@@ -2616,7 +2614,7 @@ bt_downlink_missing_check(BtreeCheckState *state, bool rightsplit,
                                (errcode(ERRCODE_NO_DATA),
                                 errmsg_internal("harmless interrupted page split detected in index \"%s\"",
                                                                 RelationGetRelationName(state->rel)),
-                                errdetail_internal("Block=%u level=%u left sibling=%u page lsn=%X/%X.",
+                                errdetail_internal("Block=%u level=%u left sibling=%u page lsn=%X/%08X.",
                                                                        blkno, opaque->btpo_level,
                                                                        opaque->btpo_prev,
                                                                        LSN_FORMAT_ARGS(pagelsn))));
@@ -2638,7 +2636,7 @@ bt_downlink_missing_check(BtreeCheckState *state, bool rightsplit,
                                (errcode(ERRCODE_INDEX_CORRUPTED),
                                 errmsg("leaf index block lacks downlink in index \"%s\"",
                                                RelationGetRelationName(state->rel)),
-                                errdetail_internal("Block=%u page lsn=%X/%X.",
+                                errdetail_internal("Block=%u page lsn=%X/%08X.",
                                                                        blkno,
                                                                        LSN_FORMAT_ARGS(pagelsn))));
 
@@ -2704,7 +2702,7 @@ bt_downlink_missing_check(BtreeCheckState *state, bool rightsplit,
                                (errcode(ERRCODE_INDEX_CORRUPTED),
                                 errmsg_internal("downlink to deleted leaf page found in index \"%s\"",
                                                                 RelationGetRelationName(state->rel)),
-                                errdetail_internal("Top parent/target block=%u leaf block=%u top parent/under check lsn=%X/%X.",
+                                errdetail_internal("Top parent/target block=%u leaf block=%u top parent/under check lsn=%X/%08X.",
                                                                        blkno, childblk,
                                                                        LSN_FORMAT_ARGS(pagelsn))));
 
@@ -2730,7 +2728,7 @@ bt_downlink_missing_check(BtreeCheckState *state, bool rightsplit,
                        (errcode(ERRCODE_INDEX_CORRUPTED),
                         errmsg("internal index block lacks downlink in index \"%s\"",
                                        RelationGetRelationName(state->rel)),
-                        errdetail_internal("Block=%u level=%u page lsn=%X/%X.",
+                        errdetail_internal("Block=%u level=%u page lsn=%X/%08X.",
                                                                blkno, opaque->btpo_level,
                                                                LSN_FORMAT_ARGS(pagelsn))));
 }
index 2b1d54a627949bc483ef80556731b4a113a550e2..8502f9efb4190423d8caf5ab214507d450c181d7 100644 (file)
@@ -5,21 +5,21 @@ CREATE UNLOGGED TABLE test_gist AS SELECT point(i,i) p, i::text t FROM
 CREATE INDEX test_gist_idx ON test_gist USING gist (p);
 -- Page 0 is the root, the rest are leaf pages
 SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist_idx', 0));
lsn | nsn | rightlink  | flags 
------+-----+------------+-------
- 0/1 | 0/0 | 4294967295 | {}
   lsn     |    nsn     | rightlink  | flags 
+------------+------------+------------+-------
+ 0/00000001 | 0/00000000 | 4294967295 | {}
 (1 row)
 
 SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist_idx', 1));
lsn | nsn | rightlink  | flags  
------+-----+------------+--------
- 0/1 | 0/0 | 4294967295 | {leaf}
   lsn     |    nsn     | rightlink  | flags  
+------------+------------+------------+--------
+ 0/00000001 | 0/00000000 | 4294967295 | {leaf}
 (1 row)
 
 SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist_idx', 2));
lsn | nsn | rightlink | flags  
------+-----+-----------+--------
- 0/1 | 0/0 |         1 | {leaf}
   lsn     |    nsn     | rightlink | flags  
+------------+------------+-----------+--------
+ 0/00000001 | 0/00000000 |         1 | {leaf}
 (1 row)
 
 SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 0), 'test_gist_idx');
index e42fd9747fd1c8916f3f8bcaf14ebdef8a3ce82f..fcf19c5ca5a50a8005b0d5e66eaf0891b1c9eb29 100644 (file)
@@ -265,9 +265,9 @@ SELECT fsm_page_contents(decode(repeat('00', :block_size), 'hex'));
 (1 row)
 
 SELECT page_header(decode(repeat('00', :block_size), 'hex'));
-      page_header      
------------------------
- (0/0,0,0,0,0,0,0,0,0)
+         page_header          
+------------------------------
+ (0/00000000,0,0,0,0,0,0,0,0)
 (1 row)
 
 SELECT page_checksum(decode(repeat('00', :block_size), 'hex'), 1);
index 0d57123aa2669c04914b8981d8c1bab88934ec3b..aef442b5db30af200fdd4ac121e4900e1d51cbd2 100644 (file)
@@ -282,7 +282,7 @@ page_header(PG_FUNCTION_ARGS)
        {
                char            lsnchar[64];
 
-               snprintf(lsnchar, sizeof(lsnchar), "%X/%X", LSN_FORMAT_ARGS(lsn));
+               snprintf(lsnchar, sizeof(lsnchar), "%X/%08X", LSN_FORMAT_ARGS(lsn));
                values[0] = CStringGetTextDatum(lsnchar);
        }
        else
index c010eed8c5d6e4ab90a2b823f97d503a9b124fe3..f955ff5d3c52ac8e92fb94e1803f2e7e7cce8119 100644 (file)
@@ -19,14 +19,14 @@ INSERT INTO sample_tbl SELECT * FROM generate_series(3, 4);
 -- ===================================================================
 -- Invalid input LSN.
 SELECT * FROM pg_get_wal_record_info('0/0');
-ERROR:  could not read WAL at LSN 0/0
+ERROR:  could not read WAL at LSN 0/00000000
 -- Invalid start LSN.
 SELECT * FROM pg_get_wal_records_info('0/0', :'wal_lsn1');
-ERROR:  could not read WAL at LSN 0/0
+ERROR:  could not read WAL at LSN 0/00000000
 SELECT * FROM pg_get_wal_stats('0/0', :'wal_lsn1');
-ERROR:  could not read WAL at LSN 0/0
+ERROR:  could not read WAL at LSN 0/00000000
 SELECT * FROM pg_get_wal_block_info('0/0', :'wal_lsn1');
-ERROR:  could not read WAL at LSN 0/0
+ERROR:  could not read WAL at LSN 0/00000000
 -- Start LSN > End LSN.
 SELECT * FROM pg_get_wal_records_info(:'wal_lsn2', :'wal_lsn1');
 ERROR:  WAL start LSN must be less than end LSN
index 64745564cc249ef47d503f2b81c0f3954fb8e8bf..0398ad82cec90634bbde56e444fcb46d5f48057e 100644 (file)
@@ -105,7 +105,7 @@ InitXLogReaderState(XLogRecPtr lsn)
        if (lsn < XLOG_BLCKSZ)
                ereport(ERROR,
                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-                                errmsg("could not read WAL at LSN %X/%X",
+                                errmsg("could not read WAL at LSN %X/%08X",
                                                LSN_FORMAT_ARGS(lsn))));
 
        private_data = (ReadLocalXLogPageNoWaitPrivate *)
@@ -128,8 +128,8 @@ InitXLogReaderState(XLogRecPtr lsn)
 
        if (XLogRecPtrIsInvalid(first_valid_record))
                ereport(ERROR,
-                               (errmsg("could not find a valid record after %X/%X",
-                                               LSN_FORMAT_ARGS(lsn))));
+                               errmsg("could not find a valid record after %X/%08X",
+                                          LSN_FORMAT_ARGS(lsn)));
 
        return xlogreader;
 }
@@ -168,12 +168,12 @@ ReadNextXLogRecord(XLogReaderState *xlogreader)
                if (errormsg)
                        ereport(ERROR,
                                        (errcode_for_file_access(),
-                                        errmsg("could not read WAL at %X/%X: %s",
+                                        errmsg("could not read WAL at %X/%08X: %s",
                                                        LSN_FORMAT_ARGS(xlogreader->EndRecPtr), errormsg)));
                else
                        ereport(ERROR,
                                        (errcode_for_file_access(),
-                                        errmsg("could not read WAL at %X/%X",
+                                        errmsg("could not read WAL at %X/%08X",
                                                        LSN_FORMAT_ARGS(xlogreader->EndRecPtr))));
        }
 
@@ -479,7 +479,7 @@ pg_get_wal_record_info(PG_FUNCTION_ARGS)
                ereport(ERROR,
                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                 errmsg("WAL input LSN must be less than current LSN"),
-                                errdetail("Current WAL LSN on the database system is at %X/%X.",
+                                errdetail("Current WAL LSN on the database system is at %X/%08X.",
                                                   LSN_FORMAT_ARGS(curr_lsn))));
 
        /* Build a tuple descriptor for our result type. */
@@ -491,7 +491,7 @@ pg_get_wal_record_info(PG_FUNCTION_ARGS)
        if (!ReadNextXLogRecord(xlogreader))
                ereport(ERROR,
                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-                                errmsg("could not read WAL at %X/%X",
+                                errmsg("could not read WAL at %X/%08X",
                                                LSN_FORMAT_ARGS(xlogreader->EndRecPtr))));
 
        GetWALRecordInfo(xlogreader, values, nulls, PG_GET_WAL_RECORD_INFO_COLS);
@@ -521,7 +521,7 @@ ValidateInputLSNs(XLogRecPtr start_lsn, XLogRecPtr *end_lsn)
                ereport(ERROR,
                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                 errmsg("WAL start LSN must be less than current LSN"),
-                                errdetail("Current WAL LSN on the database system is at %X/%X.",
+                                errdetail("Current WAL LSN on the database system is at %X/%08X.",
                                                   LSN_FORMAT_ARGS(curr_lsn))));
 
        if (start_lsn > *end_lsn)
@@ -827,7 +827,7 @@ pg_get_wal_records_info_till_end_of_wal(PG_FUNCTION_ARGS)
                ereport(ERROR,
                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                 errmsg("WAL start LSN must be less than current LSN"),
-                                errdetail("Current WAL LSN on the database system is at %X/%X.",
+                                errdetail("Current WAL LSN on the database system is at %X/%08X.",
                                                   LSN_FORMAT_ARGS(end_lsn))));
 
        GetWALRecordsInfo(fcinfo, start_lsn, end_lsn);
@@ -846,7 +846,7 @@ pg_get_wal_stats_till_end_of_wal(PG_FUNCTION_ARGS)
                ereport(ERROR,
                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                 errmsg("WAL start LSN must be less than current LSN"),
-                                errdetail("Current WAL LSN on the database system is at %X/%X.",
+                                errdetail("Current WAL LSN on the database system is at %X/%08X.",
                                                   LSN_FORMAT_ARGS(end_lsn))));
 
        GetWalStats(fcinfo, start_lsn, end_lsn, stats_per_record);
index 4f9192316e047b68f22bd86c389f249e2eeaa6e4..aa5b8772436c6a2f1891cee413b5e7719df16099 100644 (file)
@@ -7971,7 +7971,7 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       </para>
       <para>
        Finish LSN of the transaction whose changes are to be skipped, if a valid
-       LSN; otherwise <literal>0/0</literal>.
+       LSN; otherwise <literal>0/0000000</literal>.
       </para></entry>
      </row>
 
index c32e6bc000d4d2bb373288658f2750ab9b4970da..f317ed9c50e59d9c37ce8dad1b611b503211951b 100644 (file)
@@ -575,8 +575,8 @@ HINT:  To initiate replication, you must manually create the replication slot, e
 <programlisting>
 /* pub # */ SELECT * FROM pg_create_logical_replication_slot('sub1', 'pgoutput');
  slot_name |    lsn
------------+-----------
- sub1      | 0/19404D0
+-----------+------------
+ sub1      | 0/019404D0
 (1 row)
 </programlisting></para>
      </listitem>
@@ -617,8 +617,8 @@ HINT:  To initiate replication, you must manually create the replication slot, e
 <programlisting>
 /* pub # */ SELECT * FROM pg_create_logical_replication_slot('myslot', 'pgoutput');
  slot_name |    lsn
------------+-----------
- myslot    | 0/19059A0
+-----------+------------
+ myslot    | 0/019059A0
 (1 row)
 </programlisting></para>
      </listitem>
@@ -655,8 +655,8 @@ HINT:  To initiate replication, you must manually create the replication slot, e
 <programlisting>
 /* pub # */ SELECT * FROM pg_create_logical_replication_slot('myslot', 'pgoutput');
  slot_name |    lsn
------------+-----------
- myslot    | 0/1905930
+-----------+------------
+ myslot    | 0/01905930
 (1 row)
 </programlisting></para>
      </listitem>
@@ -1965,15 +1965,15 @@ DETAIL:  <replaceable class="parameter">detailed_explanation</replaceable>.
 ERROR:  conflict detected on relation "public.test": conflict=insert_exists
 DETAIL:  Key already exists in unique index "t_pkey", which was modified locally in transaction 740 at 2024-06-26 10:47:04.727375+08.
 Key (c)=(1); existing local tuple (1, 'local'); remote tuple (1, 'remote').
-CONTEXT:  processing remote data for replication origin "pg_16395" during "INSERT" for replication target relation "public.test" in transaction 725 finished at 0/14C0378
+CONTEXT:  processing remote data for replication origin "pg_16395" during "INSERT" for replication target relation "public.test" in transaction 725 finished at 0/014C0378
 </screen>
    The LSN of the transaction that contains the change violating the constraint and
-   the replication origin name can be found from the server log (LSN 0/14C0378 and
+   the replication origin name can be found from the server log (LSN 0/014C0378 and
    replication origin <literal>pg_16395</literal> in the above case).  The
    transaction that produced the conflict can be skipped by using
    <link linkend="sql-altersubscription-params-skip"><command>ALTER SUBSCRIPTION ... SKIP</command></link>
    with the finish LSN
-   (i.e., LSN 0/14C0378).  The finish LSN could be an LSN at which the transaction
+   (i.e., LSN 0/014C0378).  The finish LSN could be an LSN at which the transaction
    is committed or prepared on the publisher.  Alternatively, the transaction can
    also be skipped by calling the <link linkend="pg-replication-origin-advance">
    <function>pg_replication_origin_advance()</function></link> function.
@@ -1984,7 +1984,7 @@ CONTEXT:  processing remote data for replication origin "pg_16395" during "INSER
    <link linkend="sql-createsubscription-params-with-disable-on-error"><literal>disable_on_error</literal></link>
    option. Then, you can use <function>pg_replication_origin_advance()</function>
    function with the <parameter>node_name</parameter> (i.e., <literal>pg_16395</literal>)
-   and the next LSN of the finish LSN (i.e., 0/14C0379).  The current position of
+   and the next LSN of the finish LSN (i.e., 0/014C0379).  The current position of
    origins can be seen in the <link linkend="view-pg-replication-origin-status">
    <structname>pg_replication_origin_status</structname></link> system view.
    Please note that skipping the whole transaction includes skipping changes that
index a45a14124160784bcb43d213b3538c282cf3533c..593f784b69dcbdf99a0db29098a4a03b94099a7b 100644 (file)
 postgres=# -- Create a slot named 'regression_slot' using the output plugin 'test_decoding'
 postgres=# SELECT * FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding', false, true);
     slot_name    |    lsn
------------------+-----------
- regression_slot | 0/16B1970
+-----------------+------------
+ regression_slot | 0/016B1970
 (1 row)
 
 postgres=# SELECT slot_name, plugin, slot_type, database, active, restart_lsn, confirmed_flush_lsn FROM pg_replication_slots;
     slot_name    |    plugin     | slot_type | database | active | restart_lsn | confirmed_flush_lsn
------------------+---------------+-----------+----------+--------+-------------+-----------------
- regression_slot | test_decoding | logical   | postgres | f      | 0/16A4408   | 0/16A4440
+-----------------+---------------+-----------+----------+--------+-------------+---------------------
+ regression_slot | test_decoding | logical   | postgres | f      | 0/016A4408  | 0/016A4440
 (1 row)
 
 postgres=# -- There are no changes to see yet
@@ -78,10 +78,10 @@ CREATE TABLE
 
 postgres=# -- DDL isn't replicated, so all you'll see is the transaction
 postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL);
-    lsn    |  xid  |     data
------------+-------+--------------
- 0/BA2DA58 | 10297 | BEGIN 10297
- 0/BA5A5A0 | 10297 | COMMIT 10297
+    lsn     |  xid  |     data
+------------+-------+--------------
+ 0/0BA2DA58 | 10297 | BEGIN 10297
+ 0/0BA5A5A0 | 10297 | COMMIT 10297
 (2 rows)
 
 postgres=# -- Once changes are read, they're consumed and not emitted
@@ -97,41 +97,41 @@ postgres=*# INSERT INTO data(data) VALUES('2');
 postgres=*# COMMIT;
 
 postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL);
-    lsn    |  xid  |                          data
------------+-------+---------------------------------------------------------
- 0/BA5A688 | 10298 | BEGIN 10298
- 0/BA5A6F0 | 10298 | table public.data: INSERT: id[integer]:1 data[text]:'1'
- 0/BA5A7F8 | 10298 | table public.data: INSERT: id[integer]:2 data[text]:'2'
- 0/BA5A8A8 | 10298 | COMMIT 10298
+    lsn     |  xid  |                          data
+------------+-------+---------------------------------------------------------
+ 0/0BA5A688 | 10298 | BEGIN 10298
+ 0/0BA5A6F0 | 10298 | table public.data: INSERT: id[integer]:1 data[text]:'1'
+ 0/0BA5A7F8 | 10298 | table public.data: INSERT: id[integer]:2 data[text]:'2'
+ 0/0BA5A8A8 | 10298 | COMMIT 10298
 (4 rows)
 
 postgres=# INSERT INTO data(data) VALUES('3');
 
 postgres=# -- You can also peek ahead in the change stream without consuming changes
 postgres=# SELECT * FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL);
-    lsn    |  xid  |                          data
------------+-------+---------------------------------------------------------
- 0/BA5A8E0 | 10299 | BEGIN 10299
- 0/BA5A8E0 | 10299 | table public.data: INSERT: id[integer]:3 data[text]:'3'
- 0/BA5A990 | 10299 | COMMIT 10299
+    lsn     |  xid  |                          data
+------------+-------+---------------------------------------------------------
+ 0/0BA5A8E0 | 10299 | BEGIN 10299
+ 0/0BA5A8E0 | 10299 | table public.data: INSERT: id[integer]:3 data[text]:'3'
+ 0/0BA5A990 | 10299 | COMMIT 10299
 (3 rows)
 
 postgres=# -- The next call to pg_logical_slot_peek_changes() returns the same changes again
 postgres=# SELECT * FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL);
-    lsn    |  xid  |                          data
------------+-------+---------------------------------------------------------
- 0/BA5A8E0 | 10299 | BEGIN 10299
- 0/BA5A8E0 | 10299 | table public.data: INSERT: id[integer]:3 data[text]:'3'
- 0/BA5A990 | 10299 | COMMIT 10299
+    lsn     |  xid  |                          data
+------------+-------+---------------------------------------------------------
+ 0/0BA5A8E0 | 10299 | BEGIN 10299
+ 0/0BA5A8E0 | 10299 | table public.data: INSERT: id[integer]:3 data[text]:'3'
+ 0/0BA5A990 | 10299 | COMMIT 10299
 (3 rows)
 
 postgres=# -- options can be passed to output plugin, to influence the formatting
 postgres=# SELECT * FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL, 'include-timestamp', 'on');
-    lsn    |  xid  |                          data
------------+-------+---------------------------------------------------------
- 0/BA5A8E0 | 10299 | BEGIN 10299
- 0/BA5A8E0 | 10299 | table public.data: INSERT: id[integer]:3 data[text]:'3'
- 0/BA5A990 | 10299 | COMMIT 10299 (at 2017-05-10 12:07:21.272494-04)
+    lsn     |  xid  |                          data
+------------+-------+---------------------------------------------------------
+ 0/0BA5A8E0 | 10299 | BEGIN 10299
+ 0/0BA5A8E0 | 10299 | table public.data: INSERT: id[integer]:3 data[text]:'3'
+ 0/0BA5A990 | 10299 | COMMIT 10299 (at 2017-05-10 12:07:21.272494-04)
 (3 rows)
 
 postgres=# -- Remember to destroy a slot you no longer need to stop it consuming
@@ -200,18 +200,18 @@ postgres=*# INSERT INTO data(data) VALUES('5');
 postgres=*# PREPARE TRANSACTION 'test_prepared1';
 
 postgres=# SELECT * FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL);
-    lsn    | xid |                          data
------------+-----+---------------------------------------------------------
- 0/1689DC0 | 529 | BEGIN 529
- 0/1689DC0 | 529 | table public.data: INSERT: id[integer]:3 data[text]:'5'
- 0/1689FC0 | 529 | PREPARE TRANSACTION 'test_prepared1', txid 529
+    lsn     | xid |                          data
+------------+-----+---------------------------------------------------------
+ 0/01689DC0 | 529 | BEGIN 529
+ 0/01689DC0 | 529 | table public.data: INSERT: id[integer]:3 data[text]:'5'
+ 0/01689FC0 | 529 | PREPARE TRANSACTION 'test_prepared1', txid 529
 (3 rows)
 
 postgres=# COMMIT PREPARED 'test_prepared1';
 postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NULL);
-    lsn    | xid |                    data
------------+-----+--------------------------------------------
- 0/168A060 | 529 | COMMIT PREPARED 'test_prepared1', txid 529
+    lsn     | xid |                    data
+------------+-----+--------------------------------------------
+ 0/0168A060 | 529 | COMMIT PREPARED 'test_prepared1', txid 529
 (4 row)
 
 postgres=#-- you can also rollback a prepared transaction
@@ -219,18 +219,18 @@ postgres=# BEGIN;
 postgres=*# INSERT INTO data(data) VALUES('6');
 postgres=*# PREPARE TRANSACTION 'test_prepared2';
 postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NULL);
-    lsn    | xid |                          data
------------+-----+---------------------------------------------------------
- 0/168A180 | 530 | BEGIN 530
- 0/168A1E8 | 530 | table public.data: INSERT: id[integer]:4 data[text]:'6'
- 0/168A430 | 530 | PREPARE TRANSACTION 'test_prepared2', txid 530
+    lsn     | xid |                          data
+------------+-----+---------------------------------------------------------
+ 0/0168A180 | 530 | BEGIN 530
+ 0/0168A1E8 | 530 | table public.data: INSERT: id[integer]:4 data[text]:'6'
+ 0/0168A430 | 530 | PREPARE TRANSACTION 'test_prepared2', txid 530
 (3 rows)
 
 postgres=# ROLLBACK PREPARED 'test_prepared2';
 postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NULL);
-    lsn    | xid |                     data
------------+-----+----------------------------------------------
- 0/168A4B8 | 530 | ROLLBACK PREPARED 'test_prepared2', txid 530
+    lsn     | xid |                     data
+------------+-----+----------------------------------------------
+ 0/0168A4B8 | 530 | ROLLBACK PREPARED 'test_prepared2', txid 530
 (1 row)
 </programlisting>
 </sect1>
@@ -431,7 +431,7 @@ postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NU
      cases, the following log message may appear:
 <programlisting>
      LOG:  could not synchronize replication slot "failover_slot"
-     DETAIL:  Synchronization could lead to data loss as the remote slot needs WAL at LSN 0/3003F28 and catalog xmin 754, but the standby has LSN 0/3003F28 and catalog xmin 756
+     DETAIL:  Synchronization could lead to data loss as the remote slot needs WAL at LSN 0/03003F28 and catalog xmin 754, but the standby has LSN 0/03003F28 and catalog xmin 756
 </programlisting>
      If the logical replication slot is actively used by a consumer, no
      manual intervention is needed; the slot will advance automatically,
index 487c5d758ffbfd9c0eb13fae77c0a7252b632ad0..12873d17d7fadc5e70624ea53cd28677ec4be2ad 100644 (file)
@@ -73,9 +73,9 @@
       passed as argument.  For example:
 <screen>
 test=# SELECT * FROM page_header(get_raw_page('pg_class', 0));
-    lsn    | checksum | flags  | lower | upper | special | pagesize | version | prune_xid
------------+----------+--------+-------+-------+---------+----------+---------+-----------
- 0/24A1B50 |        0 |      1 |   232 |   368 |    8192 |     8192 |       4 |         0
+    lsn     | checksum | flags  | lower | upper | special | pagesize | version | prune_xid
+------------+----------+--------+-------+-------+---------+----------+---------+-----------
+ 0/024A1B50 |        0 |      1 |   232 |   368 |    8192 |     8192 |       4 |         0
 </screen>
       The returned columns correspond to the fields in the
       <structname>PageHeaderData</structname> struct.
@@ -741,9 +741,9 @@ test=# SELECT first_tid, nbytes, tids[0:5] AS some_tids
       For example:
 <screen>
 test=# SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist_idx', 2));
- lsn | nsn | rightlink | flags
------+-----+-----------+--------
- 0/1 | 0/0 |         1 | {leaf}
+    lsn     │    nsn     │ rightlink │ flags  
+────────────┼────────────┼───────────┼────────
+ 0/0B5FE088 │ 0/00000000 │         1 │ {leaf}
 (1 row)
 </screen>
      </para>
index 4b111f961133b497f1127209670b06a804e3a537..1c1a9d14e510ad26f4ec8ce3b4bf978a53f98ecf 100644 (file)
@@ -95,7 +95,7 @@ two_phase_at             | 0/40796AF8
 initial_xmin_horizon     | 0
 building_full_snapshot   | f
 in_slot_creation         | f
-last_serialized_snapshot | 0/0
+last_serialized_snapshot | 0/00000000
 next_phase_at            | 0
 committed_count          | 0
 committed_xip            |
@@ -114,7 +114,7 @@ two_phase_at             | 0/40796AF8
 initial_xmin_horizon     | 0
 building_full_snapshot   | f
 in_slot_creation         | f
-last_serialized_snapshot | 0/0
+last_serialized_snapshot | 0/00000000
 next_phase_at            | 0
 committed_count          | 0
 committed_xip            |
index 3a8121c70f1f11274d228c942156c2c77dba45dc..79c3ead40bc716d7cbde756d6ec9cf47b36860e2 100644 (file)
@@ -73,9 +73,9 @@
 <screen>
 postgres=# SELECT * FROM pg_get_wal_record_info('0/E419E28');
 -[ RECORD 1 ]----+-------------------------------------------------
-start_lsn        | 0/E419E28
-end_lsn          | 0/E419E68
-prev_lsn         | 0/E419D78
+start_lsn        | 0/0E419E28
+end_lsn          | 0/0E419E68
+prev_lsn         | 0/0E419D78
 xid              | 0
 resource_manager | Heap2
 record_type      | VACUUM
@@ -146,9 +146,9 @@ block_ref        |
 <screen>
 postgres=# SELECT * FROM pg_get_wal_block_info('0/1230278', '0/12302B8');
 -[ RECORD 1 ]-----+-----------------------------------
-start_lsn         | 0/1230278
-end_lsn           | 0/12302B8
-prev_lsn          | 0/122FD40
+start_lsn         | 0/01230278
+end_lsn           | 0/012302B8
+prev_lsn          | 0/0122FD40
 block_id          | 0
 reltablespace     | 1663
 reldatabase       | 1
index 5d1ae8f4f52e234f4d1e8c5284eefc19cc0ef512..7d3d590471a321fce39a02055717df875e598be1 100644 (file)
 
 <programlisting>
 postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'include-xids', '0');
-   lsn     | xid |                       data
------------+-----+--------------------------------------------------
- 0/16D30F8 | 691 | BEGIN
- 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'
- 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:3 data[text]:'demo'
- 0/16D32A0 | 691 | COMMIT
- 0/16D32D8 | 692 | BEGIN
- 0/16D3398 | 692 | table public.data: DELETE: id[int4]:2
- 0/16D3398 | 692 | table public.data: DELETE: id[int4]:3
- 0/16D3398 | 692 | COMMIT
+    lsn     | xid |                       data
+------------+-----+--------------------------------------------------
+ 0/016D30F8 | 691 | BEGIN
+ 0/016D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'
+ 0/016D32A0 | 691 | table public.data: INSERT: id[int4]:3 data[text]:'demo'
+ 0/016D32A0 | 691 | COMMIT
+ 0/016D32D8 | 692 | BEGIN
+ 0/016D3398 | 692 | table public.data: DELETE: id[int4]:2
+ 0/016D3398 | 692 | table public.data: DELETE: id[int4]:3
+ 0/016D3398 | 692 | COMMIT
 (8 rows)
 </programlisting>
  </para>
@@ -45,18 +45,18 @@ postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'i
 
 <programlisting>
 postgres[33712]=#* SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'stream-changes', '1');
-    lsn    | xid |                       data
------------+-----+--------------------------------------------------
- 0/16B21F8 | 503 | opening a streamed block for transaction TXN 503
- 0/16B21F8 | 503 | streaming change for TXN 503
- 0/16B2300 | 503 | streaming change for TXN 503
- 0/16B2408 | 503 | streaming change for TXN 503
- 0/16BEBA0 | 503 | closing a streamed block for transaction TXN 503
- 0/16B21F8 | 503 | opening a streamed block for transaction TXN 503
- 0/16BECA8 | 503 | streaming change for TXN 503
- 0/16BEDB0 | 503 | streaming change for TXN 503
- 0/16BEEB8 | 503 | streaming change for TXN 503
- 0/16BEBA0 | 503 | closing a streamed block for transaction TXN 503
+    lsn     | xid |                       data
+------------+-----+--------------------------------------------------
+ 0/016B21F8 | 503 | opening a streamed block for transaction TXN 503
+ 0/016B21F8 | 503 | streaming change for TXN 503
+ 0/016B2300 | 503 | streaming change for TXN 503
+ 0/016B2408 | 503 | streaming change for TXN 503
+ 0/016BEBA0 | 503 | closing a streamed block for transaction TXN 503
+ 0/016B21F8 | 503 | opening a streamed block for transaction TXN 503
+ 0/016BECA8 | 503 | streaming change for TXN 503
+ 0/016BEDB0 | 503 | streaming change for TXN 503
+ 0/016BEEB8 | 503 | streaming change for TXN 503
+ 0/016BEBA0 | 503 | closing a streamed block for transaction TXN 503
 (10 rows)
 </programlisting>
  </para>
index 5dd742339969a9ca65b20e7282e1990122a69897..35e3af2903ed2c4f956fefc683effbb8d27b9017 100644 (file)
@@ -29,7 +29,7 @@ replorigin_desc(StringInfo buf, XLogReaderState *record)
 
                                xlrec = (xl_replorigin_set *) rec;
 
-                               appendStringInfo(buf, "set %u; lsn %X/%X; force: %d",
+                               appendStringInfo(buf, "set %u; lsn %X/%08X; force: %d",
                                                                 xlrec->node_id,
                                                                 LSN_FORMAT_ARGS(xlrec->remote_lsn),
                                                                 xlrec->force);
index 305598e2865c8dd96fc36b6694b98cdf3006c47e..f0f696855b9af3c56f0f6636add501a2009c37d9 100644 (file)
@@ -359,7 +359,7 @@ xact_desc_commit(StringInfo buf, uint8 info, xl_xact_commit *xlrec, RepOriginId
 
        if (parsed.xinfo & XACT_XINFO_HAS_ORIGIN)
        {
-               appendStringInfo(buf, "; origin: node %u, lsn %X/%X, at %s",
+               appendStringInfo(buf, "; origin: node %u, lsn %X/%08X, at %s",
                                                 origin_id,
                                                 LSN_FORMAT_ARGS(parsed.origin_lsn),
                                                 timestamptz_to_str(parsed.origin_timestamp));
@@ -384,7 +384,7 @@ xact_desc_abort(StringInfo buf, uint8 info, xl_xact_abort *xlrec, RepOriginId or
 
        if (parsed.xinfo & XACT_XINFO_HAS_ORIGIN)
        {
-               appendStringInfo(buf, "; origin: node %u, lsn %X/%X, at %s",
+               appendStringInfo(buf, "; origin: node %u, lsn %X/%08X, at %s",
                                                 origin_id,
                                                 LSN_FORMAT_ARGS(parsed.origin_lsn),
                                                 timestamptz_to_str(parsed.origin_timestamp));
@@ -418,7 +418,7 @@ xact_desc_prepare(StringInfo buf, uint8 info, xl_xact_prepare *xlrec, RepOriginI
         * way as PrepareRedoAdd().
         */
        if (origin_id != InvalidRepOriginId)
-               appendStringInfo(buf, "; origin: node %u, lsn %X/%X, at %s",
+               appendStringInfo(buf, "; origin: node %u, lsn %X/%08X, at %s",
                                                 origin_id,
                                                 LSN_FORMAT_ARGS(parsed.origin_lsn),
                                                 timestamptz_to_str(parsed.origin_timestamp));
index 58040f28656fcc88fd968539967bd8b0570e6793..cd6c2a2f650a68f467e704ca88e8b719a0f9e70c 100644 (file)
@@ -65,7 +65,7 @@ xlog_desc(StringInfo buf, XLogReaderState *record)
        {
                CheckPoint *checkpoint = (CheckPoint *) rec;
 
-               appendStringInfo(buf, "redo %X/%X; "
+               appendStringInfo(buf, "redo %X/%08X; "
                                                 "tli %u; prev tli %u; fpw %s; wal_level %s; xid %u:%u; oid %u; multi %u; offset %u; "
                                                 "oldest xid %u in DB %u; oldest multi %u in DB %u; "
                                                 "oldest/newest commit timestamp xid: %u/%u; "
@@ -111,7 +111,7 @@ xlog_desc(StringInfo buf, XLogReaderState *record)
                XLogRecPtr      startpoint;
 
                memcpy(&startpoint, rec, sizeof(XLogRecPtr));
-               appendStringInfo(buf, "%X/%X", LSN_FORMAT_ARGS(startpoint));
+               appendStringInfo(buf, "%X/%08X", LSN_FORMAT_ARGS(startpoint));
        }
        else if (info == XLOG_PARAMETER_CHANGE)
        {
@@ -156,7 +156,7 @@ xlog_desc(StringInfo buf, XLogReaderState *record)
                xl_overwrite_contrecord xlrec;
 
                memcpy(&xlrec, rec, sizeof(xl_overwrite_contrecord));
-               appendStringInfo(buf, "lsn %X/%X; time %s",
+               appendStringInfo(buf, "lsn %X/%08X; time %s",
                                                 LSN_FORMAT_ARGS(xlrec.overwritten_lsn),
                                                 timestamptz_to_str(xlrec.overwrite_time));
        }
index a27f27cc037d11e92820b4313a60ac28feeb1590..186eb91f6094318111772ee7aef1ccfc03a55088 100644 (file)
@@ -154,7 +154,7 @@ readTimeLineHistory(TimeLineID targetTLI)
                if (*ptr == '\0' || *ptr == '#')
                        continue;
 
-               nfields = sscanf(fline, "%u\t%X/%X", &tli, &switchpoint_hi, &switchpoint_lo);
+               nfields = sscanf(fline, "%u\t%X/%08X", &tli, &switchpoint_hi, &switchpoint_lo);
 
                if (nfields < 1)
                {
@@ -399,7 +399,7 @@ writeTimeLineHistory(TimeLineID newTLI, TimeLineID parentTLI,
         * parent file failed to end with one.
         */
        snprintf(buffer, sizeof(buffer),
-                        "%s%u\t%X/%X\t%s\n",
+                        "%s%u\t%X/%08X\t%s\n",
                         (srcfd < 0) ? "" : "\n",
                         parentTLI,
                         LSN_FORMAT_ARGS(switchpoint),
index 8975dc6d3c81216c567cadb9c58476f63de76885..85cbe397cb21a7a777aa28f0ab82157af4c39116 100644 (file)
@@ -1429,12 +1429,12 @@ XlogReadTwoPhaseData(XLogRecPtr lsn, char **buf, int *len)
                if (errormsg)
                        ereport(ERROR,
                                        (errcode_for_file_access(),
-                                        errmsg("could not read two-phase state from WAL at %X/%X: %s",
+                                        errmsg("could not read two-phase state from WAL at %X/%08X: %s",
                                                        LSN_FORMAT_ARGS(lsn), errormsg)));
                else
                        ereport(ERROR,
                                        (errcode_for_file_access(),
-                                        errmsg("could not read two-phase state from WAL at %X/%X",
+                                        errmsg("could not read two-phase state from WAL at %X/%08X",
                                                        LSN_FORMAT_ARGS(lsn))));
        }
 
@@ -1442,7 +1442,7 @@ XlogReadTwoPhaseData(XLogRecPtr lsn, char **buf, int *len)
                (XLogRecGetInfo(xlogreader) & XLOG_XACT_OPMASK) != XLOG_XACT_PREPARE)
                ereport(ERROR,
                                (errcode_for_file_access(),
-                                errmsg("expected two-phase state data is not present in WAL at %X/%X",
+                                errmsg("expected two-phase state data is not present in WAL at %X/%08X",
                                                LSN_FORMAT_ARGS(lsn))));
 
        if (len != NULL)
@@ -2533,7 +2533,7 @@ PrepareRedoAdd(FullTransactionId fxid, char *buf,
                        ereport(reachedConsistency ? ERROR : WARNING,
                                        (errmsg("could not recover two-phase state file for transaction %u",
                                                        hdr->xid),
-                                        errdetail("Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk.",
+                                        errdetail("Two-phase state file has been found in WAL record %X/%08X, but this transaction has already been restored from disk.",
                                                           LSN_FORMAT_ARGS(start_lsn))));
                        return;
                }
index 47ffc0a23077236e3e54241015603a7e8cb05553..a8cc6402d6230ab67f0c832fcc654f08fa8e8666 100644 (file)
@@ -1028,7 +1028,7 @@ XLogInsertRecord(XLogRecData *rdata,
                oldCxt = MemoryContextSwitchTo(walDebugCxt);
 
                initStringInfo(&buf);
-               appendStringInfo(&buf, "INSERT @ %X/%X: ", LSN_FORMAT_ARGS(EndPos));
+               appendStringInfo(&buf, "INSERT @ %X/%08X: ", LSN_FORMAT_ARGS(EndPos));
 
                /*
                 * We have to piece together the WAL record data from the XLogRecData
@@ -1549,8 +1549,8 @@ WaitXLogInsertionsToFinish(XLogRecPtr upto)
        if (upto > reservedUpto)
        {
                ereport(LOG,
-                               (errmsg("request to flush past end of generated WAL; request %X/%X, current position %X/%X",
-                                               LSN_FORMAT_ARGS(upto), LSN_FORMAT_ARGS(reservedUpto))));
+                               errmsg("request to flush past end of generated WAL; request %X/%08X, current position %X/%08X",
+                                          LSN_FORMAT_ARGS(upto), LSN_FORMAT_ARGS(reservedUpto)));
                upto = reservedUpto;
        }
 
@@ -1716,7 +1716,7 @@ GetXLogBuffer(XLogRecPtr ptr, TimeLineID tli)
                endptr = pg_atomic_read_u64(&XLogCtl->xlblocks[idx]);
 
                if (expectedEndPtr != endptr)
-                       elog(PANIC, "could not find WAL buffer for %X/%X",
+                       elog(PANIC, "could not find WAL buffer for %X/%08X",
                                 LSN_FORMAT_ARGS(ptr));
        }
        else
@@ -1776,7 +1776,7 @@ WALReadFromBuffers(char *dstbuf, XLogRecPtr startptr, Size count,
        inserted = pg_atomic_read_u64(&XLogCtl->logInsertResult);
        if (startptr + count > inserted)
                ereport(ERROR,
-                               errmsg("cannot read past end of generated WAL: requested %X/%X, current position %X/%X",
+                               errmsg("cannot read past end of generated WAL: requested %X/%08X, current position %X/%08X",
                                           LSN_FORMAT_ARGS(startptr + count),
                                           LSN_FORMAT_ARGS(inserted)));
 
@@ -2281,7 +2281,7 @@ AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli, bool opportunistic)
 #ifdef WAL_DEBUG
        if (XLOG_DEBUG && npages > 0)
        {
-               elog(DEBUG1, "initialized %d pages, up to %X/%X",
+               elog(DEBUG1, "initialized %d pages, up to %X/%08X",
                         npages, LSN_FORMAT_ARGS(NewPageEndPtr));
        }
 #endif
@@ -2492,7 +2492,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible)
                XLogRecPtr      EndPtr = pg_atomic_read_u64(&XLogCtl->xlblocks[curridx]);
 
                if (LogwrtResult.Write >= EndPtr)
-                       elog(PANIC, "xlog write request %X/%X is past end of log %X/%X",
+                       elog(PANIC, "xlog write request %X/%08X is past end of log %X/%08X",
                                 LSN_FORMAT_ARGS(LogwrtResult.Write),
                                 LSN_FORMAT_ARGS(EndPtr));
 
@@ -2892,7 +2892,7 @@ UpdateMinRecoveryPoint(XLogRecPtr lsn, bool force)
                newMinRecoveryPoint = GetCurrentReplayRecPtr(&newMinRecoveryPointTLI);
                if (!force && newMinRecoveryPoint < lsn)
                        elog(WARNING,
-                                "xlog min recovery request %X/%X is past current point %X/%X",
+                                "xlog min recovery request %X/%08X is past current point %X/%08X",
                                 LSN_FORMAT_ARGS(lsn), LSN_FORMAT_ARGS(newMinRecoveryPoint));
 
                /* update control file */
@@ -2905,9 +2905,9 @@ UpdateMinRecoveryPoint(XLogRecPtr lsn, bool force)
                        LocalMinRecoveryPointTLI = newMinRecoveryPointTLI;
 
                        ereport(DEBUG2,
-                                       (errmsg_internal("updated min recovery point to %X/%X on timeline %u",
-                                                                        LSN_FORMAT_ARGS(newMinRecoveryPoint),
-                                                                        newMinRecoveryPointTLI)));
+                                       errmsg_internal("updated min recovery point to %X/%08X on timeline %u",
+                                                                       LSN_FORMAT_ARGS(newMinRecoveryPoint),
+                                                                       newMinRecoveryPointTLI));
                }
        }
        LWLockRelease(ControlFileLock);
@@ -2945,7 +2945,7 @@ XLogFlush(XLogRecPtr record)
 
 #ifdef WAL_DEBUG
        if (XLOG_DEBUG)
-               elog(LOG, "xlog flush request %X/%X; write %X/%X; flush %X/%X",
+               elog(LOG, "xlog flush request %X/%08X; write %X/%08X; flush %X/%08X",
                         LSN_FORMAT_ARGS(record),
                         LSN_FORMAT_ARGS(LogwrtResult.Write),
                         LSN_FORMAT_ARGS(LogwrtResult.Flush));
@@ -3078,7 +3078,7 @@ XLogFlush(XLogRecPtr record)
         */
        if (LogwrtResult.Flush < record)
                elog(ERROR,
-                        "xlog flush request %X/%X is not satisfied --- flushed only to %X/%X",
+                        "xlog flush request %X/%08X is not satisfied --- flushed only to %X/%08X",
                         LSN_FORMAT_ARGS(record),
                         LSN_FORMAT_ARGS(LogwrtResult.Flush));
 }
@@ -3205,7 +3205,7 @@ XLogBackgroundFlush(void)
 
 #ifdef WAL_DEBUG
        if (XLOG_DEBUG)
-               elog(LOG, "xlog bg flush request write %X/%X; flush: %X/%X, current is write %X/%X; flush %X/%X",
+               elog(LOG, "xlog bg flush request write %X/%08X; flush: %X/%08X, current is write %X/%08X; flush %X/%08X",
                         LSN_FORMAT_ARGS(WriteRqst.Write),
                         LSN_FORMAT_ARGS(WriteRqst.Flush),
                         LSN_FORMAT_ARGS(LogwrtResult.Write),
@@ -6921,7 +6921,7 @@ LogCheckpointEnd(bool restartpoint)
                                                "%d removed, %d recycled; write=%ld.%03d s, "
                                                "sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, "
                                                "longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, "
-                                               "estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X",
+                                               "estimate=%d kB; lsn=%X/%08X, redo lsn=%X/%08X",
                                                CheckpointStats.ckpt_bufs_written,
                                                (double) CheckpointStats.ckpt_bufs_written * 100 / NBuffers,
                                                CheckpointStats.ckpt_slru_written,
@@ -6945,7 +6945,7 @@ LogCheckpointEnd(bool restartpoint)
                                                "%d removed, %d recycled; write=%ld.%03d s, "
                                                "sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, "
                                                "longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, "
-                                               "estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X",
+                                               "estimate=%d kB; lsn=%X/%08X, redo lsn=%X/%08X",
                                                CheckpointStats.ckpt_bufs_written,
                                                (double) CheckpointStats.ckpt_bufs_written * 100 / NBuffers,
                                                CheckpointStats.ckpt_slru_written,
@@ -7641,7 +7641,7 @@ CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn, XLogRecPtr pagePtr,
        if (!RecoveryInProgress())
                elog(ERROR, "can only be used at end of recovery");
        if (pagePtr % XLOG_BLCKSZ != 0)
-               elog(ERROR, "invalid position for missing continuation record %X/%X",
+               elog(ERROR, "invalid position for missing continuation record %X/%08X",
                         LSN_FORMAT_ARGS(pagePtr));
 
        /* The current WAL insert position should be right after the page header */
@@ -7652,7 +7652,7 @@ CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn, XLogRecPtr pagePtr,
                startPos += SizeOfXLogShortPHD;
        recptr = GetXLogInsertRecPtr();
        if (recptr != startPos)
-               elog(ERROR, "invalid WAL insert position %X/%X for OVERWRITE_CONTRECORD",
+               elog(ERROR, "invalid WAL insert position %X/%08X for OVERWRITE_CONTRECORD",
                         LSN_FORMAT_ARGS(recptr));
 
        START_CRIT_SECTION();
@@ -7682,7 +7682,7 @@ CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn, XLogRecPtr pagePtr,
 
        /* check that the record was inserted to the right place */
        if (ProcLastRecPtr != startPos)
-               elog(ERROR, "OVERWRITE_CONTRECORD was inserted to unexpected position %X/%X",
+               elog(ERROR, "OVERWRITE_CONTRECORD was inserted to unexpected position %X/%08X",
                         LSN_FORMAT_ARGS(ProcLastRecPtr));
 
        XLogFlush(recptr);
@@ -7751,8 +7751,7 @@ RecoveryRestartPoint(const CheckPoint *checkPoint, XLogReaderState *record)
        if (XLogHaveInvalidPages())
        {
                elog(DEBUG2,
-                        "could not record restart point at %X/%X because there "
-                        "are unresolved references to invalid pages",
+                        "could not record restart point at %X/%08X because there are unresolved references to invalid pages",
                         LSN_FORMAT_ARGS(checkPoint->redo));
                return;
        }
@@ -7832,8 +7831,8 @@ CreateRestartPoint(int flags)
                lastCheckPoint.redo <= ControlFile->checkPointCopy.redo)
        {
                ereport(DEBUG2,
-                               (errmsg_internal("skipping restartpoint, already performed at %X/%X",
-                                                                LSN_FORMAT_ARGS(lastCheckPoint.redo))));
+                               errmsg_internal("skipping restartpoint, already performed at %X/%08X",
+                                                               LSN_FORMAT_ARGS(lastCheckPoint.redo)));
 
                UpdateMinRecoveryPoint(InvalidXLogRecPtr, true);
                if (flags & CHECKPOINT_IS_SHUTDOWN)
@@ -8017,10 +8016,10 @@ CreateRestartPoint(int flags)
 
        xtime = GetLatestXTime();
        ereport((log_checkpoints ? LOG : DEBUG2),
-                       (errmsg("recovery restart point at %X/%X",
-                                       LSN_FORMAT_ARGS(lastCheckPoint.redo)),
-                        xtime ? errdetail("Last completed transaction was at log time %s.",
-                                                          timestamptz_to_str(xtime)) : 0));
+                       errmsg("recovery restart point at %X/%08X",
+                                  LSN_FORMAT_ARGS(lastCheckPoint.redo)),
+                       xtime ? errdetail("Last completed transaction was at log time %s.",
+                                                         timestamptz_to_str(xtime)) : 0);
 
        /*
         * Finally, execute archive_cleanup_command, if any.
@@ -8281,8 +8280,8 @@ XLogRestorePoint(const char *rpName)
        RecPtr = XLogInsert(RM_XLOG_ID, XLOG_RESTORE_POINT);
 
        ereport(LOG,
-                       (errmsg("restore point \"%s\" created at %X/%X",
-                                       rpName, LSN_FORMAT_ARGS(RecPtr))));
+                       errmsg("restore point \"%s\" created at %X/%08X",
+                                  rpName, LSN_FORMAT_ARGS(RecPtr)));
 
        return RecPtr;
 }
index 342590e0a46d3f566cee93c9ca8466a83718b75f..cda4b38b7d67d9ac239a80c089696d81501bd847 100644 (file)
@@ -42,7 +42,7 @@ build_backup_content(BackupState *state, bool ishistoryfile)
 
        XLByteToSeg(state->startpoint, startsegno, wal_segment_size);
        XLogFileName(startxlogfile, state->starttli, startsegno, wal_segment_size);
-       appendStringInfo(result, "START WAL LOCATION: %X/%X (file %s)\n",
+       appendStringInfo(result, "START WAL LOCATION: %X/%08X (file %s)\n",
                                         LSN_FORMAT_ARGS(state->startpoint), startxlogfile);
 
        if (ishistoryfile)
@@ -52,11 +52,11 @@ build_backup_content(BackupState *state, bool ishistoryfile)
 
                XLByteToSeg(state->stoppoint, stopsegno, wal_segment_size);
                XLogFileName(stopxlogfile, state->stoptli, stopsegno, wal_segment_size);
-               appendStringInfo(result, "STOP WAL LOCATION: %X/%X (file %s)\n",
+               appendStringInfo(result, "STOP WAL LOCATION: %X/%08X (file %s)\n",
                                                 LSN_FORMAT_ARGS(state->stoppoint), stopxlogfile);
        }
 
-       appendStringInfo(result, "CHECKPOINT LOCATION: %X/%X\n",
+       appendStringInfo(result, "CHECKPOINT LOCATION: %X/%08X\n",
                                         LSN_FORMAT_ARGS(state->checkpointloc));
        appendStringInfoString(result, "BACKUP METHOD: streamed\n");
        appendStringInfo(result, "BACKUP FROM: %s\n",
@@ -81,7 +81,7 @@ build_backup_content(BackupState *state, bool ishistoryfile)
        Assert(XLogRecPtrIsInvalid(state->istartpoint) == (state->istarttli == 0));
        if (!XLogRecPtrIsInvalid(state->istartpoint))
        {
-               appendStringInfo(result, "INCREMENTAL FROM LSN: %X/%X\n",
+               appendStringInfo(result, "INCREMENTAL FROM LSN: %X/%08X\n",
                                                 LSN_FORMAT_ARGS(state->istartpoint));
                appendStringInfo(result, "INCREMENTAL FROM TLI: %u\n",
                                                 state->istarttli);
index 7735562db01d172383af38dc0a6fd8760db1bce9..ed3aacabc986e0a2798188e3a60d9c5f1a5354a0 100644 (file)
@@ -546,7 +546,7 @@ XLogPrefetcherNextBlock(uintptr_t pgsr_private, XLogRecPtr *lsn)
 
 #ifdef XLOGPREFETCHER_DEBUG_LEVEL
                                        elog(XLOGPREFETCHER_DEBUG_LEVEL,
-                                                "suppressing all readahead until %X/%X is replayed due to possible TLI change",
+                                                "suppressing all readahead until %X/%08X is replayed due to possible TLI change",
                                                 LSN_FORMAT_ARGS(record->lsn));
 #endif
 
@@ -579,7 +579,7 @@ XLogPrefetcherNextBlock(uintptr_t pgsr_private, XLogRecPtr *lsn)
 
 #ifdef XLOGPREFETCHER_DEBUG_LEVEL
                                        elog(XLOGPREFETCHER_DEBUG_LEVEL,
-                                                "suppressing prefetch in database %u until %X/%X is replayed due to raw file copy",
+                                                "suppressing prefetch in database %u until %X/%08X is replayed due to raw file copy",
                                                 rlocator.dbOid,
                                                 LSN_FORMAT_ARGS(record->lsn));
 #endif
@@ -607,7 +607,7 @@ XLogPrefetcherNextBlock(uintptr_t pgsr_private, XLogRecPtr *lsn)
 
 #ifdef XLOGPREFETCHER_DEBUG_LEVEL
                                                elog(XLOGPREFETCHER_DEBUG_LEVEL,
-                                                        "suppressing prefetch in relation %u/%u/%u until %X/%X is replayed, which creates the relation",
+                                                        "suppressing prefetch in relation %u/%u/%u until %X/%08X is replayed, which creates the relation",
                                                         xlrec->rlocator.spcOid,
                                                         xlrec->rlocator.dbOid,
                                                         xlrec->rlocator.relNumber,
@@ -630,7 +630,7 @@ XLogPrefetcherNextBlock(uintptr_t pgsr_private, XLogRecPtr *lsn)
 
 #ifdef XLOGPREFETCHER_DEBUG_LEVEL
                                        elog(XLOGPREFETCHER_DEBUG_LEVEL,
-                                                "suppressing prefetch in relation %u/%u/%u from block %u until %X/%X is replayed, which truncates the relation",
+                                                "suppressing prefetch in relation %u/%u/%u from block %u until %X/%08X is replayed, which truncates the relation",
                                                 xlrec->rlocator.spcOid,
                                                 xlrec->rlocator.dbOid,
                                                 xlrec->rlocator.relNumber,
@@ -729,7 +729,7 @@ XLogPrefetcherNextBlock(uintptr_t pgsr_private, XLogRecPtr *lsn)
                        {
 #ifdef XLOGPREFETCHER_DEBUG_LEVEL
                                elog(XLOGPREFETCHER_DEBUG_LEVEL,
-                                        "suppressing all prefetch in relation %u/%u/%u until %X/%X is replayed, because the relation does not exist on disk",
+                                        "suppressing all prefetch in relation %u/%u/%u until %X/%08X is replayed, because the relation does not exist on disk",
                                         reln->smgr_rlocator.locator.spcOid,
                                         reln->smgr_rlocator.locator.dbOid,
                                         reln->smgr_rlocator.locator.relNumber,
@@ -750,7 +750,7 @@ XLogPrefetcherNextBlock(uintptr_t pgsr_private, XLogRecPtr *lsn)
                        {
 #ifdef XLOGPREFETCHER_DEBUG_LEVEL
                                elog(XLOGPREFETCHER_DEBUG_LEVEL,
-                                        "suppressing prefetch in relation %u/%u/%u from block %u until %X/%X is replayed, because the relation is too small",
+                                        "suppressing prefetch in relation %u/%u/%u from block %u until %X/%08X is replayed, because the relation is too small",
                                         reln->smgr_rlocator.locator.spcOid,
                                         reln->smgr_rlocator.locator.dbOid,
                                         reln->smgr_rlocator.locator.relNumber,
@@ -928,7 +928,7 @@ XLogPrefetcherIsFiltered(XLogPrefetcher *prefetcher, RelFileLocator rlocator,
                {
 #ifdef XLOGPREFETCHER_DEBUG_LEVEL
                        elog(XLOGPREFETCHER_DEBUG_LEVEL,
-                                "prefetch of %u/%u/%u block %u suppressed; filtering until LSN %X/%X is replayed (blocks >= %u filtered)",
+                                "prefetch of %u/%u/%u block %u suppressed; filtering until LSN %X/%08X is replayed (blocks >= %u filtered)",
                                 rlocator.spcOid, rlocator.dbOid, rlocator.relNumber, blockno,
                                 LSN_FORMAT_ARGS(filter->filter_until_replayed),
                                 filter->filter_from_block);
@@ -944,7 +944,7 @@ XLogPrefetcherIsFiltered(XLogPrefetcher *prefetcher, RelFileLocator rlocator,
                {
 #ifdef XLOGPREFETCHER_DEBUG_LEVEL
                        elog(XLOGPREFETCHER_DEBUG_LEVEL,
-                                "prefetch of %u/%u/%u block %u suppressed; filtering until LSN %X/%X is replayed (whole database)",
+                                "prefetch of %u/%u/%u block %u suppressed; filtering until LSN %X/%08X is replayed (whole database)",
                                 rlocator.spcOid, rlocator.dbOid, rlocator.relNumber, blockno,
                                 LSN_FORMAT_ARGS(filter->filter_until_replayed));
 #endif
index 2790ade1f91e83a951af639564f08d319aade964..ac1f801b1eb0b934788e59485c8e010e9973f409 100644 (file)
@@ -617,7 +617,7 @@ restart:
        }
        else if (targetRecOff < pageHeaderSize)
        {
-               report_invalid_record(state, "invalid record offset at %X/%X: expected at least %u, got %u",
+               report_invalid_record(state, "invalid record offset at %X/%08X: expected at least %u, got %u",
                                                          LSN_FORMAT_ARGS(RecPtr),
                                                          pageHeaderSize, targetRecOff);
                goto err;
@@ -626,7 +626,7 @@ restart:
        if ((((XLogPageHeader) state->readBuf)->xlp_info & XLP_FIRST_IS_CONTRECORD) &&
                targetRecOff == pageHeaderSize)
        {
-               report_invalid_record(state, "contrecord is requested by %X/%X",
+               report_invalid_record(state, "contrecord is requested by %X/%08X",
                                                          LSN_FORMAT_ARGS(RecPtr));
                goto err;
        }
@@ -667,7 +667,7 @@ restart:
                if (total_len < SizeOfXLogRecord)
                {
                        report_invalid_record(state,
-                                                                 "invalid record length at %X/%X: expected at least %u, got %u",
+                                                                 "invalid record length at %X/%08X: expected at least %u, got %u",
                                                                  LSN_FORMAT_ARGS(RecPtr),
                                                                  (uint32) SizeOfXLogRecord, total_len);
                        goto err;
@@ -756,7 +756,7 @@ restart:
                        if (!(pageHeader->xlp_info & XLP_FIRST_IS_CONTRECORD))
                        {
                                report_invalid_record(state,
-                                                                         "there is no contrecord flag at %X/%X",
+                                                                         "there is no contrecord flag at %X/%08X",
                                                                          LSN_FORMAT_ARGS(RecPtr));
                                goto err;
                        }
@@ -769,7 +769,7 @@ restart:
                                total_len != (pageHeader->xlp_rem_len + gotlen))
                        {
                                report_invalid_record(state,
-                                                                         "invalid contrecord length %u (expected %lld) at %X/%X",
+                                                                         "invalid contrecord length %u (expected %lld) at %X/%08X",
                                                                          pageHeader->xlp_rem_len,
                                                                          ((long long) total_len) - gotlen,
                                                                          LSN_FORMAT_ARGS(RecPtr));
@@ -1132,7 +1132,7 @@ ValidXLogRecordHeader(XLogReaderState *state, XLogRecPtr RecPtr,
        if (record->xl_tot_len < SizeOfXLogRecord)
        {
                report_invalid_record(state,
-                                                         "invalid record length at %X/%X: expected at least %u, got %u",
+                                                         "invalid record length at %X/%08X: expected at least %u, got %u",
                                                          LSN_FORMAT_ARGS(RecPtr),
                                                          (uint32) SizeOfXLogRecord, record->xl_tot_len);
                return false;
@@ -1140,7 +1140,7 @@ ValidXLogRecordHeader(XLogReaderState *state, XLogRecPtr RecPtr,
        if (!RmgrIdIsValid(record->xl_rmid))
        {
                report_invalid_record(state,
-                                                         "invalid resource manager ID %u at %X/%X",
+                                                         "invalid resource manager ID %u at %X/%08X",
                                                          record->xl_rmid, LSN_FORMAT_ARGS(RecPtr));
                return false;
        }
@@ -1153,7 +1153,7 @@ ValidXLogRecordHeader(XLogReaderState *state, XLogRecPtr RecPtr,
                if (!(record->xl_prev < RecPtr))
                {
                        report_invalid_record(state,
-                                                                 "record with incorrect prev-link %X/%X at %X/%X",
+                                                                 "record with incorrect prev-link %X/%08X at %X/%08X",
                                                                  LSN_FORMAT_ARGS(record->xl_prev),
                                                                  LSN_FORMAT_ARGS(RecPtr));
                        return false;
@@ -1169,7 +1169,7 @@ ValidXLogRecordHeader(XLogReaderState *state, XLogRecPtr RecPtr,
                if (record->xl_prev != PrevRecPtr)
                {
                        report_invalid_record(state,
-                                                                 "record with incorrect prev-link %X/%X at %X/%X",
+                                                                 "record with incorrect prev-link %X/%08X at %X/%08X",
                                                                  LSN_FORMAT_ARGS(record->xl_prev),
                                                                  LSN_FORMAT_ARGS(RecPtr));
                        return false;
@@ -1207,7 +1207,7 @@ ValidXLogRecord(XLogReaderState *state, XLogRecord *record, XLogRecPtr recptr)
        if (!EQ_CRC32C(record->xl_crc, crc))
        {
                report_invalid_record(state,
-                                                         "incorrect resource manager data checksum in record at %X/%X",
+                                                         "incorrect resource manager data checksum in record at %X/%08X",
                                                          LSN_FORMAT_ARGS(recptr));
                return false;
        }
@@ -1241,7 +1241,7 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
                XLogFileName(fname, state->seg.ws_tli, segno, state->segcxt.ws_segsize);
 
                report_invalid_record(state,
-                                                         "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u",
+                                                         "invalid magic number %04X in WAL segment %s, LSN %X/%08X, offset %u",
                                                          hdr->xlp_magic,
                                                          fname,
                                                          LSN_FORMAT_ARGS(recptr),
@@ -1256,7 +1256,7 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
                XLogFileName(fname, state->seg.ws_tli, segno, state->segcxt.ws_segsize);
 
                report_invalid_record(state,
-                                                         "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u",
+                                                         "invalid info bits %04X in WAL segment %s, LSN %X/%08X, offset %u",
                                                          hdr->xlp_info,
                                                          fname,
                                                          LSN_FORMAT_ARGS(recptr),
@@ -1298,7 +1298,7 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
 
                /* hmm, first page of file doesn't have a long header? */
                report_invalid_record(state,
-                                                         "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u",
+                                                         "invalid info bits %04X in WAL segment %s, LSN %X/%08X, offset %u",
                                                          hdr->xlp_info,
                                                          fname,
                                                          LSN_FORMAT_ARGS(recptr),
@@ -1318,7 +1318,7 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
                XLogFileName(fname, state->seg.ws_tli, segno, state->segcxt.ws_segsize);
 
                report_invalid_record(state,
-                                                         "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u",
+                                                         "unexpected pageaddr %X/%08X in WAL segment %s, LSN %X/%08X, offset %u",
                                                          LSN_FORMAT_ARGS(hdr->xlp_pageaddr),
                                                          fname,
                                                          LSN_FORMAT_ARGS(recptr),
@@ -1344,7 +1344,7 @@ XLogReaderValidatePageHeader(XLogReaderState *state, XLogRecPtr recptr,
                        XLogFileName(fname, state->seg.ws_tli, segno, state->segcxt.ws_segsize);
 
                        report_invalid_record(state,
-                                                                 "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u",
+                                                                 "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%08X, offset %u",
                                                                  hdr->xlp_tli,
                                                                  state->latestPageTLI,
                                                                  fname,
@@ -1756,7 +1756,7 @@ DecodeXLogRecord(XLogReaderState *state,
                        if (block_id <= decoded->max_block_id)
                        {
                                report_invalid_record(state,
-                                                                         "out-of-order block_id %u at %X/%X",
+                                                                         "out-of-order block_id %u at %X/%08X",
                                                                          block_id,
                                                                          LSN_FORMAT_ARGS(state->ReadRecPtr));
                                goto err;
@@ -1780,14 +1780,14 @@ DecodeXLogRecord(XLogReaderState *state,
                        if (blk->has_data && blk->data_len == 0)
                        {
                                report_invalid_record(state,
-                                                                         "BKPBLOCK_HAS_DATA set, but no data included at %X/%X",
+                                                                         "BKPBLOCK_HAS_DATA set, but no data included at %X/%08X",
                                                                          LSN_FORMAT_ARGS(state->ReadRecPtr));
                                goto err;
                        }
                        if (!blk->has_data && blk->data_len != 0)
                        {
                                report_invalid_record(state,
-                                                                         "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X",
+                                                                         "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%08X",
                                                                          (unsigned int) blk->data_len,
                                                                          LSN_FORMAT_ARGS(state->ReadRecPtr));
                                goto err;
@@ -1823,7 +1823,7 @@ DecodeXLogRecord(XLogReaderState *state,
                                         blk->bimg_len == BLCKSZ))
                                {
                                        report_invalid_record(state,
-                                                                                 "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X",
+                                                                                 "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%08X",
                                                                                  (unsigned int) blk->hole_offset,
                                                                                  (unsigned int) blk->hole_length,
                                                                                  (unsigned int) blk->bimg_len,
@@ -1839,7 +1839,7 @@ DecodeXLogRecord(XLogReaderState *state,
                                        (blk->hole_offset != 0 || blk->hole_length != 0))
                                {
                                        report_invalid_record(state,
-                                                                                 "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X",
+                                                                                 "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%08X",
                                                                                  (unsigned int) blk->hole_offset,
                                                                                  (unsigned int) blk->hole_length,
                                                                                  LSN_FORMAT_ARGS(state->ReadRecPtr));
@@ -1853,7 +1853,7 @@ DecodeXLogRecord(XLogReaderState *state,
                                        blk->bimg_len == BLCKSZ)
                                {
                                        report_invalid_record(state,
-                                                                                 "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X",
+                                                                                 "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%08X",
                                                                                  (unsigned int) blk->bimg_len,
                                                                                  LSN_FORMAT_ARGS(state->ReadRecPtr));
                                        goto err;
@@ -1868,7 +1868,7 @@ DecodeXLogRecord(XLogReaderState *state,
                                        blk->bimg_len != BLCKSZ)
                                {
                                        report_invalid_record(state,
-                                                                                 "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X",
+                                                                                 "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%08X",
                                                                                  (unsigned int) blk->data_len,
                                                                                  LSN_FORMAT_ARGS(state->ReadRecPtr));
                                        goto err;
@@ -1884,7 +1884,7 @@ DecodeXLogRecord(XLogReaderState *state,
                                if (rlocator == NULL)
                                {
                                        report_invalid_record(state,
-                                                                                 "BKPBLOCK_SAME_REL set but no previous rel at %X/%X",
+                                                                                 "BKPBLOCK_SAME_REL set but no previous rel at %X/%08X",
                                                                                  LSN_FORMAT_ARGS(state->ReadRecPtr));
                                        goto err;
                                }
@@ -1896,7 +1896,7 @@ DecodeXLogRecord(XLogReaderState *state,
                else
                {
                        report_invalid_record(state,
-                                                                 "invalid block_id %u at %X/%X",
+                                                                 "invalid block_id %u at %X/%08X",
                                                                  block_id, LSN_FORMAT_ARGS(state->ReadRecPtr));
                        goto err;
                }
@@ -1963,7 +1963,7 @@ DecodeXLogRecord(XLogReaderState *state,
 
 shortdata_err:
        report_invalid_record(state,
-                                                 "record with invalid length at %X/%X",
+                                                 "record with invalid length at %X/%08X",
                                                  LSN_FORMAT_ARGS(state->ReadRecPtr));
 err:
        *errormsg = state->errormsg_buf;
@@ -2073,14 +2073,14 @@ RestoreBlockImage(XLogReaderState *record, uint8 block_id, char *page)
                !record->record->blocks[block_id].in_use)
        {
                report_invalid_record(record,
-                                                         "could not restore image at %X/%X with invalid block %d specified",
+                                                         "could not restore image at %X/%08X with invalid block %d specified",
                                                          LSN_FORMAT_ARGS(record->ReadRecPtr),
                                                          block_id);
                return false;
        }
        if (!record->record->blocks[block_id].has_image)
        {
-               report_invalid_record(record, "could not restore image at %X/%X with invalid state, block %d",
+               report_invalid_record(record, "could not restore image at %X/%08X with invalid state, block %d",
                                                          LSN_FORMAT_ARGS(record->ReadRecPtr),
                                                          block_id);
                return false;
@@ -2107,7 +2107,7 @@ RestoreBlockImage(XLogReaderState *record, uint8 block_id, char *page)
                                                                        bkpb->bimg_len, BLCKSZ - bkpb->hole_length) <= 0)
                                decomp_success = false;
 #else
-                       report_invalid_record(record, "could not restore image at %X/%X compressed with %s not supported by build, block %d",
+                       report_invalid_record(record, "could not restore image at %X/%08X compressed with %s not supported by build, block %d",
                                                                  LSN_FORMAT_ARGS(record->ReadRecPtr),
                                                                  "LZ4",
                                                                  block_id);
@@ -2124,7 +2124,7 @@ RestoreBlockImage(XLogReaderState *record, uint8 block_id, char *page)
                        if (ZSTD_isError(decomp_result))
                                decomp_success = false;
 #else
-                       report_invalid_record(record, "could not restore image at %X/%X compressed with %s not supported by build, block %d",
+                       report_invalid_record(record, "could not restore image at %X/%08X compressed with %s not supported by build, block %d",
                                                                  LSN_FORMAT_ARGS(record->ReadRecPtr),
                                                                  "zstd",
                                                                  block_id);
@@ -2133,7 +2133,7 @@ RestoreBlockImage(XLogReaderState *record, uint8 block_id, char *page)
                }
                else
                {
-                       report_invalid_record(record, "could not restore image at %X/%X compressed with unknown method, block %d",
+                       report_invalid_record(record, "could not restore image at %X/%08X compressed with unknown method, block %d",
                                                                  LSN_FORMAT_ARGS(record->ReadRecPtr),
                                                                  block_id);
                        return false;
@@ -2141,7 +2141,7 @@ RestoreBlockImage(XLogReaderState *record, uint8 block_id, char *page)
 
                if (!decomp_success)
                {
-                       report_invalid_record(record, "could not decompress image at %X/%X, block %d",
+                       report_invalid_record(record, "could not decompress image at %X/%08X, block %d",
                                                                  LSN_FORMAT_ARGS(record->ReadRecPtr),
                                                                  block_id);
                        return false;
index 93d389148549ce5a6655b54098548474b3b8d4a4..23878b2dd9199ccc15b0dcd2679cbcac7bc9c858 100644 (file)
@@ -620,10 +620,10 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
                 * than ControlFile->checkPoint is used.
                 */
                ereport(LOG,
-                               (errmsg("starting backup recovery with redo LSN %X/%X, checkpoint LSN %X/%X, on timeline ID %u",
-                                               LSN_FORMAT_ARGS(RedoStartLSN),
-                                               LSN_FORMAT_ARGS(CheckPointLoc),
-                                               CheckPointTLI)));
+                               errmsg("starting backup recovery with redo LSN %X/%08X, checkpoint LSN %X/%08X, on timeline ID %u",
+                                          LSN_FORMAT_ARGS(RedoStartLSN),
+                                          LSN_FORMAT_ARGS(CheckPointLoc),
+                                          CheckPointTLI));
 
                /*
                 * When a backup_label file is present, we want to roll forward from
@@ -636,8 +636,8 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
                        memcpy(&checkPoint, XLogRecGetData(xlogreader), sizeof(CheckPoint));
                        wasShutdown = ((record->xl_info & ~XLR_INFO_MASK) == XLOG_CHECKPOINT_SHUTDOWN);
                        ereport(DEBUG1,
-                                       (errmsg_internal("checkpoint record is at %X/%X",
-                                                                        LSN_FORMAT_ARGS(CheckPointLoc))));
+                                       errmsg_internal("checkpoint record is at %X/%08X",
+                                                                       LSN_FORMAT_ARGS(CheckPointLoc)));
                        InRecovery = true;      /* force recovery even if SHUTDOWNED */
 
                        /*
@@ -652,23 +652,23 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
                                if (!ReadRecord(xlogprefetcher, LOG, false,
                                                                checkPoint.ThisTimeLineID))
                                        ereport(FATAL,
-                                                       (errmsg("could not find redo location %X/%X referenced by checkpoint record at %X/%X",
-                                                                       LSN_FORMAT_ARGS(checkPoint.redo), LSN_FORMAT_ARGS(CheckPointLoc)),
-                                                        errhint("If you are restoring from a backup, touch \"%s/recovery.signal\" or \"%s/standby.signal\" and add required recovery options.\n"
-                                                                        "If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n"
-                                                                        "Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup.",
-                                                                        DataDir, DataDir, DataDir, DataDir)));
+                                                       errmsg("could not find redo location %X/%08X referenced by checkpoint record at %X/%08X",
+                                                                  LSN_FORMAT_ARGS(checkPoint.redo), LSN_FORMAT_ARGS(CheckPointLoc)),
+                                                       errhint("If you are restoring from a backup, touch \"%s/recovery.signal\" or \"%s/standby.signal\" and add required recovery options.\n"
+                                                                       "If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n"
+                                                                       "Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup.",
+                                                                       DataDir, DataDir, DataDir, DataDir));
                        }
                }
                else
                {
                        ereport(FATAL,
-                                       (errmsg("could not locate required checkpoint record at %X/%X",
-                                                       LSN_FORMAT_ARGS(CheckPointLoc)),
-                                        errhint("If you are restoring from a backup, touch \"%s/recovery.signal\" or \"%s/standby.signal\" and add required recovery options.\n"
-                                                        "If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n"
-                                                        "Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup.",
-                                                        DataDir, DataDir, DataDir, DataDir)));
+                                       errmsg("could not locate required checkpoint record at %X/%08X",
+                                                  LSN_FORMAT_ARGS(CheckPointLoc)),
+                                       errhint("If you are restoring from a backup, touch \"%s/recovery.signal\" or \"%s/standby.signal\" and add required recovery options.\n"
+                                                       "If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n"
+                                                       "Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup.",
+                                                       DataDir, DataDir, DataDir, DataDir));
                        wasShutdown = false;    /* keep compiler quiet */
                }
 
@@ -773,8 +773,8 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
                 */
                if (!XLogRecPtrIsInvalid(ControlFile->backupStartPoint))
                        ereport(LOG,
-                                       (errmsg("restarting backup recovery with redo LSN %X/%X",
-                                                       LSN_FORMAT_ARGS(ControlFile->backupStartPoint))));
+                                       errmsg("restarting backup recovery with redo LSN %X/%08X",
+                                                  LSN_FORMAT_ARGS(ControlFile->backupStartPoint)));
 
                /* Get the last valid checkpoint record. */
                CheckPointLoc = ControlFile->checkPoint;
@@ -786,8 +786,8 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
                if (record != NULL)
                {
                        ereport(DEBUG1,
-                                       (errmsg_internal("checkpoint record is at %X/%X",
-                                                                        LSN_FORMAT_ARGS(CheckPointLoc))));
+                                       errmsg_internal("checkpoint record is at %X/%08X",
+                                                                       LSN_FORMAT_ARGS(CheckPointLoc)));
                }
                else
                {
@@ -798,8 +798,8 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
                         * simplify processing around checkpoints.
                         */
                        ereport(PANIC,
-                                       (errmsg("could not locate a valid checkpoint record at %X/%X",
-                                                       LSN_FORMAT_ARGS(CheckPointLoc))));
+                                       errmsg("could not locate a valid checkpoint record at %X/%08X",
+                                                  LSN_FORMAT_ARGS(CheckPointLoc)));
                }
                memcpy(&checkPoint, XLogRecGetData(xlogreader), sizeof(CheckPoint));
                wasShutdown = ((record->xl_info & ~XLR_INFO_MASK) == XLOG_CHECKPOINT_SHUTDOWN);
@@ -824,8 +824,8 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
                                                        recoveryTargetName)));
                else if (recoveryTarget == RECOVERY_TARGET_LSN)
                        ereport(LOG,
-                                       (errmsg("starting point-in-time recovery to WAL location (LSN) \"%X/%X\"",
-                                                       LSN_FORMAT_ARGS(recoveryTargetLSN))));
+                                       errmsg("starting point-in-time recovery to WAL location (LSN) \"%X/%08X\"",
+                                                  LSN_FORMAT_ARGS(recoveryTargetLSN)));
                else if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE)
                        ereport(LOG,
                                        (errmsg("starting point-in-time recovery to earliest consistent point")));
@@ -855,7 +855,7 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
                                (errmsg("requested timeline %u is not a child of this server's history",
                                                recoveryTargetTLI),
                /* translator: %s is a backup_label file or a pg_control file */
-                                errdetail("Latest checkpoint in file \"%s\" is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X.",
+                                errdetail("Latest checkpoint in file \"%s\" is at %X/%08X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%08X.",
                                                   haveBackupLabel ? "backup_label" : "pg_control",
                                                   LSN_FORMAT_ARGS(CheckPointLoc),
                                                   CheckPointTLI,
@@ -870,15 +870,15 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
                tliOfPointInHistory(ControlFile->minRecoveryPoint - 1, expectedTLEs) !=
                ControlFile->minRecoveryPointTLI)
                ereport(FATAL,
-                               (errmsg("requested timeline %u does not contain minimum recovery point %X/%X on timeline %u",
-                                               recoveryTargetTLI,
-                                               LSN_FORMAT_ARGS(ControlFile->minRecoveryPoint),
-                                               ControlFile->minRecoveryPointTLI)));
+                               errmsg("requested timeline %u does not contain minimum recovery point %X/%08X on timeline %u",
+                                          recoveryTargetTLI,
+                                          LSN_FORMAT_ARGS(ControlFile->minRecoveryPoint),
+                                          ControlFile->minRecoveryPointTLI));
 
        ereport(DEBUG1,
-                       (errmsg_internal("redo record is at %X/%X; shutdown %s",
-                                                        LSN_FORMAT_ARGS(checkPoint.redo),
-                                                        wasShutdown ? "true" : "false")));
+                       errmsg_internal("redo record is at %X/%08X; shutdown %s",
+                                                       LSN_FORMAT_ARGS(checkPoint.redo),
+                                                       wasShutdown ? "true" : "false"));
        ereport(DEBUG1,
                        (errmsg_internal("next transaction ID: " UINT64_FORMAT "; next OID: %u",
                                                         U64FromFullTransactionId(checkPoint.nextXid),
@@ -1253,14 +1253,14 @@ read_backup_label(XLogRecPtr *checkPointLoc, TimeLineID *backupLabelTLI,
         * is pretty crude, but we are not expecting any variability in the file
         * format).
         */
-       if (fscanf(lfp, "START WAL LOCATION: %X/%X (file %08X%16s)%c",
+       if (fscanf(lfp, "START WAL LOCATION: %X/%08X (file %08X%16s)%c",
                           &hi, &lo, &tli_from_walseg, startxlogfilename, &ch) != 5 || ch != '\n')
                ereport(FATAL,
                                (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
                                 errmsg("invalid data in file \"%s\"", BACKUP_LABEL_FILE)));
        RedoStartLSN = ((uint64) hi) << 32 | lo;
        RedoStartTLI = tli_from_walseg;
-       if (fscanf(lfp, "CHECKPOINT LOCATION: %X/%X%c",
+       if (fscanf(lfp, "CHECKPOINT LOCATION: %X/%08X%c",
                           &hi, &lo, &ch) != 3 || ch != '\n')
                ereport(FATAL,
                                (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
@@ -1332,7 +1332,7 @@ read_backup_label(XLogRecPtr *checkPointLoc, TimeLineID *backupLabelTLI,
                                                                 tli_from_file, BACKUP_LABEL_FILE)));
        }
 
-       if (fscanf(lfp, "INCREMENTAL FROM LSN: %X/%X\n", &hi, &lo) > 0)
+       if (fscanf(lfp, "INCREMENTAL FROM LSN: %X/%08X\n", &hi, &lo) > 0)
                ereport(FATAL,
                                (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
                                 errmsg("this is an incremental backup, not a data directory"),
@@ -1722,8 +1722,8 @@ PerformWalRecovery(void)
                if (record->xl_rmid != RM_XLOG_ID ||
                        (record->xl_info & ~XLR_INFO_MASK) != XLOG_CHECKPOINT_REDO)
                        ereport(FATAL,
-                                       (errmsg("unexpected record type found at redo point %X/%X",
-                                                       LSN_FORMAT_ARGS(xlogreader->ReadRecPtr))));
+                                       errmsg("unexpected record type found at redo point %X/%08X",
+                                                  LSN_FORMAT_ARGS(xlogreader->ReadRecPtr)));
        }
        else
        {
@@ -1745,8 +1745,8 @@ PerformWalRecovery(void)
                RmgrStartup();
 
                ereport(LOG,
-                               (errmsg("redo starts at %X/%X",
-                                               LSN_FORMAT_ARGS(xlogreader->ReadRecPtr))));
+                               errmsg("redo starts at %X/%08X",
+                                          LSN_FORMAT_ARGS(xlogreader->ReadRecPtr)));
 
                /* Prepare to report progress of the redo phase. */
                if (!StandbyMode)
@@ -1758,7 +1758,7 @@ PerformWalRecovery(void)
                do
                {
                        if (!StandbyMode)
-                               ereport_startup_progress("redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X",
+                               ereport_startup_progress("redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%08X",
                                                                                 LSN_FORMAT_ARGS(xlogreader->ReadRecPtr));
 
 #ifdef WAL_DEBUG
@@ -1767,7 +1767,7 @@ PerformWalRecovery(void)
                                StringInfoData buf;
 
                                initStringInfo(&buf);
-                               appendStringInfo(&buf, "REDO @ %X/%X; LSN %X/%X: ",
+                               appendStringInfo(&buf, "REDO @ %X/%08X; LSN %X/%08X: ",
                                                                 LSN_FORMAT_ARGS(xlogreader->ReadRecPtr),
                                                                 LSN_FORMAT_ARGS(xlogreader->EndRecPtr));
                                xlog_outrec(&buf, xlogreader);
@@ -1880,9 +1880,9 @@ PerformWalRecovery(void)
                RmgrCleanup();
 
                ereport(LOG,
-                               (errmsg("redo done at %X/%X system usage: %s",
-                                               LSN_FORMAT_ARGS(xlogreader->ReadRecPtr),
-                                               pg_rusage_show(&ru0))));
+                               errmsg("redo done at %X/%08X system usage: %s",
+                                          LSN_FORMAT_ARGS(xlogreader->ReadRecPtr),
+                                          pg_rusage_show(&ru0)));
                xtime = GetLatestXTime();
                if (xtime)
                        ereport(LOG,
@@ -2092,7 +2092,7 @@ xlogrecovery_redo(XLogReaderState *record, TimeLineID replayTLI)
 
                memcpy(&xlrec, XLogRecGetData(record), sizeof(xl_overwrite_contrecord));
                if (xlrec.overwritten_lsn != record->overwrittenRecPtr)
-                       elog(FATAL, "mismatching overwritten LSN %X/%X -> %X/%X",
+                       elog(FATAL, "mismatching overwritten LSN %X/%08X -> %X/%08X",
                                 LSN_FORMAT_ARGS(xlrec.overwritten_lsn),
                                 LSN_FORMAT_ARGS(record->overwrittenRecPtr));
 
@@ -2101,9 +2101,9 @@ xlogrecovery_redo(XLogReaderState *record, TimeLineID replayTLI)
                missingContrecPtr = InvalidXLogRecPtr;
 
                ereport(LOG,
-                               (errmsg("successfully skipped missing contrecord at %X/%X, overwritten at %s",
-                                               LSN_FORMAT_ARGS(xlrec.overwritten_lsn),
-                                               timestamptz_to_str(xlrec.overwrite_time))));
+                               errmsg("successfully skipped missing contrecord at %X/%08X, overwritten at %s",
+                                          LSN_FORMAT_ARGS(xlrec.overwritten_lsn),
+                                          timestamptz_to_str(xlrec.overwrite_time)));
 
                /* Verifying the record should only happen once */
                record->overwrittenRecPtr = InvalidXLogRecPtr;
@@ -2129,7 +2129,7 @@ xlogrecovery_redo(XLogReaderState *record, TimeLineID replayTLI)
                        backupEndPoint = lsn;
                }
                else
-                       elog(DEBUG1, "saw end-of-backup record for backup starting at %X/%X, waiting for %X/%X",
+                       elog(DEBUG1, "saw end-of-backup record for backup starting at %X/%08X, waiting for %X/%08X",
                                 LSN_FORMAT_ARGS(startpoint), LSN_FORMAT_ARGS(backupStartPoint));
        }
 }
@@ -2224,9 +2224,9 @@ CheckRecoveryConsistency(void)
                backupEndRequired = false;
 
                ereport(LOG,
-                               (errmsg("completed backup recovery with redo LSN %X/%X and end LSN %X/%X",
-                                               LSN_FORMAT_ARGS(saveBackupStartPoint),
-                                               LSN_FORMAT_ARGS(saveBackupEndPoint))));
+                               errmsg("completed backup recovery with redo LSN %X/%08X and end LSN %X/%08X",
+                                          LSN_FORMAT_ARGS(saveBackupStartPoint),
+                                          LSN_FORMAT_ARGS(saveBackupEndPoint)));
        }
 
        /*
@@ -2255,8 +2255,8 @@ CheckRecoveryConsistency(void)
                reachedConsistency = true;
                SendPostmasterSignal(PMSIGNAL_RECOVERY_CONSISTENT);
                ereport(LOG,
-                               (errmsg("consistent recovery state reached at %X/%X",
-                                               LSN_FORMAT_ARGS(lastReplayedEndRecPtr))));
+                               errmsg("consistent recovery state reached at %X/%08X",
+                                          LSN_FORMAT_ARGS(lastReplayedEndRecPtr)));
        }
 
        /*
@@ -2293,7 +2293,7 @@ rm_redo_error_callback(void *arg)
        xlog_block_info(&buf, record);
 
        /* translator: %s is a WAL record description */
-       errcontext("WAL redo at %X/%X for %s",
+       errcontext("WAL redo at %X/%08X for %s",
                           LSN_FORMAT_ARGS(record->ReadRecPtr),
                           buf.data);
 
@@ -2328,7 +2328,7 @@ xlog_outdesc(StringInfo buf, XLogReaderState *record)
 static void
 xlog_outrec(StringInfo buf, XLogReaderState *record)
 {
-       appendStringInfo(buf, "prev %X/%X; xid %u",
+       appendStringInfo(buf, "prev %X/%08X; xid %u",
                                         LSN_FORMAT_ARGS(XLogRecGetPrev(record)),
                                         XLogRecGetXid(record));
 
@@ -2416,10 +2416,10 @@ checkTimeLineSwitch(XLogRecPtr lsn, TimeLineID newTLI, TimeLineID prevTLI,
                lsn < minRecoveryPoint &&
                newTLI > minRecoveryPointTLI)
                ereport(PANIC,
-                               (errmsg("unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u",
-                                               newTLI,
-                                               LSN_FORMAT_ARGS(minRecoveryPoint),
-                                               minRecoveryPointTLI)));
+                               errmsg("unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%08X on timeline %u",
+                                          newTLI,
+                                          LSN_FORMAT_ARGS(minRecoveryPoint),
+                                          minRecoveryPointTLI));
 
        /* Looks good */
 }
@@ -2621,8 +2621,8 @@ recoveryStopsBefore(XLogReaderState *record)
                recoveryStopTime = 0;
                recoveryStopName[0] = '\0';
                ereport(LOG,
-                               (errmsg("recovery stopping before WAL location (LSN) \"%X/%X\"",
-                                               LSN_FORMAT_ARGS(recoveryStopLSN))));
+                               errmsg("recovery stopping before WAL location (LSN) \"%X/%08X\"",
+                                          LSN_FORMAT_ARGS(recoveryStopLSN)));
                return true;
        }
 
@@ -2789,8 +2789,8 @@ recoveryStopsAfter(XLogReaderState *record)
                recoveryStopTime = 0;
                recoveryStopName[0] = '\0';
                ereport(LOG,
-                               (errmsg("recovery stopping after WAL location (LSN) \"%X/%X\"",
-                                               LSN_FORMAT_ARGS(recoveryStopLSN))));
+                               errmsg("recovery stopping after WAL location (LSN) \"%X/%08X\"",
+                                          LSN_FORMAT_ARGS(recoveryStopLSN)));
                return true;
        }
 
@@ -2910,7 +2910,7 @@ getRecoveryStopReason(void)
                                 timestamptz_to_str(recoveryStopTime));
        else if (recoveryTarget == RECOVERY_TARGET_LSN)
                snprintf(reason, sizeof(reason),
-                                "%s LSN %X/%X\n",
+                                "%s LSN %X/%08X\n",
                                 recoveryStopAfter ? "after" : "before",
                                 LSN_FORMAT_ARGS(recoveryStopLSN));
        else if (recoveryTarget == RECOVERY_TARGET_NAME)
@@ -3213,11 +3213,11 @@ ReadRecord(XLogPrefetcher *xlogprefetcher, int emode,
                        XLogFileName(fname, xlogreader->seg.ws_tli, segno,
                                                 wal_segment_size);
                        ereport(emode_for_corrupt_record(emode, xlogreader->EndRecPtr),
-                                       (errmsg("unexpected timeline ID %u in WAL segment %s, LSN %X/%X, offset %u",
-                                                       xlogreader->latestPageTLI,
-                                                       fname,
-                                                       LSN_FORMAT_ARGS(xlogreader->latestPagePtr),
-                                                       offset)));
+                                       errmsg("unexpected timeline ID %u in WAL segment %s, LSN %X/%08X, offset %u",
+                                                  xlogreader->latestPageTLI,
+                                                  fname,
+                                                  LSN_FORMAT_ARGS(xlogreader->latestPagePtr),
+                                                  offset));
                        record = NULL;
                }
 
@@ -3429,14 +3429,14 @@ retry:
                        errno = save_errno;
                        ereport(emode_for_corrupt_record(emode, targetPagePtr + reqLen),
                                        (errcode_for_file_access(),
-                                        errmsg("could not read from WAL segment %s, LSN %X/%X, offset %u: %m",
+                                        errmsg("could not read from WAL segment %s, LSN %X/%08X, offset %u: %m",
                                                        fname, LSN_FORMAT_ARGS(targetPagePtr),
                                                        readOff)));
                }
                else
                        ereport(emode_for_corrupt_record(emode, targetPagePtr + reqLen),
                                        (errcode(ERRCODE_DATA_CORRUPTED),
-                                        errmsg("could not read from WAL segment %s, LSN %X/%X, offset %u: read %d of %zu",
+                                        errmsg("could not read from WAL segment %s, LSN %X/%08X, offset %u: read %d of %zu",
                                                        fname, LSN_FORMAT_ARGS(targetPagePtr),
                                                        readOff, r, (Size) XLOG_BLCKSZ)));
                goto next_record_is_invalid;
@@ -3718,7 +3718,7 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
                                                wait_time = wal_retrieve_retry_interval -
                                                        TimestampDifferenceMilliseconds(last_fail_time, now);
 
-                                               elog(LOG, "waiting for WAL to become available at %X/%X",
+                                               elog(LOG, "waiting for WAL to become available at %X/%08X",
                                                         LSN_FORMAT_ARGS(RecPtr));
 
                                                /* Do background tasks that might benefit us later. */
@@ -3864,7 +3864,7 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
                                                        tli = tliOfPointInHistory(tliRecPtr, expectedTLEs);
 
                                                        if (curFileTLI > 0 && tli < curFileTLI)
-                                                               elog(ERROR, "according to history file, WAL location %X/%X belongs to timeline %u, but previous recovered WAL file came from timeline %u",
+                                                               elog(ERROR, "according to history file, WAL location %X/%08X belongs to timeline %u, but previous recovered WAL file came from timeline %u",
                                                                         LSN_FORMAT_ARGS(tliRecPtr),
                                                                         tli, curFileTLI);
                                                }
@@ -4177,10 +4177,10 @@ rescanLatestTimeLine(TimeLineID replayTLI, XLogRecPtr replayLSN)
        if (currentTle->end < replayLSN)
        {
                ereport(LOG,
-                               (errmsg("new timeline %u forked off current database system timeline %u before current recovery point %X/%X",
-                                               newtarget,
-                                               replayTLI,
-                                               LSN_FORMAT_ARGS(replayLSN))));
+                               errmsg("new timeline %u forked off current database system timeline %u before current recovery point %X/%08X",
+                                          newtarget,
+                                          replayTLI,
+                                          LSN_FORMAT_ARGS(replayLSN)));
                return false;
        }
 
index c389b27f77d47b3b21a0bc427a82d2b3d49c433a..27ea52fdfee66d66871e421c9cc3a294c49a3b0e 100644 (file)
@@ -795,7 +795,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage,
 
                list_free_deep(timelineHistory);
 
-               elog(DEBUG3, "switched to timeline %u valid until %X/%X",
+               elog(DEBUG3, "switched to timeline %u valid until %X/%08X",
                         state->currTLI,
                         LSN_FORMAT_ARGS(state->currTLIValidUntil));
        }
index 22e2be37c95c3da280e9bc97f5291caf75bfe31e..d05252f383c80b52d5bd4b26ad8930a196f4caf7 100644 (file)
@@ -281,7 +281,7 @@ AddWALInfoToBackupManifest(backup_manifest_info *manifest, XLogRecPtr startptr,
                }
 
                AppendToManifest(manifest,
-                                                "%s{ \"Timeline\": %u, \"Start-LSN\": \"%X/%X\", \"End-LSN\": \"%X/%X\" }",
+                                                "%s{ \"Timeline\": %u, \"Start-LSN\": \"%X/%08X\", \"End-LSN\": \"%X/%08X\" }",
                                                 first_wal_range ? "" : ",\n",
                                                 entry->tli,
                                                 LSN_FORMAT_ARGS(tl_beginptr),
index a284ce318ff7d3837817685a94be3c3fb087692a..18b0b5a52d3f88f258c7a25d1c211e112e53c603 100644 (file)
@@ -361,7 +361,7 @@ SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli)
        tstate = begin_tup_output_tupdesc(dest, tupdesc, &TTSOpsVirtual);
 
        /* Data row */
-       values[0] = CStringGetTextDatum(psprintf("%X/%X", LSN_FORMAT_ARGS(ptr)));
+       values[0] = CStringGetTextDatum(psprintf("%X/%08X", LSN_FORMAT_ARGS(ptr)));
        values[1] = Int64GetDatum(tli);
        do_tup_output(tstate, values, nulls);
 
index 28491b1e0ab08b8c3feb47f25a2ed1c2871c229c..a0d48ff0fefa92efcf2b7d5a98d893b3376afaf4 100644 (file)
@@ -409,7 +409,7 @@ PrepareForIncrementalBackup(IncrementalBackupInfo *ib,
                        if (range->start_lsn < tlep[i]->begin)
                                ereport(ERROR,
                                                (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
-                                                errmsg("manifest requires WAL from initial timeline %u starting at %X/%X, but that timeline begins at %X/%X",
+                                                errmsg("manifest requires WAL from initial timeline %u starting at %X/%08X, but that timeline begins at %X/%08X",
                                                                range->tli,
                                                                LSN_FORMAT_ARGS(range->start_lsn),
                                                                LSN_FORMAT_ARGS(tlep[i]->begin))));
@@ -419,7 +419,7 @@ PrepareForIncrementalBackup(IncrementalBackupInfo *ib,
                        if (range->start_lsn != tlep[i]->begin)
                                ereport(ERROR,
                                                (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
-                                                errmsg("manifest requires WAL from continuation timeline %u starting at %X/%X, but that timeline begins at %X/%X",
+                                                errmsg("manifest requires WAL from continuation timeline %u starting at %X/%08X, but that timeline begins at %X/%08X",
                                                                range->tli,
                                                                LSN_FORMAT_ARGS(range->start_lsn),
                                                                LSN_FORMAT_ARGS(tlep[i]->begin))));
@@ -430,7 +430,7 @@ PrepareForIncrementalBackup(IncrementalBackupInfo *ib,
                        if (range->end_lsn > backup_state->startpoint)
                                ereport(ERROR,
                                                (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
-                                                errmsg("manifest requires WAL from final timeline %u ending at %X/%X, but this backup starts at %X/%X",
+                                                errmsg("manifest requires WAL from final timeline %u ending at %X/%08X, but this backup starts at %X/%08X",
                                                                range->tli,
                                                                LSN_FORMAT_ARGS(range->end_lsn),
                                                                LSN_FORMAT_ARGS(backup_state->startpoint)),
@@ -441,7 +441,7 @@ PrepareForIncrementalBackup(IncrementalBackupInfo *ib,
                        if (range->end_lsn != tlep[i]->end)
                                ereport(ERROR,
                                                (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
-                                                errmsg("manifest requires WAL from non-final timeline %u ending at %X/%X, but this server switched timelines at %X/%X",
+                                                errmsg("manifest requires WAL from non-final timeline %u ending at %X/%08X, but this server switched timelines at %X/%08X",
                                                                range->tli,
                                                                LSN_FORMAT_ARGS(range->end_lsn),
                                                                LSN_FORMAT_ARGS(tlep[i]->end))));
@@ -522,18 +522,18 @@ PrepareForIncrementalBackup(IncrementalBackupInfo *ib,
                        if (XLogRecPtrIsInvalid(tli_missing_lsn))
                                ereport(ERROR,
                                                (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
-                                                errmsg("WAL summaries are required on timeline %u from %X/%X to %X/%X, but no summaries for that timeline and LSN range exist",
+                                                errmsg("WAL summaries are required on timeline %u from %X/%08X to %X/%08X, but no summaries for that timeline and LSN range exist",
                                                                tle->tli,
                                                                LSN_FORMAT_ARGS(tli_start_lsn),
                                                                LSN_FORMAT_ARGS(tli_end_lsn))));
                        else
                                ereport(ERROR,
                                                (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
-                                                errmsg("WAL summaries are required on timeline %u from %X/%X to %X/%X, but the summaries for that timeline and LSN range are incomplete",
+                                                errmsg("WAL summaries are required on timeline %u from %X/%08X to %X/%08X, but the summaries for that timeline and LSN range are incomplete",
                                                                tle->tli,
                                                                LSN_FORMAT_ARGS(tli_start_lsn),
                                                                LSN_FORMAT_ARGS(tli_end_lsn)),
-                                                errdetail("The first unsummarized LSN in this range is %X/%X.",
+                                                errdetail("The first unsummarized LSN in this range is %X/%08X.",
                                                                   LSN_FORMAT_ARGS(tli_missing_lsn))));
                }
 
index 4ff246cd94321ee426c00c6d5ef98673e39b201d..e23b0de724299d473e37f0b82ed65f2ec141ac0b 100644 (file)
@@ -1539,7 +1539,7 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt,
                                        if (!XLogRecPtrIsInvalid(remote_lsn) && opts.lsn < remote_lsn)
                                                ereport(ERROR,
                                                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-                                                                errmsg("skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X",
+                                                                errmsg("skip WAL location (LSN %X/%08X) must be greater than origin LSN %X/%08X",
                                                                                LSN_FORMAT_ARGS(opts.lsn),
                                                                                LSN_FORMAT_ARGS(remote_lsn))));
                                }
index 0fec4f1f871ced417fe1e8275380265d9164691f..777c9a8d5553b6fdb01738b37c503a99fda7687a 100644 (file)
@@ -385,7 +385,7 @@ WalSummarizerMain(const void *startup_data, size_t startup_data_len)
 
                        switch_lsn = tliSwitchPoint(current_tli, tles, &switch_tli);
                        ereport(DEBUG1,
-                                       errmsg_internal("switch point from TLI %u to TLI %u is at %X/%X",
+                                       errmsg_internal("switch point from TLI %u to TLI %u is at %X/%08X",
                                                                        current_tli, switch_tli, LSN_FORMAT_ARGS(switch_lsn)));
                }
 
@@ -741,7 +741,7 @@ WaitForWalSummarization(XLogRecPtr lsn)
                                ereport(ERROR,
                                                (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
                                                 errmsg("WAL summarization is not progressing"),
-                                                errdetail("Summarization is needed through %X/%X, but is stuck at %X/%X on disk and %X/%X in memory.",
+                                                errdetail("Summarization is needed through %X/%08X, but is stuck at %X/%08X on disk and %X/%08X in memory.",
                                                                   LSN_FORMAT_ARGS(lsn),
                                                                   LSN_FORMAT_ARGS(summarized_lsn),
                                                                   LSN_FORMAT_ARGS(pending_lsn))));
@@ -755,12 +755,12 @@ WaitForWalSummarization(XLogRecPtr lsn)
                                                                                                current_time) / 1000;
                        ereport(WARNING,
                                        (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
-                                        errmsg_plural("still waiting for WAL summarization through %X/%X after %ld second",
-                                                                  "still waiting for WAL summarization through %X/%X after %ld seconds",
+                                        errmsg_plural("still waiting for WAL summarization through %X/%08X after %ld second",
+                                                                  "still waiting for WAL summarization through %X/%08X after %ld seconds",
                                                                   elapsed_seconds,
                                                                   LSN_FORMAT_ARGS(lsn),
                                                                   elapsed_seconds),
-                                        errdetail("Summarization has reached %X/%X on disk and %X/%X in memory.",
+                                        errdetail("Summarization has reached %X/%08X on disk and %X/%08X in memory.",
                                                           LSN_FORMAT_ARGS(summarized_lsn),
                                                           LSN_FORMAT_ARGS(pending_lsn))));
                }
@@ -981,7 +981,7 @@ SummarizeWAL(TimeLineID tli, XLogRecPtr start_lsn, bool exact,
                        if (private_data->end_of_wal)
                        {
                                ereport(DEBUG1,
-                                               errmsg_internal("could not read WAL from timeline %u at %X/%X: end of WAL at %X/%X",
+                                               errmsg_internal("could not read WAL from timeline %u at %X/%08X: end of WAL at %X/%08X",
                                                                                tli,
                                                                                LSN_FORMAT_ARGS(start_lsn),
                                                                                LSN_FORMAT_ARGS(private_data->read_upto)));
@@ -1000,8 +1000,8 @@ SummarizeWAL(TimeLineID tli, XLogRecPtr start_lsn, bool exact,
                        }
                        else
                                ereport(ERROR,
-                                               (errmsg("could not find a valid record after %X/%X",
-                                                               LSN_FORMAT_ARGS(start_lsn))));
+                                               errmsg("could not find a valid record after %X/%08X",
+                                                          LSN_FORMAT_ARGS(start_lsn)));
                }
 
                /* We shouldn't go backward. */
@@ -1034,7 +1034,7 @@ SummarizeWAL(TimeLineID tli, XLogRecPtr start_lsn, bool exact,
                                 * able to read a complete record.
                                 */
                                ereport(DEBUG1,
-                                               errmsg_internal("could not read WAL from timeline %u at %X/%X: end of WAL at %X/%X",
+                                               errmsg_internal("could not read WAL from timeline %u at %X/%08X: end of WAL at %X/%08X",
                                                                                tli,
                                                                                LSN_FORMAT_ARGS(xlogreader->EndRecPtr),
                                                                                LSN_FORMAT_ARGS(private_data->read_upto)));
@@ -1045,13 +1045,13 @@ SummarizeWAL(TimeLineID tli, XLogRecPtr start_lsn, bool exact,
                        if (errormsg)
                                ereport(ERROR,
                                                (errcode_for_file_access(),
-                                                errmsg("could not read WAL from timeline %u at %X/%X: %s",
+                                                errmsg("could not read WAL from timeline %u at %X/%08X: %s",
                                                                tli, LSN_FORMAT_ARGS(xlogreader->EndRecPtr),
                                                                errormsg)));
                        else
                                ereport(ERROR,
                                                (errcode_for_file_access(),
-                                                errmsg("could not read WAL from timeline %u at %X/%X",
+                                                errmsg("could not read WAL from timeline %u at %X/%08X",
                                                                tli, LSN_FORMAT_ARGS(xlogreader->EndRecPtr))));
                }
 
@@ -1222,7 +1222,7 @@ SummarizeWAL(TimeLineID tli, XLogRecPtr start_lsn, bool exact,
 
                /* Tell the user what we did. */
                ereport(DEBUG1,
-                               errmsg_internal("summarized WAL on TLI %u from %X/%X to %X/%X",
+                               errmsg_internal("summarized WAL on TLI %u from %X/%08X to %X/%08X",
                                                                tli,
                                                                LSN_FORMAT_ARGS(summary_start_lsn),
                                                                LSN_FORMAT_ARGS(summary_end_lsn)));
@@ -1234,7 +1234,7 @@ SummarizeWAL(TimeLineID tli, XLogRecPtr start_lsn, bool exact,
        /* If we skipped a non-zero amount of WAL, log a debug message. */
        if (summary_end_lsn > summary_start_lsn && fast_forward)
                ereport(DEBUG1,
-                               errmsg_internal("skipped summarizing WAL on TLI %u from %X/%X to %X/%X",
+                               errmsg_internal("skipped summarizing WAL on TLI %u from %X/%08X to %X/%08X",
                                                                tli,
                                                                LSN_FORMAT_ARGS(summary_start_lsn),
                                                                LSN_FORMAT_ARGS(summary_end_lsn)));
@@ -1580,7 +1580,7 @@ summarizer_read_local_xlog_page(XLogReaderState *state,
 
                                        /* Debugging output. */
                                        ereport(DEBUG1,
-                                                       errmsg_internal("timeline %u became historic, can read up to %X/%X",
+                                                       errmsg_internal("timeline %u became historic, can read up to %X/%08X",
                                                                                        private_data->tli, LSN_FORMAT_ARGS(private_data->read_upto)));
                                }
 
index 7b4ddf7a8f52fdf364018357ffbf0e3d4b461748..f7b5d093681a2cfde0a610828e1f94ffe6b634bc 100644 (file)
@@ -534,7 +534,7 @@ libpqrcv_startstreaming(WalReceiverConn *conn,
        if (options->logical)
                appendStringInfoString(&cmd, " LOGICAL");
 
-       appendStringInfo(&cmd, " %X/%X", LSN_FORMAT_ARGS(options->startpoint));
+       appendStringInfo(&cmd, " %X/%08X", LSN_FORMAT_ARGS(options->startpoint));
 
        /*
         * Additional options are different depending on if we are doing logical
index f1eb798f3e97a29217f3ba226e23237b98f9e8cf..7e363a7c05b4f1890a5db2b9c2411252e152de77 100644 (file)
@@ -567,7 +567,7 @@ CreateDecodingContext(XLogRecPtr start_lsn,
                 * kinds of client errors; so the client may wish to check that
                 * confirmed_flush_lsn matches its expectations.
                 */
-               elog(LOG, "%X/%X has been already streamed, forwarding to %X/%X",
+               elog(LOG, "%X/%08X has been already streamed, forwarding to %X/%08X",
                         LSN_FORMAT_ARGS(start_lsn),
                         LSN_FORMAT_ARGS(slot->data.confirmed_flush));
 
@@ -610,7 +610,7 @@ CreateDecodingContext(XLogRecPtr start_lsn,
        ereport(LOG,
                        (errmsg("starting logical decoding for slot \"%s\"",
                                        NameStr(slot->data.name)),
-                        errdetail("Streaming transactions committing after %X/%X, reading WAL from %X/%X.",
+                        errdetail("Streaming transactions committing after %X/%08X, reading WAL from %X/%08X.",
                                           LSN_FORMAT_ARGS(slot->data.confirmed_flush),
                                           LSN_FORMAT_ARGS(slot->data.restart_lsn))));
 
@@ -637,7 +637,7 @@ DecodingContextFindStartpoint(LogicalDecodingContext *ctx)
        /* Initialize from where to start reading WAL. */
        XLogBeginRead(ctx->reader, slot->data.restart_lsn);
 
-       elog(DEBUG1, "searching for logical decoding starting point, starting at %X/%X",
+       elog(DEBUG1, "searching for logical decoding starting point, starting at %X/%08X",
                 LSN_FORMAT_ARGS(slot->data.restart_lsn));
 
        /* Wait for a consistent starting point */
@@ -758,7 +758,7 @@ output_plugin_error_callback(void *arg)
 
        /* not all callbacks have an associated LSN  */
        if (state->report_location != InvalidXLogRecPtr)
-               errcontext("slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X",
+               errcontext("slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%08X",
                                   NameStr(state->ctx->slot->data.name),
                                   NameStr(state->ctx->slot->data.plugin),
                                   state->callback_name,
@@ -1725,7 +1725,7 @@ LogicalIncreaseXminForSlot(XLogRecPtr current_lsn, TransactionId xmin)
        SpinLockRelease(&slot->mutex);
 
        if (got_new_xmin)
-               elog(DEBUG1, "got new catalog xmin %u at %X/%X", xmin,
+               elog(DEBUG1, "got new catalog xmin %u at %X/%08X", xmin,
                         LSN_FORMAT_ARGS(current_lsn));
 
        /* candidate already valid with the current flush position, apply */
@@ -1785,7 +1785,7 @@ LogicalIncreaseRestartDecodingForSlot(XLogRecPtr current_lsn, XLogRecPtr restart
                slot->candidate_restart_lsn = restart_lsn;
                SpinLockRelease(&slot->mutex);
 
-               elog(DEBUG1, "got new restart lsn %X/%X at %X/%X",
+               elog(DEBUG1, "got new restart lsn %X/%08X at %X/%08X",
                         LSN_FORMAT_ARGS(restart_lsn),
                         LSN_FORMAT_ARGS(current_lsn));
        }
@@ -1800,7 +1800,7 @@ LogicalIncreaseRestartDecodingForSlot(XLogRecPtr current_lsn, XLogRecPtr restart
                confirmed_flush = slot->data.confirmed_flush;
                SpinLockRelease(&slot->mutex);
 
-               elog(DEBUG1, "failed to increase restart lsn: proposed %X/%X, after %X/%X, current candidate %X/%X, current after %X/%X, flushed up to %X/%X",
+               elog(DEBUG1, "failed to increase restart lsn: proposed %X/%08X, after %X/%08X, current candidate %X/%08X, current after %X/%08X, flushed up to %X/%08X",
                         LSN_FORMAT_ARGS(restart_lsn),
                         LSN_FORMAT_ARGS(current_lsn),
                         LSN_FORMAT_ARGS(candidate_restart_lsn),
index a17bacf88e7f3d6e508749fc8eee93da555b73bc..87f10e50dcc4de97e47fa293435351c36ba4d146 100644 (file)
@@ -826,9 +826,9 @@ StartupReplicationOrigin(void)
                last_state++;
 
                ereport(LOG,
-                               (errmsg("recovered replication state of node %d to %X/%X",
-                                               disk_state.roident,
-                                               LSN_FORMAT_ARGS(disk_state.remote_lsn))));
+                               errmsg("recovered replication state of node %d to %X/%08X",
+                                          disk_state.roident,
+                                          LSN_FORMAT_ARGS(disk_state.remote_lsn)));
        }
 
        /* now check checksum */
index 3ec3abfa3da601815e897bef395778f3ae72abf8..2f0c08b8fbd33322b649de3402682dbb11605b60 100644 (file)
@@ -213,7 +213,7 @@ update_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid,
                ereport(slot->data.persistency == RS_TEMPORARY ? LOG : DEBUG1,
                                errmsg("could not synchronize replication slot \"%s\"",
                                           remote_slot->name),
-                               errdetail("Synchronization could lead to data loss, because the remote slot needs WAL at LSN %X/%X and catalog xmin %u, but the standby has LSN %X/%X and catalog xmin %u.",
+                               errdetail("Synchronization could lead to data loss, because the remote slot needs WAL at LSN %X/%08X and catalog xmin %u, but the standby has LSN %X/%08X and catalog xmin %u.",
                                                  LSN_FORMAT_ARGS(remote_slot->restart_lsn),
                                                  remote_slot->catalog_xmin,
                                                  LSN_FORMAT_ARGS(slot->data.restart_lsn),
@@ -275,7 +275,7 @@ update_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid,
                                ereport(ERROR,
                                                errmsg_internal("synchronized confirmed_flush for slot \"%s\" differs from remote slot",
                                                                                remote_slot->name),
-                                               errdetail_internal("Remote slot has LSN %X/%X but local slot has LSN %X/%X.",
+                                               errdetail_internal("Remote slot has LSN %X/%08X but local slot has LSN %X/%08X.",
                                                                                   LSN_FORMAT_ARGS(remote_slot->confirmed_lsn),
                                                                                   LSN_FORMAT_ARGS(slot->data.confirmed_flush)));
                }
@@ -593,7 +593,7 @@ update_and_persist_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid)
        {
                ereport(LOG,
                                errmsg("could not synchronize replication slot \"%s\"", remote_slot->name),
-                               errdetail("Synchronization could lead to data loss, because the standby could not build a consistent snapshot to decode WALs at LSN %X/%X.",
+                               errdetail("Synchronization could lead to data loss, because the standby could not build a consistent snapshot to decode WALs at LSN %X/%08X.",
                                                  LSN_FORMAT_ARGS(slot->data.restart_lsn)));
 
                return false;
@@ -642,7 +642,7 @@ synchronize_one_slot(RemoteSlot *remote_slot, Oid remote_dbid)
                ereport(AmLogicalSlotSyncWorkerProcess() ? LOG : ERROR,
                                errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
                                errmsg("skipping slot synchronization because the received slot sync"
-                                          " LSN %X/%X for slot \"%s\" is ahead of the standby position %X/%X",
+                                          " LSN %X/%08X for slot \"%s\" is ahead of the standby position %X/%08X",
                                           LSN_FORMAT_ARGS(remote_slot->confirmed_lsn),
                                           remote_slot->name,
                                           LSN_FORMAT_ARGS(latestFlushPtr)));
@@ -733,7 +733,7 @@ synchronize_one_slot(RemoteSlot *remote_slot, Oid remote_dbid)
                                ereport(ERROR,
                                                errmsg_internal("cannot synchronize local slot \"%s\"",
                                                                                remote_slot->name),
-                                               errdetail_internal("Local slot's start streaming location LSN(%X/%X) is ahead of remote slot's LSN(%X/%X).",
+                                               errdetail_internal("Local slot's start streaming location LSN(%X/%08X) is ahead of remote slot's LSN(%X/%08X).",
                                                                                   LSN_FORMAT_ARGS(slot->data.confirmed_flush),
                                                                                   LSN_FORMAT_ARGS(remote_slot->confirmed_lsn)));
 
index adf18c397db435719b087ac7f698a50d7eb9cfed..8532bfd27e53ffa6fbbe938070ffe82ecc1b2a9f 100644 (file)
@@ -774,7 +774,7 @@ SnapBuildDistributeSnapshotAndInval(SnapBuild *builder, XLogRecPtr lsn, Transact
                if (rbtxn_is_prepared(txn))
                        continue;
 
-               elog(DEBUG2, "adding a new snapshot and invalidations to %u at %X/%X",
+               elog(DEBUG2, "adding a new snapshot and invalidations to %u at %X/%08X",
                         txn->xid, LSN_FORMAT_ARGS(lsn));
 
                /*
@@ -1271,10 +1271,10 @@ SnapBuildFindSnapshot(SnapBuild *builder, XLogRecPtr lsn, xl_running_xacts *runn
                                                                        builder->initial_xmin_horizon))
        {
                ereport(DEBUG1,
-                               (errmsg_internal("skipping snapshot at %X/%X while building logical decoding snapshot, xmin horizon too low",
-                                                                LSN_FORMAT_ARGS(lsn)),
-                                errdetail_internal("initial xmin horizon of %u vs the snapshot's %u",
-                                                                       builder->initial_xmin_horizon, running->oldestRunningXid)));
+                               errmsg_internal("skipping snapshot at %X/%08X while building logical decoding snapshot, xmin horizon too low",
+                                                               LSN_FORMAT_ARGS(lsn)),
+                               errdetail_internal("initial xmin horizon of %u vs the snapshot's %u",
+                                                                  builder->initial_xmin_horizon, running->oldestRunningXid));
 
 
                SnapBuildWaitSnapshot(running, builder->initial_xmin_horizon);
@@ -1310,9 +1310,9 @@ SnapBuildFindSnapshot(SnapBuild *builder, XLogRecPtr lsn, xl_running_xacts *runn
                builder->next_phase_at = InvalidTransactionId;
 
                ereport(LOG,
-                               (errmsg("logical decoding found consistent point at %X/%X",
-                                               LSN_FORMAT_ARGS(lsn)),
-                                errdetail("There are no running transactions.")));
+                               errmsg("logical decoding found consistent point at %X/%08X",
+                                          LSN_FORMAT_ARGS(lsn)),
+                               errdetail("There are no running transactions."));
 
                return false;
        }
@@ -1359,10 +1359,10 @@ SnapBuildFindSnapshot(SnapBuild *builder, XLogRecPtr lsn, xl_running_xacts *runn
                Assert(TransactionIdIsNormal(builder->xmax));
 
                ereport(LOG,
-                               (errmsg("logical decoding found initial starting point at %X/%X",
-                                               LSN_FORMAT_ARGS(lsn)),
-                                errdetail("Waiting for transactions (approximately %d) older than %u to end.",
-                                                  running->xcnt, running->nextXid)));
+                               errmsg("logical decoding found initial starting point at %X/%08X",
+                                          LSN_FORMAT_ARGS(lsn)),
+                               errdetail("Waiting for transactions (approximately %d) older than %u to end.",
+                                                 running->xcnt, running->nextXid));
 
                SnapBuildWaitSnapshot(running, running->nextXid);
        }
@@ -1383,10 +1383,10 @@ SnapBuildFindSnapshot(SnapBuild *builder, XLogRecPtr lsn, xl_running_xacts *runn
                builder->next_phase_at = running->nextXid;
 
                ereport(LOG,
-                               (errmsg("logical decoding found initial consistent point at %X/%X",
-                                               LSN_FORMAT_ARGS(lsn)),
-                                errdetail("Waiting for transactions (approximately %d) older than %u to end.",
-                                                  running->xcnt, running->nextXid)));
+                               errmsg("logical decoding found initial consistent point at %X/%08X",
+                                          LSN_FORMAT_ARGS(lsn)),
+                               errdetail("Waiting for transactions (approximately %d) older than %u to end.",
+                                                 running->xcnt, running->nextXid));
 
                SnapBuildWaitSnapshot(running, running->nextXid);
        }
@@ -1407,9 +1407,9 @@ SnapBuildFindSnapshot(SnapBuild *builder, XLogRecPtr lsn, xl_running_xacts *runn
                builder->next_phase_at = InvalidTransactionId;
 
                ereport(LOG,
-                               (errmsg("logical decoding found consistent point at %X/%X",
-                                               LSN_FORMAT_ARGS(lsn)),
-                                errdetail("There are no old transactions anymore.")));
+                               errmsg("logical decoding found consistent point at %X/%08X",
+                                          LSN_FORMAT_ARGS(lsn)),
+                               errdetail("There are no old transactions anymore."));
        }
 
        /*
@@ -1913,9 +1913,9 @@ SnapBuildRestore(SnapBuild *builder, XLogRecPtr lsn)
        Assert(builder->state == SNAPBUILD_CONSISTENT);
 
        ereport(LOG,
-                       (errmsg("logical decoding found consistent point at %X/%X",
-                                       LSN_FORMAT_ARGS(lsn)),
-                        errdetail("Logical decoding will begin using saved snapshot.")));
+                       errmsg("logical decoding found consistent point at %X/%08X",
+                                  LSN_FORMAT_ARGS(lsn)),
+                       errdetail("Logical decoding will begin using saved snapshot."));
        return true;
 
 snapshot_not_interesting:
@@ -2061,7 +2061,7 @@ SnapBuildSnapshotExists(XLogRecPtr lsn)
        int                     ret;
        struct stat stat_buf;
 
-       sprintf(path, "%s/%X-%X.snap",
+       sprintf(path, "%s/%08X-%08X.snap",
                        PG_LOGICAL_SNAPSHOTS_DIR,
                        LSN_FORMAT_ARGS(lsn));
 
index c90f23ee5b0b233c29bed1fcc0554e507baa3293..e4fd6347fd1be5dd49ccf8a51c577d75f7d78847 100644 (file)
@@ -1553,7 +1553,7 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos)
 copy_table_done:
 
        elog(DEBUG1,
-                "LogicalRepSyncTableStart: '%s' origin_startpos lsn %X/%X",
+                "LogicalRepSyncTableStart: '%s' origin_startpos lsn %X/%08X",
                 originname, LSN_FORMAT_ARGS(*origin_startpos));
 
        /*
index fd11805a44cf93cfb8e06881227aa021c839455b..c5fb627aa56ec62e4e8abe33272d255af13488b2 100644 (file)
@@ -1016,7 +1016,7 @@ apply_handle_commit(StringInfo s)
        if (commit_data.commit_lsn != remote_final_lsn)
                ereport(ERROR,
                                (errcode(ERRCODE_PROTOCOL_VIOLATION),
-                                errmsg_internal("incorrect commit LSN %X/%X in commit message (expected %X/%X)",
+                                errmsg_internal("incorrect commit LSN %X/%08X in commit message (expected %X/%08X)",
                                                                 LSN_FORMAT_ARGS(commit_data.commit_lsn),
                                                                 LSN_FORMAT_ARGS(remote_final_lsn))));
 
@@ -1108,7 +1108,7 @@ apply_handle_prepare(StringInfo s)
        if (prepare_data.prepare_lsn != remote_final_lsn)
                ereport(ERROR,
                                (errcode(ERRCODE_PROTOCOL_VIOLATION),
-                                errmsg_internal("incorrect prepare LSN %X/%X in prepare message (expected %X/%X)",
+                                errmsg_internal("incorrect prepare LSN %X/%08X in prepare message (expected %X/%08X)",
                                                                 LSN_FORMAT_ARGS(prepare_data.prepare_lsn),
                                                                 LSN_FORMAT_ARGS(remote_final_lsn))));
 
@@ -3903,7 +3903,7 @@ send_feedback(XLogRecPtr recvpos, bool force, bool requestReply)
        pq_sendint64(reply_message, now);       /* sendTime */
        pq_sendbyte(reply_message, requestReply);       /* replyRequested */
 
-       elog(DEBUG2, "sending feedback (force %d) to recv %X/%X, write %X/%X, flush %X/%X",
+       elog(DEBUG2, "sending feedback (force %d) to recv %X/%08X, write %X/%08X, flush %X/%08X",
                 force,
                 LSN_FORMAT_ARGS(recvpos),
                 LSN_FORMAT_ARGS(writepos),
@@ -4909,7 +4909,7 @@ maybe_start_skipping_changes(XLogRecPtr finish_lsn)
        skip_xact_finish_lsn = finish_lsn;
 
        ereport(LOG,
-                       errmsg("logical replication starts skipping transaction at LSN %X/%X",
+                       errmsg("logical replication starts skipping transaction at LSN %X/%08X",
                                   LSN_FORMAT_ARGS(skip_xact_finish_lsn)));
 }
 
@@ -4923,8 +4923,8 @@ stop_skipping_changes(void)
                return;
 
        ereport(LOG,
-                       (errmsg("logical replication completed skipping transaction at LSN %X/%X",
-                                       LSN_FORMAT_ARGS(skip_xact_finish_lsn))));
+                       errmsg("logical replication completed skipping transaction at LSN %X/%08X",
+                                  LSN_FORMAT_ARGS(skip_xact_finish_lsn)));
 
        /* Stop skipping changes */
        skip_xact_finish_lsn = InvalidXLogRecPtr;
@@ -5012,7 +5012,7 @@ clear_subscription_skip_lsn(XLogRecPtr finish_lsn)
                if (myskiplsn != finish_lsn)
                        ereport(WARNING,
                                        errmsg("skip-LSN of subscription \"%s\" cleared", MySubscription->name),
-                                       errdetail("Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X.",
+                                       errdetail("Remote transaction's finish WAL location (LSN) %X/%08X did not match skip-LSN %X/%08X.",
                                                          LSN_FORMAT_ARGS(finish_lsn),
                                                          LSN_FORMAT_ARGS(myskiplsn)));
        }
@@ -5049,7 +5049,7 @@ apply_error_callback(void *arg)
                                           logicalrep_message_type(errarg->command),
                                           errarg->remote_xid);
                else
-                       errcontext("processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X",
+                       errcontext("processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%08X",
                                           errarg->origin_name,
                                           logicalrep_message_type(errarg->command),
                                           errarg->remote_xid,
@@ -5067,7 +5067,7 @@ apply_error_callback(void *arg)
                                                   errarg->rel->remoterel.relname,
                                                   errarg->remote_xid);
                        else
-                               errcontext("processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X",
+                               errcontext("processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%08X",
                                                   errarg->origin_name,
                                                   logicalrep_message_type(errarg->command),
                                                   errarg->rel->remoterel.nspname,
@@ -5086,7 +5086,7 @@ apply_error_callback(void *arg)
                                                   errarg->rel->remoterel.attnames[errarg->remote_attnum],
                                                   errarg->remote_xid);
                        else
-                               errcontext("processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X",
+                               errcontext("processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%08X",
                                                   errarg->origin_name,
                                                   logicalrep_message_type(errarg->command),
                                                   errarg->rel->remoterel.nspname,
index 7440aae5a1a7eb7c4008b41db280b44663cdef7a..8a649199ec69cbe44e728327f397a43c1d0d1772 100644 (file)
@@ -279,7 +279,7 @@ alter_replication_slot:
                        ;
 
 /*
- * START_REPLICATION [SLOT slot] [PHYSICAL] %X/%X [TIMELINE %u]
+ * START_REPLICATION [SLOT slot] [PHYSICAL] %X/%08X [TIMELINE %u]
  */
 start_replication:
                        K_START_REPLICATION opt_slot opt_physical RECPTR opt_timeline
@@ -295,7 +295,7 @@ start_replication:
                                }
                        ;
 
-/* START_REPLICATION SLOT slot LOGICAL %X/%X options */
+/* START_REPLICATION SLOT slot LOGICAL %X/%08X options */
 start_logical_replication:
                        K_START_REPLICATION K_SLOT IDENT K_LOGICAL RECPTR plugin_options
                                {
index 014ea8d25c6b76a4f931fc85e1bdba22f24e5546..b6930e28659537d36d2fb0c2f6aa04ab3a1ccc0f 100644 (file)
@@ -155,7 +155,7 @@ UPLOAD_MANIFEST             { return K_UPLOAD_MANIFEST; }
 {hexdigit}+\/{hexdigit}+               {
                                        uint32  hi,
                                                        lo;
-                                       if (sscanf(yytext, "%X/%X", &hi, &lo) != 2)
+                                       if (sscanf(yytext, "%X/%08X", &hi, &lo) != 2)
                                                replication_yyerror(NULL, yyscanner, "invalid streaming start location");
                                        yylval->recptr = ((uint64) hi) << 32 | lo;
                                        return RECPTR;
index f9fec50ae883ff4bf6792e5cc3831ca0c736ecad..f369fce24851c3c737a864b37543e9e1f1270f72 100644 (file)
@@ -1591,8 +1591,8 @@ ReportSlotInvalidation(ReplicationSlotInvalidationCause cause,
                                uint64          ex = oldestLSN - restart_lsn;
 
                                appendStringInfo(&err_detail,
-                                                                ngettext("The slot's restart_lsn %X/%X exceeds the limit by %" PRIu64 " byte.",
-                                                                                 "The slot's restart_lsn %X/%X exceeds the limit by %" PRIu64 " bytes.",
+                                                                ngettext("The slot's restart_lsn %X/%08X exceeds the limit by %" PRIu64 " byte.",
+                                                                                 "The slot's restart_lsn %X/%08X exceeds the limit by %" PRIu64 " bytes.",
                                                                                  ex),
                                                                 LSN_FORMAT_ARGS(restart_lsn),
                                                                 ex);
index 36cc2ed4e440f2a04dcd2181a5bf1cd00fa5827d..69f4c6157c518896f83cc95c669056fd3f5d484b 100644 (file)
@@ -566,7 +566,7 @@ pg_replication_slot_advance(PG_FUNCTION_ARGS)
        if (moveto < minlsn)
                ereport(ERROR,
                                (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
-                                errmsg("cannot advance replication slot to %X/%X, minimum is %X/%X",
+                                errmsg("cannot advance replication slot to %X/%08X, minimum is %X/%08X",
                                                LSN_FORMAT_ARGS(moveto), LSN_FORMAT_ARGS(minlsn))));
 
        /* Do the actual slot update, depending on the slot type */
index cc35984ad00857341030a3ff260fba7e834fc19e..32cf3a48b897d84db92e9bab11b164bafbe26c5a 100644 (file)
@@ -258,7 +258,7 @@ SyncRepWaitForLSN(XLogRecPtr lsn, bool commit)
        {
                char            buffer[32];
 
-               sprintf(buffer, "waiting for %X/%X", LSN_FORMAT_ARGS(lsn));
+               sprintf(buffer, "waiting for %X/%08X", LSN_FORMAT_ARGS(lsn));
                set_ps_display_suffix(buffer);
        }
 
@@ -566,7 +566,7 @@ SyncRepReleaseWaiters(void)
 
        LWLockRelease(SyncRepLock);
 
-       elog(DEBUG3, "released %d procs up to write %X/%X, %d procs up to flush %X/%X, %d procs up to apply %X/%X",
+       elog(DEBUG3, "released %d procs up to write %X/%08X, %d procs up to flush %X/%08X, %d procs up to apply %X/%08X",
                 numwrite, LSN_FORMAT_ARGS(writePtr),
                 numflush, LSN_FORMAT_ARGS(flushPtr),
                 numapply, LSN_FORMAT_ARGS(applyPtr));
index 8c4d0fd9aed2bfb4ce05da1eb58dc19352b8ecf6..b62811017116fb23cfa623d9009e61863be43322 100644 (file)
@@ -386,12 +386,12 @@ WalReceiverMain(const void *startup_data, size_t startup_data_len)
                {
                        if (first_stream)
                                ereport(LOG,
-                                               (errmsg("started streaming WAL from primary at %X/%X on timeline %u",
-                                                               LSN_FORMAT_ARGS(startpoint), startpointTLI)));
+                                               errmsg("started streaming WAL from primary at %X/%08X on timeline %u",
+                                                          LSN_FORMAT_ARGS(startpoint), startpointTLI));
                        else
                                ereport(LOG,
-                                               (errmsg("restarted WAL streaming at %X/%X on timeline %u",
-                                                               LSN_FORMAT_ARGS(startpoint), startpointTLI)));
+                                               errmsg("restarted WAL streaming at %X/%08X on timeline %u",
+                                                          LSN_FORMAT_ARGS(startpoint), startpointTLI));
                        first_stream = false;
 
                        /* Initialize LogstreamResult and buffers for processing messages */
@@ -470,7 +470,7 @@ WalReceiverMain(const void *startup_data, size_t startup_data_len)
                                                {
                                                        ereport(LOG,
                                                                        (errmsg("replication terminated by primary server"),
-                                                                        errdetail("End of WAL reached on timeline %u at %X/%X.",
+                                                                        errdetail("End of WAL reached on timeline %u at %X/%08X.",
                                                                                           startpointTLI,
                                                                                           LSN_FORMAT_ARGS(LogstreamResult.Write))));
                                                        endofwal = true;
@@ -711,7 +711,7 @@ WalRcvWaitForStartPosition(XLogRecPtr *startpoint, TimeLineID *startpointTLI)
        {
                char            activitymsg[50];
 
-               snprintf(activitymsg, sizeof(activitymsg), "restarting at %X/%X",
+               snprintf(activitymsg, sizeof(activitymsg), "restarting at %X/%08X",
                                 LSN_FORMAT_ARGS(*startpoint));
                set_ps_display(activitymsg);
        }
@@ -1014,7 +1014,7 @@ XLogWalRcvFlush(bool dying, TimeLineID tli)
                {
                        char            activitymsg[50];
 
-                       snprintf(activitymsg, sizeof(activitymsg), "streaming %X/%X",
+                       snprintf(activitymsg, sizeof(activitymsg), "streaming %X/%08X",
                                         LSN_FORMAT_ARGS(LogstreamResult.Write));
                        set_ps_display(activitymsg);
                }
@@ -1138,7 +1138,7 @@ XLogWalRcvSendReply(bool force, bool requestReply)
        pq_sendbyte(&reply_message, requestReply ? 1 : 0);
 
        /* Send it */
-       elog(DEBUG2, "sending write %X/%X flush %X/%X apply %X/%X%s",
+       elog(DEBUG2, "sending write %X/%08X flush %X/%08X apply %X/%08X%s",
                 LSN_FORMAT_ARGS(writePtr),
                 LSN_FORMAT_ARGS(flushPtr),
                 LSN_FORMAT_ARGS(applyPtr),
index f2c33250e8b2f7761af1f4324376ef7695174a2b..28b8591efa5f0b85bad84ae966e444f076d48857 100644 (file)
@@ -408,7 +408,7 @@ IdentifySystem(void)
        else
                logptr = GetFlushRecPtr(&currTLI);
 
-       snprintf(xloc, sizeof(xloc), "%X/%X", LSN_FORMAT_ARGS(logptr));
+       snprintf(xloc, sizeof(xloc), "%X/%08X", LSN_FORMAT_ARGS(logptr));
 
        if (MyDatabaseId != InvalidOid)
        {
@@ -515,7 +515,7 @@ ReadReplicationSlot(ReadReplicationSlotCmd *cmd)
                {
                        char            xloc[64];
 
-                       snprintf(xloc, sizeof(xloc), "%X/%X",
+                       snprintf(xloc, sizeof(xloc), "%X/%08X",
                                         LSN_FORMAT_ARGS(slot_contents.data.restart_lsn));
                        values[i] = CStringGetTextDatum(xloc);
                        nulls[i] = false;
@@ -892,12 +892,12 @@ StartReplication(StartReplicationCmd *cmd)
                                switchpoint < cmd->startpoint)
                        {
                                ereport(ERROR,
-                                               (errmsg("requested starting point %X/%X on timeline %u is not in this server's history",
-                                                               LSN_FORMAT_ARGS(cmd->startpoint),
-                                                               cmd->timeline),
-                                                errdetail("This server's history forked from timeline %u at %X/%X.",
-                                                                  cmd->timeline,
-                                                                  LSN_FORMAT_ARGS(switchpoint))));
+                                               errmsg("requested starting point %X/%08X on timeline %u is not in this server's history",
+                                                          LSN_FORMAT_ARGS(cmd->startpoint),
+                                                          cmd->timeline),
+                                               errdetail("This server's history forked from timeline %u at %X/%08X.",
+                                                                 cmd->timeline,
+                                                                 LSN_FORMAT_ARGS(switchpoint)));
                        }
                        sendTimeLineValidUpto = switchpoint;
                }
@@ -939,9 +939,9 @@ StartReplication(StartReplicationCmd *cmd)
                if (FlushPtr < cmd->startpoint)
                {
                        ereport(ERROR,
-                                       (errmsg("requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X",
-                                                       LSN_FORMAT_ARGS(cmd->startpoint),
-                                                       LSN_FORMAT_ARGS(FlushPtr))));
+                                       errmsg("requested starting point %X/%08X is ahead of the WAL flush position of this server %X/%08X",
+                                                  LSN_FORMAT_ARGS(cmd->startpoint),
+                                                  LSN_FORMAT_ARGS(FlushPtr)));
                }
 
                /* Start streaming from the requested point */
@@ -983,7 +983,7 @@ StartReplication(StartReplicationCmd *cmd)
                Datum           values[2];
                bool            nulls[2] = {0};
 
-               snprintf(startpos_str, sizeof(startpos_str), "%X/%X",
+               snprintf(startpos_str, sizeof(startpos_str), "%X/%08X",
                                 LSN_FORMAT_ARGS(sendTimeLineValidUpto));
 
                dest = CreateDestReceiver(DestRemoteSimple);
@@ -1324,7 +1324,7 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd)
                        ReplicationSlotPersist();
        }
 
-       snprintf(xloc, sizeof(xloc), "%X/%X",
+       snprintf(xloc, sizeof(xloc), "%X/%08X",
                         LSN_FORMAT_ARGS(MyReplicationSlot->data.confirmed_flush));
 
        dest = CreateDestReceiver(DestRemoteSimple);
@@ -2429,7 +2429,7 @@ ProcessStandbyReplyMessage(void)
                /* Copy because timestamptz_to_str returns a static buffer */
                replyTimeStr = pstrdup(timestamptz_to_str(replyTime));
 
-               elog(DEBUG2, "write %X/%X flush %X/%X apply %X/%X%s reply_time %s",
+               elog(DEBUG2, "write %X/%08X flush %X/%08X apply %X/%08X%s reply_time %s",
                         LSN_FORMAT_ARGS(writePtr),
                         LSN_FORMAT_ARGS(flushPtr),
                         LSN_FORMAT_ARGS(applyPtr),
@@ -3251,7 +3251,7 @@ XLogSendPhysical(void)
 
                WalSndCaughtUp = true;
 
-               elog(DEBUG1, "walsender reached end of timeline at %X/%X (sent up to %X/%X)",
+               elog(DEBUG1, "walsender reached end of timeline at %X/%08X (sent up to %X/%08X)",
                         LSN_FORMAT_ARGS(sendTimeLineValidUpto),
                         LSN_FORMAT_ARGS(sentPtr));
                return;
@@ -3392,7 +3392,7 @@ retry:
        {
                char            activitymsg[50];
 
-               snprintf(activitymsg, sizeof(activitymsg), "streaming %X/%X",
+               snprintf(activitymsg, sizeof(activitymsg), "streaming %X/%08X",
                                 LSN_FORMAT_ARGS(sentPtr));
                set_ps_display(activitymsg);
        }
index 7fa8d9247e097b4943a76ec1e9c98623a7899d7d..4222bdab07807cbfd99910232fc7c7a104ac0258 100644 (file)
@@ -1376,7 +1376,7 @@ LogCurrentRunningXacts(RunningTransactions CurrRunningXacts)
 
        if (xlrec.subxid_overflow)
                elog(DEBUG2,
-                        "snapshot of %d running transactions overflowed (lsn %X/%X oldest xid %u latest complete %u next xid %u)",
+                        "snapshot of %d running transactions overflowed (lsn %X/%08X oldest xid %u latest complete %u next xid %u)",
                         CurrRunningXacts->xcnt,
                         LSN_FORMAT_ARGS(recptr),
                         CurrRunningXacts->oldestRunningXid,
@@ -1384,7 +1384,7 @@ LogCurrentRunningXacts(RunningTransactions CurrRunningXacts)
                         CurrRunningXacts->nextXid);
        else
                elog(DEBUG2,
-                        "snapshot of %d+%d running transaction ids (lsn %X/%X oldest xid %u latest complete %u next xid %u)",
+                        "snapshot of %d+%d running transaction ids (lsn %X/%08X oldest xid %u latest complete %u next xid %u)",
                         CurrRunningXacts->xcnt, CurrRunningXacts->subxcnt,
                         LSN_FORMAT_ARGS(recptr),
                         CurrRunningXacts->oldestRunningXid,
index 16311590a14a033d1fa34953a5dc4540304e7c92..12de2446f5b69e871536d3c17684eb8c12d5bfda 100644 (file)
@@ -83,7 +83,7 @@ pg_lsn_out(PG_FUNCTION_ARGS)
        char            buf[MAXPG_LSNLEN + 1];
        char       *result;
 
-       snprintf(buf, sizeof buf, "%X/%X", LSN_FORMAT_ARGS(lsn));
+       snprintf(buf, sizeof buf, "%X/%08X", LSN_FORMAT_ARGS(lsn));
        result = pstrdup(buf);
        PG_RETURN_CSTRING(result);
 }
index eb7354200bcee772bf40a98a10515db4ba29ad6a..55621f35fb6b73292c3894b1aed6ac15f1b9ddca 100644 (file)
@@ -487,7 +487,7 @@ reached_end_position(XLogRecPtr segendpos, uint32 timeline,
                        if (r < 0)
                                pg_fatal("could not read from ready pipe: %m");
 
-                       if (sscanf(xlogend, "%X/%X", &hi, &lo) != 2)
+                       if (sscanf(xlogend, "%X/%08X", &hi, &lo) != 2)
                                pg_fatal("could not parse write-ahead log location \"%s\"",
                                                 xlogend);
                        xlogendptr = ((uint64) hi) << 32 | lo;
@@ -629,7 +629,7 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier,
        param->wal_compress_level = wal_compress_level;
 
        /* Convert the starting position */
-       if (sscanf(startpos, "%X/%X", &hi, &lo) != 2)
+       if (sscanf(startpos, "%X/%08X", &hi, &lo) != 2)
                pg_fatal("could not parse write-ahead log location \"%s\"",
                                 startpos);
        param->startptr = ((uint64) hi) << 32 | lo;
@@ -2255,7 +2255,7 @@ BaseBackup(char *compression_algorithm, char *compression_detail,
                 * value directly in the variable, and then set the flag that says
                 * it's there.
                 */
-               if (sscanf(xlogend, "%X/%X", &hi, &lo) != 2)
+               if (sscanf(xlogend, "%X/%08X", &hi, &lo) != 2)
                        pg_fatal("could not parse write-ahead log location \"%s\"",
                                         xlogend);
                xlogendptr = ((uint64) hi) << 32 | lo;
index 11f71c0380181c95668a841e353f486b6ea506a2..025b893a41e832460291f77eb5d02d889dd6a53f 100644 (file)
@@ -1262,7 +1262,7 @@ setup_recovery(const struct LogicalRepInfo *dbinfo, const char *datadir, const c
        {
                appendPQExpBufferStr(recoveryconfcontents, "# dry run mode");
                appendPQExpBuffer(recoveryconfcontents,
-                                                 "recovery_target_lsn = '%X/%X'\n",
+                                                 "recovery_target_lsn = '%X/%08X'\n",
                                                  LSN_FORMAT_ARGS((XLogRecPtr) InvalidXLogRecPtr));
        }
        else
@@ -1876,7 +1876,7 @@ set_replication_progress(PGconn *conn, const struct LogicalRepInfo *dbinfo, cons
        if (dry_run)
        {
                suboid = InvalidOid;
-               lsnstr = psprintf("%X/%X", LSN_FORMAT_ARGS((XLogRecPtr) InvalidXLogRecPtr));
+               lsnstr = psprintf("%X/%08X", LSN_FORMAT_ARGS((XLogRecPtr) InvalidXLogRecPtr));
        }
        else
        {
index e816cf58101fbf36e27f9282840543c3c793535a..289ca14dcfe5810cf0271ad24ca3434be8fb3e70 100644 (file)
@@ -188,14 +188,14 @@ stop_streaming(XLogRecPtr xlogpos, uint32 timeline, bool segment_finished)
 
        /* we assume that we get called once at the end of each segment */
        if (verbose && segment_finished)
-               pg_log_info("finished segment at %X/%X (timeline %u)",
+               pg_log_info("finished segment at %X/%08X (timeline %u)",
                                        LSN_FORMAT_ARGS(xlogpos),
                                        timeline);
 
        if (!XLogRecPtrIsInvalid(endpos) && endpos < xlogpos)
        {
                if (verbose)
-                       pg_log_info("stopped log streaming at %X/%X (timeline %u)",
+                       pg_log_info("stopped log streaming at %X/%08X (timeline %u)",
                                                LSN_FORMAT_ARGS(xlogpos),
                                                timeline);
                time_to_stop = true;
@@ -211,7 +211,7 @@ stop_streaming(XLogRecPtr xlogpos, uint32 timeline, bool segment_finished)
         * timeline, but it's close enough for reporting purposes.
         */
        if (verbose && prevtimeline != 0 && prevtimeline != timeline)
-               pg_log_info("switched to timeline %u at %X/%X",
+               pg_log_info("switched to timeline %u at %X/%08X",
                                        timeline,
                                        LSN_FORMAT_ARGS(prevpos));
 
@@ -575,7 +575,7 @@ StreamLog(void)
         * Start the replication
         */
        if (verbose)
-               pg_log_info("starting log streaming at %X/%X (timeline %u)",
+               pg_log_info("starting log streaming at %X/%08X (timeline %u)",
                                        LSN_FORMAT_ARGS(stream.startpos),
                                        stream.timeline);
 
@@ -689,7 +689,7 @@ main(int argc, char **argv)
                                basedir = pg_strdup(optarg);
                                break;
                        case 'E':
-                               if (sscanf(optarg, "%X/%X", &hi, &lo) != 2)
+                               if (sscanf(optarg, "%X/%08X", &hi, &lo) != 2)
                                        pg_fatal("could not parse end position \"%s\"", optarg);
                                endpos = ((uint64) hi) << 32 | lo;
                                break;
index fb7a6a1d05d8dca1f81290c51953f1a35a19865b..8a5dd24e6c9ad70faa14f6d7d21feb90a849bf82 100644 (file)
@@ -144,7 +144,7 @@ sendFeedback(PGconn *conn, TimestampTz now, bool force, bool replyRequested)
                return true;
 
        if (verbose)
-               pg_log_info("confirming write up to %X/%X, flush to %X/%X (slot %s)",
+               pg_log_info("confirming write up to %X/%08X, flush to %X/%08X (slot %s)",
                                        LSN_FORMAT_ARGS(output_written_lsn),
                                        LSN_FORMAT_ARGS(output_fsync_lsn),
                                        replication_slot);
@@ -238,13 +238,13 @@ StreamLogicalLog(void)
         * Start the replication
         */
        if (verbose)
-               pg_log_info("starting log streaming at %X/%X (slot %s)",
+               pg_log_info("starting log streaming at %X/%08X (slot %s)",
                                        LSN_FORMAT_ARGS(startpos),
                                        replication_slot);
 
        /* Initiate the replication stream at specified location */
        query = createPQExpBuffer();
-       appendPQExpBuffer(query, "START_REPLICATION SLOT \"%s\" LOGICAL %X/%X",
+       appendPQExpBuffer(query, "START_REPLICATION SLOT \"%s\" LOGICAL %X/%08X",
                                          replication_slot, LSN_FORMAT_ARGS(startpos));
 
        /* print options if there are any */
@@ -800,12 +800,12 @@ main(int argc, char **argv)
                                break;
 /* replication options */
                        case 'I':
-                               if (sscanf(optarg, "%X/%X", &hi, &lo) != 2)
+                               if (sscanf(optarg, "%X/%08X", &hi, &lo) != 2)
                                        pg_fatal("could not parse start position \"%s\"", optarg);
                                startpos = ((uint64) hi) << 32 | lo;
                                break;
                        case 'E':
-                               if (sscanf(optarg, "%X/%X", &hi, &lo) != 2)
+                               if (sscanf(optarg, "%X/%08X", &hi, &lo) != 2)
                                        pg_fatal("could not parse end position \"%s\"", optarg);
                                endpos = ((uint64) hi) << 32 | lo;
                                break;
@@ -1075,12 +1075,12 @@ prepareToTerminate(PGconn *conn, XLogRecPtr endpos, StreamStopReason reason,
                                pg_log_info("received interrupt signal, exiting");
                                break;
                        case STREAM_STOP_KEEPALIVE:
-                               pg_log_info("end position %X/%X reached by keepalive",
+                               pg_log_info("end position %X/%08X reached by keepalive",
                                                        LSN_FORMAT_ARGS(endpos));
                                break;
                        case STREAM_STOP_END_OF_WAL:
                                Assert(!XLogRecPtrIsInvalid(lsn));
-                               pg_log_info("end position %X/%X reached by WAL record at %X/%X",
+                               pg_log_info("end position %X/%08X reached by WAL record at %X/%08X",
                                                        LSN_FORMAT_ARGS(endpos), LSN_FORMAT_ARGS(lsn));
                                break;
                        case STREAM_STOP_NONE:
index 6b6e32dfbdf5615fcd4417d2419c90d748e15010..d6b7f117fa3bbc2f7b1f73e76f221c6bfb3b3f75 100644 (file)
@@ -571,7 +571,7 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
                        return true;
 
                /* Initiate the replication stream at specified location */
-               snprintf(query, sizeof(query), "START_REPLICATION %s%X/%X TIMELINE %u",
+               snprintf(query, sizeof(query), "START_REPLICATION %s%X/%08X TIMELINE %u",
                                 slotcmd,
                                 LSN_FORMAT_ARGS(stream->startpos),
                                 stream->timeline);
@@ -628,7 +628,7 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
                        }
                        if (stream->startpos > stoppos)
                        {
-                               pg_log_error("server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X",
+                               pg_log_error("server stopped streaming timeline %u at %X/%08X, but reported next timeline %u to begin at %X/%08X",
                                                         stream->timeline, LSN_FORMAT_ARGS(stoppos),
                                                         newtimeline, LSN_FORMAT_ARGS(stream->startpos));
                                goto error;
@@ -720,7 +720,7 @@ ReadEndOfStreamingResult(PGresult *res, XLogRecPtr *startpos, uint32 *timeline)
        }
 
        *timeline = atoi(PQgetvalue(res, 0, 0));
-       if (sscanf(PQgetvalue(res, 0, 1), "%X/%X", &startpos_xlogid,
+       if (sscanf(PQgetvalue(res, 0, 1), "%X/%08X", &startpos_xlogid,
                           &startpos_xrecoff) != 2)
        {
                pg_log_error("could not parse next timeline's starting point \"%s\"",
index c7b8a4c3a4b6a9f6a46ca5d63e6d7fba21ab2da3..e5a7cb6e5b14eb10b55563fbb634355367760214 100644 (file)
@@ -445,7 +445,7 @@ RunIdentifySystem(PGconn *conn, char **sysid, TimeLineID *starttli,
        /* Get LSN start position if necessary */
        if (startpos != NULL)
        {
-               if (sscanf(PQgetvalue(res, 0, 2), "%X/%X", &hi, &lo) != 2)
+               if (sscanf(PQgetvalue(res, 0, 2), "%X/%08X", &hi, &lo) != 2)
                {
                        pg_log_error("could not parse write-ahead log location \"%s\"",
                                                 PQgetvalue(res, 0, 2));
@@ -551,7 +551,7 @@ GetSlotInformation(PGconn *conn, const char *slot_name,
                uint32          hi,
                                        lo;
 
-               if (sscanf(PQgetvalue(res, 0, 1), "%X/%X", &hi, &lo) != 2)
+               if (sscanf(PQgetvalue(res, 0, 1), "%X/%08X", &hi, &lo) != 2)
                {
                        pg_log_error("could not parse restart_lsn \"%s\" for replication slot \"%s\"",
                                                 PQgetvalue(res, 0, 1), slot_name);
index e89d4603f09dcfe1c8c3c3535f488d57701b6ad5..e774bc78a626466b6b23acd05f712890387330c0 100644 (file)
@@ -247,7 +247,7 @@ parse_lsn(char *s, char *e, XLogRecPtr *lsn, char **c)
        unsigned        lo;
 
        *e = '\0';
-       success = (sscanf(s, "%X/%X%n", &hi, &lo, &nchars) == 2);
+       success = (sscanf(s, "%X/%08X%n", &hi, &lo, &nchars) == 2);
        *e = save;
 
        if (success)
index 28e58cd8ef458038db3987c7f4fc991934e69a65..f5cef99f62730c0da41b33fad51e4e8446dd1cb4 100644 (file)
@@ -569,7 +569,7 @@ check_backup_label_files(int n_backups, char **backup_dirs)
                        pg_fatal("backup at \"%s\" starts on timeline %u, but expected %u",
                                         backup_dirs[i], start_tli, check_tli);
                if (i < n_backups - 1 && start_lsn != check_lsn)
-                       pg_fatal("backup at \"%s\" starts at LSN %X/%X, but expected %X/%X",
+                       pg_fatal("backup at \"%s\" starts at LSN %X/%08X, but expected %X/%08X",
                                         backup_dirs[i],
                                         LSN_FORMAT_ARGS(start_lsn),
                                         LSN_FORMAT_ARGS(check_lsn));
index 313f8929df509e07cc707a518beb7a1e3eff125b..819a3fd0b7a6bb74a273d5d53616c2bf7c306438 100644 (file)
@@ -155,7 +155,7 @@ finalize_manifest(manifest_writer *mwriter,
        for (wal_range = first_wal_range; wal_range != NULL;
                 wal_range = wal_range->next)
                appendStringInfo(&mwriter->buf,
-                                                "%s{ \"Timeline\": %u, \"Start-LSN\": \"%X/%X\", \"End-LSN\": \"%X/%X\" }",
+                                                "%s{ \"Timeline\": %u, \"Start-LSN\": \"%X/%08X\", \"End-LSN\": \"%X/%08X\" }",
                                                 wal_range == first_wal_range ? "" : ",\n",
                                                 wal_range->tli,
                                                 LSN_FORMAT_ARGS(wal_range->start_lsn),
index 7bb801bb886123c4d79a4789bbb8ff865c6de5d8..10de058ce91f4859070799f05d5ca0c690f6a14d 100644 (file)
@@ -245,9 +245,9 @@ main(int argc, char *argv[])
                   dbState(ControlFile->state));
        printf(_("pg_control last modified:             %s\n"),
                   pgctime_str);
-       printf(_("Latest checkpoint location:           %X/%X\n"),
+       printf(_("Latest checkpoint location:           %X/%08X\n"),
                   LSN_FORMAT_ARGS(ControlFile->checkPoint));
-       printf(_("Latest checkpoint's REDO location:    %X/%X\n"),
+       printf(_("Latest checkpoint's REDO location:    %X/%08X\n"),
                   LSN_FORMAT_ARGS(ControlFile->checkPointCopy.redo));
        printf(_("Latest checkpoint's REDO WAL file:    %s\n"),
                   xlogfilename);
@@ -282,15 +282,15 @@ main(int argc, char *argv[])
                   ControlFile->checkPointCopy.newestCommitTsXid);
        printf(_("Time of latest checkpoint:            %s\n"),
                   ckpttime_str);
-       printf(_("Fake LSN counter for unlogged rels:   %X/%X\n"),
+       printf(_("Fake LSN counter for unlogged rels:   %X/%08X\n"),
                   LSN_FORMAT_ARGS(ControlFile->unloggedLSN));
-       printf(_("Minimum recovery ending location:     %X/%X\n"),
+       printf(_("Minimum recovery ending location:     %X/%08X\n"),
                   LSN_FORMAT_ARGS(ControlFile->minRecoveryPoint));
        printf(_("Min recovery ending loc's timeline:   %u\n"),
                   ControlFile->minRecoveryPointTLI);
-       printf(_("Backup start location:                %X/%X\n"),
+       printf(_("Backup start location:                %X/%08X\n"),
                   LSN_FORMAT_ARGS(ControlFile->backupStartPoint));
-       printf(_("Backup end location:                  %X/%X\n"),
+       printf(_("Backup end location:                  %X/%08X\n"),
                   LSN_FORMAT_ARGS(ControlFile->backupEndPoint));
        printf(_("End-of-backup record required:        %s\n"),
                   ControlFile->backupEndRequired ? _("yes") : _("no"));
index 56c2ad55d4a6701f4d6924191a42d3d3fa948a61..e80edb7077e269131da1724490110419779bbb3a 100644 (file)
@@ -215,7 +215,7 @@ libpq_get_current_wal_insert_lsn(rewind_source *source)
 
        val = run_simple_query(conn, "SELECT pg_current_wal_insert_lsn()");
 
-       if (sscanf(val, "%X/%X", &hi, &lo) != 2)
+       if (sscanf(val, "%X/%08X", &hi, &lo) != 2)
                pg_fatal("unrecognized result \"%s\" for current WAL insert location", val);
 
        result = ((uint64) hi) << 32 | lo;
index 2cd44625ca3687c3e24851b9423569652c8aefa8..8f4b282c6b1bbb01fcb8bbff2db5bf299bdb4e76 100644 (file)
@@ -89,11 +89,11 @@ extractPageMap(const char *datadir, XLogRecPtr startpoint, int tliIndex,
                        XLogRecPtr      errptr = xlogreader->EndRecPtr;
 
                        if (errormsg)
-                               pg_fatal("could not read WAL record at %X/%X: %s",
+                               pg_fatal("could not read WAL record at %X/%08X: %s",
                                                 LSN_FORMAT_ARGS(errptr),
                                                 errormsg);
                        else
-                               pg_fatal("could not read WAL record at %X/%X",
+                               pg_fatal("could not read WAL record at %X/%08X",
                                                 LSN_FORMAT_ARGS(errptr));
                }
 
@@ -105,7 +105,7 @@ extractPageMap(const char *datadir, XLogRecPtr startpoint, int tliIndex,
         * messed up.
         */
        if (xlogreader->EndRecPtr != endpoint)
-               pg_fatal("end pointer %X/%X is not a valid end point; expected %X/%X",
+               pg_fatal("end pointer %X/%08X is not a valid end point; expected %X/%08X",
                                 LSN_FORMAT_ARGS(endpoint), LSN_FORMAT_ARGS(xlogreader->EndRecPtr));
 
        XLogReaderFree(xlogreader);
@@ -143,10 +143,10 @@ readOneRecord(const char *datadir, XLogRecPtr ptr, int tliIndex,
        if (record == NULL)
        {
                if (errormsg)
-                       pg_fatal("could not read WAL record at %X/%X: %s",
+                       pg_fatal("could not read WAL record at %X/%08X: %s",
                                         LSN_FORMAT_ARGS(ptr), errormsg);
                else
-                       pg_fatal("could not read WAL record at %X/%X",
+                       pg_fatal("could not read WAL record at %X/%08X",
                                         LSN_FORMAT_ARGS(ptr));
        }
        endptr = xlogreader->EndRecPtr;
@@ -211,11 +211,11 @@ findLastCheckpoint(const char *datadir, XLogRecPtr forkptr, int tliIndex,
                if (record == NULL)
                {
                        if (errormsg)
-                               pg_fatal("could not find previous WAL record at %X/%X: %s",
+                               pg_fatal("could not find previous WAL record at %X/%08X: %s",
                                                 LSN_FORMAT_ARGS(searchptr),
                                                 errormsg);
                        else
-                               pg_fatal("could not find previous WAL record at %X/%X",
+                               pg_fatal("could not find previous WAL record at %X/%08X",
                                                 LSN_FORMAT_ARGS(searchptr));
                }
 
@@ -458,8 +458,8 @@ extractPageInfo(XLogReaderState *record)
                 * we don't recognize the type. That's bad - we don't know how to
                 * track that change.
                 */
-               pg_fatal("WAL record modifies a relation, but record type is not recognized: "
-                                "lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X",
+               pg_fatal("WAL record modifies a relation, but record type is not recognized:\n"
+                                "lsn: %X/%08X, rmid: %d, rmgr: %s, info: %02X",
                                 LSN_FORMAT_ARGS(record->ReadRecPtr),
                                 rmid, RmgrName(rmid), info);
        }
index 9d16c1e6b475735f2a3fc62746d818d05c842e5e..0c68dd4235e699f258431e5d63c996ec6f623e76 100644 (file)
@@ -393,7 +393,7 @@ main(int argc, char **argv)
                                                                   targetHistory, targetNentries,
                                                                   &divergerec, &lastcommontliIndex);
 
-               pg_log_info("servers diverged at WAL location %X/%X on timeline %u",
+               pg_log_info("servers diverged at WAL location %X/%08X on timeline %u",
                                        LSN_FORMAT_ARGS(divergerec),
                                        targetHistory[lastcommontliIndex].tli);
 
@@ -461,7 +461,7 @@ main(int argc, char **argv)
 
        findLastCheckpoint(datadir_target, divergerec, lastcommontliIndex,
                                           &chkptrec, &chkpttli, &chkptredo, restore_command);
-       pg_log_info("rewinding from last common checkpoint at %X/%X on timeline %u",
+       pg_log_info("rewinding from last common checkpoint at %X/%08X on timeline %u",
                                LSN_FORMAT_ARGS(chkptrec), chkpttli);
 
        /* Initialize the hash table to track the status of each file */
@@ -902,7 +902,7 @@ getTimelineHistory(TimeLineID tli, bool is_source, int *nentries)
                        TimeLineHistoryEntry *entry;
 
                        entry = &history[i];
-                       pg_log_debug("%u: %X/%X - %X/%X", entry->tli,
+                       pg_log_debug("%u: %X/%08X - %X/%08X", entry->tli,
                                                 LSN_FORMAT_ARGS(entry->begin),
                                                 LSN_FORMAT_ARGS(entry->end));
                }
@@ -981,8 +981,8 @@ createBackupLabel(XLogRecPtr startpoint, TimeLineID starttli, XLogRecPtr checkpo
        strftime(strfbuf, sizeof(strfbuf), "%Y-%m-%d %H:%M:%S %Z", tmp);
 
        len = snprintf(buf, sizeof(buf),
-                                  "START WAL LOCATION: %X/%X (file %s)\n"
-                                  "CHECKPOINT LOCATION: %X/%X\n"
+                                  "START WAL LOCATION: %X/%08X (file %s)\n"
+                                  "CHECKPOINT LOCATION: %X/%08X\n"
                                   "BACKUP METHOD: pg_rewind\n"
                                   "BACKUP FROM: standby\n"
                                   "START TIME: %s\n",
index 4d9f0d8301bf2abc0ed8e41b25f01192a658b4c3..6784969951f579d8be8512cdaa045090d13acae0 100644 (file)
@@ -66,7 +66,7 @@ rewind_parseTimeLineHistory(char *buffer, TimeLineID targetTLI, int *nentries)
                if (*ptr == '\0' || *ptr == '#')
                        continue;
 
-               nfields = sscanf(fline, "%u\t%X/%X", &tli, &switchpoint_hi, &switchpoint_lo);
+               nfields = sscanf(fline, "%u\t%X/%08X", &tli, &switchpoint_hi, &switchpoint_lo);
 
                if (nfields < 1)
                {
index 48994ef9bc6fce558d38c460a6095cc724424613..5e6c13bb9216839b40106274e6328ddba7e8a681 100644 (file)
@@ -1207,7 +1207,7 @@ parse_required_wal(verifier_context *context, char *pg_waldump_path,
        {
                char       *pg_waldump_cmd;
 
-               pg_waldump_cmd = psprintf("\"%s\" --quiet --path=\"%s\" --timeline=%u --start=%X/%X --end=%X/%X\n",
+               pg_waldump_cmd = psprintf("\"%s\" --quiet --path=\"%s\" --timeline=%u --start=%X/%08X --end=%X/%08X\n",
                                                                  pg_waldump_path, wal_directory, this_wal_range->tli,
                                                                  LSN_FORMAT_ARGS(this_wal_range->start_lsn),
                                                                  LSN_FORMAT_ARGS(this_wal_range->end_lsn));
index 51fb76efc489ef5a5fa6742f0c873111e72cc10d..13d3ec2f5be3cee52de5a2470c1145a98a8956dc 100644 (file)
@@ -656,7 +656,7 @@ XLogDumpDisplayStats(XLogDumpConfig *config, XLogStats *stats)
        }
        total_len = total_rec_len + total_fpi_len;
 
-       printf("WAL statistics between %X/%X and %X/%X:\n",
+       printf("WAL statistics between %X/%08X and %X/%08X:\n",
                   LSN_FORMAT_ARGS(stats->startptr), LSN_FORMAT_ARGS(stats->endptr));
 
        /*
@@ -904,7 +904,7 @@ main(int argc, char **argv)
                                config.filter_by_extended = true;
                                break;
                        case 'e':
-                               if (sscanf(optarg, "%X/%X", &xlogid, &xrecoff) != 2)
+                               if (sscanf(optarg, "%X/%08X", &xlogid, &xrecoff) != 2)
                                {
                                        pg_log_error("invalid WAL location: \"%s\"",
                                                                 optarg);
@@ -1002,7 +1002,7 @@ main(int argc, char **argv)
                                config.filter_by_extended = true;
                                break;
                        case 's':
-                               if (sscanf(optarg, "%X/%X", &xlogid, &xrecoff) != 2)
+                               if (sscanf(optarg, "%X/%08X", &xlogid, &xrecoff) != 2)
                                {
                                        pg_log_error("invalid WAL location: \"%s\"",
                                                                 optarg);
@@ -1140,7 +1140,7 @@ main(int argc, char **argv)
                        XLogSegNoOffsetToRecPtr(segno, 0, WalSegSz, private.startptr);
                else if (!XLByteInSeg(private.startptr, segno, WalSegSz))
                {
-                       pg_log_error("start WAL location %X/%X is not inside file \"%s\"",
+                       pg_log_error("start WAL location %X/%08X is not inside file \"%s\"",
                                                 LSN_FORMAT_ARGS(private.startptr),
                                                 fname);
                        goto bad_argument;
@@ -1182,7 +1182,7 @@ main(int argc, char **argv)
                if (!XLByteInSeg(private.endptr, segno, WalSegSz) &&
                        private.endptr != (segno + 1) * WalSegSz)
                {
-                       pg_log_error("end WAL location %X/%X is not inside file \"%s\"",
+                       pg_log_error("end WAL location %X/%08X is not inside file \"%s\"",
                                                 LSN_FORMAT_ARGS(private.endptr),
                                                 argv[argc - 1]);
                        goto bad_argument;
@@ -1214,7 +1214,7 @@ main(int argc, char **argv)
        first_record = XLogFindNextRecord(xlogreader_state, private.startptr);
 
        if (first_record == InvalidXLogRecPtr)
-               pg_fatal("could not find a valid record after %X/%X",
+               pg_fatal("could not find a valid record after %X/%08X",
                                 LSN_FORMAT_ARGS(private.startptr));
 
        /*
@@ -1224,8 +1224,8 @@ main(int argc, char **argv)
         */
        if (first_record != private.startptr &&
                XLogSegmentOffset(private.startptr, WalSegSz) != 0)
-               pg_log_info(ngettext("first record is after %X/%X, at %X/%X, skipping over %u byte",
-                                                        "first record is after %X/%X, at %X/%X, skipping over %u bytes",
+               pg_log_info(ngettext("first record is after %X/%08X, at %X/%08X, skipping over %u byte",
+                                                        "first record is after %X/%08X, at %X/%08X, skipping over %u bytes",
                                                         (first_record - private.startptr)),
                                        LSN_FORMAT_ARGS(private.startptr),
                                        LSN_FORMAT_ARGS(first_record),
@@ -1309,7 +1309,7 @@ main(int argc, char **argv)
                exit(0);
 
        if (errormsg)
-               pg_fatal("error in WAL record at %X/%X: %s",
+               pg_fatal("error in WAL record at %X/%08X: %s",
                                 LSN_FORMAT_ARGS(xlogreader_state->ReadRecPtr),
                                 errormsg);
 
index 71973af199b9082382b443bd6f5b79cc4a957e89..58e0948100f4b6f32ac451bc0154575dfac1f92f 100644 (file)
@@ -942,7 +942,7 @@ parse_xlogrecptr(XLogRecPtr *result, char *input)
        uint32          hi;
        uint32          lo;
 
-       if (sscanf(input, "%X/%X", &hi, &lo) != 2)
+       if (sscanf(input, "%X/%08X", &hi, &lo) != 2)
                return false;
        *result = ((uint64) hi) << 32 | lo;
        return true;
index 9e41c9f6e8446e7e73bd126b0438a56482191504..514f03df0b69bcadb181a6b861d74fcdceee6e1a 100644 (file)
@@ -38,7 +38,10 @@ typedef uint64 XLogRecPtr;
 /*
  * Handy macro for printing XLogRecPtr in conventional format, e.g.,
  *
- * printf("%X/%X", LSN_FORMAT_ARGS(lsn));
+ * printf("%X/08X", LSN_FORMAT_ARGS(lsn));
+ *
+ * To avoid breaking translatable messages, we're directly applying the
+ * LSN format instead of using a macro.
  */
 #define LSN_FORMAT_ARGS(lsn) (AssertVariableIsOfTypeMacro((lsn), XLogRecPtr), (uint32) ((lsn) >> 32)), ((uint32) (lsn))
 
index 9a3b4866fce4abbc4e75da50fa4dad3a7ce85b0e..b381d0c21b5fe8d0be430d617a69e1311b26fdec 100644 (file)
@@ -39,7 +39,7 @@ sub find_largest_lsn
        defined($len) or die "read error on $filename: $!";
        close($fh);
 
-       return sprintf("%X/%X", $max_hi, $max_lo);
+       return sprintf("%X/%08X", $max_hi, $max_lo);
 }
 
 # Initialize primary node
index 93e93be56689d730c9dd8f45b5567a33ffb660d6..c58e232a2635ca228350125d133eac2f1f6704f8 100644 (file)
@@ -3872,15 +3872,15 @@ ERROR:  factorial of a negative number is undefined
 -- Tests for pg_lsn()
 --
 SELECT pg_lsn(23783416::numeric);
-  pg_lsn   
------------
- 0/16AE7F8
+   pg_lsn   
+------------
+ 0/016AE7F8
 (1 row)
 
 SELECT pg_lsn(0::numeric);
- pg_lsn 
---------
- 0/0
+   pg_lsn   
+------------
+ 0/00000000
 (1 row)
 
 SELECT pg_lsn(18446744073709551615::numeric);
index b27eec7c01503edc477078efcbf28b9b082c1531..8ab59b2e4459328d60f652adec638e868ea84512 100644 (file)
@@ -41,9 +41,9 @@ SELECT * FROM pg_input_error_info('16AE7F7', 'pg_lsn');
 
 -- Min/Max aggregation
 SELECT MIN(f1), MAX(f1) FROM PG_LSN_TBL;
min |        max        
------+-------------------
- 0/0 | FFFFFFFF/FFFFFFFF
   min     |        max        
+------------+-------------------
+ 0/00000000 | FFFFFFFF/FFFFFFFF
 (1 row)
 
 DROP TABLE PG_LSN_TBL;
@@ -85,21 +85,21 @@ SELECT '0/16AE7F8'::pg_lsn - '0/16AE7F7'::pg_lsn;
 (1 row)
 
 SELECT '0/16AE7F7'::pg_lsn + 16::numeric;
- ?column?  
------------
- 0/16AE807
 ?column?  
+------------
+ 0/016AE807
 (1 row)
 
 SELECT 16::numeric + '0/16AE7F7'::pg_lsn;
- ?column?  
------------
- 0/16AE807
 ?column?  
+------------
+ 0/016AE807
 (1 row)
 
 SELECT '0/16AE7F7'::pg_lsn - 16::numeric;
- ?column?  
------------
- 0/16AE7E7
 ?column?  
+------------
+ 0/016AE7E7
 (1 row)
 
 SELECT 'FFFFFFFF/FFFFFFFE'::pg_lsn + 1::numeric;
@@ -111,9 +111,9 @@ SELECT 'FFFFFFFF/FFFFFFFE'::pg_lsn + 1::numeric;
 SELECT 'FFFFFFFF/FFFFFFFE'::pg_lsn + 2::numeric; -- out of range error
 ERROR:  pg_lsn out of range
 SELECT '0/1'::pg_lsn - 1::numeric;
- ?column? 
-----------
- 0/0
+  ?column?  
+------------
+ 0/00000000
 (1 row)
 
 SELECT '0/1'::pg_lsn - 2::numeric; -- out of range error
@@ -125,9 +125,9 @@ SELECT '0/0'::pg_lsn + ('FFFFFFFF/FFFFFFFF'::pg_lsn - '0/0'::pg_lsn);
 (1 row)
 
 SELECT 'FFFFFFFF/FFFFFFFF'::pg_lsn - ('FFFFFFFF/FFFFFFFF'::pg_lsn - '0/0'::pg_lsn);
- ?column? 
-----------
- 0/0
+  ?column?  
+------------
+ 0/00000000
 (1 row)
 
 SELECT '0/16AE7F7'::pg_lsn + 'NaN'::numeric;
@@ -164,107 +164,107 @@ SELECT DISTINCT (i || '/' || j)::pg_lsn f
        generate_series(1, 5) k
   WHERE i <= 10 AND j > 0 AND j <= 10
   ORDER BY f;
-   f   
--------
- 1/1
- 1/2
- 1/3
- 1/4
- 1/5
- 1/6
- 1/7
- 1/8
- 1/9
- 1/10
- 2/1
- 2/2
- 2/3
- 2/4
- 2/5
- 2/6
- 2/7
- 2/8
- 2/9
- 2/10
- 3/1
- 3/2
- 3/3
- 3/4
- 3/5
- 3/6
- 3/7
- 3/8
- 3/9
- 3/10
- 4/1
- 4/2
- 4/3
- 4/4
- 4/5
- 4/6
- 4/7
- 4/8
- 4/9
- 4/10
- 5/1
- 5/2
- 5/3
- 5/4
- 5/5
- 5/6
- 5/7
- 5/8
- 5/9
- 5/10
- 6/1
- 6/2
- 6/3
- 6/4
- 6/5
- 6/6
- 6/7
- 6/8
- 6/9
- 6/10
- 7/1
- 7/2
- 7/3
- 7/4
- 7/5
- 7/6
- 7/7
- 7/8
- 7/9
- 7/10
- 8/1
- 8/2
- 8/3
- 8/4
- 8/5
- 8/6
- 8/7
- 8/8
- 8/9
- 8/10
- 9/1
- 9/2
- 9/3
- 9/4
- 9/5
- 9/6
- 9/7
- 9/8
- 9/9
- 9/10
- 10/1
- 10/2
- 10/3
- 10/4
- 10/5
- 10/6
- 10/7
- 10/8
- 10/9
- 10/10
+      f      
+-------------
+ 1/00000001
+ 1/00000002
+ 1/00000003
+ 1/00000004
+ 1/00000005
+ 1/00000006
+ 1/00000007
+ 1/00000008
+ 1/00000009
+ 1/00000010
+ 2/00000001
+ 2/00000002
+ 2/00000003
+ 2/00000004
+ 2/00000005
+ 2/00000006
+ 2/00000007
+ 2/00000008
+ 2/00000009
+ 2/00000010
+ 3/00000001
+ 3/00000002
+ 3/00000003
+ 3/00000004
+ 3/00000005
+ 3/00000006
+ 3/00000007
+ 3/00000008
+ 3/00000009
+ 3/00000010
+ 4/00000001
+ 4/00000002
+ 4/00000003
+ 4/00000004
+ 4/00000005
+ 4/00000006
+ 4/00000007
+ 4/00000008
+ 4/00000009
+ 4/00000010
+ 5/00000001
+ 5/00000002
+ 5/00000003
+ 5/00000004
+ 5/00000005
+ 5/00000006
+ 5/00000007
+ 5/00000008
+ 5/00000009
+ 5/00000010
+ 6/00000001
+ 6/00000002
+ 6/00000003
+ 6/00000004
+ 6/00000005
+ 6/00000006
+ 6/00000007
+ 6/00000008
+ 6/00000009
+ 6/00000010
+ 7/00000001
+ 7/00000002
+ 7/00000003
+ 7/00000004
+ 7/00000005
+ 7/00000006
+ 7/00000007
+ 7/00000008
+ 7/00000009
+ 7/00000010
+ 8/00000001
+ 8/00000002
+ 8/00000003
+ 8/00000004
+ 8/00000005
+ 8/00000006
+ 8/00000007
+ 8/00000008
+ 8/00000009
+ 8/00000010
+ 9/00000001
+ 9/00000002
+ 9/00000003
+ 9/00000004
+ 9/00000005
+ 9/00000006
+ 9/00000007
+ 9/00000008
+ 9/00000009
+ 9/00000010
+ 10/00000001
+ 10/00000002
+ 10/00000003
+ 10/00000004
+ 10/00000005
+ 10/00000006
+ 10/00000007
+ 10/00000008
+ 10/00000009
+ 10/00000010
 (100 rows)
 
index 1443e1d92929669f5c169d518868f068ccfa2fb1..529b22417319d130c25f9fcbc658d9727bcf72d3 100644 (file)
@@ -116,18 +116,18 @@ CREATE SUBSCRIPTION regress_testsub4 CONNECTION 'dbname=regress_doesnotexist' PU
 WARNING:  subscription was created, but is not connected
 HINT:  To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription.
 \dRs+ regress_testsub4
-                                                                                                                 List of subscriptions
-       Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           | Skip LSN 
-------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+----------
- regress_testsub4 | regress_subscription_user | f       | {testpub}   | f      | parallel  | d                | f                | none   | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/0
+                                                                                                                  List of subscriptions
+       Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           |  Skip LSN  
+------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+------------
+ regress_testsub4 | regress_subscription_user | f       | {testpub}   | f      | parallel  | d                | f                | none   | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/00000000
 (1 row)
 
 ALTER SUBSCRIPTION regress_testsub4 SET (origin = any);
 \dRs+ regress_testsub4
-                                                                                                                 List of subscriptions
-       Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           | Skip LSN 
-------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+----------
- regress_testsub4 | regress_subscription_user | f       | {testpub}   | f      | parallel  | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/0
+                                                                                                                  List of subscriptions
+       Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           |  Skip LSN  
+------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+------------
+ regress_testsub4 | regress_subscription_user | f       | {testpub}   | f      | parallel  | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/00000000
 (1 row)
 
 DROP SUBSCRIPTION regress_testsub3;
@@ -145,10 +145,10 @@ ALTER SUBSCRIPTION regress_testsub CONNECTION 'foobar';
 ERROR:  invalid connection string syntax: missing "=" after "foobar" in connection info string
 
 \dRs+
-                                                                                                                List of subscriptions
-      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           | Skip LSN 
------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+----------
- regress_testsub | regress_subscription_user | f       | {testpub}   | f      | parallel  | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/0
+                                                                                                                 List of subscriptions
+      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           |  Skip LSN  
+-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+------------
+ regress_testsub | regress_subscription_user | f       | {testpub}   | f      | parallel  | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/00000000
 (1 row)
 
 ALTER SUBSCRIPTION regress_testsub SET PUBLICATION testpub2, testpub3 WITH (refresh = false);
@@ -157,10 +157,10 @@ ALTER SUBSCRIPTION regress_testsub SET (slot_name = 'newname');
 ALTER SUBSCRIPTION regress_testsub SET (password_required = false);
 ALTER SUBSCRIPTION regress_testsub SET (run_as_owner = true);
 \dRs+
-                                                                                                                     List of subscriptions
-      Name       |           Owner           | Enabled |     Publication     | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |           Conninfo           | Skip LSN 
------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+------------------------------+----------
- regress_testsub | regress_subscription_user | f       | {testpub2,testpub3} | f      | parallel  | d                | f                | any    | f                 | t             | f        | off                | dbname=regress_doesnotexist2 | 0/0
+                                                                                                                      List of subscriptions
+      Name       |           Owner           | Enabled |     Publication     | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |           Conninfo           |  Skip LSN  
+-----------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+------------------------------+------------
+ regress_testsub | regress_subscription_user | f       | {testpub2,testpub3} | f      | parallel  | d                | f                | any    | f                 | t             | f        | off                | dbname=regress_doesnotexist2 | 0/00000000
 (1 row)
 
 ALTER SUBSCRIPTION regress_testsub SET (password_required = true);
@@ -176,10 +176,10 @@ ERROR:  unrecognized subscription parameter: "create_slot"
 -- ok
 ALTER SUBSCRIPTION regress_testsub SKIP (lsn = '0/12345');
 \dRs+
-                                                                                                                     List of subscriptions
-      Name       |           Owner           | Enabled |     Publication     | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |           Conninfo           | Skip LSN 
------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+------------------------------+----------
- regress_testsub | regress_subscription_user | f       | {testpub2,testpub3} | f      | parallel  | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist2 | 0/12345
+                                                                                                                      List of subscriptions
+      Name       |           Owner           | Enabled |     Publication     | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |           Conninfo           |  Skip LSN  
+-----------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+------------------------------+------------
+ regress_testsub | regress_subscription_user | f       | {testpub2,testpub3} | f      | parallel  | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist2 | 0/00012345
 (1 row)
 
 -- ok - with lsn = NONE
@@ -188,10 +188,10 @@ ALTER SUBSCRIPTION regress_testsub SKIP (lsn = NONE);
 ALTER SUBSCRIPTION regress_testsub SKIP (lsn = '0/0');
 ERROR:  invalid WAL location (LSN): 0/0
 \dRs+
-                                                                                                                     List of subscriptions
-      Name       |           Owner           | Enabled |     Publication     | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |           Conninfo           | Skip LSN 
------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+------------------------------+----------
- regress_testsub | regress_subscription_user | f       | {testpub2,testpub3} | f      | parallel  | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist2 | 0/0
+                                                                                                                      List of subscriptions
+      Name       |           Owner           | Enabled |     Publication     | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |           Conninfo           |  Skip LSN  
+-----------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+------------------------------+------------
+ regress_testsub | regress_subscription_user | f       | {testpub2,testpub3} | f      | parallel  | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist2 | 0/00000000
 (1 row)
 
 BEGIN;
@@ -223,10 +223,10 @@ ALTER SUBSCRIPTION regress_testsub_foo SET (synchronous_commit = foobar);
 ERROR:  invalid value for parameter "synchronous_commit": "foobar"
 HINT:  Available values: local, remote_write, remote_apply, on, off.
 \dRs+
-                                                                                                                       List of subscriptions
-        Name         |           Owner           | Enabled |     Publication     | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |           Conninfo           | Skip LSN 
----------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+------------------------------+----------
- regress_testsub_foo | regress_subscription_user | f       | {testpub2,testpub3} | f      | parallel  | d                | f                | any    | t                 | f             | f        | local              | dbname=regress_doesnotexist2 | 0/0
+                                                                                                                        List of subscriptions
+        Name         |           Owner           | Enabled |     Publication     | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |           Conninfo           |  Skip LSN  
+---------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+------------------------------+------------
+ regress_testsub_foo | regress_subscription_user | f       | {testpub2,testpub3} | f      | parallel  | d                | f                | any    | t                 | f             | f        | local              | dbname=regress_doesnotexist2 | 0/00000000
 (1 row)
 
 -- rename back to keep the rest simple
@@ -255,19 +255,19 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB
 WARNING:  subscription was created, but is not connected
 HINT:  To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription.
 \dRs+
-                                                                                                                List of subscriptions
-      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           | Skip LSN 
------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+----------
- regress_testsub | regress_subscription_user | f       | {testpub}   | t      | parallel  | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/0
+                                                                                                                 List of subscriptions
+      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           |  Skip LSN  
+-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+------------
+ regress_testsub | regress_subscription_user | f       | {testpub}   | t      | parallel  | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/00000000
 (1 row)
 
 ALTER SUBSCRIPTION regress_testsub SET (binary = false);
 ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE);
 \dRs+
-                                                                                                                List of subscriptions
-      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           | Skip LSN 
------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+----------
- regress_testsub | regress_subscription_user | f       | {testpub}   | f      | parallel  | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/0
+                                                                                                                 List of subscriptions
+      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           |  Skip LSN  
+-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+------------
+ regress_testsub | regress_subscription_user | f       | {testpub}   | f      | parallel  | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/00000000
 (1 row)
 
 DROP SUBSCRIPTION regress_testsub;
@@ -279,27 +279,27 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB
 WARNING:  subscription was created, but is not connected
 HINT:  To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription.
 \dRs+
-                                                                                                                List of subscriptions
-      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           | Skip LSN 
------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+----------
- regress_testsub | regress_subscription_user | f       | {testpub}   | f      | on        | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/0
+                                                                                                                 List of subscriptions
+      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           |  Skip LSN  
+-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+------------
+ regress_testsub | regress_subscription_user | f       | {testpub}   | f      | on        | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/00000000
 (1 row)
 
 ALTER SUBSCRIPTION regress_testsub SET (streaming = parallel);
 \dRs+
-                                                                                                                List of subscriptions
-      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           | Skip LSN 
------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+----------
- regress_testsub | regress_subscription_user | f       | {testpub}   | f      | parallel  | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/0
+                                                                                                                 List of subscriptions
+      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           |  Skip LSN  
+-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+------------
+ regress_testsub | regress_subscription_user | f       | {testpub}   | f      | parallel  | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/00000000
 (1 row)
 
 ALTER SUBSCRIPTION regress_testsub SET (streaming = false);
 ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE);
 \dRs+
-                                                                                                                List of subscriptions
-      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           | Skip LSN 
------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+----------
- regress_testsub | regress_subscription_user | f       | {testpub}   | f      | off       | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/0
+                                                                                                                 List of subscriptions
+      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           |  Skip LSN  
+-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+------------
+ regress_testsub | regress_subscription_user | f       | {testpub}   | f      | off       | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/00000000
 (1 row)
 
 -- fail - publication already exists
@@ -314,10 +314,10 @@ ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub1, testpub2 WITH (refr
 ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub1, testpub2 WITH (refresh = false);
 ERROR:  publication "testpub1" is already in subscription "regress_testsub"
 \dRs+
-                                                                                                                        List of subscriptions
-      Name       |           Owner           | Enabled |         Publication         | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           | Skip LSN 
------------------+---------------------------+---------+-----------------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+----------
- regress_testsub | regress_subscription_user | f       | {testpub,testpub1,testpub2} | f      | off       | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/0
+                                                                                                                         List of subscriptions
+      Name       |           Owner           | Enabled |         Publication         | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           |  Skip LSN  
+-----------------+---------------------------+---------+-----------------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+------------
+ regress_testsub | regress_subscription_user | f       | {testpub,testpub1,testpub2} | f      | off       | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/00000000
 (1 row)
 
 -- fail - publication used more than once
@@ -332,10 +332,10 @@ ERROR:  publication "testpub3" is not in subscription "regress_testsub"
 -- ok - delete publications
 ALTER SUBSCRIPTION regress_testsub DROP PUBLICATION testpub1, testpub2 WITH (refresh = false);
 \dRs+
-                                                                                                                List of subscriptions
-      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           | Skip LSN 
------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+----------
- regress_testsub | regress_subscription_user | f       | {testpub}   | f      | off       | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/0
+                                                                                                                 List of subscriptions
+      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           |  Skip LSN  
+-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+------------
+ regress_testsub | regress_subscription_user | f       | {testpub}   | f      | off       | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/00000000
 (1 row)
 
 DROP SUBSCRIPTION regress_testsub;
@@ -371,19 +371,19 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB
 WARNING:  subscription was created, but is not connected
 HINT:  To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription.
 \dRs+
-                                                                                                                List of subscriptions
-      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           | Skip LSN 
------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+----------
- regress_testsub | regress_subscription_user | f       | {testpub}   | f      | parallel  | p                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/0
+                                                                                                                 List of subscriptions
+      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           |  Skip LSN  
+-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+------------
+ regress_testsub | regress_subscription_user | f       | {testpub}   | f      | parallel  | p                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/00000000
 (1 row)
 
 -- we can alter streaming when two_phase enabled
 ALTER SUBSCRIPTION regress_testsub SET (streaming = true);
 \dRs+
-                                                                                                                List of subscriptions
-      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           | Skip LSN 
------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+----------
- regress_testsub | regress_subscription_user | f       | {testpub}   | f      | on        | p                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/0
+                                                                                                                 List of subscriptions
+      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           |  Skip LSN  
+-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+------------
+ regress_testsub | regress_subscription_user | f       | {testpub}   | f      | on        | p                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/00000000
 (1 row)
 
 ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE);
@@ -393,10 +393,10 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB
 WARNING:  subscription was created, but is not connected
 HINT:  To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription.
 \dRs+
-                                                                                                                List of subscriptions
-      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           | Skip LSN 
------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+----------
- regress_testsub | regress_subscription_user | f       | {testpub}   | f      | on        | p                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/0
+                                                                                                                 List of subscriptions
+      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           |  Skip LSN  
+-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+------------
+ regress_testsub | regress_subscription_user | f       | {testpub}   | f      | on        | p                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/00000000
 (1 row)
 
 ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE);
@@ -409,18 +409,18 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB
 WARNING:  subscription was created, but is not connected
 HINT:  To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription.
 \dRs+
-                                                                                                                List of subscriptions
-      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           | Skip LSN 
------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+----------
- regress_testsub | regress_subscription_user | f       | {testpub}   | f      | parallel  | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/0
+                                                                                                                 List of subscriptions
+      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           |  Skip LSN  
+-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+------------
+ regress_testsub | regress_subscription_user | f       | {testpub}   | f      | parallel  | d                | f                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/00000000
 (1 row)
 
 ALTER SUBSCRIPTION regress_testsub SET (disable_on_error = true);
 \dRs+
-                                                                                                                List of subscriptions
-      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           | Skip LSN 
------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+----------
- regress_testsub | regress_subscription_user | f       | {testpub}   | f      | parallel  | d                | t                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/0
+                                                                                                                 List of subscriptions
+      Name       |           Owner           | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit |          Conninfo           |  Skip LSN  
+-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+------------
+ regress_testsub | regress_subscription_user | f       | {testpub}   | f      | parallel  | d                | t                | any    | t                 | f             | f        | off                | dbname=regress_doesnotexist | 0/00000000
 (1 row)
 
 ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE);