diff options
Diffstat (limited to 'src/backend/access/nbtree/nbtinsert.c')
-rw-r--r-- | src/backend/access/nbtree/nbtinsert.c | 63 |
1 files changed, 21 insertions, 42 deletions
diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c index 06c54a456dc..743583bccab 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.11 1997/03/24 08:48:09 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.12 1997/04/16 01:48:11 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -33,7 +33,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); -static void _bt_updateitem(Relation rel, Size keysz, Buffer buf, Oid bti_oid, BTItem newItem); +static void _bt_updateitem(Relation rel, Size keysz, Buffer buf, BTItem oldItem, BTItem newItem); static bool _bt_isequal (TupleDesc itupdesc, Page page, OffsetNumber offnum, int keysz, ScanKey scankey); /* @@ -357,7 +357,7 @@ _bt_insertonpg(Relation rel, DOUBLEALIGN (IndexTupleDSize (stack->bts_btitem->bti_itup)) ) { _bt_updateitem(rel, keysz, pbuf, - stack->bts_btitem->bti_oid, lowLeftItem); + stack->bts_btitem, lowLeftItem); _bt_relbuf(rel, buf, BT_WRITE); _bt_relbuf(rel, rbuf, BT_WRITE); } @@ -644,23 +644,14 @@ _bt_findsplitloc(Relation rel, OffsetNumber saferight; ItemId nxtitemid, safeitemid; BTItem safeitem, nxtitem; - IndexTuple safetup, nxttup; Size nbytes; - TupleDesc itupdesc; int natts; - int attno; - Datum attsafe; - Datum attnext; - bool null; - itupdesc = RelationGetTupleDescriptor(rel); natts = rel->rd_rel->relnatts; - saferight = start; safeitemid = PageGetItemId(page, saferight); nbytes = ItemIdGetLength(safeitemid) + sizeof(ItemIdData); safeitem = (BTItem) PageGetItem(page, safeitemid); - safetup = &(safeitem->bti_itup); i = OffsetNumberNext(start); @@ -670,26 +661,17 @@ _bt_findsplitloc(Relation rel, nxtitemid = PageGetItemId(page, i); nbytes += (ItemIdGetLength(nxtitemid) + sizeof(ItemIdData)); nxtitem = (BTItem) PageGetItem(page, nxtitemid); - nxttup = &(nxtitem->bti_itup); - - /* test against last known safe item */ - for (attno = 1; attno <= natts; attno++) { - attsafe = index_getattr(safetup, attno, itupdesc, &null); - attnext = index_getattr(nxttup, attno, itupdesc, &null); - /* - * If the tuple we're looking at isn't equal to the last safe one - * we saw, then it's our new safe tuple. - */ - - if (!_bt_invokestrat(rel, attno, BTEqualStrategyNumber, - attsafe, attnext)) { - safetup = nxttup; - saferight = i; - - /* break is for the attno for loop */ - break; - } + /* + * Test against last known safe item: + * if the tuple we're looking at isn't equal to the last safe + * one we saw, then it's our new safe tuple. + */ + if ( !_bt_itemcmp (rel, natts, + safeitem, nxtitem, BTEqualStrategyNumber) ) + { + safeitem = nxtitem; + saferight = i; } i = OffsetNumberNext(i); } @@ -753,7 +735,7 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf) rbkno = BufferGetBlockNumber(rbuf); lpage = BufferGetPage(lbuf); rpage = BufferGetPage(rbuf); - + /* * step over the high key on the left page while building the * left page pointer. @@ -793,7 +775,7 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf) _bt_wrtbuf(rel, rootbuf); /* update metadata page with new root block number */ - _bt_metaproot(rel, rootbknum); + _bt_metaproot(rel, rootbknum, 0); } /* @@ -820,7 +802,6 @@ _bt_pgaddtup(Relation rel, Page page; BTPageOpaque opaque; BTItem chkitem; - Oid afteroid; page = BufferGetPage(buf); opaque = (BTPageOpaque) PageGetSpecialPointer(page); @@ -829,14 +810,13 @@ _bt_pgaddtup(Relation rel, if (afteritem == (BTItem) NULL) { itup_off = _bt_binsrch(rel, buf, keysz, itup_scankey, BT_INSERTION); } else { - afteroid = afteritem->bti_oid; itup_off = first; do { chkitem = (BTItem) PageGetItem(page, PageGetItemId(page, itup_off)); itup_off = OffsetNumberNext(itup_off); - } while (chkitem->bti_oid != afteroid); + } while ( ! BTItemSame (chkitem, afteritem) ); } (void) PageAddItem(page, (Item) btitem, itemsize, itup_off, LP_USED); @@ -870,7 +850,6 @@ _bt_goesonpg(Relation rel, BTPageOpaque opaque; BTItem chkitem; OffsetNumber offnum, maxoff; - Oid afteroid; bool found; page = BufferGetPage(buf); @@ -908,7 +887,6 @@ _bt_goesonpg(Relation rel, return (false); /* damn, have to work for it. i hate that. */ - afteroid = afteritem->bti_oid; maxoff = PageGetMaxOffsetNumber(page); /* @@ -924,7 +902,8 @@ _bt_goesonpg(Relation rel, offnum <= maxoff; offnum = OffsetNumberNext(offnum)) { chkitem = (BTItem) PageGetItem(page, PageGetItemId(page, offnum)); - if (chkitem->bti_oid == afteroid) { + + if ( BTItemSame (chkitem, afteritem) ) { found = true; break; } @@ -1029,7 +1008,7 @@ static void _bt_updateitem(Relation rel, Size keysz, Buffer buf, - Oid bti_oid, + BTItem oldItem, BTItem newItem) { Page page; @@ -1050,10 +1029,10 @@ _bt_updateitem(Relation rel, do { item = (BTItem) PageGetItem(page, PageGetItemId(page, i)); i = OffsetNumberNext(i); - } while (i <= maxoff && item->bti_oid != bti_oid); + } while (i <= maxoff && ! BTItemSame (item, oldItem)); /* this should never happen (in theory) */ - if (item->bti_oid != bti_oid) { + if ( ! BTItemSame (item, oldItem) ) { elog(FATAL, "_bt_getstackbuf was lying!!"); } |