diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 0d4ed602d7..3ec85b56cd 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -8001,16 +8001,10 @@ heap_xlog_delete(XLogReaderState *record) XLogRecPtr lsn = record->EndRecPtr; xl_heap_delete *xlrec = (xl_heap_delete *) XLogRecGetData(record); Buffer buffer; - Page page; - ItemId lp = NULL; - HeapTupleHeader htup; BlockNumber blkno; RelFileNode target_node; - ItemPointerData target_tid; XLogRecGetBlockTag(record, 0, &target_node, NULL, &blkno); - ItemPointerSetBlockNumber(&target_tid, blkno); - ItemPointerSetOffsetNumber(&target_tid, xlrec->offnum); /* * The visibility map may need to be fixed even if the heap page is @@ -8029,10 +8023,16 @@ heap_xlog_delete(XLogReaderState *record) if (XLogReadBufferForRedo(record, 0, &buffer) == BLK_NEEDS_REDO) { + Page page; + HeapTupleHeader htup; + ItemId lp; + page = BufferGetPage(buffer); if (PageGetMaxOffsetNumber(page) >= xlrec->offnum) lp = PageGetItemId(page, xlrec->offnum); + else + lp = NULL; if (PageGetMaxOffsetNumber(page) < xlrec->offnum || !ItemIdIsNormal(lp)) elog(PANIC, "invalid lp"); @@ -8060,7 +8060,7 @@ heap_xlog_delete(XLogReaderState *record) if (xlrec->flags & XLH_DELETE_IS_PARTITION_MOVE) HeapTupleHeaderSetMovedPartitions(htup); else - htup->t_ctid = target_tid; + ItemPointerSet(&htup->t_ctid, blkno, xlrec->offnum); PageSetLSN(page, lsn); MarkBufferDirty(buffer); } @@ -8075,23 +8075,12 @@ heap_xlog_insert(XLogReaderState *record) xl_heap_insert *xlrec = (xl_heap_insert *) XLogRecGetData(record); Buffer buffer; Page page; - union - { - HeapTupleHeaderData hdr; - char data[MaxHeapTupleSize]; - } tbuf; - HeapTupleHeader htup; - xl_heap_header xlhdr; - uint32 newlen; Size freespace = 0; RelFileNode target_node; BlockNumber blkno; - ItemPointerData target_tid; XLogRedoAction action; XLogRecGetBlockTag(record, 0, &target_node, NULL, &blkno); - ItemPointerSetBlockNumber(&target_tid, blkno); - ItemPointerSetOffsetNumber(&target_tid, xlrec->offnum); /* * The visibility map may need to be fixed even if the heap page is @@ -8123,8 +8112,16 @@ heap_xlog_insert(XLogReaderState *record) action = XLogReadBufferForRedo(record, 0, &buffer); if (action == BLK_NEEDS_REDO) { - Size datalen; - char *data; + union + { + HeapTupleHeaderData hdr; + char data[MaxHeapTupleSize]; + } tbuf; + xl_heap_header xlhdr; + HeapTupleHeader htup; + Size datalen; + uint32 newlen; + char *data; page = BufferGetPage(buffer); @@ -8150,7 +8147,7 @@ heap_xlog_insert(XLogReaderState *record) htup->t_hoff = xlhdr.t_hoff; HeapTupleHeaderSetXmin(htup, XLogRecGetXid(record)); HeapTupleHeaderSetCmin(htup, FirstCommandId); - htup->t_ctid = target_tid; + ItemPointerSet(&htup->t_ctid, blkno, xlrec->offnum); if (PageAddItem(page, (Item) htup, newlen, xlrec->offnum, true, true) == InvalidOffsetNumber) @@ -8285,8 +8282,7 @@ heap_xlog_multi_insert(XLogReaderState *record) htup->t_hoff = xlhdr->t_hoff; HeapTupleHeaderSetXmin(htup, XLogRecGetXid(record)); HeapTupleHeaderSetCmin(htup, FirstCommandId); - ItemPointerSetBlockNumber(&htup->t_ctid, blkno); - ItemPointerSetOffsetNumber(&htup->t_ctid, offnum); + ItemPointerSet(&htup->t_ctid, blkno, offnum); offnum = PageAddItem(page, (Item) htup, newlen, offnum, true, true); if (offnum == InvalidOffsetNumber) @@ -8331,11 +8327,11 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) RelFileNode rnode; BlockNumber oldblk; BlockNumber newblk; - ItemPointerData newtid; Buffer obuffer, nbuffer; Page page; OffsetNumber offnum; + OffsetNumber new_offnum; ItemId lp = NULL; HeapTupleData oldtup; HeapTupleHeader htup; @@ -8366,7 +8362,7 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) else oldblk = newblk; - ItemPointerSet(&newtid, newblk, xlrec->new_offnum); + new_offnum = xlrec->new_offnum; /* * The visibility map may need to be fixed even if the heap page is @@ -8421,8 +8417,9 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) &htup->t_infomask2); HeapTupleHeaderSetXmax(htup, xlrec->old_xmax); HeapTupleHeaderSetCmax(htup, FirstCommandId, false); + /* Set forward chain link in t_ctid */ - htup->t_ctid = newtid; + ItemPointerSet(&htup->t_ctid, newblk, new_offnum); /* Mark the page as a candidate for pruning */ PageSetPrunable(page, XLogRecGetXid(record)); @@ -8555,8 +8552,9 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) HeapTupleHeaderSetXmin(htup, XLogRecGetXid(record)); HeapTupleHeaderSetCmin(htup, FirstCommandId); HeapTupleHeaderSetXmax(htup, xlrec->new_xmax); + /* Make sure there is no forward chain link in t_ctid */ - htup->t_ctid = newtid; + ItemPointerSet(&htup->t_ctid, newblk, new_offnum); offnum = PageAddItem(page, (Item) htup, newlen, offnum, true, true); if (offnum == InvalidOffsetNumber)