diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c index c1cedd33bdaaaef907a521f483ea24b495a767b6..77410b8568da4ffc5e42f6787218c38e5598f4df 100644 --- a/src/backend/access/nbtree/nbtinsert.c +++ b/src/backend/access/nbtree/nbtinsert.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.7 1996/11/13 20:47:11 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.8 1996/12/06 09:45:30 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -31,10 +31,7 @@ static OffsetNumber _bt_findsplitloc(Relation rel, Page page, OffsetNumber start static void _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf); static OffsetNumber _bt_pgaddtup(Relation rel, Buffer buf, int keysz, ScanKey itup_scankey, Size itemsize, BTItem btitem, BTItem afteritem); static bool _bt_goesonpg(Relation rel, Buffer buf, Size keysz, ScanKey scankey, BTItem afteritem); - -#if 0 static void _bt_updateitem(Relation rel, Size keysz, Buffer buf, Oid bti_oid, BTItem newItem); -#endif /* * _bt_doinsert() -- Handle insertion of a single btitem in the tree. @@ -265,6 +262,8 @@ _bt_insertonpg(Relation rel, if (_bt_itemcmp(rel, keysz, stack->bts_btitem, new_item, BTGreaterStrategyNumber)) { + ppageop = (BTPageOpaque) PageGetSpecialPointer(page); + Assert (P_LEFTMOST(ppageop)); lowLeftItem = (BTItem) PageGetItem(page, PageGetItemId(page, P_FIRSTKEY)); @@ -278,56 +277,80 @@ _bt_insertonpg(Relation rel, /* because it's bigger than what was there before). */ /* --djm 8/21/96 */ - /* _bt_updateitem(rel, keysz, pbuf, stack->bts_btitem->bti_oid, - lowLeftItem); */ - - /* get the parent page */ - ppage = BufferGetPage(pbuf); - ppageop = (BTPageOpaque) PageGetSpecialPointer(ppage); + /* + * but it works for items with the same size and so why don't + * use it for them ? - vadim 12/05/96 + */ + if ( DOUBLEALIGN (IndexTupleDSize (lowLeftItem->bti_itup)) == + DOUBLEALIGN (IndexTupleDSize (stack->bts_btitem->bti_itup)) ) + { + _bt_updateitem(rel, keysz, pbuf, + stack->bts_btitem->bti_oid, lowLeftItem); + _bt_relbuf(rel, buf, BT_WRITE); + _bt_relbuf(rel, rbuf, BT_WRITE); + } + else + { + /* get the parent page */ + ppage = BufferGetPage(pbuf); + ppageop = (BTPageOpaque) PageGetSpecialPointer(ppage); - /* figure out which key is leftmost (if the parent page */ - /* is rightmost, too, it must be the root) */ - if(P_RIGHTMOST(ppageop)) { - leftmost_offset = P_HIKEY; - } else { - leftmost_offset = P_FIRSTKEY; - } - PageIndexTupleDelete(ppage, leftmost_offset); + /* + * figure out which key is leftmost (if the parent page + * is rightmost, too, it must be the root) + */ + if(P_RIGHTMOST(ppageop)) { + leftmost_offset = P_HIKEY; + } else { + leftmost_offset = P_FIRSTKEY; + } + PageIndexTupleDelete(ppage, leftmost_offset); - /* don't write anything out yet--we still have the write */ - /* lock, and now we call another _bt_insertonpg to */ - /* insert the correct leftmost key */ + /* + * don't write anything out yet--we still have the write + * lock, and now we call another _bt_insertonpg to + * insert the correct leftmost key + */ - /* make a new leftmost item, using the tuple data from */ - /* lowLeftItem. point it to the left child. */ - /* update it on the stack at the same time. */ - bknum = BufferGetBlockNumber(buf); - pfree(stack->bts_btitem); - stack->bts_btitem = _bt_formitem(&(lowLeftItem->bti_itup)); - ItemPointerSet(&(stack->bts_btitem->bti_itup.t_tid), + /* + * make a new leftmost item, using the tuple data from + * lowLeftItem. point it to the left child. + * update it on the stack at the same time. + */ + bknum = BufferGetBlockNumber(buf); + pfree(stack->bts_btitem); + stack->bts_btitem = _bt_formitem(&(lowLeftItem->bti_itup)); + ItemPointerSet(&(stack->bts_btitem->bti_itup.t_tid), bknum, P_HIKEY); - /* unlock the children before doing this */ - _bt_relbuf(rel, buf, BT_WRITE); - _bt_relbuf(rel, rbuf, BT_WRITE); + /* unlock the children before doing this */ + _bt_relbuf(rel, buf, BT_WRITE); + _bt_relbuf(rel, rbuf, BT_WRITE); - /* a regular _bt_binsrch should find the right place to */ - /* put the new entry, since it should be lower than any */ - /* other key on the page, therefore set afteritem to NULL */ - newskey = _bt_mkscankey(rel, &(stack->bts_btitem->bti_itup)); - newres = _bt_insertonpg(rel, pbuf, stack->bts_parent, + /* + * a regular _bt_binsrch should find the right place to + * put the new entry, since it should be lower than any + * other key on the page, therefore set afteritem to NULL + */ + newskey = _bt_mkscankey(rel, &(stack->bts_btitem->bti_itup)); + newres = _bt_insertonpg(rel, pbuf, stack->bts_parent, keysz, newskey, stack->bts_btitem, NULL); - pfree(newres); - pfree(newskey); + pfree(newres); + pfree(newskey); - /* we have now lost our lock on the parent buffer, and */ - /* need to get it back. */ - pbuf = _bt_getstackbuf(rel, stack, BT_WRITE); - } else { - _bt_relbuf(rel, buf, BT_WRITE); - _bt_relbuf(rel, rbuf, BT_WRITE); + /* + * we have now lost our lock on the parent buffer, and + * need to get it back. + */ + pbuf = _bt_getstackbuf(rel, stack, BT_WRITE); + } + } + else + { + _bt_relbuf(rel, buf, BT_WRITE); + _bt_relbuf(rel, rbuf, BT_WRITE); } newskey = _bt_mkscankey(rel, &(new_item->bti_itup)); @@ -872,8 +895,6 @@ _bt_itemcmp(Relation rel, return (true); } -#if 0 -/* gone since updating in place doesn't work in general --djm 11/13/96 */ /* * _bt_updateitem() -- updates the key of the item identified by the * oid with the key of newItem (done in place if @@ -912,18 +933,23 @@ _bt_updateitem(Relation rel, elog(FATAL, "_bt_getstackbuf was lying!!"); } + /* + * It's defined by caller (_bt_insertonpg) + */ + /* if(IndexTupleDSize(newItem->bti_itup) > IndexTupleDSize(item->bti_itup)) { elog(NOTICE, "trying to overwrite a smaller value with a bigger one in _bt_updateitem"); elog(WARN, "this is not good."); } + */ oldIndexTuple = &(item->bti_itup); newIndexTuple = &(newItem->bti_itup); /* keep the original item pointer */ - ItemPointerCopy(&(oldIndexTuple->t_tid), &itemPtrData); - CopyIndexTuple(newIndexTuple, &oldIndexTuple); - ItemPointerCopy(&itemPtrData, &(oldIndexTuple->t_tid)); + ItemPointerCopy(&(oldIndexTuple->t_tid), &itemPtrData); + CopyIndexTuple(newIndexTuple, &oldIndexTuple); + ItemPointerCopy(&itemPtrData, &(oldIndexTuple->t_tid)); + } -#endif