Re-use free space on index pages with duplicates.

This commit is contained in:
Vadim B. Mikheev 1999-08-09 01:39:19 +00:00
parent 10d6d411a8
commit 1ecb43a40c
1 changed files with 9 additions and 20 deletions

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.49 1999/07/19 07:07:19 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.50 1999/08/09 01:39:19 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@ -392,17 +392,18 @@ _bt_insertonpg(Relation rel,
bool is_root = lpageop->btpo_flags & BTP_ROOT;
/*
* If we have to split leaf page in the chain of duplicates by new
* duplicate then we try to look at our right sibling first.
* Instead of splitting leaf page in the chain of duplicates
* by new duplicate, insert it into some right page.
*/
if ((lpageop->btpo_flags & BTP_CHAIN) &&
(lpageop->btpo_flags & BTP_LEAF) && keys_equal)
{
bool use_left = true;
rbuf = _bt_getbuf(rel, lpageop->btpo_next, BT_WRITE);
rpage = BufferGetPage(rbuf);
rpageop = (BTPageOpaque) PageGetSpecialPointer(rpage);
/*
* some checks
*/
if (!P_RIGHTMOST(rpageop)) /* non-rightmost page */
{ /* If we have the same hikey here then
* it's yet another page in chain. */
@ -418,32 +419,20 @@ _bt_insertonpg(Relation rel,
BTGreaterStrategyNumber))
elog(FATAL, "btree: hikey is out of order");
else if (rpageop->btpo_flags & BTP_CHAIN)
/*
* If hikey > scankey then it's last page in chain and
* BTP_CHAIN must be OFF
*/
elog(FATAL, "btree: lost last page in the chain of duplicates");
/* if there is room here then we use this page. */
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;
}
if (!use_left) /* insert on the right page */
{
_bt_relbuf(rel, buf, BT_WRITE);
return (_bt_insertonpg(rel, rbuf, stack, keysz,
scankey, btitem, afteritem));
}
_bt_relbuf(rel, rbuf, BT_WRITE);
_bt_relbuf(rel, buf, BT_WRITE);
return (_bt_insertonpg(rel, rbuf, stack, keysz,
scankey, btitem, afteritem));
}
/*