Skip to content

Commit 329fb11

Browse files
committed
1. BTREE_VERSION_1: using bti_itup->t_tid as unique identifier for a given
index tuple (logical position within A LEVEL). bti_oid & bti_dummy taken off from BTItemData. 2. Fix for multi-column indices (nbtsearch.c): _bt_binsrch() - for searches on internal pages having keysize < number of attrs we point at the last item < the scankey, not at the first item = the scankey; _bt_moveright() - if keysize < number of attrs we compare scankey with _last_ item on current page to decide should we move right or not.
1 parent afd9295 commit 329fb11

File tree

5 files changed

+167
-99
lines changed

5 files changed

+167
-99
lines changed

src/backend/access/nbtree/nbtinsert.c

Lines changed: 21 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.11 1997/03/24 08:48:09 vadim Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.12 1997/04/16 01:48:11 vadim Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -33,7 +33,7 @@ static OffsetNumber _bt_findsplitloc(Relation rel, Page page, OffsetNumber start
3333
static void _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf);
3434
static OffsetNumber _bt_pgaddtup(Relation rel, Buffer buf, int keysz, ScanKey itup_scankey, Size itemsize, BTItem btitem, BTItem afteritem);
3535
static bool _bt_goesonpg(Relation rel, Buffer buf, Size keysz, ScanKey scankey, BTItem afteritem);
36-
static void _bt_updateitem(Relation rel, Size keysz, Buffer buf, Oid bti_oid, BTItem newItem);
36+
static void _bt_updateitem(Relation rel, Size keysz, Buffer buf, BTItem oldItem, BTItem newItem);
3737
static bool _bt_isequal (TupleDesc itupdesc, Page page, OffsetNumber offnum, int keysz, ScanKey scankey);
3838

3939
/*
@@ -357,7 +357,7 @@ _bt_insertonpg(Relation rel,
357357
DOUBLEALIGN (IndexTupleDSize (stack->bts_btitem->bti_itup)) )
358358
{
359359
_bt_updateitem(rel, keysz, pbuf,
360-
stack->bts_btitem->bti_oid, lowLeftItem);
360+
stack->bts_btitem, lowLeftItem);
361361
_bt_relbuf(rel, buf, BT_WRITE);
362362
_bt_relbuf(rel, rbuf, BT_WRITE);
363363
}
@@ -644,23 +644,14 @@ _bt_findsplitloc(Relation rel,
644644
OffsetNumber saferight;
645645
ItemId nxtitemid, safeitemid;
646646
BTItem safeitem, nxtitem;
647-
IndexTuple safetup, nxttup;
648647
Size nbytes;
649-
TupleDesc itupdesc;
650648
int natts;
651-
int attno;
652-
Datum attsafe;
653-
Datum attnext;
654-
bool null;
655649

656-
itupdesc = RelationGetTupleDescriptor(rel);
657650
natts = rel->rd_rel->relnatts;
658-
659651
saferight = start;
660652
safeitemid = PageGetItemId(page, saferight);
661653
nbytes = ItemIdGetLength(safeitemid) + sizeof(ItemIdData);
662654
safeitem = (BTItem) PageGetItem(page, safeitemid);
663-
safetup = &(safeitem->bti_itup);
664655

665656
i = OffsetNumberNext(start);
666657

@@ -670,26 +661,17 @@ _bt_findsplitloc(Relation rel,
670661
nxtitemid = PageGetItemId(page, i);
671662
nbytes += (ItemIdGetLength(nxtitemid) + sizeof(ItemIdData));
672663
nxtitem = (BTItem) PageGetItem(page, nxtitemid);
673-
nxttup = &(nxtitem->bti_itup);
674-
675-
/* test against last known safe item */
676-
for (attno = 1; attno <= natts; attno++) {
677-
attsafe = index_getattr(safetup, attno, itupdesc, &null);
678-
attnext = index_getattr(nxttup, attno, itupdesc, &null);
679664

680-
/*
681-
* If the tuple we're looking at isn't equal to the last safe one
682-
* we saw, then it's our new safe tuple.
683-
*/
684-
685-
if (!_bt_invokestrat(rel, attno, BTEqualStrategyNumber,
686-
attsafe, attnext)) {
687-
safetup = nxttup;
688-
saferight = i;
689-
690-
/* break is for the attno for loop */
691-
break;
692-
}
665+
/*
666+
* Test against last known safe item:
667+
* if the tuple we're looking at isn't equal to the last safe
668+
* one we saw, then it's our new safe tuple.
669+
*/
670+
if ( !_bt_itemcmp (rel, natts,
671+
safeitem, nxtitem, BTEqualStrategyNumber) )
672+
{
673+
safeitem = nxtitem;
674+
saferight = i;
693675
}
694676
i = OffsetNumberNext(i);
695677
}
@@ -753,7 +735,7 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf)
753735
rbkno = BufferGetBlockNumber(rbuf);
754736
lpage = BufferGetPage(lbuf);
755737
rpage = BufferGetPage(rbuf);
756-
738+
757739
/*
758740
* step over the high key on the left page while building the
759741
* left page pointer.
@@ -793,7 +775,7 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf)
793775
_bt_wrtbuf(rel, rootbuf);
794776

795777
/* update metadata page with new root block number */
796-
_bt_metaproot(rel, rootbknum);
778+
_bt_metaproot(rel, rootbknum, 0);
797779
}
798780

799781
/*
@@ -820,7 +802,6 @@ _bt_pgaddtup(Relation rel,
820802
Page page;
821803
BTPageOpaque opaque;
822804
BTItem chkitem;
823-
Oid afteroid;
824805

825806
page = BufferGetPage(buf);
826807
opaque = (BTPageOpaque) PageGetSpecialPointer(page);
@@ -829,14 +810,13 @@ _bt_pgaddtup(Relation rel,
829810
if (afteritem == (BTItem) NULL) {
830811
itup_off = _bt_binsrch(rel, buf, keysz, itup_scankey, BT_INSERTION);
831812
} else {
832-
afteroid = afteritem->bti_oid;
833813
itup_off = first;
834814

835815
do {
836816
chkitem =
837817
(BTItem) PageGetItem(page, PageGetItemId(page, itup_off));
838818
itup_off = OffsetNumberNext(itup_off);
839-
} while (chkitem->bti_oid != afteroid);
819+
} while ( ! BTItemSame (chkitem, afteritem) );
840820
}
841821

842822
(void) PageAddItem(page, (Item) btitem, itemsize, itup_off, LP_USED);
@@ -870,7 +850,6 @@ _bt_goesonpg(Relation rel,
870850
BTPageOpaque opaque;
871851
BTItem chkitem;
872852
OffsetNumber offnum, maxoff;
873-
Oid afteroid;
874853
bool found;
875854

876855
page = BufferGetPage(buf);
@@ -908,7 +887,6 @@ _bt_goesonpg(Relation rel,
908887
return (false);
909888

910889
/* damn, have to work for it. i hate that. */
911-
afteroid = afteritem->bti_oid;
912890
maxoff = PageGetMaxOffsetNumber(page);
913891

914892
/*
@@ -924,7 +902,8 @@ _bt_goesonpg(Relation rel,
924902
offnum <= maxoff;
925903
offnum = OffsetNumberNext(offnum)) {
926904
chkitem = (BTItem) PageGetItem(page, PageGetItemId(page, offnum));
927-
if (chkitem->bti_oid == afteroid) {
905+
906+
if ( BTItemSame (chkitem, afteritem) ) {
928907
found = true;
929908
break;
930909
}
@@ -1029,7 +1008,7 @@ static void
10291008
_bt_updateitem(Relation rel,
10301009
Size keysz,
10311010
Buffer buf,
1032-
Oid bti_oid,
1011+
BTItem oldItem,
10331012
BTItem newItem)
10341013
{
10351014
Page page;
@@ -1050,10 +1029,10 @@ _bt_updateitem(Relation rel,
10501029
do {
10511030
item = (BTItem) PageGetItem(page, PageGetItemId(page, i));
10521031
i = OffsetNumberNext(i);
1053-
} while (i <= maxoff && item->bti_oid != bti_oid);
1032+
} while (i <= maxoff && ! BTItemSame (item, oldItem));
10541033

10551034
/* this should never happen (in theory) */
1056-
if (item->bti_oid != bti_oid) {
1035+
if ( ! BTItemSame (item, oldItem) ) {
10571036
elog(FATAL, "_bt_getstackbuf was lying!!");
10581037
}
10591038

src/backend/access/nbtree/nbtpage.c

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtpage.c,v 1.6 1996/11/05 10:35:30 scrappy Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtpage.c,v 1.7 1997/04/16 01:48:15 vadim Exp $
1212
*
1313
* NOTES
1414
* Postgres btree pages look like ordinary relation pages. The opaque
@@ -38,12 +38,20 @@
3838

3939
#define BTREE_METAPAGE 0
4040
#define BTREE_MAGIC 0x053162
41+
42+
#ifdef BTREE_VERSION_1
43+
#define BTREE_VERSION 1
44+
#else
4145
#define BTREE_VERSION 0
46+
#endif
4247

4348
typedef struct BTMetaPageData {
4449
uint32 btm_magic;
4550
uint32 btm_version;
4651
BlockNumber btm_root;
52+
#ifdef BTREE_VERSION_1
53+
int32 btm_level;
54+
#endif
4755
} BTMetaPageData;
4856

4957
#define BTPageGetMeta(p) \
@@ -95,6 +103,9 @@ _bt_metapinit(Relation rel)
95103
metad.btm_magic = BTREE_MAGIC;
96104
metad.btm_version = BTREE_VERSION;
97105
metad.btm_root = P_NONE;
106+
#ifdef BTREE_VERSION_1
107+
metad.btm_level = 0;
108+
#endif
98109
memmove((char *) BTPageGetMeta(pg), (char *) &metad, sizeof(metad));
99110

100111
op = (BTPageOpaque) PageGetSpecialPointer(pg);
@@ -179,6 +190,17 @@ _bt_getroot(Relation rel, int access)
179190
metaopaque = (BTPageOpaque) PageGetSpecialPointer(metapg);
180191
Assert(metaopaque->btpo_flags & BTP_META);
181192
metad = BTPageGetMeta(metapg);
193+
194+
if (metad->btm_magic != BTREE_MAGIC) {
195+
elog(WARN, "Index %s is not a btree",
196+
RelationGetRelationName(rel));
197+
}
198+
199+
if (metad->btm_version != BTREE_VERSION) {
200+
elog(WARN, "Version mismatch on %s: version %d file, version %d code",
201+
RelationGetRelationName(rel),
202+
metad->btm_version, BTREE_VERSION);
203+
}
182204

183205
/* if no root page initialized yet, do it */
184206
if (metad->btm_root == P_NONE) {
@@ -209,6 +231,9 @@ _bt_getroot(Relation rel, int access)
209231
rootblkno = BufferGetBlockNumber(rootbuf);
210232
rootpg = BufferGetPage(rootbuf);
211233
metad->btm_root = rootblkno;
234+
#ifdef BTREE_VERSION_1
235+
metad->btm_level = 1;
236+
#endif
212237
_bt_pageinit(rootpg, BufferGetPageSize(rootbuf));
213238
rootopaque = (BTPageOpaque) PageGetSpecialPointer(rootpg);
214239
rootopaque->btpo_flags |= (BTP_LEAF | BTP_ROOT);
@@ -387,7 +412,7 @@ _bt_pageinit(Page page, Size size)
387412
* a reference to or lock on the metapage.
388413
*/
389414
void
390-
_bt_metaproot(Relation rel, BlockNumber rootbknum)
415+
_bt_metaproot(Relation rel, BlockNumber rootbknum, int level)
391416
{
392417
Buffer metabuf;
393418
Page metap;
@@ -400,6 +425,12 @@ _bt_metaproot(Relation rel, BlockNumber rootbknum)
400425
Assert(metaopaque->btpo_flags & BTP_META);
401426
metad = BTPageGetMeta(metap);
402427
metad->btm_root = rootbknum;
428+
#ifdef BTREE_VERSION_1
429+
if ( level == 0 ) /* called from _do_insert */
430+
metad->btm_level += 1;
431+
else
432+
metad->btm_level = level; /* called from btsort */
433+
#endif
403434
_bt_wrtbuf(rel, metabuf);
404435
}
405436

@@ -434,7 +465,7 @@ _bt_getstackbuf(Relation rel, BTStack stack, int access)
434465
item = (BTItem) PageGetItem(page, itemid);
435466

436467
/* if the item is where we left it, we're done */
437-
if (item->bti_oid == stack->bts_btitem->bti_oid)
468+
if ( BTItemSame (item, stack->bts_btitem) )
438469
return (buf);
439470

440471
/* if the item has just moved right on this page, we're done */
@@ -445,7 +476,7 @@ _bt_getstackbuf(Relation rel, BTStack stack, int access)
445476
item = (BTItem) PageGetItem(page, itemid);
446477

447478
/* if the item is where we left it, we're done */
448-
if (item->bti_oid == stack->bts_btitem->bti_oid)
479+
if ( BTItemSame (item, stack->bts_btitem) )
449480
return (buf);
450481
}
451482
}
@@ -471,7 +502,7 @@ _bt_getstackbuf(Relation rel, BTStack stack, int access)
471502
offnum = OffsetNumberNext(offnum)) {
472503
itemid = PageGetItemId(page, offnum);
473504
item = (BTItem) PageGetItem(page, itemid);
474-
if (item->bti_oid == stack->bts_btitem->bti_oid)
505+
if ( BTItemSame (item, stack->bts_btitem) )
475506
return (buf);
476507
}
477508
}

0 commit comments

Comments
 (0)