From: Kyotaro Horiguchi Date: Fri, 26 Jul 2019 17:12:24 +0900 Subject: [PATCH] Fix offset of pg_walfile_name_offset. The function returns the name of the previous segment with the offset of the given location at segment boundaries. For example, it returns ("...16", 0) returned for '0/17000000'. That is inconsistent, or at least confusing. This patch changes the function to return the given LSN - 1 as offset. --- src/backend/access/transam/xlogfuncs.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c index b35043bf71..79ea0495b4 100644 --- a/src/backend/access/transam/xlogfuncs.c +++ b/src/backend/access/transam/xlogfuncs.c @@ -447,6 +447,8 @@ pg_last_wal_replay_lsn(PG_FUNCTION_ARGS) * 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. + * To be consistent to filename, returns the offset one byte before the given + * location as offset. */ Datum pg_walfile_name_offset(PG_FUNCTION_ARGS) @@ -480,10 +482,16 @@ pg_walfile_name_offset(PG_FUNCTION_ARGS) resultTupleDesc = BlessTupleDesc(resultTupleDesc); + /* + * We assume the given location point as one-byte after the location + * really wanted. + */ + locationpoint--; + /* * xlogfilename */ - XLByteToPrevSeg(locationpoint, xlogsegno, wal_segment_size); + XLByteToSeg(locationpoint, xlogsegno, wal_segment_size); XLogFileName(xlogfilename, ThisTimeLineID, xlogsegno, wal_segment_size); values[0] = CStringGetTextDatum(xlogfilename); -- 2.16.3 ----Next_Part(Fri_Jul_26_17_21_20_2019_557)----