From bade01cb4dd88f63bd9024cfdaec3d5001a805f3 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Tue, 28 Mar 2023 10:53:48 -0700 Subject: [PATCH] Fix recent pg_walinspect fpi_length bug. Commit 0276ae42dd taught pg_walinspect's pg_get_wal_record_info() function to output NULLs rather than empty strings for its record description and block_ref output parameters. However, it inadvertently moved the function call that sets fpi_length until after it was already set. As a result, pg_get_wal_record_info() always output spurious fpi_length values of 0. Fix by switching the order back (but keep the behavioral change). Author: Bharath Rupireddy Discussion: https://postgr.es/m/CAH2-WzkJmgSYkt6-smQ+57SxSmov+EKqFZdSimFewosoL_JKoA@mail.gmail.com --- contrib/pg_walinspect/pg_walinspect.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/contrib/pg_walinspect/pg_walinspect.c b/contrib/pg_walinspect/pg_walinspect.c index 2933734122..062e90dbce 100644 --- a/contrib/pg_walinspect/pg_walinspect.c +++ b/contrib/pg_walinspect/pg_walinspect.c @@ -186,6 +186,7 @@ GetWALRecordInfo(XLogReaderState *record, Datum *values, RmgrData desc; uint32 fpi_len = 0; StringInfoData rec_desc; + StringInfoData rec_blk_ref; int i = 0; desc = GetRmgr(XLogRecGetRmid(record)); @@ -197,6 +198,12 @@ GetWALRecordInfo(XLogReaderState *record, Datum *values, initStringInfo(&rec_desc); desc.rm_desc(&rec_desc, record); + if (XLogRecHasAnyBlockRefs(record)) + { + initStringInfo(&rec_blk_ref); + XLogRecGetBlockRefInfo(record, false, true, &rec_blk_ref, &fpi_len); + } + values[i++] = LSNGetDatum(record->ReadRecPtr); values[i++] = LSNGetDatum(record->EndRecPtr); values[i++] = LSNGetDatum(XLogRecGetPrev(record)); @@ -205,7 +212,6 @@ GetWALRecordInfo(XLogReaderState *record, Datum *values, values[i++] = CStringGetTextDatum(id); values[i++] = UInt32GetDatum(XLogRecGetTotalLen(record)); values[i++] = UInt32GetDatum(XLogRecGetDataLen(record)); - values[i++] = UInt32GetDatum(fpi_len); if (rec_desc.len > 0) @@ -213,15 +219,8 @@ GetWALRecordInfo(XLogReaderState *record, Datum *values, else nulls[i++] = true; - /* Block references. */ if (XLogRecHasAnyBlockRefs(record)) - { - StringInfoData rec_blk_ref; - - initStringInfo(&rec_blk_ref); - XLogRecGetBlockRefInfo(record, false, true, &rec_blk_ref, &fpi_len); values[i++] = CStringGetTextDatum(rec_blk_ref.data); - } else nulls[i++] = true;