summaryrefslogtreecommitdiff
path: root/src/backend/access/gist/gistget.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-02-05 19:38:58 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-02-05 19:38:58 +0000
commit12179c99b13067c170ae9d1c8fa2c93c01a21f94 (patch)
tree3a43cdcd3ea0b865a070b04f4fcde3249934236b /src/backend/access/gist/gistget.c
parent11635c3f6fe1961dddc1155dfc4de145fa007c88 (diff)
downloadpostgresql-12179c99b13067c170ae9d1c8fa2c93c01a21f94.tar.gz
Marginal hack to merge adjacent ReleaseBuffer/ReadBuffer calls into
ReleaseAndReadBuffer during GIST index searches. We already did this in btree and rtree, might as well do it here too.
Diffstat (limited to 'src/backend/access/gist/gistget.c')
-rw-r--r--src/backend/access/gist/gistget.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/src/backend/access/gist/gistget.c b/src/backend/access/gist/gistget.c
index 70febc584c..03856874f3 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
- * $PostgreSQL: pgsql/src/backend/access/gist/gistget.c,v 1.43 2004/12/31 21:59:10 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/access/gist/gistget.c,v 1.44 2005/02/05 19:38:58 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -60,10 +60,11 @@ gistfirst(IndexScanDesc s, ScanDirection dir)
BlockNumber blk;
IndexTuple it;
+ so = (GISTScanOpaque) s->opaque;
+
b = ReadBuffer(s->indexRelation, GISTP_ROOT);
p = BufferGetPage(b);
po = (GISTPageOpaque) PageGetSpecialPointer(p);
- so = (GISTScanOpaque) s->opaque;
for (;;)
{
@@ -75,12 +76,14 @@ gistfirst(IndexScanDesc s, ScanDirection dir)
while (n < FirstOffsetNumber || n > maxoff)
{
- ReleaseBuffer(b);
- if (so->s_stack == NULL)
+ stk = so->s_stack;
+ if (stk == NULL)
+ {
+ ReleaseBuffer(b);
return false;
+ }
- stk = so->s_stack;
- b = ReadBuffer(s->indexRelation, stk->gs_blk);
+ b = ReleaseAndReadBuffer(b, s->indexRelation, stk->gs_blk);
p = BufferGetPage(b);
po = (GISTPageOpaque) PageGetSpecialPointer(p);
maxoff = PageGetMaxOffsetNumber(p);
@@ -89,6 +92,7 @@ gistfirst(IndexScanDesc s, ScanDirection dir)
n = OffsetNumberPrev(stk->gs_child);
else
n = OffsetNumberNext(stk->gs_child);
+
so->s_stack = stk->gs_parent;
pfree(stk);
@@ -116,8 +120,7 @@ gistfirst(IndexScanDesc s, ScanDirection dir)
it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n));
blk = ItemPointerGetBlockNumber(&(it->t_tid));
- ReleaseBuffer(b);
- b = ReadBuffer(s->indexRelation, blk);
+ b = ReleaseAndReadBuffer(b, s->indexRelation, blk);
p = BufferGetPage(b);
po = (GISTPageOpaque) PageGetSpecialPointer(p);
}
@@ -137,6 +140,8 @@ gistnext(IndexScanDesc s, ScanDirection dir)
BlockNumber blk;
IndexTuple it;
+ so = (GISTScanOpaque) s->opaque;
+
blk = ItemPointerGetBlockNumber(&(s->currentItemData));
n = ItemPointerGetOffsetNumber(&(s->currentItemData));
@@ -148,7 +153,6 @@ gistnext(IndexScanDesc s, ScanDirection dir)
b = ReadBuffer(s->indexRelation, blk);
p = BufferGetPage(b);
po = (GISTPageOpaque) PageGetSpecialPointer(p);
- so = (GISTScanOpaque) s->opaque;
for (;;)
{
@@ -157,20 +161,23 @@ gistnext(IndexScanDesc s, ScanDirection dir)
while (n < FirstOffsetNumber || n > maxoff)
{
- ReleaseBuffer(b);
- if (so->s_stack == NULL)
+ stk = so->s_stack;
+ if (stk == NULL)
+ {
+ ReleaseBuffer(b);
return false;
+ }
- stk = so->s_stack;
- b = ReadBuffer(s->indexRelation, stk->gs_blk);
+ b = ReleaseAndReadBuffer(b, s->indexRelation, stk->gs_blk);
p = BufferGetPage(b);
- maxoff = PageGetMaxOffsetNumber(p);
po = (GISTPageOpaque) PageGetSpecialPointer(p);
+ maxoff = PageGetMaxOffsetNumber(p);
if (ScanDirectionIsBackward(dir))
n = OffsetNumberPrev(stk->gs_child);
else
n = OffsetNumberNext(stk->gs_child);
+
so->s_stack = stk->gs_parent;
pfree(stk);
@@ -198,8 +205,7 @@ gistnext(IndexScanDesc s, ScanDirection dir)
it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n));
blk = ItemPointerGetBlockNumber(&(it->t_tid));
- ReleaseBuffer(b);
- b = ReadBuffer(s->indexRelation, blk);
+ b = ReleaseAndReadBuffer(b, s->indexRelation, blk);
p = BufferGetPage(b);
po = (GISTPageOpaque) PageGetSpecialPointer(p);