(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))));
 }
                    (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))));
 
                    (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",
                    (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)),
                    (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",
                    (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))));
        }
                            (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))));
                }
                    (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,
                    (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,
                    (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,
                        (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))));
            }
                                (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))));
 
                    (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))));
 
                                (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;
                            (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;
                        (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))));
            }
                (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))));
 
                    (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))));
    }
                (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))));
                (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))));
 
                (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))));
 
            (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))));
 }
 
 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');
 
 (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);
 
    {
        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
 
 -- ===================================================================
 -- 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
 
    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 *)
 
    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;
 }
        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))));
    }
 
        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. */
    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);
        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)
        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);
        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);
 
       </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>
 
 
 <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>
 <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>
 <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>
 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.
    <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
 
 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
 
 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
 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
 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
 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>
      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,
 
       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.
       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>
 
 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            |
 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            |
 
 <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
 <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
 
 
 <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>
 
 <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>
 
 
                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);
 
 
    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));
 
    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));
     * 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));
 
    {
        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; "
        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)
    {
        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));
    }
 
        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)
        {
     * 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),
 
        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))));
    }
 
        (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)
            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;
        }
 
        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
    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;
    }
 
        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
    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)));
 
 #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
        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));
 
        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 */
            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);
 
 #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));
     */
    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));
 }
 
 #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),
                        "%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,
                        "%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,
    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 */
        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();
 
    /* 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);
    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;
    }
        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)
 
    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.
    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;
 }
 
 
    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)
 
        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",
    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);
 
 
 #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
 
 
 #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
 
 #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,
 
 #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,
            {
 #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,
            {
 #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,
        {
 #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);
        {
 #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
 
    }
    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;
    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;
    }
        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;
            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;
            }
                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));
    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;
    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;
    }
        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;
        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;
    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;
    }
        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),
        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),
 
        /* 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),
        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),
            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,
            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;
            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;
                     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,
                    (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));
                    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;
                    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;
                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;
                }
        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;
        }
 
 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;
        !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;
                                    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);
            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);
        }
        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;
 
        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;
 
         * 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
            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 */
 
            /*
                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 */
        }
 
         */
        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;
        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
        {
             * 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);
                            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")));
                (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,
        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),
     * 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),
                                 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"),
        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
    {
        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)
        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
                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);
        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,
 
        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));
 
        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;
            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));
    }
 }
        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)));
    }
 
    /*
        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)));
    }
 
    /*
    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);
 
 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));
 
        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 */
 }
        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;
    }
 
        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;
    }
 
                 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)
            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;
        }
 
            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;
                        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. */
                            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);
                        }
    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;
    }
 
 
 
        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));
    }
 
        }
 
        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),
 
    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);
 
 
            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))));
            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))));
            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)),
            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))));
            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))));
        }
 
 
                    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))));
                }
 
 
            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)));
        }
 
                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))));
                                                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))));
        }
            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)));
            }
            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. */
                 * 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)));
            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))));
        }
 
 
        /* 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)));
    /* 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)));
 
                    /* 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)));
                }
 
 
    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
 
         * 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));
 
    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))));
 
    /* 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 */
 
    /* 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,
    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 */
        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));
    }
        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),
 
        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 */
 
        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),
                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)));
        }
    {
        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;
        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)));
                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)));
 
 
        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));
 
        /*
                                    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);
        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;
    }
        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);
    }
        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);
    }
        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."));
    }
 
    /*
    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:
    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));
 
 
 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));
 
    /*
 
    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))));
 
    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))));
 
    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),
    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)));
 }
 
        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;
        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)));
    }
                       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,
                           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,
                           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,
 
            ;
 
 /*
- * 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
                }
            ;
 
-/* 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
                {
 
 {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;
 
                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);
 
    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 */
 
    {
        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);
    }
 
 
    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));
 
        {
            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 */
                        {
                            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;
    {
        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);
    }
        {
            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);
        }
    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),
 
    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)
    {
        {
            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;
                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;
        }
        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 */
        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);
            ReplicationSlotPersist();
    }
 
-   snprintf(xloc, sizeof(xloc), "%X/%X",
+   snprintf(xloc, sizeof(xloc), "%X/%08X",
             LSN_FORMAT_ARGS(MyReplicationSlot->data.confirmed_flush));
 
    dest = CreateDestReceiver(DestRemoteSimple);
        /* 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),
 
        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;
    {
        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);
    }
 
 
    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,
             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,
 
    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);
 }
 
            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;
    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;
         * 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;
 
    {
        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
    if (dry_run)
    {
        suboid = InvalidOid;
-       lsnstr = psprintf("%X/%X", LSN_FORMAT_ARGS((XLogRecPtr) InvalidXLogRecPtr));
+       lsnstr = psprintf("%X/%08X", LSN_FORMAT_ARGS((XLogRecPtr) InvalidXLogRecPtr));
    }
    else
    {
 
 
    /* 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;
     * 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));
 
     * 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);
 
                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;
 
        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);
     * 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 */
                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;
                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:
 
            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);
            }
            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;
    }
 
    *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\"",
 
    /* 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));
        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);
 
    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)
 
            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));
 
    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),
 
           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);
           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"));
 
 
    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;
 
            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));
        }
 
     * 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);
    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;
        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));
        }
 
         * 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);
    }
 
                                   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);
 
 
    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 */
            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));
        }
    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",
 
        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)
        {
 
    {
        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));
 
    }
    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));
 
    /*
                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);
                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);
            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;
        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;
    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));
 
    /*
     */
    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),
        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);
 
 
    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;
 
 /*
  * 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))
 
 
    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
 
 -- 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);
 
 
 -- 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;
 (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;
 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
 (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;
        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)
 
 
 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;
 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);
 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);
 -- 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
 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;
 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
 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;
 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
 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
 -- 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;
 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);
 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);
 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);