diff options
Diffstat (limited to 'src/backend/access/nbtree/nbtree.c')
-rw-r--r-- | src/backend/access/nbtree/nbtree.c | 60 |
1 files changed, 28 insertions, 32 deletions
diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c index a57bac1c810..60ea3162d6c 100644 --- a/src/backend/access/nbtree/nbtree.c +++ b/src/backend/access/nbtree/nbtree.c @@ -12,7 +12,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.65 2000/10/13 12:05:20 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.66 2000/10/20 11:01:03 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -1261,44 +1261,40 @@ _bt_del_item(Relation reln, Buffer buffer, BTItem btitem, bool insert, } lp = PageGetItemId(page, offno); - if (ItemIdDeleted(lp)) /* marked for deletion */ - { - if (!InRecovery) - elog(STOP, "btree_%s_undo: deleted target tuple in rollback", - (insert) ? "insert" : "split"); - } - else if (InRecovery) /* check heap tuple */ + + if (InRecovery) /* check heap tuple */ { - int result; - CommandId cid; - RelFileNode hnode; - Size hsize = (insert) ? SizeOfBtreeInsert : SizeOfBtreeSplit; - - memcpy(&cid, (char*)xlrec + hsize, sizeof(CommandId)); - memcpy(&hnode, (char*)xlrec + hsize + sizeof(CommandId), sizeof(RelFileNode)); - result = XLogIsOwnerOfTuple(hnode, &(btitem->bti_itup.t_tid), - record->xl_xid, cid); - if (result < 0) /* not owner */ + if (!ItemIdDeleted(lp)) { - UnlockAndReleaseBuffer(buffer); - return; - } - } - else if (! BufferIsUpdatable(buffer)) /* normal rollback */ - { - lp->lp_flags |= LP_DELETE; - MarkBufferForCleanup(buffer, IndexPageCleanup); - return; - } + int result; + CommandId cid; + RelFileNode hnode; + Size hsize = (insert) ? SizeOfBtreeInsert : SizeOfBtreeSplit; - PageIndexTupleDelete(page, offno); - if (InRecovery) - { + memcpy(&cid, (char*)xlrec + hsize, sizeof(CommandId)); + memcpy(&hnode, (char*)xlrec + hsize + sizeof(CommandId), sizeof(RelFileNode)); + result = XLogIsOwnerOfTuple(hnode, &(btitem->bti_itup.t_tid), + record->xl_xid, cid); + if (result < 0) /* not owner */ + { + UnlockAndReleaseBuffer(buffer); + return; + } + } + PageIndexTupleDelete(page, offno); pageop = (BTPageOpaque) PageGetSpecialPointer(page); pageop->btpo_flags |= BTP_REORDER; + UnlockAndWriteBuffer(buffer); + return; } - UnlockAndWriteBuffer(buffer); + /* normal rollback */ + if (ItemIdDeleted(lp)) /* marked for deletion ?! */ + elog(STOP, "btree_%s_undo: deleted target tuple in rollback", + (insert) ? "insert" : "split"); + + lp->lp_flags |= LP_DELETE; + MarkBufferForCleanup(buffer, IndexPageCleanup); return; } |