test-result-v5.txt

application/octet-stream

Filename: test-result-v5.txt
Type: application/octet-stream
Part: 1
Message: Re: Return value of XLogInsertRecord() for XLOG_SWITCH record
======================================================
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>