test-result-v5.txt
application/octet-stream
Filename: test-result-v5.txt
Type: application/octet-stream
Part: 1
======================================================
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>