====================================================== 1.An XLOG_SWITCH record can be written within a WAL page with plenty of free space remaining afterward: 2026-06-27 16:26:13.869 CST [21653] STATEMENT: SELECT pg_switch_wal(); 1: pg_switch_wal (typeid = 3220, len = 8, typmod = -1, byval = t) ---- 1: pg_switch_wal = "0/030000C0" (typeid = 3220, len = 8, typmod = -1, byval = t) ---- backend> 2026-06-27 16:27:08.577 CST [21653] STATEMENT: select 'pg_current_wal_flush_lsn' as lsn_name, pg_current_wal_flush_lsn(), pg_walfile_name_offset(pg_current_wal_flush_lsn()) union all select 'pg_current_wal_insert_lsn', pg_current_wal_insert_lsn(), pg_walfile_name_offset(pg_current_wal_insert_lsn()) union all select 'pg_current_wal_lsn', pg_current_wal_lsn(), pg_walfile_name_offset(pg_current_wal_lsn()); 1: lsn_name (typeid = 25, len = -1, typmod = -1, byval = f) 2: pg_current_wal_flush_lsn (typeid = 3220, len = 8, typmod = -1, byval = t) 3: pg_walfile_name_offset (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_flush_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/04000130" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(000000010000000000000004,304)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_insert_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/04000130" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(000000010000000000000004,304)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/04000130" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(000000010000000000000004,304)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 2026-06-27 16:28:05.070 CST [21653] STATEMENT: SELECT pg_switch_wal(); 1: pg_switch_wal (typeid = 3220, len = 8, typmod = -1, byval = t) ---- 1: pg_switch_wal = "0/04000148" (typeid = 3220, len = 8, typmod = -1, byval = t) ---- ================="0/04000130" + 24(MAXALIGN(SizeOfXLogRecord)) = "0/04000148" ====================================================== 2.An XLOG_SWITCH record may exactly fill a WAL page, leaving no free space afterward. 2026-06-27 16:32:24.865 CST [21653] STATEMENT: SELECT pg_switch_wal(); 1: pg_switch_wal (typeid = 3220, len = 8, typmod = -1, byval = t) ---- 1: pg_switch_wal = "0/05000000" (typeid = 3220, len = 8, typmod = -1, byval = t) ---- 2026-06-27 16:32:51.540 CST [21653] STATEMENT: insert into tt1 values(1); 2026-06-27 16:33:22.353 CST [21653] STATEMENT: select 'pg_current_wal_flush_lsn' as lsn_name, pg_current_wal_flush_lsn(), pg_walfile_name_offset(pg_current_wal_flush_lsn()) union all select 'pg_current_wal_insert_lsn', pg_current_wal_insert_lsn(), pg_walfile_name_offset(pg_current_wal_insert_lsn()) union all select 'pg_current_wal_lsn', pg_current_wal_lsn(), pg_walfile_name_offset(pg_current_wal_lsn()); 1: lsn_name (typeid = 25, len = -1, typmod = -1, byval = f) 2: pg_current_wal_flush_lsn (typeid = 3220, len = 8, typmod = -1, byval = t) 3: pg_walfile_name_offset (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_flush_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/05000090" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(000000010000000000000005,144)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_insert_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/05000090" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(000000010000000000000005,144)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/05000090" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(000000010000000000000005,144)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 2026-06-27 16:36:10.220 CST [21653] STATEMENT: SELECT pg_switch_wal(); 1: pg_switch_wal (typeid = 3220, len = 8, typmod = -1, byval = t) ---- 1: pg_switch_wal = "0/05002000" (typeid = 3220, len = 8, typmod = -1, byval = t) ---- The LSN pair (000000010000000000000005,144) corresponds to the first block of WAL segment file 5. After writing the WAL record, the resulting EndPos value equals 8192, which maps to LSN 0/05002000. ====================================================== 3.Calling pg_switch_wal() twice consecutively does not trigger an actual WAL segment switch. 2026-06-27 16:40:34.074 CST [21653] STATEMENT: SELECT pg_switch_wal(); 1: pg_switch_wal (typeid = 3220, len = 8, typmod = -1, byval = t) ---- 1: pg_switch_wal = "0/06000000" (typeid = 3220, len = 8, typmod = -1, byval = t) ---- 2026-06-27 16:41:02.672 CST [21653] STATEMENT: SELECT pg_switch_wal(); 1: pg_switch_wal (typeid = 3220, len = 8, typmod = -1, byval = t) ---- 1: pg_switch_wal = "0/06000000" (typeid = 3220, len = 8, typmod = -1, byval = t) ---- 2026-06-27 16:41:49.301 CST [21653] STATEMENT: select 'pg_current_wal_flush_lsn' as lsn_name, pg_current_wal_flush_lsn(), pg_walfile_name_offset(pg_current_wal_flush_lsn()) union all select 'pg_current_wal_insert_lsn', pg_current_wal_insert_lsn(), pg_walfile_name_offset(pg_current_wal_insert_lsn()) union all select 'pg_current_wal_lsn', pg_current_wal_lsn(), pg_walfile_name_offset(pg_current_wal_lsn()); 1: lsn_name (typeid = 25, len = -1, typmod = -1, byval = f) 2: pg_current_wal_flush_lsn (typeid = 3220, len = 8, typmod = -1, byval = t) 3: pg_walfile_name_offset (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_flush_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/06000000" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(000000010000000000000006,0)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_insert_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/06000028" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(000000010000000000000006,40)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/06000000" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(000000010000000000000006,0)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- ====================================================== 4.Cross page boundaries within a single WAL segment file: 2026-06-27 16:42:44.823 CST [21653] STATEMENT: insert into tt1 values(1); 2026-06-27 16:43:08.114 CST [21653] STATEMENT: select 'pg_current_wal_flush_lsn' as lsn_name, pg_current_wal_flush_lsn(), pg_walfile_name_offset(pg_current_wal_flush_lsn()) union all select 'pg_current_wal_insert_lsn', pg_current_wal_insert_lsn(), pg_walfile_name_offset(pg_current_wal_insert_lsn()) union all select 'pg_current_wal_lsn', pg_current_wal_lsn(), pg_walfile_name_offset(pg_current_wal_lsn()); 1: lsn_name (typeid = 25, len = -1, typmod = -1, byval = f) 2: pg_current_wal_flush_lsn (typeid = 3220, len = 8, typmod = -1, byval = t) 3: pg_walfile_name_offset (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_flush_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/06000090" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(000000010000000000000006,144)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_insert_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/06000090" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(000000010000000000000006,144)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/06000090" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(000000010000000000000006,144)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- (000000010000000000000006,144) is the first segment file 6 set Insert->CurrBytePos = XLogRecPtrToBytePos(XLogBytePosToRecPtr(Insert->CurrBytePos) + (XLOG_BLCKSZ - XLogBytePosToRecPtr(Insert->CurrBytePos) % XLOG_BLCKSZ) - sizeof(uint32) - 4) let StartPos == Insert->CurrBytePos == "(000000010000000000000006,8184)" == "0/06001FF8" EndPos == StartPos + 8(first 8 bytes of MAXALIGN(SizeOfXLogRecord)) + 24(SizeOfXLogShortPHD) + 16(the rest bytes MAXALIGN(SizeOfXLogRecord)) == "0/06002028" 2026-06-27 16:43:45.974 CST [21653] STATEMENT: SELECT pg_switch_wal(); 1: pg_switch_wal (typeid = 3220, len = 8, typmod = -1, byval = t) ---- 1: pg_switch_wal = "0/06002028" (typeid = 3220, len = 8, typmod = -1, byval = t) ---- 2026-06-27 17:13:59.265 CST [21653] STATEMENT: select 'pg_current_wal_flush_lsn' as lsn_name, pg_current_wal_flush_lsn(), pg_walfile_name_offset(pg_current_wal_flush_lsn()) union all select 'pg_current_wal_insert_lsn', pg_current_wal_insert_lsn(), pg_walfile_name_offset(pg_current_wal_insert_lsn()) union all select 'pg_current_wal_lsn', pg_current_wal_lsn(), pg_walfile_name_offset(pg_current_wal_lsn()); 1: lsn_name (typeid = 25, len = -1, typmod = -1, byval = f) 2: pg_current_wal_flush_lsn (typeid = 3220, len = 8, typmod = -1, byval = t) 3: pg_walfile_name_offset (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_flush_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/07000000" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(000000010000000000000007,0)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_insert_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/07000028" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(000000010000000000000007,40)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/07000000" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(000000010000000000000007,0)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- ====================================================== 5.This WAL record will cross both page boundaries and WAL segment files. backend> select 'pg_current_wal_flush_lsn' as lsn_name, pg_current_wal_flush_lsn(), pg_walfile_name_offset(pg_current_wal_flush_lsn()) union all select 'pg_current_wal_insert_lsn', pg_current_wal_insert_lsn(), pg_walfile_name_offset(pg_current_wal_insert_lsn()) union all select 'pg_current_wal_lsn', pg_current_wal_lsn(), pg_walfile_name_offset(pg_current_wal_lsn()); 1: lsn_name (typeid = 25, len = -1, typmod = -1, byval = f) 2: pg_current_wal_flush_lsn (typeid = 3220, len = 8, typmod = -1, byval = t) 3: pg_walfile_name_offset (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_flush_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/0A000000" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(00000001000000000000000A,0)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_insert_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/0A000028" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(00000001000000000000000A,40)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/0A000000" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(00000001000000000000000A,0)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- backend> insert into tt1 values(1); backend> select 'pg_current_wal_flush_lsn' as lsn_name, pg_current_wal_flush_lsn(), pg_walfile_name_offset(pg_current_wal_flush_lsn()) union all select 'pg_current_wal_insert_lsn', pg_current_wal_insert_lsn(), pg_walfile_name_offset(pg_current_wal_insert_lsn()) union all select 'pg_current_wal_lsn', pg_current_wal_lsn(), pg_walfile_name_offset(pg_current_wal_lsn()); 1: lsn_name (typeid = 25, len = -1, typmod = -1, byval = f) 2: pg_current_wal_flush_lsn (typeid = 3220, len = 8, typmod = -1, byval = t) 3: pg_walfile_name_offset (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_flush_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/0A000090" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(00000001000000000000000A,144)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_insert_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/0A000090" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(00000001000000000000000A,144)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/0A000090" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(00000001000000000000000A,144)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- backend> SELECT pg_switch_wal(); GDB:Insert->CurrBytePos = XLogRecPtrToBytePos( XLogBytePosToRecPtr(Insert->CurrBytePos) + (wal_segment_size - XLogBytePosToRecPtr(Insert->CurrBytePos) % wal_segment_size) - sizeof(uint32) ) StartPos == "(00000001000000000000000A,16777212)" == "0/0AFFFFFC" EndPos == StartPos + 4(first 4 bytes of MAXALIGN(SizeOfXLogRecord)) + 40(SizeOfXLogLongPHD) + 20(the rest bytes MAXALIGN(SizeOfXLogRecord)) == 16,777,276 EndPos===>16,777,276 - 16,777,216(wal_segment_size) == offset 60 of next segment file 11(B). so , EndPos == "(00000001000000000000000B,60)" == "0/0B00003C" backend> SELECT pg_switch_wal(); 1: pg_switch_wal (typeid = 3220, len = 8, typmod = -1, byval = t) ---- 1: pg_switch_wal = "0/0B00003C" (typeid = 3220, len = 8, typmod = -1, byval = t) ---- backend> select 'pg_current_wal_flush_lsn' as lsn_name, pg_current_wal_flush_lsn(), pg_walfile_name_offset(pg_current_wal_flush_lsn()) union all select 'pg_current_wal_insert_lsn', pg_current_wal_insert_lsn(), pg_walfile_name_offset(pg_current_wal_insert_lsn()) union all select 'pg_current_wal_lsn', pg_current_wal_lsn(), pg_walfile_name_offset(pg_current_wal_lsn()); 1: lsn_name (typeid = 25, len = -1, typmod = -1, byval = f) 2: pg_current_wal_flush_lsn (typeid = 3220, len = 8, typmod = -1, byval = t) 3: pg_walfile_name_offset (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_flush_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/0C000000" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(00000001000000000000000C,0)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_insert_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/0C000028" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(00000001000000000000000C,40)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- 1: = "pg_current_wal_lsn" (typeid = 25, len = -1, typmod = -1, byval = f) 2: = "0/0C000000" (typeid = 3220, len = 8, typmod = -1, byval = t) 3: = "(00000001000000000000000C,0)" (typeid = 2249, len = -1, typmod = -1, byval = f) ---- backend>