@ -7,7 +7,7 @@
*
*
*
*
* IDENTIFICATION
* 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 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 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 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 ) ;
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 ) ) )
DOUBLEALIGN ( IndexTupleDSize ( stack - > bts_btitem - > bti_itup ) ) )
{
{
_bt_updateitem ( rel , keysz , pbuf ,
_bt_updateitem ( rel , keysz , pbuf ,
stack - > bts_btitem - > bti_oid , lowLeftItem ) ;
stack - > bts_btitem , lowLeftItem ) ;
_bt_relbuf ( rel , buf , BT_WRITE ) ;
_bt_relbuf ( rel , buf , BT_WRITE ) ;
_bt_relbuf ( rel , rbuf , BT_WRITE ) ;
_bt_relbuf ( rel , rbuf , BT_WRITE ) ;
}
}
@ -644,23 +644,14 @@ _bt_findsplitloc(Relation rel,
OffsetNumber saferight ;
OffsetNumber saferight ;
ItemId nxtitemid , safeitemid ;
ItemId nxtitemid , safeitemid ;
BTItem safeitem , nxtitem ;
BTItem safeitem , nxtitem ;
IndexTuple safetup , nxttup ;
Size nbytes ;
Size nbytes ;
TupleDesc itupdesc ;
int natts ;
int natts ;
int attno ;
Datum attsafe ;
Datum attnext ;
bool null ;
itupdesc = RelationGetTupleDescriptor ( rel ) ;
natts = rel - > rd_rel - > relnatts ;
natts = rel - > rd_rel - > relnatts ;
saferight = start ;
saferight = start ;
safeitemid = PageGetItemId ( page , saferight ) ;
safeitemid = PageGetItemId ( page , saferight ) ;
nbytes = ItemIdGetLength ( safeitemid ) + sizeof ( ItemIdData ) ;
nbytes = ItemIdGetLength ( safeitemid ) + sizeof ( ItemIdData ) ;
safeitem = ( BTItem ) PageGetItem ( page , safeitemid ) ;
safeitem = ( BTItem ) PageGetItem ( page , safeitemid ) ;
safetup = & ( safeitem - > bti_itup ) ;
i = OffsetNumberNext ( start ) ;
i = OffsetNumberNext ( start ) ;
@ -670,26 +661,17 @@ _bt_findsplitloc(Relation rel,
nxtitemid = PageGetItemId ( page , i ) ;
nxtitemid = PageGetItemId ( page , i ) ;
nbytes + = ( ItemIdGetLength ( nxtitemid ) + sizeof ( ItemIdData ) ) ;
nbytes + = ( ItemIdGetLength ( nxtitemid ) + sizeof ( ItemIdData ) ) ;
nxtitem = ( BTItem ) PageGetItem ( page , nxtitemid ) ;
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
* Test against last known safe item :
* we saw , then it ' s our new safe tuple .
* 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 ,
if ( ! _bt_invokestrat ( rel , attno , BTEqualStrategyNumber ,
safeitem , nxtitem , BTEqualStrategyNumber ) )
attsafe , attnext ) ) {
{
safetup = nxttup ;
safeitem = nxtitem ;
saferight = i ;
saferight = i ;
/* break is for the attno for loop */
break ;
}
}
}
i = OffsetNumberNext ( i ) ;
i = OffsetNumberNext ( i ) ;
}
}
@ -793,7 +775,7 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf)
_bt_wrtbuf ( rel , rootbuf ) ;
_bt_wrtbuf ( rel , rootbuf ) ;
/* update metadata page with new root block number */
/* 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 ;
Page page ;
BTPageOpaque opaque ;
BTPageOpaque opaque ;
BTItem chkitem ;
BTItem chkitem ;
Oid afteroid ;
page = BufferGetPage ( buf ) ;
page = BufferGetPage ( buf ) ;
opaque = ( BTPageOpaque ) PageGetSpecialPointer ( page ) ;
opaque = ( BTPageOpaque ) PageGetSpecialPointer ( page ) ;
@ -829,14 +810,13 @@ _bt_pgaddtup(Relation rel,
if ( afteritem = = ( BTItem ) NULL ) {
if ( afteritem = = ( BTItem ) NULL ) {
itup_off = _bt_binsrch ( rel , buf , keysz , itup_scankey , BT_INSERTION ) ;
itup_off = _bt_binsrch ( rel , buf , keysz , itup_scankey , BT_INSERTION ) ;
} else {
} else {
afteroid = afteritem - > bti_oid ;
itup_off = first ;
itup_off = first ;
do {
do {
chkitem =
chkitem =
( BTItem ) PageGetItem ( page , PageGetItemId ( page , itup_off ) ) ;
( BTItem ) PageGetItem ( page , PageGetItemId ( page , itup_off ) ) ;
itup_off = OffsetNumberNext ( 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 ) ;
( void ) PageAddItem ( page , ( Item ) btitem , itemsize , itup_off , LP_USED ) ;
@ -870,7 +850,6 @@ _bt_goesonpg(Relation rel,
BTPageOpaque opaque ;
BTPageOpaque opaque ;
BTItem chkitem ;
BTItem chkitem ;
OffsetNumber offnum , maxoff ;
OffsetNumber offnum , maxoff ;
Oid afteroid ;
bool found ;
bool found ;
page = BufferGetPage ( buf ) ;
page = BufferGetPage ( buf ) ;
@ -908,7 +887,6 @@ _bt_goesonpg(Relation rel,
return ( false ) ;
return ( false ) ;
/* damn, have to work for it. i hate that. */
/* damn, have to work for it. i hate that. */
afteroid = afteritem - > bti_oid ;
maxoff = PageGetMaxOffsetNumber ( page ) ;
maxoff = PageGetMaxOffsetNumber ( page ) ;
/*
/*
@ -924,7 +902,8 @@ _bt_goesonpg(Relation rel,
offnum < = maxoff ;
offnum < = maxoff ;
offnum = OffsetNumberNext ( offnum ) ) {
offnum = OffsetNumberNext ( offnum ) ) {
chkitem = ( BTItem ) PageGetItem ( page , PageGetItemId ( page , offnum ) ) ;
chkitem = ( BTItem ) PageGetItem ( page , PageGetItemId ( page , offnum ) ) ;
if ( chkitem - > bti_oid = = afteroid ) {
if ( BTItemSame ( chkitem , afteritem ) ) {
found = true ;
found = true ;
break ;
break ;
}
}
@ -1029,7 +1008,7 @@ static void
_bt_updateitem ( Relation rel ,
_bt_updateitem ( Relation rel ,
Size keysz ,
Size keysz ,
Buffer buf ,
Buffer buf ,
Oid bti_oid ,
BTItem oldItem ,
BTItem newItem )
BTItem newItem )
{
{
Page page ;
Page page ;
@ -1050,10 +1029,10 @@ _bt_updateitem(Relation rel,
do {
do {
item = ( BTItem ) PageGetItem ( page , PageGetItemId ( page , i ) ) ;
item = ( BTItem ) PageGetItem ( page , PageGetItemId ( page , i ) ) ;
i = OffsetNumberNext ( i ) ;
i = OffsetNumberNext ( i ) ;
} while ( i < = maxoff & & item - > bti_oid ! = bti_oid ) ;
} while ( i < = maxoff & & ! BTItemSame ( item , oldItem ) ) ;
/* this should never happen (in theory) */
/* this should never happen (in theory) */
if ( item - > bti_oid ! = bti_oid ) {
if ( ! BTItemSame ( item , oldItem ) ) {
elog ( FATAL , " _bt_getstackbuf was lying!! " ) ;
elog ( FATAL , " _bt_getstackbuf was lying!! " ) ;
}
}