Columnar: only call BuildStripeMetadata() with heap tuple.

BuildStripeMetadata() calls HeapTupleHeaderGetXmin(), which must only
be called on a proper heap tuple with MVCC information. Make sure the
caller passes the heap tuple, and not a datum tuple.

Fixes #5318.
pull/5319/head
Jeff Davis 2021-09-23 15:44:05 -07:00
parent 9cc125166b
commit d49d321eac
1 changed files with 13 additions and 1 deletions

View File

@ -1178,8 +1178,18 @@ UpdateStripeMetadataRow(uint64 storageId, uint64 stripeId, bool *update,
heap_inplace_update(columnarStripes, modifiedTuple); heap_inplace_update(columnarStripes, modifiedTuple);
/*
* Existing tuple now contains modifications, because we used
* heap_inplace_update().
*/
HeapTuple newTuple = oldTuple;
/*
* Must not pass modifiedTuple, because BuildStripeMetadata expects a real
* heap tuple with MVCC fields.
*/
StripeMetadata *modifiedStripeMetadata = BuildStripeMetadata(columnarStripes, StripeMetadata *modifiedStripeMetadata = BuildStripeMetadata(columnarStripes,
modifiedTuple); newTuple);
CommandCounterIncrement(); CommandCounterIncrement();
@ -1233,6 +1243,8 @@ ReadDataFileStripeList(uint64 storageId, Snapshot snapshot)
/* /*
* BuildStripeMetadata builds a StripeMetadata object from given heap tuple. * BuildStripeMetadata builds a StripeMetadata object from given heap tuple.
*
* NB: heapTuple must be a proper heap tuple with MVCC fields.
*/ */
static StripeMetadata * static StripeMetadata *
BuildStripeMetadata(Relation columnarStripes, HeapTuple heapTuple) BuildStripeMetadata(Relation columnarStripes, HeapTuple heapTuple)