diff options
| author | Vadim B. Mikheev <vadim4o@yahoo.com> | 1997-04-16 01:48:29 +0000 |
|---|---|---|
| committer | Vadim B. Mikheev <vadim4o@yahoo.com> | 1997-04-16 01:48:29 +0000 |
| commit | 329fb11262b79a45749a8005e7a31ff178eb6d10 (patch) | |
| tree | 29688f93c8cb433804684cd71318639661cd01dd /src/backend/access/nbtree/nbtpage.c | |
| parent | afd92957868ad2438910ad2db7f7719b46a2c2b9 (diff) | |
| download | postgresql-329fb11262b79a45749a8005e7a31ff178eb6d10.tar.gz | |
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.
Diffstat (limited to 'src/backend/access/nbtree/nbtpage.c')
| -rw-r--r-- | src/backend/access/nbtree/nbtpage.c | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c index 280f67def1..440a118fbd 100644 --- a/src/backend/access/nbtree/nbtpage.c +++ b/src/backend/access/nbtree/nbtpage.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtpage.c,v 1.6 1996/11/05 10:35:30 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtpage.c,v 1.7 1997/04/16 01:48:15 vadim Exp $ * * NOTES * Postgres btree pages look like ordinary relation pages. The opaque @@ -38,12 +38,20 @@ #define BTREE_METAPAGE 0 #define BTREE_MAGIC 0x053162 + +#ifdef BTREE_VERSION_1 +#define BTREE_VERSION 1 +#else #define BTREE_VERSION 0 +#endif typedef struct BTMetaPageData { uint32 btm_magic; uint32 btm_version; BlockNumber btm_root; +#ifdef BTREE_VERSION_1 + int32 btm_level; +#endif } BTMetaPageData; #define BTPageGetMeta(p) \ @@ -95,6 +103,9 @@ _bt_metapinit(Relation rel) metad.btm_magic = BTREE_MAGIC; metad.btm_version = BTREE_VERSION; metad.btm_root = P_NONE; +#ifdef BTREE_VERSION_1 + metad.btm_level = 0; +#endif memmove((char *) BTPageGetMeta(pg), (char *) &metad, sizeof(metad)); op = (BTPageOpaque) PageGetSpecialPointer(pg); @@ -179,6 +190,17 @@ _bt_getroot(Relation rel, int access) metaopaque = (BTPageOpaque) PageGetSpecialPointer(metapg); Assert(metaopaque->btpo_flags & BTP_META); metad = BTPageGetMeta(metapg); + + if (metad->btm_magic != BTREE_MAGIC) { + elog(WARN, "Index %s is not a btree", + RelationGetRelationName(rel)); + } + + if (metad->btm_version != BTREE_VERSION) { + elog(WARN, "Version mismatch on %s: version %d file, version %d code", + RelationGetRelationName(rel), + metad->btm_version, BTREE_VERSION); + } /* if no root page initialized yet, do it */ if (metad->btm_root == P_NONE) { @@ -209,6 +231,9 @@ _bt_getroot(Relation rel, int access) rootblkno = BufferGetBlockNumber(rootbuf); rootpg = BufferGetPage(rootbuf); metad->btm_root = rootblkno; +#ifdef BTREE_VERSION_1 + metad->btm_level = 1; +#endif _bt_pageinit(rootpg, BufferGetPageSize(rootbuf)); rootopaque = (BTPageOpaque) PageGetSpecialPointer(rootpg); rootopaque->btpo_flags |= (BTP_LEAF | BTP_ROOT); @@ -387,7 +412,7 @@ _bt_pageinit(Page page, Size size) * a reference to or lock on the metapage. */ void -_bt_metaproot(Relation rel, BlockNumber rootbknum) +_bt_metaproot(Relation rel, BlockNumber rootbknum, int level) { Buffer metabuf; Page metap; @@ -400,6 +425,12 @@ _bt_metaproot(Relation rel, BlockNumber rootbknum) Assert(metaopaque->btpo_flags & BTP_META); metad = BTPageGetMeta(metap); metad->btm_root = rootbknum; +#ifdef BTREE_VERSION_1 + if ( level == 0 ) /* called from _do_insert */ + metad->btm_level += 1; + else + metad->btm_level = level; /* called from btsort */ +#endif _bt_wrtbuf(rel, metabuf); } @@ -434,7 +465,7 @@ _bt_getstackbuf(Relation rel, BTStack stack, int access) item = (BTItem) PageGetItem(page, itemid); /* if the item is where we left it, we're done */ - if (item->bti_oid == stack->bts_btitem->bti_oid) + if ( BTItemSame (item, stack->bts_btitem) ) return (buf); /* 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) item = (BTItem) PageGetItem(page, itemid); /* if the item is where we left it, we're done */ - if (item->bti_oid == stack->bts_btitem->bti_oid) + if ( BTItemSame (item, stack->bts_btitem) ) return (buf); } } @@ -471,7 +502,7 @@ _bt_getstackbuf(Relation rel, BTStack stack, int access) offnum = OffsetNumberNext(offnum)) { itemid = PageGetItemId(page, offnum); item = (BTItem) PageGetItem(page, itemid); - if (item->bti_oid == stack->bts_btitem->bti_oid) + if ( BTItemSame (item, stack->bts_btitem) ) return (buf); } } |
