diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2002-05-20 23:51:44 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2002-05-20 23:51:44 +0000 |
commit | 44fbe20d620d4f2e39aaa9896de4683e55b0d317 (patch) | |
tree | 5717c7d32f5f7ef72318c70c641129176820a2d0 /src/backend/access/gist | |
parent | c961474c96fd1fedc25896a1de9a98caeedfbe49 (diff) | |
download | postgresql-44fbe20d620d4f2e39aaa9896de4683e55b0d317.tar.gz postgresql-44fbe20d620d4f2e39aaa9896de4683e55b0d317.zip |
Restructure indexscan API (index_beginscan, index_getnext) per
yesterday's proposal to pghackers. Also remove unnecessary parameters
to heap_beginscan, heap_rescan. I modified pg_proc.h to reflect the
new numbers of parameters for the AM interface routines, but did not
force an initdb because nothing actually looks at those fields.
Diffstat (limited to 'src/backend/access/gist')
-rw-r--r-- | src/backend/access/gist/gist.c | 20 | ||||
-rw-r--r-- | src/backend/access/gist/gistget.c | 112 | ||||
-rw-r--r-- | src/backend/access/gist/gistscan.c | 44 |
3 files changed, 57 insertions, 119 deletions
diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index 34013f46889..1da836a3648 100644 --- a/src/backend/access/gist/gist.c +++ b/src/backend/access/gist/gist.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/gist/gist.c,v 1.91 2002/03/06 06:09:15 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/gist/gist.c,v 1.92 2002/05/20 23:51:40 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1590,7 +1590,6 @@ gistbulkdelete(PG_FUNCTION_ARGS) BlockNumber num_pages; double tuples_removed; double num_index_tuples; - RetrieveIndexResult res; IndexScanDesc iscan; tuples_removed = 0; @@ -1607,23 +1606,20 @@ gistbulkdelete(PG_FUNCTION_ARGS) */ /* walk through the entire index */ - iscan = index_beginscan(rel, false, 0, (ScanKey) NULL); + iscan = index_beginscan(NULL, rel, SnapshotAny, 0, (ScanKey) NULL); - while ((res = index_getnext(iscan, ForwardScanDirection)) - != (RetrieveIndexResult) NULL) + while (index_getnext_indexitem(iscan, ForwardScanDirection)) { - ItemPointer heapptr = &res->heap_iptr; - - if (callback(heapptr, callback_state)) + if (callback(&iscan->xs_ctup.t_self, callback_state)) { - ItemPointer indexptr = &res->index_iptr; + ItemPointerData indextup = iscan->currentItemData; BlockNumber blkno; OffsetNumber offnum; Buffer buf; Page page; - blkno = ItemPointerGetBlockNumber(indexptr); - offnum = ItemPointerGetOffsetNumber(indexptr); + blkno = ItemPointerGetBlockNumber(&indextup); + offnum = ItemPointerGetOffsetNumber(&indextup); /* adjust any scans that will be affected by this deletion */ gistadjscans(rel, GISTOP_DEL, blkno, offnum); @@ -1640,8 +1636,6 @@ gistbulkdelete(PG_FUNCTION_ARGS) } else num_index_tuples += 1; - - pfree(res); } index_endscan(iscan); diff --git a/src/backend/access/gist/gistget.c b/src/backend/access/gist/gistget.c index 826644288a2..96d2e5bc4e3 100644 --- a/src/backend/access/gist/gistget.c +++ b/src/backend/access/gist/gistget.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/gist/gistget.c,v 1.32 2002/03/05 05:30:31 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/gist/gistget.c,v 1.33 2002/05/20 23:51:41 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -20,10 +20,9 @@ static OffsetNumber gistfindnext(IndexScanDesc s, Page p, OffsetNumber n, ScanDirection dir); -static RetrieveIndexResult gistscancache(IndexScanDesc s, ScanDirection dir); -static RetrieveIndexResult gistfirst(IndexScanDesc s, ScanDirection dir); -static RetrieveIndexResult gistnext(IndexScanDesc s, ScanDirection dir); -static ItemPointer gistheapptr(Relation r, ItemPointer itemp); +static bool gistscancache(IndexScanDesc s, ScanDirection dir); +static bool gistfirst(IndexScanDesc s, ScanDirection dir); +static bool gistnext(IndexScanDesc s, ScanDirection dir); static bool gistindex_keytest(IndexTuple tuple, int scanKeySize, ScanKey key, GISTSTATE *giststate, Relation r, Page p, OffsetNumber offset); @@ -34,35 +33,34 @@ gistgettuple(PG_FUNCTION_ARGS) { IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0); ScanDirection dir = (ScanDirection) PG_GETARG_INT32(1); - RetrieveIndexResult res; + bool res; /* if we have it cached in the scan desc, just return the value */ - if ((res = gistscancache(s, dir)) != (RetrieveIndexResult) NULL) - PG_RETURN_POINTER(res); + if (gistscancache(s, dir)) + PG_RETURN_BOOL(true); /* not cached, so we'll have to do some work */ if (ItemPointerIsValid(&(s->currentItemData))) res = gistnext(s, dir); else res = gistfirst(s, dir); - PG_RETURN_POINTER(res); + PG_RETURN_BOOL(res); } -static RetrieveIndexResult +static bool gistfirst(IndexScanDesc s, ScanDirection dir) { Buffer b; Page p; OffsetNumber n; OffsetNumber maxoff; - RetrieveIndexResult res; GISTPageOpaque po; GISTScanOpaque so; GISTSTACK *stk; BlockNumber blk; IndexTuple it; - b = ReadBuffer(s->relation, GISTP_ROOT); + b = ReadBuffer(s->indexRelation, GISTP_ROOT); p = BufferGetPage(b); po = (GISTPageOpaque) PageGetSpecialPointer(p); so = (GISTScanOpaque) s->opaque; @@ -77,13 +75,12 @@ gistfirst(IndexScanDesc s, ScanDirection dir) while (n < FirstOffsetNumber || n > maxoff) { - ReleaseBuffer(b); if (so->s_stack == (GISTSTACK *) NULL) - return (RetrieveIndexResult) NULL; + return false; stk = so->s_stack; - b = ReadBuffer(s->relation, stk->gs_blk); + b = ReadBuffer(s->indexRelation, stk->gs_blk); p = BufferGetPage(b); po = (GISTPageOpaque) PageGetSpecialPointer(p); maxoff = PageGetMaxOffsetNumber(p); @@ -103,10 +100,10 @@ gistfirst(IndexScanDesc s, ScanDirection dir) it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n)); - res = FormRetrieveIndexResult(&(s->currentItemData), &(it->t_tid)); + s->xs_ctup.t_self = it->t_tid; ReleaseBuffer(b); - return res; + return true; } else { @@ -120,21 +117,20 @@ gistfirst(IndexScanDesc s, ScanDirection dir) blk = ItemPointerGetBlockNumber(&(it->t_tid)); ReleaseBuffer(b); - b = ReadBuffer(s->relation, blk); + b = ReadBuffer(s->indexRelation, blk); p = BufferGetPage(b); po = (GISTPageOpaque) PageGetSpecialPointer(p); } } } -static RetrieveIndexResult +static bool gistnext(IndexScanDesc s, ScanDirection dir) { Buffer b; Page p; OffsetNumber n; OffsetNumber maxoff; - RetrieveIndexResult res; GISTPageOpaque po; GISTScanOpaque so; GISTSTACK *stk; @@ -149,7 +145,7 @@ gistnext(IndexScanDesc s, ScanDirection dir) else n = OffsetNumberPrev(n); - b = ReadBuffer(s->relation, blk); + b = ReadBuffer(s->indexRelation, blk); p = BufferGetPage(b); po = (GISTPageOpaque) PageGetSpecialPointer(p); so = (GISTScanOpaque) s->opaque; @@ -161,13 +157,12 @@ gistnext(IndexScanDesc s, ScanDirection dir) while (n < FirstOffsetNumber || n > maxoff) { - ReleaseBuffer(b); if (so->s_stack == (GISTSTACK *) NULL) - return (RetrieveIndexResult) NULL; + return false; stk = so->s_stack; - b = ReadBuffer(s->relation, stk->gs_blk); + b = ReadBuffer(s->indexRelation, stk->gs_blk); p = BufferGetPage(b); maxoff = PageGetMaxOffsetNumber(p); po = (GISTPageOpaque) PageGetSpecialPointer(p); @@ -187,10 +182,10 @@ gistnext(IndexScanDesc s, ScanDirection dir) it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n)); - res = FormRetrieveIndexResult(&(s->currentItemData), &(it->t_tid)); + s->xs_ctup.t_self = it->t_tid; ReleaseBuffer(b); - return res; + return true; } else { @@ -204,7 +199,7 @@ gistnext(IndexScanDesc s, ScanDirection dir) blk = ItemPointerGetBlockNumber(&(it->t_tid)); ReleaseBuffer(b); - b = ReadBuffer(s->relation, blk); + b = ReadBuffer(s->indexRelation, blk); p = BufferGetPage(b); po = (GISTPageOpaque) PageGetSpecialPointer(p); @@ -233,7 +228,6 @@ gistindex_keytest(IndexTuple tuple, IncrIndexProcessed(); - while (scanKeySize > 0) { datum = index_getattr(tuple, @@ -314,7 +308,7 @@ gistfindnext(IndexScanDesc s, Page p, OffsetNumber n, ScanDirection dir) it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n)); if (gistindex_keytest(it, s->numberOfKeys, s->keyData, giststate, - s->relation, p, n)) + s->indexRelation, p, n)) break; if (ScanDirectionIsBackward(dir)) @@ -326,57 +320,25 @@ gistfindnext(IndexScanDesc s, Page p, OffsetNumber n, ScanDirection dir) return n; } -static RetrieveIndexResult +static bool gistscancache(IndexScanDesc s, ScanDirection dir) { - RetrieveIndexResult res; - ItemPointer ip; - - if (!(ScanDirectionIsNoMovement(dir) - && ItemPointerIsValid(&(s->currentItemData)))) - { - - return (RetrieveIndexResult) NULL; - } - - ip = gistheapptr(s->relation, &(s->currentItemData)); - - if (ItemPointerIsValid(ip)) - res = FormRetrieveIndexResult(&(s->currentItemData), ip); - else - res = (RetrieveIndexResult) NULL; - - pfree(ip); - - return res; -} - -/* - * gistheapptr returns the item pointer to the tuple in the heap relation - * for which itemp is the index relation item pointer. - */ -static ItemPointer -gistheapptr(Relation r, ItemPointer itemp) -{ Buffer b; Page p; - IndexTuple it; - ItemPointer ip; OffsetNumber n; + IndexTuple it; - ip = (ItemPointer) palloc(sizeof(ItemPointerData)); - if (ItemPointerIsValid(itemp)) - { - b = ReadBuffer(r, ItemPointerGetBlockNumber(itemp)); - p = BufferGetPage(b); - n = ItemPointerGetOffsetNumber(itemp); - it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n)); - memmove((char *) ip, (char *) &(it->t_tid), - sizeof(ItemPointerData)); - ReleaseBuffer(b); - } - else - ItemPointerSetInvalid(ip); + if (!(ScanDirectionIsNoMovement(dir) + && ItemPointerIsValid(&(s->currentItemData)))) + return false; - return ip; + b = ReadBuffer(s->indexRelation, + ItemPointerGetBlockNumber(&(s->currentItemData))); + p = BufferGetPage(b); + n = ItemPointerGetOffsetNumber(&(s->currentItemData)); + it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n)); + s->xs_ctup.t_self = it->t_tid; + ReleaseBuffer(b); + + return true; } diff --git a/src/backend/access/gist/gistscan.c b/src/backend/access/gist/gistscan.c index 2d3a4f69419..67b10f7ddb0 100644 --- a/src/backend/access/gist/gistscan.c +++ b/src/backend/access/gist/gistscan.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/gist/gistscan.c,v 1.41 2002/03/05 05:30:35 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/gist/gistscan.c,v 1.42 2002/05/20 23:51:41 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -53,12 +53,11 @@ Datum gistbeginscan(PG_FUNCTION_ARGS) { Relation r = (Relation) PG_GETARG_POINTER(0); - bool fromEnd = PG_GETARG_BOOL(1); - uint16 nkeys = PG_GETARG_UINT16(2); - ScanKey key = (ScanKey) PG_GETARG_POINTER(3); + int nkeys = PG_GETARG_INT32(1); + ScanKey key = (ScanKey) PG_GETARG_POINTER(2); IndexScanDesc s; - s = RelationGetIndexScan(r, fromEnd, nkeys, key); + s = RelationGetIndexScan(r, nkeys, key); gistregscan(s); @@ -69,8 +68,7 @@ Datum gistrescan(PG_FUNCTION_ARGS) { IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0); - bool fromEnd = PG_GETARG_BOOL(1); - ScanKey key = (ScanKey) PG_GETARG_POINTER(2); + ScanKey key = (ScanKey) PG_GETARG_POINTER(1); GISTScanOpaque p; int i; @@ -80,18 +78,6 @@ gistrescan(PG_FUNCTION_ARGS) ItemPointerSetInvalid(&s->currentItemData); ItemPointerSetInvalid(&s->currentMarkData); - /* - * Set flags. - */ - if (RelationGetNumberOfBlocks(s->relation) == 0) - s->flags = ScanUnmarked; - else if (fromEnd) - s->flags = ScanUnmarked | ScanUncheckedPrevious; - else - s->flags = ScanUnmarked | ScanUncheckedNext; - - s->scanFromEnd = fromEnd; - if (s->numberOfKeys > 0) { memmove(s->keyData, @@ -109,7 +95,8 @@ gistrescan(PG_FUNCTION_ARGS) for (i = 0; i < s->numberOfKeys; i++) { s->keyData[i].sk_procedure - = RelationGetGISTStrategy(s->relation, s->keyData[i].sk_attno, + = RelationGetGISTStrategy(s->indexRelation, + s->keyData[i].sk_attno, s->keyData[i].sk_procedure); s->keyData[i].sk_func = p->giststate->consistentFn[s->keyData[i].sk_attno - 1]; } @@ -122,7 +109,7 @@ gistrescan(PG_FUNCTION_ARGS) p->s_flags = 0x0; s->opaque = p; p->giststate = (GISTSTATE *) palloc(sizeof(GISTSTATE)); - initGISTstate(p->giststate, s->relation); + initGISTstate(p->giststate, s->indexRelation); if (s->numberOfKeys > 0) /* @@ -133,15 +120,10 @@ gistrescan(PG_FUNCTION_ARGS) */ for (i = 0; i < s->numberOfKeys; i++) { - - /*---------- - * s->keyData[i].sk_procedure = - * index_getprocid(s->relation, 1, GIST_CONSISTENT_PROC); - *---------- - */ - s->keyData[i].sk_procedure - = RelationGetGISTStrategy(s->relation, s->keyData[i].sk_attno, - s->keyData[i].sk_procedure); + s->keyData[i].sk_procedure = + RelationGetGISTStrategy(s->indexRelation, + s->keyData[i].sk_attno, + s->keyData[i].sk_procedure); s->keyData[i].sk_func = p->giststate->consistentFn[s->keyData[i].sk_attno - 1]; } } @@ -309,7 +291,7 @@ gistadjscans(Relation rel, int op, BlockNumber blkno, OffsetNumber offnum) relid = RelationGetRelid(rel); for (l = GISTScans; l != (GISTScanList) NULL; l = l->gsl_next) { - if (l->gsl_scan->relation->rd_id == relid) + if (l->gsl_scan->indexRelation->rd_id == relid) gistadjone(l->gsl_scan, op, blkno, offnum); } } |