1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-31 17:02:12 +03:00

Patches for Vadim's multikey indexing...

This commit is contained in:
Marc G. Fournier
1997-03-18 18:41:37 +00:00
parent c3d637ac3a
commit d146305065
9 changed files with 418 additions and 252 deletions

View File

@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.14 1997/02/18 17:13:48 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.15 1997/03/18 18:38:41 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@@ -562,7 +562,6 @@ _bt_next(IndexScanDesc scan, ScanDirection dir)
Page page;
OffsetNumber offnum;
RetrieveIndexResult res;
BlockNumber blkno;
ItemPointer current;
BTItem btitem;
IndexTuple itup;
@@ -584,31 +583,35 @@ _bt_next(IndexScanDesc scan, ScanDirection dir)
/* we still have the buffer pinned and locked */
buf = so->btso_curbuf;
blkno = BufferGetBlockNumber(buf);
/* step one tuple in the appropriate direction */
if (!_bt_step(scan, &buf, dir))
return ((RetrieveIndexResult) NULL);
do
{
/* step one tuple in the appropriate direction */
if (!_bt_step(scan, &buf, dir))
return ((RetrieveIndexResult) NULL);
/* by here, current is the tuple we want to return */
offnum = ItemPointerGetOffsetNumber(current);
page = BufferGetPage(buf);
btitem = (BTItem) PageGetItem(page, PageGetItemId(page, offnum));
itup = &btitem->bti_itup;
/* by here, current is the tuple we want to return */
offnum = ItemPointerGetOffsetNumber(current);
page = BufferGetPage(buf);
btitem = (BTItem) PageGetItem(page, PageGetItemId(page, offnum));
itup = &btitem->bti_itup;
if (_bt_checkqual(scan, itup)) {
res = FormRetrieveIndexResult(current, &(itup->t_tid));
if (_bt_checkqual(scan, itup))
{
res = FormRetrieveIndexResult(current, &(itup->t_tid));
/* remember which buffer we have pinned and locked */
so->btso_curbuf = buf;
} else {
ItemPointerSetInvalid(current);
so->btso_curbuf = InvalidBuffer;
_bt_relbuf(rel, buf, BT_READ);
res = (RetrieveIndexResult) NULL;
}
/* remember which buffer we have pinned and locked */
so->btso_curbuf = buf;
return (res);
}
} while ( _bt_checkforkeys (scan, itup, so->numberOfFirstKeys) );
ItemPointerSetInvalid(current);
so->btso_curbuf = InvalidBuffer;
_bt_relbuf(rel, buf, BT_READ);
return (res);
return ((RetrieveIndexResult) NULL);
}
/*
@@ -660,13 +663,6 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
* ordered to take advantage of index ordering) to position ourselves
* at the right place in the scan.
*/
/*
* XXX -- The attribute number stored in the scan key is the attno
* in the heap relation. We need to transmogrify this into
* the index relation attno here. For the moment, we have
* hardwired attno == 1.
*/
proc = index_getprocid(rel, 1, BTORDER_PROC);
ScanKeyEntryInitialize(&skdata, so->keyData[0].sk_flags, 1, proc,
so->keyData[0].sk_argument);
@@ -802,12 +798,20 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
btitem = (BTItem) PageGetItem(page, PageGetItemId(page, offnum));
itup = &btitem->bti_itup;
if (_bt_checkqual(scan, itup)) {
if ( _bt_checkqual(scan, itup) )
{
res = FormRetrieveIndexResult(current, &(itup->t_tid));
/* remember which buffer we have pinned */
so->btso_curbuf = buf;
} else {
}
else if ( _bt_checkforkeys (scan, itup, so->numberOfFirstKeys) )
{
so->btso_curbuf = buf;
return (_bt_next (scan, dir));
}
else
{
ItemPointerSetInvalid(current);
so->btso_curbuf = InvalidBuffer;
_bt_relbuf(rel, buf, BT_READ);
@@ -1224,7 +1228,14 @@ _bt_endpoint(IndexScanDesc scan, ScanDirection dir)
/* remember which buffer we have pinned */
so->btso_curbuf = buf;
} else {
}
else if ( _bt_checkforkeys (scan, itup, so->numberOfFirstKeys) )
{
so->btso_curbuf = buf;
return (_bt_next (scan, dir));
}
else
{
_bt_relbuf(rel, buf, BT_READ);
res = (RetrieveIndexResult) NULL;
}