mirror of
https://github.com/postgres/postgres.git
synced 2025-07-21 16:02:15 +03:00
Redefine the lp_flags field of item pointers as having four states, rather
than two independent bits (one of which was never used in heap pages anyway, or at least hadn't been in a very long time). This gives us flexibility to add the HOT notions of redirected and dead item pointers without requiring anything so klugy as magic values of lp_off and lp_len. The state values are chosen so that for the states currently in use (pre-HOT) there is no change in the physical representation.
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.239 2007/09/07 20:59:26 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.240 2007/09/12 22:10:26 tgl Exp $
|
||||
*
|
||||
*
|
||||
* INTERFACE ROUTINES
|
||||
@ -198,7 +198,7 @@ heapgetpage(HeapScanDesc scan, BlockNumber page)
|
||||
lineoff <= lines;
|
||||
lineoff++, lpp++)
|
||||
{
|
||||
if (ItemIdIsUsed(lpp))
|
||||
if (ItemIdIsNormal(lpp))
|
||||
{
|
||||
HeapTupleData loctup;
|
||||
bool valid;
|
||||
@ -384,7 +384,7 @@ heapgettup(HeapScanDesc scan,
|
||||
{
|
||||
while (linesleft > 0)
|
||||
{
|
||||
if (ItemIdIsUsed(lpp))
|
||||
if (ItemIdIsNormal(lpp))
|
||||
{
|
||||
bool valid;
|
||||
|
||||
@ -653,7 +653,7 @@ heapgettup_pagemode(HeapScanDesc scan,
|
||||
{
|
||||
lineoff = scan->rs_vistuples[lineindex];
|
||||
lpp = PageGetItemId(dp, lineoff);
|
||||
Assert(ItemIdIsUsed(lpp));
|
||||
Assert(ItemIdIsNormal(lpp));
|
||||
|
||||
tuple->t_data = (HeapTupleHeader) PageGetItem((Page) dp, lpp);
|
||||
tuple->t_len = ItemIdGetLength(lpp);
|
||||
@ -1334,7 +1334,7 @@ heap_release_fetch(Relation relation,
|
||||
/*
|
||||
* Must check for deleted tuple.
|
||||
*/
|
||||
if (!ItemIdIsUsed(lp))
|
||||
if (!ItemIdIsNormal(lp))
|
||||
{
|
||||
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
|
||||
if (keep_buf)
|
||||
@ -1463,7 +1463,7 @@ heap_get_latest_tid(Relation relation,
|
||||
break;
|
||||
}
|
||||
lp = PageGetItemId(dp, offnum);
|
||||
if (!ItemIdIsUsed(lp))
|
||||
if (!ItemIdIsNormal(lp))
|
||||
{
|
||||
UnlockReleaseBuffer(buffer);
|
||||
break;
|
||||
@ -1775,6 +1775,7 @@ heap_delete(Relation relation, ItemPointer tid,
|
||||
|
||||
dp = (PageHeader) BufferGetPage(buffer);
|
||||
lp = PageGetItemId(dp, ItemPointerGetOffsetNumber(tid));
|
||||
Assert(ItemIdIsNormal(lp));
|
||||
|
||||
tp.t_data = (HeapTupleHeader) PageGetItem(dp, lp);
|
||||
tp.t_len = ItemIdGetLength(lp);
|
||||
@ -2079,6 +2080,7 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
|
||||
|
||||
dp = (PageHeader) BufferGetPage(buffer);
|
||||
lp = PageGetItemId(dp, ItemPointerGetOffsetNumber(otid));
|
||||
Assert(ItemIdIsNormal(lp));
|
||||
|
||||
oldtup.t_data = (HeapTupleHeader) PageGetItem(dp, lp);
|
||||
oldtup.t_len = ItemIdGetLength(lp);
|
||||
@ -2565,7 +2567,7 @@ heap_lock_tuple(Relation relation, HeapTuple tuple, Buffer *buffer,
|
||||
|
||||
dp = (PageHeader) BufferGetPage(*buffer);
|
||||
lp = PageGetItemId(dp, ItemPointerGetOffsetNumber(tid));
|
||||
Assert(ItemIdIsUsed(lp));
|
||||
Assert(ItemIdIsNormal(lp));
|
||||
|
||||
tuple->t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp);
|
||||
tuple->t_len = ItemIdGetLength(lp);
|
||||
@ -2958,7 +2960,7 @@ heap_inplace_update(Relation relation, HeapTuple tuple)
|
||||
if (PageGetMaxOffsetNumber(page) >= offnum)
|
||||
lp = PageGetItemId(page, offnum);
|
||||
|
||||
if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsUsed(lp))
|
||||
if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp))
|
||||
elog(ERROR, "heap_inplace_update: invalid lp");
|
||||
|
||||
htup = (HeapTupleHeader) PageGetItem(page, lp);
|
||||
@ -3523,7 +3525,7 @@ heap_xlog_clean(XLogRecPtr lsn, XLogRecord *record)
|
||||
{
|
||||
/* unused[] entries are zero-based */
|
||||
lp = PageGetItemId(page, *unused + 1);
|
||||
lp->lp_flags &= ~LP_USED;
|
||||
ItemIdSetUnused(lp);
|
||||
unused++;
|
||||
}
|
||||
}
|
||||
@ -3643,7 +3645,7 @@ heap_xlog_delete(XLogRecPtr lsn, XLogRecord *record)
|
||||
if (PageGetMaxOffsetNumber(page) >= offnum)
|
||||
lp = PageGetItemId(page, offnum);
|
||||
|
||||
if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsUsed(lp))
|
||||
if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp))
|
||||
elog(PANIC, "heap_delete_redo: invalid lp");
|
||||
|
||||
htup = (HeapTupleHeader) PageGetItem(page, lp);
|
||||
@ -3734,8 +3736,7 @@ heap_xlog_insert(XLogRecPtr lsn, XLogRecord *record)
|
||||
HeapTupleHeaderSetCmin(htup, FirstCommandId);
|
||||
htup->t_ctid = xlrec->target.tid;
|
||||
|
||||
offnum = PageAddItem(page, (Item) htup, newlen, offnum,
|
||||
LP_USED | OverwritePageMode);
|
||||
offnum = PageAddItem(page, (Item) htup, newlen, offnum, true);
|
||||
if (offnum == InvalidOffsetNumber)
|
||||
elog(PANIC, "heap_insert_redo: failed to add tuple");
|
||||
PageSetLSN(page, lsn);
|
||||
@ -3796,7 +3797,7 @@ heap_xlog_update(XLogRecPtr lsn, XLogRecord *record, bool move)
|
||||
if (PageGetMaxOffsetNumber(page) >= offnum)
|
||||
lp = PageGetItemId(page, offnum);
|
||||
|
||||
if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsUsed(lp))
|
||||
if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp))
|
||||
elog(PANIC, "heap_update_redo: invalid lp");
|
||||
|
||||
htup = (HeapTupleHeader) PageGetItem(page, lp);
|
||||
@ -3913,8 +3914,7 @@ newsame:;
|
||||
/* Make sure there is no forward chain link in t_ctid */
|
||||
htup->t_ctid = xlrec->newtid;
|
||||
|
||||
offnum = PageAddItem(page, (Item) htup, newlen, offnum,
|
||||
LP_USED | OverwritePageMode);
|
||||
offnum = PageAddItem(page, (Item) htup, newlen, offnum, true);
|
||||
if (offnum == InvalidOffsetNumber)
|
||||
elog(PANIC, "heap_update_redo: failed to add tuple");
|
||||
PageSetLSN(page, lsn);
|
||||
@ -3955,7 +3955,7 @@ heap_xlog_lock(XLogRecPtr lsn, XLogRecord *record)
|
||||
if (PageGetMaxOffsetNumber(page) >= offnum)
|
||||
lp = PageGetItemId(page, offnum);
|
||||
|
||||
if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsUsed(lp))
|
||||
if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp))
|
||||
elog(PANIC, "heap_lock_redo: invalid lp");
|
||||
|
||||
htup = (HeapTupleHeader) PageGetItem(page, lp);
|
||||
@ -4014,7 +4014,7 @@ heap_xlog_inplace(XLogRecPtr lsn, XLogRecord *record)
|
||||
if (PageGetMaxOffsetNumber(page) >= offnum)
|
||||
lp = PageGetItemId(page, offnum);
|
||||
|
||||
if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsUsed(lp))
|
||||
if (PageGetMaxOffsetNumber(page) < offnum || !ItemIdIsNormal(lp))
|
||||
elog(PANIC, "heap_inplace_redo: invalid lp");
|
||||
|
||||
htup = (HeapTupleHeader) PageGetItem(page, lp);
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/access/heap/hio.c,v 1.65 2007/02/05 04:22:18 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/access/heap/hio.c,v 1.66 2007/09/12 22:10:26 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -41,7 +41,7 @@ RelationPutHeapTuple(Relation relation,
|
||||
pageHeader = BufferGetPage(buffer);
|
||||
|
||||
offnum = PageAddItem(pageHeader, (Item) tuple->t_data,
|
||||
tuple->t_len, InvalidOffsetNumber, LP_USED);
|
||||
tuple->t_len, InvalidOffsetNumber, false);
|
||||
|
||||
if (offnum == InvalidOffsetNumber)
|
||||
elog(PANIC, "failed to add tuple to page");
|
||||
|
@ -96,7 +96,7 @@
|
||||
* Portions Copyright (c) 1994-5, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/access/heap/rewriteheap.c,v 1.5 2007/05/17 15:28:29 alvherre Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/access/heap/rewriteheap.c,v 1.6 2007/09/12 22:10:26 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -628,7 +628,7 @@ raw_heap_insert(RewriteState state, HeapTuple tup)
|
||||
|
||||
/* And now we can insert the tuple into the page */
|
||||
newoff = PageAddItem(page, (Item) heaptup->t_data, len,
|
||||
InvalidOffsetNumber, LP_USED);
|
||||
InvalidOffsetNumber, false);
|
||||
if (newoff == InvalidOffsetNumber)
|
||||
elog(ERROR, "failed to add tuple");
|
||||
|
||||
|
Reference in New Issue
Block a user