diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 053fbc5ef2..20da3ed033 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -27075,11 +27075,6 @@ postgres=# SELECT * FROM pg_walfile_name_offset((pg_backup_stop()).lsn); (1 row) Similarly, pg_walfile_name extracts just the write-ahead log file name. - When the given write-ahead log location is exactly at a write-ahead log file boundary, both - these functions return the name of the preceding write-ahead log file. - This is usually the desired behavior for managing write-ahead log archiving - behavior, since the preceding file is the last one that currently - needs to be archived. diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c index 45a70668b1..45452d937c 100644 --- a/src/backend/access/transam/xlogfuncs.c +++ b/src/backend/access/transam/xlogfuncs.c @@ -374,10 +374,6 @@ pg_last_wal_replay_lsn(PG_FUNCTION_ARGS) /* * Compute an xlog file name and decimal byte offset given a WAL location, * such as is returned by pg_backup_stop() or pg_switch_wal(). - * - * Note that a location exactly at a segment boundary is taken to be in - * the previous segment. This is usually the right thing, since the - * expected usage is to determine which xlog file(s) are ready to archive. */ Datum pg_walfile_name_offset(PG_FUNCTION_ARGS) @@ -414,7 +410,7 @@ pg_walfile_name_offset(PG_FUNCTION_ARGS) /* * xlogfilename */ - XLByteToPrevSeg(locationpoint, xlogsegno, wal_segment_size); + XLByteToSeg(locationpoint, xlogsegno, wal_segment_size); XLogFileName(xlogfilename, GetWALInsertionTimeLine(), xlogsegno, wal_segment_size); @@ -457,7 +453,7 @@ pg_walfile_name(PG_FUNCTION_ARGS) errhint("%s cannot be executed during recovery.", "pg_walfile_name()"))); - XLByteToPrevSeg(locationpoint, xlogsegno, wal_segment_size); + XLByteToSeg(locationpoint, xlogsegno, wal_segment_size); XLogFileName(xlogfilename, GetWALInsertionTimeLine(), xlogsegno, wal_segment_size); diff --git a/src/test/regress/expected/misc_functions.out b/src/test/regress/expected/misc_functions.out index c669948370..9302134077 100644 --- a/src/test/regress/expected/misc_functions.out +++ b/src/test/regress/expected/misc_functions.out @@ -619,7 +619,7 @@ SELECT count(*) > 0 AS ok FROM pg_control_system(); t (1 row) --- pg_split_walfile_name +-- pg_split_walfile_name, pg_walfile_name & pg_walfile_name_offset SELECT * FROM pg_split_walfile_name(NULL); segment_number | timeline_id ----------------+------------- @@ -642,3 +642,31 @@ SELECT segment_number > 0 AS ok_segment_number, timeline_id t | 4294967295 (1 row) +SELECT setting::int8 AS segment_size +FROM pg_settings +WHERE name = 'wal_segment_size' +\gset +SELECT segment_number, file_offset +FROM pg_walfile_name_offset('0/0'::pg_lsn + :segment_size), + pg_split_walfile_name(file_name); + segment_number | file_offset +----------------+------------- + 1 | 0 +(1 row) + +SELECT segment_number, file_offset +FROM pg_walfile_name_offset('0/0'::pg_lsn + :segment_size + 1), + pg_split_walfile_name(file_name); + segment_number | file_offset +----------------+------------- + 1 | 1 +(1 row) + +SELECT segment_number, file_offset = :segment_size - 1 +FROM pg_walfile_name_offset('0/0'::pg_lsn + :segment_size - 1), + pg_split_walfile_name(file_name); + segment_number | ?column? +----------------+---------- + 0 | t +(1 row) + diff --git a/src/test/regress/sql/misc_functions.sql b/src/test/regress/sql/misc_functions.sql index b57f01f3e9..d3dc591173 100644 --- a/src/test/regress/sql/misc_functions.sql +++ b/src/test/regress/sql/misc_functions.sql @@ -230,10 +230,23 @@ SELECT count(*) > 0 AS ok FROM pg_control_init(); SELECT count(*) > 0 AS ok FROM pg_control_recovery(); SELECT count(*) > 0 AS ok FROM pg_control_system(); --- pg_split_walfile_name +-- pg_split_walfile_name, pg_walfile_name & pg_walfile_name_offset SELECT * FROM pg_split_walfile_name(NULL); SELECT * FROM pg_split_walfile_name('invalid'); SELECT segment_number > 0 AS ok_segment_number, timeline_id FROM pg_split_walfile_name('000000010000000100000000'); SELECT segment_number > 0 AS ok_segment_number, timeline_id FROM pg_split_walfile_name('ffffffFF00000001000000af'); +SELECT setting::int8 AS segment_size +FROM pg_settings +WHERE name = 'wal_segment_size' +\gset +SELECT segment_number, file_offset +FROM pg_walfile_name_offset('0/0'::pg_lsn + :segment_size), + pg_split_walfile_name(file_name); +SELECT segment_number, file_offset +FROM pg_walfile_name_offset('0/0'::pg_lsn + :segment_size + 1), + pg_split_walfile_name(file_name); +SELECT segment_number, file_offset = :segment_size - 1 +FROM pg_walfile_name_offset('0/0'::pg_lsn + :segment_size - 1), + pg_split_walfile_name(file_name);