From cd2016bdd021785daf42ba83919c3175db6337ed Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Thu, 19 Feb 2015 14:29:57 +0900 Subject: [PATCH 4/4] Replace some struct declarations with union in heapam.c To ensure that there is enough room for operations, add a size equivalent to the tuple header data. --- src/backend/access/heap/heapam.c | 12 ++++++------ src/include/access/htup_details.h | 2 ++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 46060bc1..c4b825d 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -7351,10 +7351,10 @@ heap_xlog_insert(XLogReaderState *record) xl_heap_insert *xlrec = (xl_heap_insert *) XLogRecGetData(record); Buffer buffer; Page page; - struct + union { HeapTupleHeaderData hdr; - char data[MaxHeapTupleSize]; + char data[SizeOfHeapTupleHeaderData + MaxHeapTupleSize]; } tbuf; HeapTupleHeader htup; xl_heap_header xlhdr; @@ -7469,10 +7469,10 @@ heap_xlog_multi_insert(XLogReaderState *record) BlockNumber blkno; Buffer buffer; Page page; - struct + union { HeapTupleHeaderData hdr; - char data[MaxHeapTupleSize]; + char data[SizeOfHeapTupleHeaderData + MaxHeapTupleSize]; } tbuf; HeapTupleHeader htup; uint32 newlen; @@ -7618,10 +7618,10 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) uint16 prefixlen = 0, suffixlen = 0; char *newp; - struct + union { HeapTupleHeaderData hdr; - char data[MaxHeapTupleSize]; + char data[SizeOfHeapTupleHeaderData + MaxHeapTupleSize]; } tbuf; xl_heap_header xlhdr; uint32 newlen; diff --git a/src/include/access/htup_details.h b/src/include/access/htup_details.h index d2ad910..2da4f42 100644 --- a/src/include/access/htup_details.h +++ b/src/include/access/htup_details.h @@ -155,6 +155,8 @@ struct HeapTupleHeaderData /* MORE DATA FOLLOWS AT END OF STRUCT */ }; +#define SizeOfHeapTupleHeaderData MAXALIGN(sizeof(HeapTupleHeaderData)) + /* typedef appears in tupbasics.h */ /* -- 2.3.0