summaryrefslogtreecommitdiff
path: root/src/backend/access/nbtree
diff options
context:
space:
mode:
authorVadim B. Mikheev <vadim4o@yahoo.com>1997-05-31 06:35:56 +0000
committerVadim B. Mikheev <vadim4o@yahoo.com>1997-05-31 06:35:56 +0000
commit139858e6993fa9b235fed221a1f69d207dc932d0 (patch)
tree4c95831bfb51f3920acc61a1451c4e01b36cc07a /src/backend/access/nbtree
parent5cf55737a47d6e9a07489f10adb145dd06f262c6 (diff)
downloadpostgresql-139858e6993fa9b235fed221a1f69d207dc932d0.tar.gz
If we have to split leaf page in the chain of duplicates
then we try to look at our right sibling first, but not farther, as it was in yesterday fix.
Diffstat (limited to 'src/backend/access/nbtree')
-rw-r--r--src/backend/access/nbtree/nbtinsert.c65
1 files changed, 24 insertions, 41 deletions
diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c
index 534927717f..c4f0fc0d04 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.13 1997/05/30 18:35:31 vadim Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.14 1997/05/31 06:35:56 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -287,31 +287,22 @@ _bt_insertonpg(Relation rel,
/*
* If we have to split leaf page in the chain of duplicates
- * then we try to move righter to avoid splitting.
+ * then we try to look at our right sibling first.
*/
if ( ( lpageop->btpo_flags & BTP_CHAIN ) &&
( lpageop->btpo_flags & BTP_LEAF ) )
{
bool use_left = true;
+ bool keys_equal = false;
- for ( ; ; )
- {
- bool keys_equal = false;
-
- rbuf = _bt_getbuf(rel, lpageop->btpo_next, BT_WRITE);
- rpage = BufferGetPage(rbuf);
- rpageop = (BTPageOpaque) PageGetSpecialPointer(rpage);
- if ( P_RIGHTMOST (rpageop) )
- {
- Assert ( !( rpageop->btpo_flags & BTP_CHAIN ) );
- use_left = false;
- break;
- }
- /*
+ rbuf = _bt_getbuf(rel, lpageop->btpo_next, BT_WRITE);
+ rpage = BufferGetPage(rbuf);
+ rpageop = (BTPageOpaque) PageGetSpecialPointer(rpage);
+ if ( !P_RIGHTMOST (rpageop) ) /* non-rightmost page */
+ { /*
* If we have the same hikey here then it's
- * yet another page in chain and we may move
- * even righter.
- */
+ * yet another page in chain.
+ */
if ( _bt_skeycmp (rel, keysz, scankey, rpage,
PageGetItemId(rpage, P_HIKEY),
BTEqualStrategyNumber) )
@@ -321,12 +312,12 @@ _bt_insertonpg(Relation rel,
keys_equal = true;
}
else if ( _bt_skeycmp (rel, keysz, scankey, rpage,
- PageGetItemId(rpage, P_HIKEY),
- BTGreaterStrategyNumber) )
- elog (FATAL, "btree: hikey is out of order");
+ PageGetItemId(rpage, P_HIKEY),
+ BTGreaterStrategyNumber) )
+ elog (FATAL, "btree: hikey is out of order");
/*
* If hikey > scankey and BTP_CHAIN is ON
- * then it's first page of the chain of higher keys:
+ * then it's first page of the chain of higher keys:
* our left sibling hikey was lying! We can't add new
* item here, but we can turn BTP_CHAIN off on our
* left page and overwrite its hikey.
@@ -336,26 +327,19 @@ _bt_insertonpg(Relation rel,
BTItem tmp;
lpageop->btpo_flags &= ~BTP_CHAIN;
- tmp = (BTItem) PageGetItem(rpage,
- PageGetItemId(rpage, P_HIKEY));
+ tmp = (BTItem) PageGetItem(rpage, PageGetItemId(rpage, P_HIKEY));
hiRightItem = _bt_formitem(&(tmp->bti_itup));
- break;
}
- /*
- * if there is room here or hikey > scankey (so it's our
- * last page in the chain and we can't move righter)
- * we have to use this page .
- */
- if ( PageGetFreeSpace (rpage) > itemsz || !keys_equal )
- {
+ /* if there is room here then we use this page. */
+ else if ( PageGetFreeSpace (rpage) > itemsz )
+ use_left = false;
+ }
+ else /* rightmost page */
+ {
+ Assert ( !( rpageop->btpo_flags & BTP_CHAIN ) );
+ /* if there is room here then we use this page. */
+ if ( PageGetFreeSpace (rpage) > itemsz )
use_left = false;
- break;
- }
- /* try to move righter */
- _bt_relbuf(rel, buf, BT_WRITE);
- buf = rbuf;
- page = rpage;
- lpageop = rpageop;
}
if ( !use_left ) /* insert on the right page */
{
@@ -364,7 +348,6 @@ _bt_insertonpg(Relation rel,
scankey, btitem, afteritem) );
}
_bt_relbuf(rel, rbuf, BT_WRITE);
- bknum = BufferGetBlockNumber(buf);
}
/* split the buffer into left and right halves */