]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Marginal hack to merge adjacent ReleaseBuffer/ReadBuffer calls into
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 5 Feb 2005 19:38:58 +0000 (19:38 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 5 Feb 2005 19:38:58 +0000 (19:38 +0000)
ReleaseAndReadBuffer during GIST index searches.  We already did this
in btree and rtree, might as well do it here too.

src/backend/access/gist/gistget.c

index 70febc584c412afe8a5087bd9f4aff7a217ccb7e..03856874f33618fc88e173aa9e46dab9031ebb09 100644 (file)
@@ -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);