mirror of
https://github.com/postgres/postgres.git
synced 2025-09-03 15:22:11 +03:00
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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
@@ -2014,14 +2014,12 @@ ReorderBufferSerializeChange(ReorderBuffer *rb, ReorderBufferTXN *txn,
|
||||
newtup = change->data.tp.newtuple;
|
||||
|
||||
if (oldtup)
|
||||
oldlen = offsetof(ReorderBufferTupleBuf, data)
|
||||
+oldtup->tuple.t_len
|
||||
- offsetof(HeapTupleHeaderData, t_bits);
|
||||
oldlen = offsetof(ReorderBufferTupleBuf, t_data) +
|
||||
oldtup->tuple.t_len;
|
||||
|
||||
if (newtup)
|
||||
newlen = offsetof(ReorderBufferTupleBuf, data)
|
||||
+newtup->tuple.t_len
|
||||
- offsetof(HeapTupleHeaderData, t_bits);
|
||||
newlen = offsetof(ReorderBufferTupleBuf, t_data) +
|
||||
newtup->tuple.t_len;
|
||||
|
||||
sz += oldlen;
|
||||
sz += newlen;
|
||||
@@ -2262,27 +2260,25 @@ ReorderBufferRestoreChange(ReorderBuffer *rb, ReorderBufferTXN *txn,
|
||||
case REORDER_BUFFER_CHANGE_DELETE:
|
||||
if (change->data.tp.newtuple)
|
||||
{
|
||||
Size len = offsetof(ReorderBufferTupleBuf, data)
|
||||
+((ReorderBufferTupleBuf *) data)->tuple.t_len
|
||||
- offsetof(HeapTupleHeaderData, t_bits);
|
||||
Size len = offsetof(ReorderBufferTupleBuf, t_data) +
|
||||
((ReorderBufferTupleBuf *) data)->tuple.t_len;
|
||||
|
||||
change->data.tp.newtuple = ReorderBufferGetTupleBuf(rb);
|
||||
memcpy(change->data.tp.newtuple, data, len);
|
||||
change->data.tp.newtuple->tuple.t_data =
|
||||
&change->data.tp.newtuple->header;
|
||||
&change->data.tp.newtuple->t_data.header;
|
||||
data += len;
|
||||
}
|
||||
|
||||
if (change->data.tp.oldtuple)
|
||||
{
|
||||
Size len = offsetof(ReorderBufferTupleBuf, data)
|
||||
+((ReorderBufferTupleBuf *) data)->tuple.t_len
|
||||
- offsetof(HeapTupleHeaderData, t_bits);
|
||||
Size len = offsetof(ReorderBufferTupleBuf, t_data) +
|
||||
((ReorderBufferTupleBuf *) data)->tuple.t_len;
|
||||
|
||||
change->data.tp.oldtuple = ReorderBufferGetTupleBuf(rb);
|
||||
memcpy(change->data.tp.oldtuple, data, len);
|
||||
change->data.tp.oldtuple->tuple.t_data =
|
||||
&change->data.tp.oldtuple->header;
|
||||
&change->data.tp.oldtuple->t_data.header;
|
||||
data += len;
|
||||
}
|
||||
break;
|
||||
@@ -2660,7 +2656,7 @@ ReorderBufferToastReplace(ReorderBuffer *rb, ReorderBufferTXN *txn,
|
||||
*/
|
||||
tmphtup = heap_form_tuple(desc, attrs, isnull);
|
||||
Assert(newtup->tuple.t_len <= MaxHeapTupleSize);
|
||||
Assert(&newtup->header == newtup->tuple.t_data);
|
||||
Assert(&newtup->t_data.header == newtup->tuple.t_data);
|
||||
|
||||
memcpy(newtup->tuple.t_data, tmphtup->t_data, tmphtup->t_len);
|
||||
newtup->tuple.t_len = tmphtup->t_len;
|
||||
|
Reference in New Issue
Block a user