mirror of https://github.com/postgres/postgres
Re-use free space on index pages with duplicates.
This commit is contained in:
parent
10d6d411a8
commit
1ecb43a40c
|
@ -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));
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue