From e1a11d93111ff3fba7a91f3f2ac0b0aca16909a8 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 21 Feb 2015 15:13:06 -0500 Subject: Use FLEXIBLE_ARRAY_MEMBER for HeapTupleHeaderData.t_bits[]. This requires changing quite a few places that were depending on sizeof(HeapTupleHeaderData), but it seems for the best. Michael Paquier, some adjustments by me --- src/backend/replication/logical/decode.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) (limited to 'src/backend/replication/logical/decode.c') diff --git a/src/backend/replication/logical/decode.c b/src/backend/replication/logical/decode.c index 77c02baf113..e7614bd515a 100644 --- a/src/backend/replication/logical/decode.c +++ b/src/backend/replication/logical/decode.c @@ -765,21 +765,19 @@ DecodeMultiInsert(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) * transactions. */ tuple->tuple.t_tableOid = InvalidOid; - tuple->tuple.t_data = &tuple->header; - tuple->tuple.t_len = datalen - + offsetof(HeapTupleHeaderData, t_bits); + tuple->tuple.t_data = &tuple->t_data.header; + tuple->tuple.t_len = datalen + SizeofHeapTupleHeader; - memset(&tuple->header, 0, sizeof(HeapTupleHeaderData)); + memset(&tuple->t_data.header, 0, SizeofHeapTupleHeader); - memcpy((char *) &tuple->header - + offsetof(HeapTupleHeaderData, t_bits), + memcpy((char *) &tuple->t_data.header + SizeofHeapTupleHeader, (char *) data, datalen); data += datalen; - tuple->header.t_infomask = xlhdr->t_infomask; - tuple->header.t_infomask2 = xlhdr->t_infomask2; - tuple->header.t_hoff = xlhdr->t_hoff; + tuple->t_data.header.t_infomask = xlhdr->t_infomask; + tuple->t_data.header.t_infomask2 = xlhdr->t_infomask2; + tuple->t_data.header.t_hoff = xlhdr->t_hoff; } /* @@ -815,27 +813,27 @@ DecodeXLogTuple(char *data, Size len, ReorderBufferTupleBuf *tuple) Assert(datalen >= 0); Assert(datalen <= MaxHeapTupleSize); - tuple->tuple.t_len = datalen + offsetof(HeapTupleHeaderData, t_bits); + tuple->tuple.t_len = datalen + SizeofHeapTupleHeader; /* not a disk based tuple */ ItemPointerSetInvalid(&tuple->tuple.t_self); /* we can only figure this out after reassembling the transactions */ tuple->tuple.t_tableOid = InvalidOid; - tuple->tuple.t_data = &tuple->header; + tuple->tuple.t_data = &tuple->t_data.header; /* data is not stored aligned, copy to aligned storage */ memcpy((char *) &xlhdr, data, SizeOfHeapHeader); - memset(&tuple->header, 0, sizeof(HeapTupleHeaderData)); + memset(&tuple->t_data.header, 0, SizeofHeapTupleHeader); - memcpy((char *) &tuple->header + offsetof(HeapTupleHeaderData, t_bits), + memcpy((char *) &tuple->t_data.header + SizeofHeapTupleHeader, data + SizeOfHeapHeader, datalen); - tuple->header.t_infomask = xlhdr.t_infomask; - tuple->header.t_infomask2 = xlhdr.t_infomask2; - tuple->header.t_hoff = xlhdr.t_hoff; + tuple->t_data.header.t_infomask = xlhdr.t_infomask; + tuple->t_data.header.t_infomask2 = xlhdr.t_infomask2; + tuple->t_data.header.t_hoff = xlhdr.t_hoff; } -- cgit v1.2.3