Here is an updated patch that just introduces LSN_FORMAT_ARGS(). I think the result is quite pleasant.

--
Peter Eisentraut
2ndQuadrant, an EDB company
https://www.2ndquadrant.com/
From 91d831518c8a71b010bdc835caacaedb20ffb896 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Thu, 18 Feb 2021 13:02:08 +0100
Subject: [PATCH v2] Simplify printing of LSNs

Add a macro LSN_FORMAT_ARGS for use in printf-style printing of LSNs.

Discussion: 
https://www.postgresql.org/message-id/flat/caexhw5ub5natelz3hjuce6amuvqatssxc7o+uk7y4t9rrk2...@mail.gmail.com
---
 contrib/amcheck/verify_nbtree.c               |  57 +++------
 contrib/pageinspect/rawpage.c                 |   3 +-
 src/backend/access/heap/rewriteheap.c         |   6 +-
 src/backend/access/rmgrdesc/replorigindesc.c  |   3 +-
 src/backend/access/rmgrdesc/xactdesc.c        |   3 +-
 src/backend/access/rmgrdesc/xlogdesc.c        |   5 +-
 src/backend/access/transam/timeline.c         |   2 +-
 src/backend/access/transam/twophase.c         |   6 +-
 src/backend/access/transam/xlog.c             | 110 +++++++-----------
 src/backend/access/transam/xlogreader.c       |  58 ++++-----
 src/backend/access/transam/xlogutils.c        |   3 +-
 src/backend/replication/backup_manifest.c     |   4 +-
 src/backend/replication/basebackup.c          |   2 +-
 .../libpqwalreceiver/libpqwalreceiver.c       |   4 +-
 src/backend/replication/logical/logical.c     |  34 +++---
 src/backend/replication/logical/origin.c      |   3 +-
 .../replication/logical/reorderbuffer.c       |   3 +-
 src/backend/replication/logical/snapbuild.c   |  20 ++--
 src/backend/replication/logical/tablesync.c   |   4 +-
 src/backend/replication/logical/worker.c      |   7 +-
 src/backend/replication/slot.c                |   3 +-
 src/backend/replication/slotfuncs.c           |   3 +-
 src/backend/replication/syncrep.c             |   8 +-
 src/backend/replication/walreceiver.c         |  20 ++--
 src/backend/replication/walsender.c           |  32 +++--
 src/backend/storage/ipc/standby.c             |   4 +-
 src/backend/utils/adt/pg_lsn.c                |   8 +-
 src/bin/pg_basebackup/pg_receivewal.c         |   8 +-
 src/bin/pg_basebackup/pg_recvlogical.c        |  13 +--
 src/bin/pg_basebackup/receivelog.c            |   6 +-
 src/bin/pg_controldata/pg_controldata.c       |  18 +--
 src/bin/pg_rewind/parsexlog.c                 |  14 +--
 src/bin/pg_rewind/pg_rewind.c                 |  13 +--
 src/bin/pg_verifybackup/pg_verifybackup.c     |   6 +-
 src/bin/pg_waldump/pg_waldump.c               |  20 ++--
 src/include/access/xlogdefs.h                 |   7 ++
 36 files changed, 212 insertions(+), 308 deletions(-)

diff --git a/contrib/amcheck/verify_nbtree.c b/contrib/amcheck/verify_nbtree.c
index 4db1a64d51..a5a7627839 100644
--- a/contrib/amcheck/verify_nbtree.c
+++ b/contrib/amcheck/verify_nbtree.c
@@ -1078,8 +1078,7 @@ bt_target_page_check(BtreeCheckState *state)
                                                                                
state->targetblock,
                                                                                
BTreeTupleGetNAtts(itup, state->rel),
                                                                                
P_ISLEAF(topaque) ? "heap" : "index",
-                                                                               
(uint32) (state->targetlsn >> 32),
-                                                                               
(uint32) state->targetlsn)));
+                                                                               
LSN_FORMAT_ARGS(state->targetlsn))));
                }
        }
 
@@ -1120,8 +1119,7 @@ bt_target_page_check(BtreeCheckState *state)
                                         errdetail_internal("Index tid=(%u,%u) 
tuple size=%zu lp_len=%u page lsn=%X/%X.",
                                                                                
state->targetblock, offset,
                                                                                
tupsize, ItemIdGetLength(itemid),
-                                                                               
(uint32) (state->targetlsn >> 32),
-                                                                               
(uint32) state->targetlsn),
+                                                                               
LSN_FORMAT_ARGS(state->targetlsn)),
                                         errhint("This could be a torn page 
problem.")));
 
                /* Check the number of index tuple attributes */
@@ -1147,8 +1145,7 @@ bt_target_page_check(BtreeCheckState *state)
                                                                                
BTreeTupleGetNAtts(itup, state->rel),
                                                                                
P_ISLEAF(topaque) ? "heap" : "index",
                                                                                
htid,
-                                                                               
(uint32) (state->targetlsn >> 32),
-                                                                               
(uint32) state->targetlsn)));
+                                                                               
LSN_FORMAT_ARGS(state->targetlsn))));
                }
 
                /*
@@ -1195,8 +1192,7 @@ bt_target_page_check(BtreeCheckState *state)
                                                        
RelationGetRelationName(state->rel)),
                                         errdetail_internal("Index tid=%s 
points to heap tid=%s page lsn=%X/%X.",
                                                                                
itid, htid,
-                                                                               
(uint32) (state->targetlsn >> 32),
-                                                                               
(uint32) state->targetlsn)));
+                                                                               
LSN_FORMAT_ARGS(state->targetlsn))));
                }
 
                /*
@@ -1225,8 +1221,7 @@ bt_target_page_check(BtreeCheckState *state)
                                                                                
         RelationGetRelationName(state->rel)),
                                                         
errdetail_internal("Index tid=%s posting list offset=%d page lsn=%X/%X.",
                                                                                
                itid, i,
-                                                                               
                (uint32) (state->targetlsn >> 32),
-                                                                               
                (uint32) state->targetlsn)));
+                                                                               
                LSN_FORMAT_ARGS(state->targetlsn))));
                                }
 
                                ItemPointerCopy(current, &last);
@@ -1282,8 +1277,7 @@ bt_target_page_check(BtreeCheckState *state)
                                                                                
itid,
                                                                                
P_ISLEAF(topaque) ? "heap" : "index",
                                                                                
htid,
-                                                                               
(uint32) (state->targetlsn >> 32),
-                                                                               
(uint32) state->targetlsn)));
+                                                                               
LSN_FORMAT_ARGS(state->targetlsn))));
                }
 
                /* Fingerprint leaf page tuples (those that point to the heap) 
*/
@@ -1390,8 +1384,7 @@ bt_target_page_check(BtreeCheckState *state)
                                                                                
itid,
                                                                                
P_ISLEAF(topaque) ? "heap" : "index",
                                                                                
htid,
-                                                                               
(uint32) (state->targetlsn >> 32),
-                                                                               
(uint32) state->targetlsn)));
+                                                                               
LSN_FORMAT_ARGS(state->targetlsn))));
                }
                /* Reset, in case scantid was set to (itup) posting tuple's max 
TID */
                skey->scantid = scantid;
@@ -1442,8 +1435,7 @@ bt_target_page_check(BtreeCheckState *state)
                                                                                
nitid,
                                                                                
P_ISLEAF(topaque) ? "heap" : "index",
                                                                                
nhtid,
-                                                                               
(uint32) (state->targetlsn >> 32),
-                                                                               
(uint32) state->targetlsn)));
+                                                                               
LSN_FORMAT_ARGS(state->targetlsn))));
                }
 
                /*
@@ -1500,8 +1492,7 @@ bt_target_page_check(BtreeCheckState *state)
                                                                
RelationGetRelationName(state->rel)),
                                                 errdetail_internal("Last item 
on page tid=(%u,%u) page lsn=%X/%X.",
                                                                                
        state->targetblock, offset,
-                                                                               
        (uint32) (state->targetlsn >> 32),
-                                                                               
        (uint32) state->targetlsn)));
+                                                                               
        LSN_FORMAT_ARGS(state->targetlsn))));
                        }
                }
 
@@ -1907,8 +1898,7 @@ bt_child_highkey_check(BtreeCheckState *state,
                                                        
RelationGetRelationName(state->rel)),
                                         errdetail_internal("Target block=%u 
child block=%u target page lsn=%X/%X.",
                                                                                
state->targetblock, blkno,
-                                                                               
(uint32) (state->targetlsn >> 32),
-                                                                               
(uint32) state->targetlsn)));
+                                                                               
LSN_FORMAT_ARGS(state->targetlsn))));
 
                /* Check level for non-ignorable page */
                if (!P_IGNORE(opaque) && opaque->btpo.level != target_level - 1)
@@ -1993,8 +1983,7 @@ bt_child_highkey_check(BtreeCheckState *state,
                                                                                
RelationGetRelationName(state->rel)),
                                                                 
errdetail_internal("Target block=%u child block=%u target page lsn=%X/%X.",
                                                                                
                        state->targetblock, blkno,
-                                                                               
                        (uint32) (state->targetlsn >> 32),
-                                                                               
                        (uint32) state->targetlsn)));
+                                                                               
                        LSN_FORMAT_ARGS(state->targetlsn))));
                                        pivotkey_offset = P_HIKEY;
                                }
                                itemid = PageGetItemIdCareful(state, 
state->targetblock,
@@ -2024,8 +2013,7 @@ bt_child_highkey_check(BtreeCheckState *state,
                                                                        
RelationGetRelationName(state->rel)),
                                                         
errdetail_internal("Target block=%u child block=%u target page lsn=%X/%X.",
                                                                                
                state->targetblock, blkno,
-                                                                               
                (uint32) (state->targetlsn >> 32),
-                                                                               
                (uint32) state->targetlsn)));
+                                                                               
                LSN_FORMAT_ARGS(state->targetlsn))));
                                itup = state->lowkey;
                        }
 
@@ -2037,8 +2025,7 @@ bt_child_highkey_check(BtreeCheckState *state,
                                                                
RelationGetRelationName(state->rel)),
                                                 errdetail_internal("Target 
block=%u child block=%u target page lsn=%X/%X.",
                                                                                
        state->targetblock, blkno,
-                                                                               
        (uint32) (state->targetlsn >> 32),
-                                                                               
        (uint32) state->targetlsn)));
+                                                                               
        LSN_FORMAT_ARGS(state->targetlsn))));
                        }
                }
 
@@ -2178,8 +2165,7 @@ bt_child_check(BtreeCheckState *state, BTScanInsert 
targetkey,
                                                
RelationGetRelationName(state->rel)),
                                 errdetail_internal("Parent block=%u child 
block=%u parent page lsn=%X/%X.",
                                                                        
state->targetblock, childblock,
-                                                                       
(uint32) (state->targetlsn >> 32),
-                                                                       
(uint32) state->targetlsn)));
+                                                                       
LSN_FORMAT_ARGS(state->targetlsn))));
 
        for (offset = P_FIRSTDATAKEY(copaque);
                 offset <= maxoffset;
@@ -2220,8 +2206,7 @@ bt_child_check(BtreeCheckState *state, BTScanInsert 
targetkey,
                                                        
RelationGetRelationName(state->rel)),
                                         errdetail_internal("Parent block=%u 
child index tid=(%u,%u) parent page lsn=%X/%X.",
                                                                                
state->targetblock, childblock, offset,
-                                                                               
(uint32) (state->targetlsn >> 32),
-                                                                               
(uint32) state->targetlsn)));
+                                                                               
LSN_FORMAT_ARGS(state->targetlsn))));
        }
 
        pfree(child);
@@ -2292,8 +2277,7 @@ bt_downlink_missing_check(BtreeCheckState *state, bool 
rightsplit,
                                 errdetail_internal("Block=%u level=%u left 
sibling=%u page lsn=%X/%X.",
                                                                        blkno, 
opaque->btpo.level,
                                                                        
opaque->btpo_prev,
-                                                                       
(uint32) (pagelsn >> 32),
-                                                                       
(uint32) pagelsn)));
+                                                                       
LSN_FORMAT_ARGS(pagelsn))));
                return;
        }
 
@@ -2314,8 +2298,7 @@ bt_downlink_missing_check(BtreeCheckState *state, bool 
rightsplit,
                                                
RelationGetRelationName(state->rel)),
                                 errdetail_internal("Block=%u page lsn=%X/%X.",
                                                                        blkno,
-                                                                       
(uint32) (pagelsn >> 32),
-                                                                       
(uint32) pagelsn)));
+                                                                       
LSN_FORMAT_ARGS(pagelsn))));
 
        /* Descend from the given page, which is an internal page */
        elog(DEBUG1, "checking for interrupted multi-level deletion due to 
missing downlink in index \"%s\"",
@@ -2381,8 +2364,7 @@ bt_downlink_missing_check(BtreeCheckState *state, bool 
rightsplit,
                                                                 
RelationGetRelationName(state->rel)),
                                 errdetail_internal("Top parent/target block=%u 
leaf block=%u top parent/under check lsn=%X/%X.",
                                                                        blkno, 
childblk,
-                                                                       
(uint32) (pagelsn >> 32),
-                                                                       
(uint32) pagelsn)));
+                                                                       
LSN_FORMAT_ARGS(pagelsn))));
 
        /*
         * Iff leaf page is half-dead, its high key top parent link should point
@@ -2408,8 +2390,7 @@ bt_downlink_missing_check(BtreeCheckState *state, bool 
rightsplit,
                                        RelationGetRelationName(state->rel)),
                         errdetail_internal("Block=%u level=%u page lsn=%X/%X.",
                                                                blkno, 
opaque->btpo.level,
-                                                               (uint32) 
(pagelsn >> 32),
-                                                               (uint32) 
pagelsn)));
+                                                               
LSN_FORMAT_ARGS(pagelsn))));
 }
 
 /*
diff --git a/contrib/pageinspect/rawpage.c b/contrib/pageinspect/rawpage.c
index 9e9ee8a493..7272b21016 100644
--- a/contrib/pageinspect/rawpage.c
+++ b/contrib/pageinspect/rawpage.c
@@ -309,8 +309,7 @@ page_header(PG_FUNCTION_ARGS)
        {
                char            lsnchar[64];
 
-               snprintf(lsnchar, sizeof(lsnchar), "%X/%X",
-                                (uint32) (lsn >> 32), (uint32) lsn);
+               snprintf(lsnchar, sizeof(lsnchar), "%X/%X", 
LSN_FORMAT_ARGS(lsn));
                values[0] = CStringGetTextDatum(lsnchar);
        }
        else
diff --git a/src/backend/access/heap/rewriteheap.c 
b/src/backend/access/heap/rewriteheap.c
index fcaad9ba0b..8241ba8f31 100644
--- a/src/backend/access/heap/rewriteheap.c
+++ b/src/backend/access/heap/rewriteheap.c
@@ -997,8 +997,7 @@ logical_rewrite_log_mapping(RewriteState state, 
TransactionId xid,
                snprintf(path, MAXPGPATH,
                                 "pg_logical/mappings/" LOGICAL_REWRITE_FORMAT,
                                 dboid, relid,
-                                (uint32) (state->rs_begin_lsn >> 32),
-                                (uint32) state->rs_begin_lsn,
+                                LSN_FORMAT_ARGS(state->rs_begin_lsn),
                                 xid, GetCurrentTransactionId());
 
                dlist_init(&src->mappings);
@@ -1120,8 +1119,7 @@ heap_xlog_logical_rewrite(XLogReaderState *r)
        snprintf(path, MAXPGPATH,
                         "pg_logical/mappings/" LOGICAL_REWRITE_FORMAT,
                         xlrec->mapped_db, xlrec->mapped_rel,
-                        (uint32) (xlrec->start_lsn >> 32),
-                        (uint32) xlrec->start_lsn,
+                        LSN_FORMAT_ARGS(xlrec->start_lsn),
                         xlrec->mapped_xid, XLogRecGetXid(r));
 
        fd = OpenTransientFile(path,
diff --git a/src/backend/access/rmgrdesc/replorigindesc.c 
b/src/backend/access/rmgrdesc/replorigindesc.c
index 2e29ecc6d5..1f314c4771 100644
--- a/src/backend/access/rmgrdesc/replorigindesc.c
+++ b/src/backend/access/rmgrdesc/replorigindesc.c
@@ -31,8 +31,7 @@ replorigin_desc(StringInfo buf, XLogReaderState *record)
 
                                appendStringInfo(buf, "set %u; lsn %X/%X; 
force: %d",
                                                                 xlrec->node_id,
-                                                                (uint32) 
(xlrec->remote_lsn >> 32),
-                                                                (uint32) 
xlrec->remote_lsn,
+                                                                
LSN_FORMAT_ARGS(xlrec->remote_lsn),
                                                                 xlrec->force);
                                break;
                        }
diff --git a/src/backend/access/rmgrdesc/xactdesc.c 
b/src/backend/access/rmgrdesc/xactdesc.c
index c6fb1ec572..4b0d10f073 100644
--- a/src/backend/access/rmgrdesc/xactdesc.c
+++ b/src/backend/access/rmgrdesc/xactdesc.c
@@ -306,8 +306,7 @@ xact_desc_commit(StringInfo buf, uint8 info, xl_xact_commit 
*xlrec, RepOriginId
        {
                appendStringInfo(buf, "; origin: node %u, lsn %X/%X, at %s",
                                                 origin_id,
-                                                (uint32) (parsed.origin_lsn >> 
32),
-                                                (uint32) parsed.origin_lsn,
+                                                
LSN_FORMAT_ARGS(parsed.origin_lsn),
                                                 
timestamptz_to_str(parsed.origin_timestamp));
        }
 }
diff --git a/src/backend/access/rmgrdesc/xlogdesc.c 
b/src/backend/access/rmgrdesc/xlogdesc.c
index 92cc7ea073..e6090a9dad 100644
--- a/src/backend/access/rmgrdesc/xlogdesc.c
+++ b/src/backend/access/rmgrdesc/xlogdesc.c
@@ -49,7 +49,7 @@ xlog_desc(StringInfo buf, XLogReaderState *record)
                                                 "oldest xid %u in DB %u; 
oldest multi %u in DB %u; "
                                                 "oldest/newest commit 
timestamp xid: %u/%u; "
                                                 "oldest running xid %u; %s",
-                                                (uint32) (checkpoint->redo >> 
32), (uint32) checkpoint->redo,
+                                                
LSN_FORMAT_ARGS(checkpoint->redo),
                                                 checkpoint->ThisTimeLineID,
                                                 checkpoint->PrevTimeLineID,
                                                 checkpoint->fullPageWrites ? 
"true" : "false",
@@ -89,8 +89,7 @@ xlog_desc(StringInfo buf, XLogReaderState *record)
                XLogRecPtr      startpoint;
 
                memcpy(&startpoint, rec, sizeof(XLogRecPtr));
-               appendStringInfo(buf, "%X/%X",
-                                                (uint32) (startpoint >> 32), 
(uint32) startpoint);
+               appendStringInfo(buf, "%X/%X", LSN_FORMAT_ARGS(startpoint));
        }
        else if (info == XLOG_PARAMETER_CHANGE)
        {
diff --git a/src/backend/access/transam/timeline.c 
b/src/backend/access/transam/timeline.c
index 690471ac4e..8d0903c175 100644
--- a/src/backend/access/transam/timeline.c
+++ b/src/backend/access/transam/timeline.c
@@ -402,7 +402,7 @@ writeTimeLineHistory(TimeLineID newTLI, TimeLineID 
parentTLI,
                         "%s%u\t%X/%X\t%s\n",
                         (srcfd < 0) ? "" : "\n",
                         parentTLI,
-                        (uint32) (switchpoint >> 32), (uint32) (switchpoint),
+                        LSN_FORMAT_ARGS(switchpoint),
                         reason);
 
        nbytes = strlen(buffer);
diff --git a/src/backend/access/transam/twophase.c 
b/src/backend/access/transam/twophase.c
index 70d22577ce..0cae9486f6 100644
--- a/src/backend/access/transam/twophase.c
+++ b/src/backend/access/transam/twophase.c
@@ -1348,16 +1348,14 @@ XlogReadTwoPhaseData(XLogRecPtr lsn, char **buf, int 
*len)
                ereport(ERROR,
                                (errcode_for_file_access(),
                                 errmsg("could not read two-phase state from 
WAL at %X/%X",
-                                               (uint32) (lsn >> 32),
-                                               (uint32) lsn)));
+                                               LSN_FORMAT_ARGS(lsn))));
 
        if (XLogRecGetRmid(xlogreader) != RM_XACT_ID ||
                (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",
-                                               (uint32) (lsn >> 32),
-                                               (uint32) lsn)));
+                                               LSN_FORMAT_ARGS(lsn))));
 
        if (len != NULL)
                *len = XLogRecGetDataLen(xlogreader);
diff --git a/src/backend/access/transam/xlog.c 
b/src/backend/access/transam/xlog.c
index e0c37f73f3..377afb8732 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -1219,8 +1219,7 @@ XLogInsertRecord(XLogRecData *rdata,
                oldCxt = MemoryContextSwitchTo(walDebugCxt);
 
                initStringInfo(&buf);
-               appendStringInfo(&buf, "INSERT @ %X/%X: ",
-                                                (uint32) (EndPos >> 32), 
(uint32) EndPos);
+               appendStringInfo(&buf, "INSERT @ %X/%X: ", 
LSN_FORMAT_ARGS(EndPos));
 
                /*
                 * We have to piece together the WAL record data from the 
XLogRecData
@@ -1821,8 +1820,7 @@ WaitXLogInsertionsToFinish(XLogRecPtr upto)
        {
                ereport(LOG,
                                (errmsg("request to flush past end of generated 
WAL; request %X/%X, current position %X/%X",
-                                               (uint32) (upto >> 32), (uint32) 
upto,
-                                               (uint32) (reservedUpto >> 32), 
(uint32) reservedUpto)));
+                                               LSN_FORMAT_ARGS(upto), 
LSN_FORMAT_ARGS(reservedUpto))));
                upto = reservedUpto;
        }
 
@@ -1973,7 +1971,7 @@ GetXLogBuffer(XLogRecPtr ptr)
 
                if (expectedEndPtr != endptr)
                        elog(PANIC, "could not find WAL buffer for %X/%X",
-                                (uint32) (ptr >> 32), (uint32) ptr);
+                                LSN_FORMAT_ARGS(ptr));
        }
        else
        {
@@ -2290,7 +2288,7 @@ AdvanceXLInsertBuffer(XLogRecPtr upto, bool opportunistic)
        if (XLOG_DEBUG && npages > 0)
        {
                elog(DEBUG1, "initialized %d pages, up to %X/%X",
-                        npages, (uint32) (NewPageEndPtr >> 32), (uint32) 
NewPageEndPtr);
+                        npages, LSN_FORMAT_ARGS(NewPageEndPtr));
        }
 #endif
 }
@@ -2471,9 +2469,8 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible)
 
                if (LogwrtResult.Write >= EndPtr)
                        elog(PANIC, "xlog write request %X/%X is past end of 
log %X/%X",
-                                (uint32) (LogwrtResult.Write >> 32),
-                                (uint32) LogwrtResult.Write,
-                                (uint32) (EndPtr >> 32), (uint32) EndPtr);
+                                LSN_FORMAT_ARGS(LogwrtResult.Write),
+                                LSN_FORMAT_ARGS(EndPtr));
 
                /* Advance LogwrtResult.Write to end of current buffer page */
                LogwrtResult.Write = EndPtr;
@@ -2823,9 +2820,7 @@ UpdateMinRecoveryPoint(XLogRecPtr lsn, bool force)
                if (!force && newMinRecoveryPoint < lsn)
                        elog(WARNING,
                                 "xlog min recovery request %X/%X is past 
current point %X/%X",
-                                (uint32) (lsn >> 32), (uint32) lsn,
-                                (uint32) (newMinRecoveryPoint >> 32),
-                                (uint32) newMinRecoveryPoint);
+                                LSN_FORMAT_ARGS(lsn), 
LSN_FORMAT_ARGS(newMinRecoveryPoint));
 
                /* update control file */
                if (ControlFile->minRecoveryPoint < newMinRecoveryPoint)
@@ -2838,8 +2833,7 @@ UpdateMinRecoveryPoint(XLogRecPtr lsn, bool force)
 
                        ereport(DEBUG2,
                                        (errmsg_internal("updated min recovery 
point to %X/%X on timeline %u",
-                                                       (uint32) 
(minRecoveryPoint >> 32),
-                                                       (uint32) 
minRecoveryPoint,
+                                                       
LSN_FORMAT_ARGS(minRecoveryPoint),
                                                        
newMinRecoveryPointTLI)));
                }
        }
@@ -2878,9 +2872,9 @@ XLogFlush(XLogRecPtr record)
 #ifdef WAL_DEBUG
        if (XLOG_DEBUG)
                elog(LOG, "xlog flush request %X/%X; write %X/%X; flush %X/%X",
-                        (uint32) (record >> 32), (uint32) record,
-                        (uint32) (LogwrtResult.Write >> 32), (uint32) 
LogwrtResult.Write,
-                        (uint32) (LogwrtResult.Flush >> 32), (uint32) 
LogwrtResult.Flush);
+                        LSN_FORMAT_ARGS(record),
+                        LSN_FORMAT_ARGS(LogwrtResult.Write),
+                        LSN_FORMAT_ARGS(LogwrtResult.Flush));
 #endif
 
        START_CRIT_SECTION();
@@ -3013,8 +3007,8 @@ XLogFlush(XLogRecPtr record)
        if (LogwrtResult.Flush < record)
                elog(ERROR,
                         "xlog flush request %X/%X is not satisfied --- flushed 
only to %X/%X",
-                        (uint32) (record >> 32), (uint32) record,
-                        (uint32) (LogwrtResult.Flush >> 32), (uint32) 
LogwrtResult.Flush);
+                        LSN_FORMAT_ARGS(record),
+                        LSN_FORMAT_ARGS(LogwrtResult.Flush));
 }
 
 /*
@@ -3129,10 +3123,10 @@ XLogBackgroundFlush(void)
 #ifdef WAL_DEBUG
        if (XLOG_DEBUG)
                elog(LOG, "xlog bg flush request write %X/%X; flush: %X/%X, 
current is write %X/%X; flush %X/%X",
-                        (uint32) (WriteRqst.Write >> 32), (uint32) 
WriteRqst.Write,
-                        (uint32) (WriteRqst.Flush >> 32), (uint32) 
WriteRqst.Flush,
-                        (uint32) (LogwrtResult.Write >> 32), (uint32) 
LogwrtResult.Write,
-                        (uint32) (LogwrtResult.Flush >> 32), (uint32) 
LogwrtResult.Flush);
+                        LSN_FORMAT_ARGS(WriteRqst.Write),
+                        LSN_FORMAT_ARGS(WriteRqst.Flush),
+                        LSN_FORMAT_ARGS(LogwrtResult.Write),
+                        LSN_FORMAT_ARGS(LogwrtResult.Flush));
 #endif
 
        START_CRIT_SECTION();
@@ -4560,7 +4554,7 @@ rescanLatestTimeLine(void)
                                (errmsg("new timeline %u forked off current 
database system timeline %u before current recovery point %X/%X",
                                                newtarget,
                                                ThisTimeLineID,
-                                               (uint32) (EndRecPtr >> 32), 
(uint32) EndRecPtr)));
+                                               LSN_FORMAT_ARGS(EndRecPtr))));
                return false;
        }
 
@@ -5754,8 +5748,7 @@ recoveryStopsBefore(XLogReaderState *record)
                recoveryStopName[0] = '\0';
                ereport(LOG,
                                (errmsg("recovery stopping before WAL location 
(LSN) \"%X/%X\"",
-                                               (uint32) (recoveryStopLSN >> 
32),
-                                               (uint32) recoveryStopLSN)));
+                                               
LSN_FORMAT_ARGS(recoveryStopLSN))));
                return true;
        }
 
@@ -5918,8 +5911,7 @@ recoveryStopsAfter(XLogReaderState *record)
                recoveryStopName[0] = '\0';
                ereport(LOG,
                                (errmsg("recovery stopping after WAL location 
(LSN) \"%X/%X\"",
-                                               (uint32) (recoveryStopLSN >> 
32),
-                                               (uint32) recoveryStopLSN)));
+                                               
LSN_FORMAT_ARGS(recoveryStopLSN))));
                return true;
        }
 
@@ -6531,8 +6523,7 @@ StartupXLOG(void)
                else if (recoveryTarget == RECOVERY_TARGET_LSN)
                        ereport(LOG,
                                        (errmsg("starting point-in-time 
recovery to WAL location (LSN) \"%X/%X\"",
-                                                       (uint32) 
(recoveryTargetLSN >> 32),
-                                                       (uint32) 
recoveryTargetLSN)));
+                                                       
LSN_FORMAT_ARGS(recoveryTargetLSN))));
                else if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE)
                        ereport(LOG,
                                        (errmsg("starting point-in-time 
recovery to earliest consistent point")));
@@ -6598,7 +6589,7 @@ StartupXLOG(void)
                        wasShutdown = ((record->xl_info & ~XLR_INFO_MASK) == 
XLOG_CHECKPOINT_SHUTDOWN);
                        ereport(DEBUG1,
                                        (errmsg_internal("checkpoint record is 
at %X/%X",
-                                                       (uint32) (checkPointLoc 
>> 32), (uint32) checkPointLoc)));
+                                                                        
LSN_FORMAT_ARGS(checkPointLoc))));
                        InRecovery = true;      /* force recovery even if 
SHUTDOWNED */
 
                        /*
@@ -6731,7 +6722,7 @@ StartupXLOG(void)
                {
                        ereport(DEBUG1,
                                        (errmsg_internal("checkpoint record is 
at %X/%X",
-                                                       (uint32) (checkPointLoc 
>> 32), (uint32) checkPointLoc)));
+                                                                        
LSN_FORMAT_ARGS(checkPointLoc))));
                }
                else
                {
@@ -6783,11 +6774,9 @@ StartupXLOG(void)
                                (errmsg("requested timeline %u is not a child 
of this server's history",
                                                recoveryTargetTLI),
                                 errdetail("Latest checkpoint 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.",
-                                                  (uint32) 
(ControlFile->checkPoint >> 32),
-                                                  (uint32) 
ControlFile->checkPoint,
+                                                  
LSN_FORMAT_ARGS(ControlFile->checkPoint),
                                                   
ControlFile->checkPointCopy.ThisTimeLineID,
-                                                  (uint32) (switchpoint >> 32),
-                                                  (uint32) switchpoint)));
+                                                  
LSN_FORMAT_ARGS(switchpoint))));
        }
 
        /*
@@ -6800,15 +6789,14 @@ StartupXLOG(void)
                ereport(FATAL,
                                (errmsg("requested timeline %u does not contain 
minimum recovery point %X/%X on timeline %u",
                                                recoveryTargetTLI,
-                                               (uint32) 
(ControlFile->minRecoveryPoint >> 32),
-                                               (uint32) 
ControlFile->minRecoveryPoint,
+                                               
LSN_FORMAT_ARGS(ControlFile->minRecoveryPoint),
                                                
ControlFile->minRecoveryPointTLI)));
 
        LastRec = RecPtr = checkPointLoc;
 
        ereport(DEBUG1,
                        (errmsg_internal("redo record is at %X/%X; shutdown %s",
-                                                        (uint32) 
(checkPoint.redo >> 32), (uint32) checkPoint.redo,
+                                                        
LSN_FORMAT_ARGS(checkPoint.redo),
                                                         wasShutdown ? "true" : 
"false")));
        ereport(DEBUG1,
                        (errmsg_internal("next transaction ID: " UINT64_FORMAT 
"; next OID: %u",
@@ -7254,7 +7242,7 @@ StartupXLOG(void)
 
                        ereport(LOG,
                                        (errmsg("redo starts at %X/%X",
-                                                       (uint32) (ReadRecPtr >> 
32), (uint32) ReadRecPtr)));
+                                                       
LSN_FORMAT_ARGS(ReadRecPtr))));
 
                        /*
                         * main redo apply loop
@@ -7272,8 +7260,8 @@ StartupXLOG(void)
 
                                        initStringInfo(&buf);
                                        appendStringInfo(&buf, "REDO @ %X/%X; 
LSN %X/%X: ",
-                                                                        
(uint32) (ReadRecPtr >> 32), (uint32) ReadRecPtr,
-                                                                        
(uint32) (EndRecPtr >> 32), (uint32) EndRecPtr);
+                                                                        
LSN_FORMAT_ARGS(ReadRecPtr),
+                                                                        
LSN_FORMAT_ARGS(EndRecPtr));
                                        xlog_outrec(&buf, xlogreader);
                                        appendStringInfoString(&buf, " - ");
                                        xlog_outdesc(&buf, xlogreader);
@@ -7516,7 +7504,7 @@ StartupXLOG(void)
 
                        ereport(LOG,
                                        (errmsg("redo done at %X/%X system 
usage: %s",
-                                                       (uint32) (ReadRecPtr >> 
32), (uint32) ReadRecPtr,
+                                                       
LSN_FORMAT_ARGS(ReadRecPtr),
                                                        pg_rusage_show(&ru0))));
                        xtime = GetLatestXTime();
                        if (xtime)
@@ -7684,8 +7672,7 @@ StartupXLOG(void)
                        snprintf(reason, sizeof(reason),
                                         "%s LSN %X/%X\n",
                                         recoveryStopAfter ? "after" : "before",
-                                        (uint32) (recoveryStopLSN >> 32),
-                                        (uint32) recoveryStopLSN);
+                                        LSN_FORMAT_ARGS(recoveryStopLSN));
                else if (recoveryTarget == RECOVERY_TARGET_NAME)
                        snprintf(reason, sizeof(reason),
                                         "at restore point \"%s\"",
@@ -8109,8 +8096,7 @@ CheckRecoveryConsistency(void)
                reachedConsistency = true;
                ereport(LOG,
                                (errmsg("consistent recovery state reached at 
%X/%X",
-                                               (uint32) (lastReplayedEndRecPtr 
>> 32),
-                                               (uint32) 
lastReplayedEndRecPtr)));
+                                               
LSN_FORMAT_ARGS(lastReplayedEndRecPtr))));
        }
 
        /*
@@ -9344,8 +9330,7 @@ RecoveryRestartPoint(const CheckPoint *checkPoint)
                elog(trace_recovery(DEBUG2),
                         "could not record restart point at %X/%X because there 
"
                         "are unresolved references to invalid pages",
-                        (uint32) (checkPoint->redo >> 32),
-                        (uint32) checkPoint->redo);
+                        LSN_FORMAT_ARGS(checkPoint->redo));
                return;
        }
 
@@ -9422,8 +9407,7 @@ CreateRestartPoint(int flags)
        {
                ereport(DEBUG2,
                                (errmsg_internal("skipping restartpoint, 
already performed at %X/%X",
-                                               (uint32) (lastCheckPoint.redo 
>> 32),
-                                               (uint32) lastCheckPoint.redo)));
+                                                                
LSN_FORMAT_ARGS(lastCheckPoint.redo))));
 
                UpdateMinRecoveryPoint(InvalidXLogRecPtr, true);
                if (flags & CHECKPOINT_IS_SHUTDOWN)
@@ -9595,7 +9579,7 @@ CreateRestartPoint(int flags)
        xtime = GetLatestXTime();
        ereport((log_checkpoints ? LOG : DEBUG2),
                        (errmsg("recovery restart point at %X/%X",
-                                       (uint32) (lastCheckPoint.redo >> 32), 
(uint32) lastCheckPoint.redo),
+                                       LSN_FORMAT_ARGS(lastCheckPoint.redo)),
                         xtime ? errdetail("Last completed transaction was at 
log time %s.",
                                                           
timestamptz_to_str(xtime)) : 0));
 
@@ -9837,7 +9821,7 @@ XLogRestorePoint(const char *rpName)
 
        ereport(LOG,
                        (errmsg("restore point \"%s\" created at %X/%X",
-                                       rpName, (uint32) (RecPtr >> 32), 
(uint32) RecPtr)));
+                                       rpName, LSN_FORMAT_ARGS(RecPtr))));
 
        return RecPtr;
 }
@@ -10008,8 +9992,7 @@ checkTimeLineSwitch(XLogRecPtr lsn, TimeLineID newTLI, 
TimeLineID prevTLI)
                ereport(PANIC,
                                (errmsg("unexpected timeline ID %u in 
checkpoint record, before reaching minimum recovery point %X/%X on timeline %u",
                                                newTLI,
-                                               (uint32) (minRecoveryPoint >> 
32),
-                                               (uint32) minRecoveryPoint,
+                                               
LSN_FORMAT_ARGS(minRecoveryPoint),
                                                minRecoveryPointTLI)));
 
        /* Looks good */
@@ -10365,8 +10348,7 @@ static void
 xlog_outrec(StringInfo buf, XLogReaderState *record)
 {
        appendStringInfo(buf, "prev %X/%X; xid %u",
-                                        (uint32) (XLogRecGetPrev(record) >> 
32),
-                                        (uint32) XLogRecGetPrev(record),
+                                        
LSN_FORMAT_ARGS(XLogRecGetPrev(record)),
                                         XLogRecGetXid(record));
 
        appendStringInfo(buf, "; len %u",
@@ -10952,9 +10934,9 @@ do_pg_start_backup(const char *backupidstr, bool fast, 
TimeLineID *starttli_p,
                                        "%Y-%m-%d %H:%M:%S %Z",
                                        pg_localtime(&stamp_time, 
log_timezone));
                appendStringInfo(labelfile, "START WAL LOCATION: %X/%X (file 
%s)\n",
-                                                (uint32) (startpoint >> 32), 
(uint32) startpoint, xlogfilename);
+                                                LSN_FORMAT_ARGS(startpoint), 
xlogfilename);
                appendStringInfo(labelfile, "CHECKPOINT LOCATION: %X/%X\n",
-                                                (uint32) (checkpointloc >> 
32), (uint32) checkpointloc);
+                                                
LSN_FORMAT_ARGS(checkpointloc));
                appendStringInfo(labelfile, "BACKUP METHOD: %s\n",
                                                 exclusive ? "pg_start_backup" 
: "streamed");
                appendStringInfo(labelfile, "BACKUP FROM: %s\n",
@@ -11440,9 +11422,9 @@ do_pg_stop_backup(char *labelfile, bool waitforarchive, 
TimeLineID *stoptli_p)
                                         errmsg("could not create file \"%s\": 
%m",
                                                        histfilepath)));
                fprintf(fp, "START WAL LOCATION: %X/%X (file %s)\n",
-                               (uint32) (startpoint >> 32), (uint32) 
startpoint, startxlogfilename);
+                               LSN_FORMAT_ARGS(startpoint), startxlogfilename);
                fprintf(fp, "STOP WAL LOCATION: %X/%X (file %s)\n",
-                               (uint32) (stoppoint >> 32), (uint32) stoppoint, 
stopxlogfilename);
+                               LSN_FORMAT_ARGS(stoppoint), stopxlogfilename);
 
                /*
                 * Transfer remaining lines including label and start timeline 
to
@@ -11895,8 +11877,7 @@ rm_redo_error_callback(void *arg)
 
        /* translator: %s is a WAL record description */
        errcontext("WAL redo at %X/%X for %s",
-                          (uint32) (record->ReadRecPtr >> 32),
-                          (uint32) record->ReadRecPtr,
+                          LSN_FORMAT_ARGS(record->ReadRecPtr),
                           buf.data);
 
        pfree(buf.data);
@@ -12494,8 +12475,7 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool 
randAccess,
 
                                                        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",
-                                                                        
(uint32) (tliRecPtr >> 32),
-                                                                        
(uint32) tliRecPtr,
+                                                                        
LSN_FORMAT_ARGS(tliRecPtr),
                                                                         tli, 
curFileTLI);
                                                }
                                                curFileTLI = tli;
diff --git a/src/backend/access/transam/xlogreader.c 
b/src/backend/access/transam/xlogreader.c
index bb95e0e527..42738eb940 100644
--- a/src/backend/access/transam/xlogreader.c
+++ b/src/backend/access/transam/xlogreader.c
@@ -347,7 +347,7 @@ XLogReadRecord(XLogReaderState *state, char **errormsg)
        else if (targetRecOff < pageHeaderSize)
        {
                report_invalid_record(state, "invalid record offset at %X/%X",
-                                                         (uint32) (RecPtr >> 
32), (uint32) RecPtr);
+                                                         
LSN_FORMAT_ARGS(RecPtr));
                goto err;
        }
 
@@ -355,7 +355,7 @@ XLogReadRecord(XLogReaderState *state, char **errormsg)
                targetRecOff == pageHeaderSize)
        {
                report_invalid_record(state, "contrecord is requested by %X/%X",
-                                                         (uint32) (RecPtr >> 
32), (uint32) RecPtr);
+                                                         
LSN_FORMAT_ARGS(RecPtr));
                goto err;
        }
 
@@ -396,7 +396,7 @@ XLogReadRecord(XLogReaderState *state, char **errormsg)
                {
                        report_invalid_record(state,
                                                                  "invalid 
record length at %X/%X: wanted %u, got %u",
-                                                                 (uint32) 
(RecPtr >> 32), (uint32) RecPtr,
+                                                                 
LSN_FORMAT_ARGS(RecPtr),
                                                                  (uint32) 
SizeOfXLogRecord, total_len);
                        goto err;
                }
@@ -420,8 +420,7 @@ XLogReadRecord(XLogReaderState *state, char **errormsg)
                {
                        /* We treat this as a "bogus data" condition */
                        report_invalid_record(state, "record length %u at %X/%X 
too long",
-                                                                 total_len,
-                                                                 (uint32) 
(RecPtr >> 32), (uint32) RecPtr);
+                                                                 total_len, 
LSN_FORMAT_ARGS(RecPtr));
                        goto err;
                }
 
@@ -452,7 +451,7 @@ XLogReadRecord(XLogReaderState *state, char **errormsg)
                        {
                                report_invalid_record(state,
                                                                          
"there is no contrecord flag at %X/%X",
-                                                                         
(uint32) (RecPtr >> 32), (uint32) RecPtr);
+                                                                         
LSN_FORMAT_ARGS(RecPtr));
                                goto err;
                        }
 
@@ -467,7 +466,7 @@ XLogReadRecord(XLogReaderState *state, char **errormsg)
                                                                          
"invalid contrecord length %u (expected %lld) at %X/%X",
                                                                          
pageHeader->xlp_rem_len,
                                                                          
((long long) total_len) - gotlen,
-                                                                         
(uint32) (RecPtr >> 32), (uint32) RecPtr);
+                                                                         
LSN_FORMAT_ARGS(RecPtr));
                                goto err;
                        }
 
@@ -694,7 +693,7 @@ ValidXLogRecordHeader(XLogReaderState *state, XLogRecPtr 
RecPtr,
        {
                report_invalid_record(state,
                                                          "invalid record 
length at %X/%X: wanted %u, got %u",
-                                                         (uint32) (RecPtr >> 
32), (uint32) RecPtr,
+                                                         
LSN_FORMAT_ARGS(RecPtr),
                                                          (uint32) 
SizeOfXLogRecord, record->xl_tot_len);
                return false;
        }
@@ -702,8 +701,7 @@ ValidXLogRecordHeader(XLogReaderState *state, XLogRecPtr 
RecPtr,
        {
                report_invalid_record(state,
                                                          "invalid resource 
manager ID %u at %X/%X",
-                                                         record->xl_rmid, 
(uint32) (RecPtr >> 32),
-                                                         (uint32) RecPtr);
+                                                         record->xl_rmid, 
LSN_FORMAT_ARGS(RecPtr));
                return false;
        }
        if (randAccess)
@@ -716,9 +714,8 @@ ValidXLogRecordHeader(XLogReaderState *state, XLogRecPtr 
RecPtr,
                {
                        report_invalid_record(state,
                                                                  "record with 
incorrect prev-link %X/%X at %X/%X",
-                                                                 (uint32) 
(record->xl_prev >> 32),
-                                                                 (uint32) 
record->xl_prev,
-                                                                 (uint32) 
(RecPtr >> 32), (uint32) RecPtr);
+                                                                 
LSN_FORMAT_ARGS(record->xl_prev),
+                                                                 
LSN_FORMAT_ARGS(RecPtr));
                        return false;
                }
        }
@@ -733,9 +730,8 @@ ValidXLogRecordHeader(XLogReaderState *state, XLogRecPtr 
RecPtr,
                {
                        report_invalid_record(state,
                                                                  "record with 
incorrect prev-link %X/%X at %X/%X",
-                                                                 (uint32) 
(record->xl_prev >> 32),
-                                                                 (uint32) 
record->xl_prev,
-                                                                 (uint32) 
(RecPtr >> 32), (uint32) RecPtr);
+                                                                 
LSN_FORMAT_ARGS(record->xl_prev),
+                                                                 
LSN_FORMAT_ARGS(RecPtr));
                        return false;
                }
        }
@@ -770,7 +766,7 @@ ValidXLogRecord(XLogReaderState *state, XLogRecord *record, 
XLogRecPtr recptr)
        {
                report_invalid_record(state,
                                                          "incorrect resource 
manager data checksum in record at %X/%X",
-                                                         (uint32) (recptr >> 
32), (uint32) recptr);
+                                                         
LSN_FORMAT_ARGS(recptr));
                return false;
        }
 
@@ -881,7 +877,7 @@ XLogReaderValidatePageHeader(XLogReaderState *state, 
XLogRecPtr recptr,
 
                report_invalid_record(state,
                                                          "unexpected pageaddr 
%X/%X in log segment %s, offset %u",
-                                                         (uint32) 
(hdr->xlp_pageaddr >> 32), (uint32) hdr->xlp_pageaddr,
+                                                         
LSN_FORMAT_ARGS(hdr->xlp_pageaddr),
                                                          fname,
                                                          offset);
                return false;
@@ -1252,8 +1248,7 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord 
*record, char **errormsg)
                                report_invalid_record(state,
                                                                          
"out-of-order block_id %u at %X/%X",
                                                                          
block_id,
-                                                                         
(uint32) (state->ReadRecPtr >> 32),
-                                                                         
(uint32) state->ReadRecPtr);
+                                                                         
LSN_FORMAT_ARGS(state->ReadRecPtr));
                                goto err;
                        }
                        state->max_block_id = block_id;
@@ -1274,7 +1269,7 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord 
*record, char **errormsg)
                        {
                                report_invalid_record(state,
                                                                          
"BKPBLOCK_HAS_DATA set, but no data included at %X/%X",
-                                                                         
(uint32) (state->ReadRecPtr >> 32), (uint32) state->ReadRecPtr);
+                                                                         
LSN_FORMAT_ARGS(state->ReadRecPtr));
                                goto err;
                        }
                        if (!blk->has_data && blk->data_len != 0)
@@ -1282,7 +1277,7 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord 
*record, char **errormsg)
                                report_invalid_record(state,
                                                                          
"BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X",
                                                                          
(unsigned int) blk->data_len,
-                                                                         
(uint32) (state->ReadRecPtr >> 32), (uint32) state->ReadRecPtr);
+                                                                         
LSN_FORMAT_ARGS(state->ReadRecPtr));
                                goto err;
                        }
                        datatotal += blk->data_len;
@@ -1320,7 +1315,7 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord 
*record, char **errormsg)
                                                                                
  (unsigned int) blk->hole_offset,
                                                                                
  (unsigned int) blk->hole_length,
                                                                                
  (unsigned int) blk->bimg_len,
-                                                                               
  (uint32) (state->ReadRecPtr >> 32), (uint32) state->ReadRecPtr);
+                                                                               
  LSN_FORMAT_ARGS(state->ReadRecPtr));
                                        goto err;
                                }
 
@@ -1335,7 +1330,7 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord 
*record, char **errormsg)
                                                                                
  "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X",
                                                                                
  (unsigned int) blk->hole_offset,
                                                                                
  (unsigned int) blk->hole_length,
-                                                                               
  (uint32) (state->ReadRecPtr >> 32), (uint32) state->ReadRecPtr);
+                                                                               
  LSN_FORMAT_ARGS(state->ReadRecPtr));
                                        goto err;
                                }
 
@@ -1349,7 +1344,7 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord 
*record, char **errormsg)
                                        report_invalid_record(state,
                                                                                
  "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X",
                                                                                
  (unsigned int) blk->bimg_len,
-                                                                               
  (uint32) (state->ReadRecPtr >> 32), (uint32) state->ReadRecPtr);
+                                                                               
  LSN_FORMAT_ARGS(state->ReadRecPtr));
                                        goto err;
                                }
 
@@ -1364,7 +1359,7 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord 
*record, char **errormsg)
                                        report_invalid_record(state,
                                                                                
  "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image 
length is %u at %X/%X",
                                                                                
  (unsigned int) blk->data_len,
-                                                                               
  (uint32) (state->ReadRecPtr >> 32), (uint32) state->ReadRecPtr);
+                                                                               
  LSN_FORMAT_ARGS(state->ReadRecPtr));
                                        goto err;
                                }
                        }
@@ -1379,7 +1374,7 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord 
*record, char **errormsg)
                                {
                                        report_invalid_record(state,
                                                                                
  "BKPBLOCK_SAME_REL set but no previous rel at %X/%X",
-                                                                               
  (uint32) (state->ReadRecPtr >> 32), (uint32) state->ReadRecPtr);
+                                                                               
  LSN_FORMAT_ARGS(state->ReadRecPtr));
                                        goto err;
                                }
 
@@ -1391,9 +1386,7 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord 
*record, char **errormsg)
                {
                        report_invalid_record(state,
                                                                  "invalid 
block_id %u at %X/%X",
-                                                                 block_id,
-                                                                 (uint32) 
(state->ReadRecPtr >> 32),
-                                                                 (uint32) 
state->ReadRecPtr);
+                                                                 block_id, 
LSN_FORMAT_ARGS(state->ReadRecPtr));
                        goto err;
                }
        }
@@ -1480,7 +1473,7 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord 
*record, char **errormsg)
 shortdata_err:
        report_invalid_record(state,
                                                  "record with invalid length 
at %X/%X",
-                                                 (uint32) (state->ReadRecPtr 
>> 32), (uint32) state->ReadRecPtr);
+                                                 
LSN_FORMAT_ARGS(state->ReadRecPtr));
 err:
        *errormsg = state->errormsg_buf;
 
@@ -1569,8 +1562,7 @@ RestoreBlockImage(XLogReaderState *record, uint8 
block_id, char *page)
                                                        BLCKSZ - 
bkpb->hole_length, true) < 0)
                {
                        report_invalid_record(record, "invalid compressed image 
at %X/%X, block %d",
-                                                                 (uint32) 
(record->ReadRecPtr >> 32),
-                                                                 (uint32) 
record->ReadRecPtr,
+                                                                 
LSN_FORMAT_ARGS(record->ReadRecPtr),
                                                                  block_id);
                        return false;
                }
diff --git a/src/backend/access/transam/xlogutils.c 
b/src/backend/access/transam/xlogutils.c
index e723253297..a7a473de4a 100644
--- a/src/backend/access/transam/xlogutils.c
+++ b/src/backend/access/transam/xlogutils.c
@@ -776,8 +776,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, 
XLogRecPtr wantPage, uint32 wa
 
                elog(DEBUG3, "switched to timeline %u valid until %X/%X",
                         state->currTLI,
-                        (uint32) (state->currTLIValidUntil >> 32),
-                        (uint32) (state->currTLIValidUntil));
+                        LSN_FORMAT_ARGS(state->currTLIValidUntil));
        }
 }
 
diff --git a/src/backend/replication/backup_manifest.c 
b/src/backend/replication/backup_manifest.c
index 32bb0efb3d..8882444025 100644
--- a/src/backend/replication/backup_manifest.c
+++ b/src/backend/replication/backup_manifest.c
@@ -277,8 +277,8 @@ AddWALInfoToBackupManifest(backup_manifest_info *manifest, 
XLogRecPtr startptr,
                                                 "%s{ \"Timeline\": %u, 
\"Start-LSN\": \"%X/%X\", \"End-LSN\": \"%X/%X\" }",
                                                 first_wal_range ? "" : ",\n",
                                                 entry->tli,
-                                                (uint32) (tl_beginptr >> 32), 
(uint32) tl_beginptr,
-                                                (uint32) (endptr >> 32), 
(uint32) endptr);
+                                                LSN_FORMAT_ARGS(tl_beginptr),
+                                                LSN_FORMAT_ARGS(endptr));
 
                if (starttli == entry->tli)
                {
diff --git a/src/backend/replication/basebackup.c 
b/src/backend/replication/basebackup.c
index 0f54635550..240e902d28 100644
--- a/src/backend/replication/basebackup.c
+++ b/src/backend/replication/basebackup.c
@@ -1075,7 +1075,7 @@ SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli)
        pq_sendint16(&buf, 2);          /* number of columns */
 
        len = snprintf(str, sizeof(str),
-                                  "%X/%X", (uint32) (ptr >> 32), (uint32) ptr);
+                                  "%X/%X", LSN_FORMAT_ARGS(ptr));
        pq_sendint32(&buf, len);
        pq_sendbytes(&buf, str, len);
 
diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c 
b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
index 7714696140..5272eed9ab 100644
--- a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
+++ b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
@@ -406,9 +406,7 @@ libpqrcv_startstreaming(WalReceiverConn *conn,
        if (options->logical)
                appendStringInfoString(&cmd, " LOGICAL");
 
-       appendStringInfo(&cmd, " %X/%X",
-                                        (uint32) (options->startpoint >> 32),
-                                        (uint32) options->startpoint);
+       appendStringInfo(&cmd, " %X/%X", LSN_FORMAT_ARGS(options->startpoint));
 
        /*
         * Additional options are different depending on if we are doing logical
diff --git a/src/backend/replication/logical/logical.c 
b/src/backend/replication/logical/logical.c
index 0977aec711..baeb45ff43 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -514,9 +514,8 @@ CreateDecodingContext(XLogRecPtr start_lsn,
                 * replication.
                 */
                elog(DEBUG1, "cannot stream from %X/%X, minimum is %X/%X, 
forwarding",
-                        (uint32) (start_lsn >> 32), (uint32) start_lsn,
-                        (uint32) (slot->data.confirmed_flush >> 32),
-                        (uint32) slot->data.confirmed_flush);
+                        LSN_FORMAT_ARGS(start_lsn),
+                        LSN_FORMAT_ARGS(slot->data.confirmed_flush));
 
                start_lsn = slot->data.confirmed_flush;
        }
@@ -538,10 +537,8 @@ CreateDecodingContext(XLogRecPtr start_lsn,
                        (errmsg("starting logical decoding for slot \"%s\"",
                                        NameStr(slot->data.name)),
                         errdetail("Streaming transactions committing after 
%X/%X, reading WAL from %X/%X.",
-                                          (uint32) (slot->data.confirmed_flush 
>> 32),
-                                          (uint32) slot->data.confirmed_flush,
-                                          (uint32) (slot->data.restart_lsn >> 
32),
-                                          (uint32) slot->data.restart_lsn)));
+                                          
LSN_FORMAT_ARGS(slot->data.confirmed_flush),
+                                          
LSN_FORMAT_ARGS(slot->data.restart_lsn))));
 
        return ctx;
 }
@@ -567,8 +564,7 @@ DecodingContextFindStartpoint(LogicalDecodingContext *ctx)
        XLogBeginRead(ctx->reader, slot->data.restart_lsn);
 
        elog(DEBUG1, "searching for logical decoding starting point, starting 
at %X/%X",
-                (uint32) (slot->data.restart_lsn >> 32),
-                (uint32) slot->data.restart_lsn);
+                LSN_FORMAT_ARGS(slot->data.restart_lsn));
 
        /* Wait for a consistent starting point */
        for (;;)
@@ -688,8 +684,7 @@ output_plugin_error_callback(void *arg)
                                   NameStr(state->ctx->slot->data.name),
                                   NameStr(state->ctx->slot->data.plugin),
                                   state->callback_name,
-                                  (uint32) (state->report_location >> 32),
-                                  (uint32) state->report_location);
+                                  LSN_FORMAT_ARGS(state->report_location));
        else
                errcontext("slot \"%s\", output plugin \"%s\", in the %s 
callback",
                                   NameStr(state->ctx->slot->data.name),
@@ -1623,8 +1618,8 @@ LogicalIncreaseRestartDecodingForSlot(XLogRecPtr 
current_lsn, XLogRecPtr restart
                SpinLockRelease(&slot->mutex);
 
                elog(DEBUG1, "got new restart lsn %X/%X at %X/%X",
-                        (uint32) (restart_lsn >> 32), (uint32) restart_lsn,
-                        (uint32) (current_lsn >> 32), (uint32) current_lsn);
+                        LSN_FORMAT_ARGS(restart_lsn),
+                        LSN_FORMAT_ARGS(current_lsn));
        }
        else
        {
@@ -1638,14 +1633,11 @@ LogicalIncreaseRestartDecodingForSlot(XLogRecPtr 
current_lsn, XLogRecPtr restart
                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",
-                        (uint32) (restart_lsn >> 32), (uint32) restart_lsn,
-                        (uint32) (current_lsn >> 32), (uint32) current_lsn,
-                        (uint32) (candidate_restart_lsn >> 32),
-                        (uint32) candidate_restart_lsn,
-                        (uint32) (candidate_restart_valid >> 32),
-                        (uint32) candidate_restart_valid,
-                        (uint32) (confirmed_flush >> 32),
-                        (uint32) confirmed_flush);
+                        LSN_FORMAT_ARGS(restart_lsn),
+                        LSN_FORMAT_ARGS(current_lsn),
+                        LSN_FORMAT_ARGS(candidate_restart_lsn),
+                        LSN_FORMAT_ARGS(candidate_restart_valid),
+                        LSN_FORMAT_ARGS(confirmed_flush));
        }
 
        /* candidates are already valid with the current flush position, apply 
*/
diff --git a/src/backend/replication/logical/origin.c 
b/src/backend/replication/logical/origin.c
index 685eaa6134..39471fddad 100644
--- a/src/backend/replication/logical/origin.c
+++ b/src/backend/replication/logical/origin.c
@@ -789,8 +789,7 @@ StartupReplicationOrigin(void)
                ereport(LOG,
                                (errmsg("recovered replication state of node %u 
to %X/%X",
                                                disk_state.roident,
-                                               (uint32) (disk_state.remote_lsn 
>> 32),
-                                               (uint32) 
disk_state.remote_lsn)));
+                                               
LSN_FORMAT_ARGS(disk_state.remote_lsn))));
        }
 
        /* now check checksum */
diff --git a/src/backend/replication/logical/reorderbuffer.c 
b/src/backend/replication/logical/reorderbuffer.c
index 5a62ab8bbc..c742e1d970 100644
--- a/src/backend/replication/logical/reorderbuffer.c
+++ b/src/backend/replication/logical/reorderbuffer.c
@@ -4366,8 +4366,7 @@ ReorderBufferSerializedPath(char *path, ReplicationSlot 
*slot, TransactionId xid
 
        snprintf(path, MAXPGPATH, "pg_replslot/%s/xid-%u-lsn-%X-%X.spill",
                         NameStr(MyReplicationSlot->data.name),
-                        xid,
-                        (uint32) (recptr >> 32), (uint32) recptr);
+                        xid, LSN_FORMAT_ARGS(recptr));
 }
 
 /*
diff --git a/src/backend/replication/logical/snapbuild.c 
b/src/backend/replication/logical/snapbuild.c
index 752cf2d7db..e11788795f 100644
--- a/src/backend/replication/logical/snapbuild.c
+++ b/src/backend/replication/logical/snapbuild.c
@@ -801,7 +801,7 @@ SnapBuildDistributeNewCatalogSnapshot(SnapBuild *builder, 
XLogRecPtr lsn)
                        continue;
 
                elog(DEBUG2, "adding a new snapshot to %u at %X/%X",
-                        txn->xid, (uint32) (lsn >> 32), (uint32) lsn);
+                        txn->xid, LSN_FORMAT_ARGS(lsn));
 
                /*
                 * increase the snapshot's refcount for the transaction we are 
handing
@@ -1191,7 +1191,7 @@ SnapBuildFindSnapshot(SnapBuild *builder, XLogRecPtr lsn, 
xl_running_xacts *runn
        {
                ereport(DEBUG1,
                                (errmsg_internal("skipping snapshot at %X/%X 
while building logical decoding snapshot, xmin horizon too low",
-                                                                (uint32) (lsn 
>> 32), (uint32) lsn),
+                                                                
LSN_FORMAT_ARGS(lsn)),
                                 errdetail_internal("initial xmin horizon of %u 
vs the snapshot's %u",
                                                                        
builder->initial_xmin_horizon, running->oldestRunningXid)));
 
@@ -1230,7 +1230,7 @@ SnapBuildFindSnapshot(SnapBuild *builder, XLogRecPtr lsn, 
xl_running_xacts *runn
 
                ereport(LOG,
                                (errmsg("logical decoding found consistent 
point at %X/%X",
-                                               (uint32) (lsn >> 32), (uint32) 
lsn),
+                                               LSN_FORMAT_ARGS(lsn)),
                                 errdetail("There are no running 
transactions.")));
 
                return false;
@@ -1274,7 +1274,7 @@ SnapBuildFindSnapshot(SnapBuild *builder, XLogRecPtr lsn, 
xl_running_xacts *runn
 
                ereport(LOG,
                                (errmsg("logical decoding found initial 
starting point at %X/%X",
-                                               (uint32) (lsn >> 32), (uint32) 
lsn),
+                                               LSN_FORMAT_ARGS(lsn)),
                                 errdetail("Waiting for transactions 
(approximately %d) older than %u to end.",
                                                   running->xcnt, 
running->nextXid)));
 
@@ -1298,7 +1298,7 @@ SnapBuildFindSnapshot(SnapBuild *builder, XLogRecPtr lsn, 
xl_running_xacts *runn
 
                ereport(LOG,
                                (errmsg("logical decoding found initial 
consistent point at %X/%X",
-                                               (uint32) (lsn >> 32), (uint32) 
lsn),
+                                               LSN_FORMAT_ARGS(lsn)),
                                 errdetail("Waiting for transactions 
(approximately %d) older than %u to end.",
                                                   running->xcnt, 
running->nextXid)));
 
@@ -1323,7 +1323,7 @@ SnapBuildFindSnapshot(SnapBuild *builder, XLogRecPtr lsn, 
xl_running_xacts *runn
 
                ereport(LOG,
                                (errmsg("logical decoding found consistent 
point at %X/%X",
-                                               (uint32) (lsn >> 32), (uint32) 
lsn),
+                                               LSN_FORMAT_ARGS(lsn)),
                                 errdetail("There are no old transactions 
anymore.")));
        }
 
@@ -1477,7 +1477,7 @@ SnapBuildSerialize(SnapBuild *builder, XLogRecPtr lsn)
         * no hope continuing to decode anyway.
         */
        sprintf(path, "pg_logical/snapshots/%X-%X.snap",
-                       (uint32) (lsn >> 32), (uint32) lsn);
+                       LSN_FORMAT_ARGS(lsn));
 
        /*
         * first check whether some other backend already has written the 
snapshot
@@ -1520,7 +1520,7 @@ SnapBuildSerialize(SnapBuild *builder, XLogRecPtr lsn)
 
        /* to make sure only we will write to this tempfile, include pid */
        sprintf(tmppath, "pg_logical/snapshots/%X-%X.snap.%u.tmp",
-                       (uint32) (lsn >> 32), (uint32) lsn, MyProcPid);
+                       LSN_FORMAT_ARGS(lsn), MyProcPid);
 
        /*
         * Unlink temporary file if it already exists, needs to have been 
before a
@@ -1670,7 +1670,7 @@ SnapBuildRestore(SnapBuild *builder, XLogRecPtr lsn)
                return false;
 
        sprintf(path, "pg_logical/snapshots/%X-%X.snap",
-                       (uint32) (lsn >> 32), (uint32) lsn);
+                       LSN_FORMAT_ARGS(lsn));
 
        fd = OpenTransientFile(path, O_RDONLY | PG_BINARY);
 
@@ -1854,7 +1854,7 @@ SnapBuildRestore(SnapBuild *builder, XLogRecPtr lsn)
 
        ereport(LOG,
                        (errmsg("logical decoding found consistent point at 
%X/%X",
-                                       (uint32) (lsn >> 32), (uint32) lsn),
+                                       LSN_FORMAT_ARGS(lsn)),
                         errdetail("Logical decoding will begin using saved 
snapshot.")));
        return true;
 
diff --git a/src/backend/replication/logical/tablesync.c 
b/src/backend/replication/logical/tablesync.c
index 24a6ce5d8e..feb634e7ac 100644
--- a/src/backend/replication/logical/tablesync.c
+++ b/src/backend/replication/logical/tablesync.c
@@ -1120,9 +1120,7 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos)
 
        elog(DEBUG1,
                 "LogicalRepSyncTableStart: '%s' origin_startpos lsn %X/%X",
-                originname,
-                (uint32) (*origin_startpos >> 32),
-                (uint32) *origin_startpos);
+                originname, LSN_FORMAT_ARGS(*origin_startpos));
 
        /*
         * We are done with the initial data synchronization, update the state.
diff --git a/src/backend/replication/logical/worker.c 
b/src/backend/replication/logical/worker.c
index cfc924cd89..18d05286b6 100644
--- a/src/backend/replication/logical/worker.c
+++ b/src/backend/replication/logical/worker.c
@@ -2359,10 +2359,9 @@ send_feedback(XLogRecPtr recvpos, bool force, bool 
requestReply)
 
        elog(DEBUG2, "sending feedback (force %d) to recv %X/%X, write %X/%X, 
flush %X/%X",
                 force,
-                (uint32) (recvpos >> 32), (uint32) recvpos,
-                (uint32) (writepos >> 32), (uint32) writepos,
-                (uint32) (flushpos >> 32), (uint32) flushpos
-               );
+                LSN_FORMAT_ARGS(recvpos),
+                LSN_FORMAT_ARGS(writepos),
+                LSN_FORMAT_ARGS(flushpos));
 
        walrcv_send(wrconn, reply_message->data, reply_message->len);
 
diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index e00c7ffc01..fb4af2ef52 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -1242,8 +1242,7 @@ InvalidateObsoleteReplicationSlots(XLogSegNo oldestSegno)
                ereport(LOG,
                                (errmsg("invalidating slot \"%s\" because its 
restart_lsn %X/%X exceeds max_slot_wal_keep_size",
                                                NameStr(slotname),
-                                               (uint32) (restart_lsn >> 32),
-                                               (uint32) restart_lsn)));
+                                               LSN_FORMAT_ARGS(restart_lsn))));
 
                SpinLockAcquire(&s->mutex);
                s->data.invalidated_at = s->data.restart_lsn;
diff --git a/src/backend/replication/slotfuncs.c 
b/src/backend/replication/slotfuncs.c
index 057f41046d..d24bb5b0b5 100644
--- a/src/backend/replication/slotfuncs.c
+++ b/src/backend/replication/slotfuncs.c
@@ -659,8 +659,7 @@ pg_replication_slot_advance(PG_FUNCTION_ARGS)
                ereport(ERROR,
                                
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
                                 errmsg("cannot advance replication slot to 
%X/%X, minimum is %X/%X",
-                                               (uint32) (moveto >> 32), 
(uint32) moveto,
-                                               (uint32) (minlsn >> 32), 
(uint32) minlsn)));
+                                               LSN_FORMAT_ARGS(moveto), 
LSN_FORMAT_ARGS(minlsn))));
 
        /* Do the actual slot update, depending on the slot type */
        if (OidIsValid(MyReplicationSlot->data.database))
diff --git a/src/backend/replication/syncrep.c 
b/src/backend/replication/syncrep.c
index f765002e0d..7fa1a87cd8 100644
--- a/src/backend/replication/syncrep.c
+++ b/src/backend/replication/syncrep.c
@@ -222,7 +222,7 @@ SyncRepWaitForLSN(XLogRecPtr lsn, bool commit)
                new_status = (char *) palloc(len + 32 + 1);
                memcpy(new_status, old_status, len);
                sprintf(new_status + len, " waiting for %X/%X",
-                               (uint32) (lsn >> 32), (uint32) lsn);
+                               LSN_FORMAT_ARGS(lsn));
                set_ps_display(new_status);
                new_status[len] = '\0'; /* truncate off " waiting ..." */
        }
@@ -534,9 +534,9 @@ SyncRepReleaseWaiters(void)
        LWLockRelease(SyncRepLock);
 
        elog(DEBUG3, "released %d procs up to write %X/%X, %d procs up to flush 
%X/%X, %d procs up to apply %X/%X",
-                numwrite, (uint32) (writePtr >> 32), (uint32) writePtr,
-                numflush, (uint32) (flushPtr >> 32), (uint32) flushPtr,
-                numapply, (uint32) (applyPtr >> 32), (uint32) applyPtr);
+                numwrite, LSN_FORMAT_ARGS(writePtr),
+                numflush, LSN_FORMAT_ARGS(flushPtr),
+                numapply, LSN_FORMAT_ARGS(applyPtr));
 }
 
 /*
diff --git a/src/backend/replication/walreceiver.c 
b/src/backend/replication/walreceiver.c
index 723f513d8b..208611056a 100644
--- a/src/backend/replication/walreceiver.c
+++ b/src/backend/replication/walreceiver.c
@@ -392,13 +392,11 @@ WalReceiverMain(void)
                        if (first_stream)
                                ereport(LOG,
                                                (errmsg("started streaming WAL 
from primary at %X/%X on timeline %u",
-                                                               (uint32) 
(startpoint >> 32), (uint32) startpoint,
-                                                               
startpointTLI)));
+                                                               
LSN_FORMAT_ARGS(startpoint), startpointTLI)));
                        else
                                ereport(LOG,
                                                (errmsg("restarted WAL 
streaming at %X/%X on timeline %u",
-                                                               (uint32) 
(startpoint >> 32), (uint32) startpoint,
-                                                               
startpointTLI)));
+                                                               
LSN_FORMAT_ARGS(startpoint), startpointTLI)));
                        first_stream = false;
 
                        /* Initialize LogstreamResult and buffers for 
processing messages */
@@ -465,7 +463,7 @@ WalReceiverMain(void)
                                                                        
(errmsg("replication terminated by primary server"),
                                                                         
errdetail("End of WAL reached on timeline %u at %X/%X.",
                                                                                
           startpointTLI,
-                                                                               
           (uint32) (LogstreamResult.Write >> 32), (uint32) 
LogstreamResult.Write)));
+                                                                               
           LSN_FORMAT_ARGS(LogstreamResult.Write))));
                                                        endofwal = true;
                                                        break;
                                                }
@@ -699,8 +697,7 @@ WalRcvWaitForStartPosition(XLogRecPtr *startpoint, 
TimeLineID *startpointTLI)
                char            activitymsg[50];
 
                snprintf(activitymsg, sizeof(activitymsg), "restarting at 
%X/%X",
-                                (uint32) (*startpoint >> 32),
-                                (uint32) *startpoint);
+                                LSN_FORMAT_ARGS(*startpoint));
                set_ps_display(activitymsg);
        }
 }
@@ -1002,8 +999,7 @@ XLogWalRcvFlush(bool dying)
                        char            activitymsg[50];
 
                        snprintf(activitymsg, sizeof(activitymsg), "streaming 
%X/%X",
-                                        (uint32) (LogstreamResult.Write >> 32),
-                                        (uint32) LogstreamResult.Write);
+                                        
LSN_FORMAT_ARGS(LogstreamResult.Write));
                        set_ps_display(activitymsg);
                }
 
@@ -1080,9 +1076,9 @@ XLogWalRcvSendReply(bool force, bool requestReply)
 
        /* Send it */
        elog(DEBUG2, "sending write %X/%X flush %X/%X apply %X/%X%s",
-                (uint32) (writePtr >> 32), (uint32) writePtr,
-                (uint32) (flushPtr >> 32), (uint32) flushPtr,
-                (uint32) (applyPtr >> 32), (uint32) applyPtr,
+                LSN_FORMAT_ARGS(writePtr),
+                LSN_FORMAT_ARGS(flushPtr),
+                LSN_FORMAT_ARGS(applyPtr),
                 requestReply ? " (reply requested)" : "");
 
        walrcv_send(wrconn, reply_message.data, reply_message.len);
diff --git a/src/backend/replication/walsender.c 
b/src/backend/replication/walsender.c
index 64167fe3a6..81244541e2 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -402,7 +402,7 @@ IdentifySystem(void)
        else
                logptr = GetFlushRecPtr();
 
-       snprintf(xloc, sizeof(xloc), "%X/%X", (uint32) (logptr >> 32), (uint32) 
logptr);
+       snprintf(xloc, sizeof(xloc), "%X/%X", LSN_FORMAT_ARGS(logptr));
 
        if (MyDatabaseId != InvalidOid)
        {
@@ -674,13 +674,11 @@ StartReplication(StartReplicationCmd *cmd)
                        {
                                ereport(ERROR,
                                                (errmsg("requested starting 
point %X/%X on timeline %u is not in this server's history",
-                                                               (uint32) 
(cmd->startpoint >> 32),
-                                                               (uint32) 
(cmd->startpoint),
+                                                               
LSN_FORMAT_ARGS(cmd->startpoint),
                                                                cmd->timeline),
                                                 errdetail("This server's 
history forked from timeline %u at %X/%X.",
                                                                   
cmd->timeline,
-                                                                  (uint32) 
(switchpoint >> 32),
-                                                                  (uint32) 
(switchpoint))));
+                                                                  
LSN_FORMAT_ARGS(switchpoint))));
                        }
                        sendTimeLineValidUpto = switchpoint;
                }
@@ -723,10 +721,8 @@ StartReplication(StartReplicationCmd *cmd)
                {
                        ereport(ERROR,
                                        (errmsg("requested starting point %X/%X 
is ahead of the WAL flush position of this server %X/%X",
-                                                       (uint32) 
(cmd->startpoint >> 32),
-                                                       (uint32) 
(cmd->startpoint),
-                                                       (uint32) (FlushPtr >> 
32),
-                                                       (uint32) (FlushPtr))));
+                                                       
LSN_FORMAT_ARGS(cmd->startpoint),
+                                                       
LSN_FORMAT_ARGS(FlushPtr))));
                }
 
                /* Start streaming from the requested point */
@@ -769,8 +765,7 @@ StartReplication(StartReplicationCmd *cmd)
                bool            nulls[2];
 
                snprintf(startpos_str, sizeof(startpos_str), "%X/%X",
-                                (uint32) (sendTimeLineValidUpto >> 32),
-                                (uint32) sendTimeLineValidUpto);
+                                LSN_FORMAT_ARGS(sendTimeLineValidUpto));
 
                dest = CreateDestReceiver(DestRemoteSimple);
                MemSet(nulls, false, sizeof(nulls));
@@ -1063,8 +1058,7 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd)
        }
 
        snprintf(xloc, sizeof(xloc), "%X/%X",
-                        (uint32) (MyReplicationSlot->data.confirmed_flush >> 
32),
-                        (uint32) MyReplicationSlot->data.confirmed_flush);
+                        
LSN_FORMAT_ARGS(MyReplicationSlot->data.confirmed_flush));
 
        dest = CreateDestReceiver(DestRemoteSimple);
        MemSet(nulls, false, sizeof(nulls));
@@ -1900,9 +1894,9 @@ ProcessStandbyReplyMessage(void)
                replyTimeStr = pstrdup(timestamptz_to_str(replyTime));
 
                elog(DEBUG2, "write %X/%X flush %X/%X apply %X/%X%s reply_time 
%s",
-                        (uint32) (writePtr >> 32), (uint32) writePtr,
-                        (uint32) (flushPtr >> 32), (uint32) flushPtr,
-                        (uint32) (applyPtr >> 32), (uint32) applyPtr,
+                        LSN_FORMAT_ARGS(writePtr),
+                        LSN_FORMAT_ARGS(flushPtr),
+                        LSN_FORMAT_ARGS(applyPtr),
                         replyRequested ? " (reply requested)" : "",
                         replyTimeStr);
 
@@ -2694,8 +2688,8 @@ XLogSendPhysical(void)
                WalSndCaughtUp = true;
 
                elog(DEBUG1, "walsender reached end of timeline at %X/%X (sent 
up to %X/%X)",
-                        (uint32) (sendTimeLineValidUpto >> 32), (uint32) 
sendTimeLineValidUpto,
-                        (uint32) (sentPtr >> 32), (uint32) sentPtr);
+                        LSN_FORMAT_ARGS(sendTimeLineValidUpto),
+                        LSN_FORMAT_ARGS(sentPtr));
                return;
        }
 
@@ -2826,7 +2820,7 @@ XLogSendPhysical(void)
                char            activitymsg[50];
 
                snprintf(activitymsg, sizeof(activitymsg), "streaming %X/%X",
-                                (uint32) (sentPtr >> 32), (uint32) sentPtr);
+                                LSN_FORMAT_ARGS(sentPtr));
                set_ps_display(activitymsg);
        }
 }
diff --git a/src/backend/storage/ipc/standby.c 
b/src/backend/storage/ipc/standby.c
index 5877a60715..a3ee652030 100644
--- a/src/backend/storage/ipc/standby.c
+++ b/src/backend/storage/ipc/standby.c
@@ -1262,7 +1262,7 @@ LogCurrentRunningXacts(RunningTransactions 
CurrRunningXacts)
                elog(trace_recovery(DEBUG2),
                         "snapshot of %u running transactions overflowed (lsn 
%X/%X oldest xid %u latest complete %u next xid %u)",
                         CurrRunningXacts->xcnt,
-                        (uint32) (recptr >> 32), (uint32) recptr,
+                        LSN_FORMAT_ARGS(recptr),
                         CurrRunningXacts->oldestRunningXid,
                         CurrRunningXacts->latestCompletedXid,
                         CurrRunningXacts->nextXid);
@@ -1270,7 +1270,7 @@ LogCurrentRunningXacts(RunningTransactions 
CurrRunningXacts)
                elog(trace_recovery(DEBUG2),
                         "snapshot of %u+%u running transaction ids (lsn %X/%X 
oldest xid %u latest complete %u next xid %u)",
                         CurrRunningXacts->xcnt, CurrRunningXacts->subxcnt,
-                        (uint32) (recptr >> 32), (uint32) recptr,
+                        LSN_FORMAT_ARGS(recptr),
                         CurrRunningXacts->oldestRunningXid,
                         CurrRunningXacts->latestCompletedXid,
                         CurrRunningXacts->nextXid);
diff --git a/src/backend/utils/adt/pg_lsn.c b/src/backend/utils/adt/pg_lsn.c
index 12ad0c4c31..b41dfe9eb0 100644
--- a/src/backend/utils/adt/pg_lsn.c
+++ b/src/backend/utils/adt/pg_lsn.c
@@ -83,14 +83,8 @@ pg_lsn_out(PG_FUNCTION_ARGS)
        XLogRecPtr      lsn = PG_GETARG_LSN(0);
        char            buf[MAXPG_LSNLEN + 1];
        char       *result;
-       uint32          id,
-                               off;
-
-       /* Decode ID and offset */
-       id = (uint32) (lsn >> 32);
-       off = (uint32) lsn;
 
-       snprintf(buf, sizeof buf, "%X/%X", id, off);
+       snprintf(buf, sizeof buf, "%X/%X", LSN_FORMAT_ARGS(lsn));
        result = pstrdup(buf);
        PG_RETURN_CSTRING(result);
 }
diff --git a/src/bin/pg_basebackup/pg_receivewal.c 
b/src/bin/pg_basebackup/pg_receivewal.c
index 4122d84094..0d15012c29 100644
--- a/src/bin/pg_basebackup/pg_receivewal.c
+++ b/src/bin/pg_basebackup/pg_receivewal.c
@@ -115,14 +115,14 @@ stop_streaming(XLogRecPtr xlogpos, uint32 timeline, bool 
segment_finished)
        /* we assume that we get called once at the end of each segment */
        if (verbose && segment_finished)
                pg_log_info("finished segment at %X/%X (timeline %u)",
-                                       (uint32) (xlogpos >> 32), (uint32) 
xlogpos,
+                                       LSN_FORMAT_ARGS(xlogpos),
                                        timeline);
 
        if (!XLogRecPtrIsInvalid(endpos) && endpos < xlogpos)
        {
                if (verbose)
                        pg_log_info("stopped log streaming at %X/%X (timeline 
%u)",
-                                               (uint32) (xlogpos >> 32), 
(uint32) xlogpos,
+                                               LSN_FORMAT_ARGS(xlogpos),
                                                timeline);
                time_to_stop = true;
                return true;
@@ -139,7 +139,7 @@ stop_streaming(XLogRecPtr xlogpos, uint32 timeline, bool 
segment_finished)
        if (verbose && prevtimeline != 0 && prevtimeline != timeline)
                pg_log_info("switched to timeline %u at %X/%X",
                                        timeline,
-                                       (uint32) (prevpos >> 32), (uint32) 
prevpos);
+                                       LSN_FORMAT_ARGS(prevpos));
 
        prevtimeline = timeline;
        prevpos = xlogpos;
@@ -420,7 +420,7 @@ StreamLog(void)
         */
        if (verbose)
                pg_log_info("starting log streaming at %X/%X (timeline %u)",
-                                       (uint32) (stream.startpos >> 32), 
(uint32) stream.startpos,
+                                       LSN_FORMAT_ARGS(stream.startpos),
                                        stream.timeline);
 
        stream.stream_stop = stop_streaming;
diff --git a/src/bin/pg_basebackup/pg_recvlogical.c 
b/src/bin/pg_basebackup/pg_recvlogical.c
index 553ba7b8f4..bf0246c426 100644
--- a/src/bin/pg_basebackup/pg_recvlogical.c
+++ b/src/bin/pg_basebackup/pg_recvlogical.c
@@ -131,8 +131,8 @@ sendFeedback(PGconn *conn, TimestampTz now, bool force, 
bool replyRequested)
 
        if (verbose)
                pg_log_info("confirming write up to %X/%X, flush to %X/%X (slot 
%s)",
-                                       (uint32) (output_written_lsn >> 32), 
(uint32) output_written_lsn,
-                                       (uint32) (output_fsync_lsn >> 32), 
(uint32) output_fsync_lsn,
+                                       LSN_FORMAT_ARGS(output_written_lsn),
+                                       LSN_FORMAT_ARGS(output_fsync_lsn),
                                        replication_slot);
 
        replybuf[len] = 'r';
@@ -228,12 +228,12 @@ StreamLogicalLog(void)
         */
        if (verbose)
                pg_log_info("starting log streaming at %X/%X (slot %s)",
-                                       (uint32) (startpos >> 32), (uint32) 
startpos,
+                                       LSN_FORMAT_ARGS(startpos),
                                        replication_slot);
 
        /* Initiate the replication stream at specified location */
        appendPQExpBuffer(query, "START_REPLICATION SLOT \"%s\" LOGICAL %X/%X",
-                                         replication_slot, (uint32) (startpos 
>> 32), (uint32) startpos);
+                                         replication_slot, 
LSN_FORMAT_ARGS(startpos));
 
        /* print options if there are any */
        if (noptions)
@@ -1045,10 +1045,9 @@ prepareToTerminate(PGconn *conn, XLogRecPtr endpos, bool 
keepalive, XLogRecPtr l
        {
                if (keepalive)
                        pg_log_info("end position %X/%X reached by keepalive",
-                                               (uint32) (endpos >> 32), 
(uint32) endpos);
+                                               LSN_FORMAT_ARGS(endpos));
                else
                        pg_log_info("end position %X/%X reached by WAL record 
at %X/%X",
-                                               (uint32) (endpos >> 32), 
(uint32) (endpos),
-                                               (uint32) (lsn >> 32), (uint32) 
lsn);
+                                               LSN_FORMAT_ARGS(endpos), 
LSN_FORMAT_ARGS(lsn));
        }
 }
diff --git a/src/bin/pg_basebackup/receivelog.c 
b/src/bin/pg_basebackup/receivelog.c
index 4fc050f3a1..7a2148fd05 100644
--- a/src/bin/pg_basebackup/receivelog.c
+++ b/src/bin/pg_basebackup/receivelog.c
@@ -560,7 +560,7 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
                /* Initiate the replication stream at specified location */
                snprintf(query, sizeof(query), "START_REPLICATION %s%X/%X 
TIMELINE %u",
                                 slotcmd,
-                                (uint32) (stream->startpos >> 32), (uint32) 
stream->startpos,
+                                LSN_FORMAT_ARGS(stream->startpos),
                                 stream->timeline);
                res = PQexec(conn, query);
                if (PQresultStatus(res) != PGRES_COPY_BOTH)
@@ -616,8 +616,8 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
                        if (stream->startpos > stoppos)
                        {
                                pg_log_error("server stopped streaming timeline 
%u at %X/%X, but reported next timeline %u to begin at %X/%X",
-                                                        stream->timeline, 
(uint32) (stoppos >> 32), (uint32) stoppos,
-                                                        newtimeline, (uint32) 
(stream->startpos >> 32), (uint32) stream->startpos);
+                                                        stream->timeline, 
LSN_FORMAT_ARGS(stoppos),
+                                                        newtimeline, 
LSN_FORMAT_ARGS(stream->startpos));
                                goto error;
                        }
 
diff --git a/src/bin/pg_controldata/pg_controldata.c 
b/src/bin/pg_controldata/pg_controldata.c
index 3e00ac0f70..f911f98d94 100644
--- a/src/bin/pg_controldata/pg_controldata.c
+++ b/src/bin/pg_controldata/pg_controldata.c
@@ -236,11 +236,9 @@ main(int argc, char *argv[])
        printf(_("pg_control last modified:             %s\n"),
                   pgctime_str);
        printf(_("Latest checkpoint location:           %X/%X\n"),
-                  (uint32) (ControlFile->checkPoint >> 32),
-                  (uint32) ControlFile->checkPoint);
+                  LSN_FORMAT_ARGS(ControlFile->checkPoint));
        printf(_("Latest checkpoint's REDO location:    %X/%X\n"),
-                  (uint32) (ControlFile->checkPointCopy.redo >> 32),
-                  (uint32) ControlFile->checkPointCopy.redo);
+                  LSN_FORMAT_ARGS(ControlFile->checkPointCopy.redo));
        printf(_("Latest checkpoint's REDO WAL file:    %s\n"),
                   xlogfilename);
        printf(_("Latest checkpoint's TimeLineID:       %u\n"),
@@ -275,19 +273,15 @@ main(int argc, char *argv[])
        printf(_("Time of latest checkpoint:            %s\n"),
                   ckpttime_str);
        printf(_("Fake LSN counter for unlogged rels:   %X/%X\n"),
-                  (uint32) (ControlFile->unloggedLSN >> 32),
-                  (uint32) ControlFile->unloggedLSN);
+                  LSN_FORMAT_ARGS(ControlFile->unloggedLSN));
        printf(_("Minimum recovery ending location:     %X/%X\n"),
-                  (uint32) (ControlFile->minRecoveryPoint >> 32),
-                  (uint32) ControlFile->minRecoveryPoint);
+                  LSN_FORMAT_ARGS(ControlFile->minRecoveryPoint));
        printf(_("Min recovery ending loc's timeline:   %u\n"),
                   ControlFile->minRecoveryPointTLI);
        printf(_("Backup start location:                %X/%X\n"),
-                  (uint32) (ControlFile->backupStartPoint >> 32),
-                  (uint32) ControlFile->backupStartPoint);
+                  LSN_FORMAT_ARGS(ControlFile->backupStartPoint));
        printf(_("Backup end location:                  %X/%X\n"),
-                  (uint32) (ControlFile->backupEndPoint >> 32),
-                  (uint32) ControlFile->backupEndPoint);
+                  LSN_FORMAT_ARGS(ControlFile->backupEndPoint));
        printf(_("End-of-backup record required:        %s\n"),
                   ControlFile->backupEndRequired ? _("yes") : _("no"));
        printf(_("wal_level setting:                    %s\n"),
diff --git a/src/bin/pg_rewind/parsexlog.c b/src/bin/pg_rewind/parsexlog.c
index 7117ae5229..59ebac7d6a 100644
--- a/src/bin/pg_rewind/parsexlog.c
+++ b/src/bin/pg_rewind/parsexlog.c
@@ -87,11 +87,11 @@ extractPageMap(const char *datadir, XLogRecPtr startpoint, 
int tliIndex,
 
                        if (errormsg)
                                pg_fatal("could not read WAL record at %X/%X: 
%s",
-                                                (uint32) (errptr >> 32), 
(uint32) (errptr),
+                                                LSN_FORMAT_ARGS(errptr),
                                                 errormsg);
                        else
                                pg_fatal("could not read WAL record at %X/%X",
-                                                (uint32) (errptr >> 32), 
(uint32) (errptr));
+                                                LSN_FORMAT_ARGS(errptr));
                }
 
                extractPageInfo(xlogreader);
@@ -140,10 +140,10 @@ readOneRecord(const char *datadir, XLogRecPtr ptr, int 
tliIndex,
        {
                if (errormsg)
                        pg_fatal("could not read WAL record at %X/%X: %s",
-                                        (uint32) (ptr >> 32), (uint32) (ptr), 
errormsg);
+                                        LSN_FORMAT_ARGS(ptr), errormsg);
                else
                        pg_fatal("could not read WAL record at %X/%X",
-                                        (uint32) (ptr >> 32), (uint32) (ptr));
+                                        LSN_FORMAT_ARGS(ptr));
        }
        endptr = xlogreader->EndRecPtr;
 
@@ -206,11 +206,11 @@ findLastCheckpoint(const char *datadir, XLogRecPtr 
forkptr, int tliIndex,
                {
                        if (errormsg)
                                pg_fatal("could not find previous WAL record at 
%X/%X: %s",
-                                                (uint32) (searchptr >> 32), 
(uint32) (searchptr),
+                                                LSN_FORMAT_ARGS(searchptr),
                                                 errormsg);
                        else
                                pg_fatal("could not find previous WAL record at 
%X/%X",
-                                                (uint32) (searchptr >> 32), 
(uint32) (searchptr));
+                                                LSN_FORMAT_ARGS(searchptr));
                }
 
                /*
@@ -428,7 +428,7 @@ extractPageInfo(XLogReaderState *record)
                 */
                pg_fatal("WAL record modifies a relation, but record type is 
not recognized: "
                                 "lsn: %X/%X, rmgr: %s, info: %02X",
-                                (uint32) (record->ReadRecPtr >> 32), (uint32) 
(record->ReadRecPtr),
+                                LSN_FORMAT_ARGS(record->ReadRecPtr),
                                 RmgrNames[rmid], info);
        }
 
diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c
index 359a6a587c..9df08ab2b0 100644
--- a/src/bin/pg_rewind/pg_rewind.c
+++ b/src/bin/pg_rewind/pg_rewind.c
@@ -344,7 +344,7 @@ main(int argc, char **argv)
 
                findCommonAncestorTimeline(&divergerec, &lastcommontliIndex);
                pg_log_info("servers diverged at WAL location %X/%X on timeline 
%u",
-                                       (uint32) (divergerec >> 32), (uint32) 
divergerec,
+                                       LSN_FORMAT_ARGS(divergerec),
                                        targetHistory[lastcommontliIndex].tli);
 
                /*
@@ -401,8 +401,7 @@ main(int argc, char **argv)
        findLastCheckpoint(datadir_target, divergerec, lastcommontliIndex,
                                           &chkptrec, &chkpttli, &chkptredo, 
restore_command);
        pg_log_info("rewinding from last common checkpoint at %X/%X on timeline 
%u",
-                               (uint32) (chkptrec >> 32), (uint32) chkptrec,
-                               chkpttli);
+                               LSN_FORMAT_ARGS(chkptrec), chkpttli);
 
        /* Initialize the hash table to track the status of each file */
        filehash_init();
@@ -859,8 +858,8 @@ getTimelineHistory(ControlFileData *controlFile, int 
*nentries)
 
                        entry = &history[i];
                        pg_log_debug("%d: %X/%X - %X/%X", entry->tli,
-                                                (uint32) (entry->begin >> 32), 
(uint32) (entry->begin),
-                                                (uint32) (entry->end >> 32), 
(uint32) (entry->end));
+                                                LSN_FORMAT_ARGS(entry->begin),
+                                                LSN_FORMAT_ARGS(entry->end));
                }
        }
 
@@ -954,8 +953,8 @@ createBackupLabel(XLogRecPtr startpoint, TimeLineID 
starttli, XLogRecPtr checkpo
                                   "BACKUP FROM: standby\n"
                                   "START TIME: %s\n",
        /* omit LABEL: line */
-                                  (uint32) (startpoint >> 32), (uint32) 
startpoint, xlogfilename,
-                                  (uint32) (checkpointloc >> 32), (uint32) 
checkpointloc,
+                                  LSN_FORMAT_ARGS(startpoint), xlogfilename,
+                                  LSN_FORMAT_ARGS(checkpointloc),
                                   strfbuf);
        if (len >= sizeof(buf))
                pg_fatal("backup label buffer too small");      /* shouldn't 
happen */
diff --git a/src/bin/pg_verifybackup/pg_verifybackup.c 
b/src/bin/pg_verifybackup/pg_verifybackup.c
index bb3f2783d0..f5ebd57a47 100644
--- a/src/bin/pg_verifybackup/pg_verifybackup.c
+++ b/src/bin/pg_verifybackup/pg_verifybackup.c
@@ -816,10 +816,8 @@ parse_required_wal(verifier_context *context, char 
*pg_waldump_path,
 
                pg_waldump_cmd = psprintf("\"%s\" --quiet --path=\"%s\" 
--timeline=%u --start=%X/%X --end=%X/%X\n",
                                                                  
pg_waldump_path, wal_directory, this_wal_range->tli,
-                                                                 (uint32) 
(this_wal_range->start_lsn >> 32),
-                                                                 (uint32) 
this_wal_range->start_lsn,
-                                                                 (uint32) 
(this_wal_range->end_lsn >> 32),
-                                                                 (uint32) 
this_wal_range->end_lsn);
+                                                                 
LSN_FORMAT_ARGS(this_wal_range->start_lsn),
+                                                                 
LSN_FORMAT_ARGS(this_wal_range->end_lsn));
                if (system(pg_waldump_cmd) != 0)
                        report_backup_error(context,
                                                                "WAL parsing 
failed for timeline %u",
diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c
index 164868d16e..610f65e471 100644
--- a/src/bin/pg_waldump/pg_waldump.c
+++ b/src/bin/pg_waldump/pg_waldump.c
@@ -467,8 +467,8 @@ XLogDumpDisplayRecord(XLogDumpConfig *config, 
XLogReaderState *record)
                   desc->rm_name,
                   rec_len, XLogRecGetTotalLen(record),
                   XLogRecGetXid(record),
-                  (uint32) (record->ReadRecPtr >> 32), (uint32) 
record->ReadRecPtr,
-                  (uint32) (xl_prev >> 32), (uint32) xl_prev);
+                  LSN_FORMAT_ARGS(record->ReadRecPtr),
+                  LSN_FORMAT_ARGS(xl_prev));
 
        id = desc->rm_identify(info);
        if (id == NULL)
@@ -972,8 +972,7 @@ main(int argc, char **argv)
                else if (!XLByteInSeg(private.startptr, segno, WalSegSz))
                {
                        pg_log_error("start WAL location %X/%X is not inside 
file \"%s\"",
-                                                (uint32) (private.startptr >> 
32),
-                                                (uint32) private.startptr,
+                                                
LSN_FORMAT_ARGS(private.startptr),
                                                 fname);
                        goto bad_argument;
                }
@@ -1015,8 +1014,7 @@ main(int argc, char **argv)
                        private.endptr != (segno + 1) * WalSegSz)
                {
                        pg_log_error("end WAL location %X/%X is not inside file 
\"%s\"",
-                                                (uint32) (private.endptr >> 
32),
-                                                (uint32) private.endptr,
+                                                
LSN_FORMAT_ARGS(private.endptr),
                                                 argv[argc - 1]);
                        goto bad_argument;
                }
@@ -1048,8 +1046,7 @@ main(int argc, char **argv)
 
        if (first_record == InvalidXLogRecPtr)
                fatal_error("could not find a valid record after %X/%X",
-                                       (uint32) (private.startptr >> 32),
-                                       (uint32) private.startptr);
+                                       LSN_FORMAT_ARGS(private.startptr));
 
        /*
         * Display a message that we're skipping data if `from` wasn't a pointer
@@ -1061,8 +1058,8 @@ main(int argc, char **argv)
                printf(ngettext("first record is after %X/%X, at %X/%X, 
skipping over %u byte\n",
                                                "first record is after %X/%X, 
at %X/%X, skipping over %u bytes\n",
                                                (first_record - 
private.startptr)),
-                          (uint32) (private.startptr >> 32), (uint32) 
private.startptr,
-                          (uint32) (first_record >> 32), (uint32) first_record,
+                          LSN_FORMAT_ARGS(private.startptr),
+                          LSN_FORMAT_ARGS(first_record),
                           (uint32) (first_record - private.startptr));
 
        for (;;)
@@ -1110,8 +1107,7 @@ main(int argc, char **argv)
 
        if (errormsg)
                fatal_error("error in WAL record at %X/%X: %s",
-                                       (uint32) (xlogreader_state->ReadRecPtr 
>> 32),
-                                       (uint32) xlogreader_state->ReadRecPtr,
+                                       
LSN_FORMAT_ARGS(xlogreader_state->ReadRecPtr),
                                        errormsg);
 
        XLogReaderFree(xlogreader_state);
diff --git a/src/include/access/xlogdefs.h b/src/include/access/xlogdefs.h
index 65836d5bc6..b7ccd10a39 100644
--- a/src/include/access/xlogdefs.h
+++ b/src/include/access/xlogdefs.h
@@ -35,6 +35,13 @@ typedef uint64 XLogRecPtr;
  */
 #define FirstNormalUnloggedLSN ((XLogRecPtr) 1000)
 
+/*
+ * Handy macro for printing XLogRecPtr in conventional format, e.g.,
+ *
+ * printf("%X/%X", LSN_FORMAT_ARGS(lsn));
+ */
+#define LSN_FORMAT_ARGS(lsn) (AssertVariableIsOfTypeMacro((lsn), XLogRecPtr), 
(unsigned) ((lsn) >> 32)), ((unsigned) (lsn))
+
 /*
  * XLogSegNo - physical log file sequence number.
  */
-- 
2.30.1

Reply via email to