aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Geoghegan <pg@bowt.ie>2023-03-28 10:53:48 -0700
committerPeter Geoghegan <pg@bowt.ie>2023-03-28 10:53:48 -0700
commitbade01cb4dd88f63bd9024cfdaec3d5001a805f3 (patch)
treef0cd51f78e3583caece9692da8903e7d69409155
parent326a33a289c7ba2dbf45f17e610b7be98dc11f67 (diff)
downloadpostgresql-bade01cb4dd88f63bd9024cfdaec3d5001a805f3.tar.gz
postgresql-bade01cb4dd88f63bd9024cfdaec3d5001a805f3.zip
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 <bharath.rupireddyforpostgres@gmail.com> Discussion: https://postgr.es/m/CAH2-WzkJmgSYkt6-smQ+57SxSmov+EKqFZdSimFewosoL_JKoA@mail.gmail.com
-rw-r--r--contrib/pg_walinspect/pg_walinspect.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/contrib/pg_walinspect/pg_walinspect.c b/contrib/pg_walinspect/pg_walinspect.c
index 2933734122b..062e90dbce9 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;