Skip to content

Commit 12179c9

Browse files
committed
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.
1 parent 11635c3 commit 12179c9

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

src/backend/access/gist/gistget.c

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gist/gistget.c,v 1.43 2004/12/31 21:59:10 pgsql Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gist/gistget.c,v 1.44 2005/02/05 19:38:58 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -60,10 +60,11 @@ gistfirst(IndexScanDesc s, ScanDirection dir)
6060
BlockNumber blk;
6161
IndexTuple it;
6262

63+
so = (GISTScanOpaque) s->opaque;
64+
6365
b = ReadBuffer(s->indexRelation, GISTP_ROOT);
6466
p = BufferGetPage(b);
6567
po = (GISTPageOpaque) PageGetSpecialPointer(p);
66-
so = (GISTScanOpaque) s->opaque;
6768

6869
for (;;)
6970
{
@@ -75,12 +76,14 @@ gistfirst(IndexScanDesc s, ScanDirection dir)
7576

7677
while (n < FirstOffsetNumber || n > maxoff)
7778
{
78-
ReleaseBuffer(b);
79-
if (so->s_stack == NULL)
79+
stk = so->s_stack;
80+
if (stk == NULL)
81+
{
82+
ReleaseBuffer(b);
8083
return false;
84+
}
8185

82-
stk = so->s_stack;
83-
b = ReadBuffer(s->indexRelation, stk->gs_blk);
86+
b = ReleaseAndReadBuffer(b, s->indexRelation, stk->gs_blk);
8487
p = BufferGetPage(b);
8588
po = (GISTPageOpaque) PageGetSpecialPointer(p);
8689
maxoff = PageGetMaxOffsetNumber(p);
@@ -89,6 +92,7 @@ gistfirst(IndexScanDesc s, ScanDirection dir)
8992
n = OffsetNumberPrev(stk->gs_child);
9093
else
9194
n = OffsetNumberNext(stk->gs_child);
95+
9296
so->s_stack = stk->gs_parent;
9397
pfree(stk);
9498

@@ -116,8 +120,7 @@ gistfirst(IndexScanDesc s, ScanDirection dir)
116120
it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n));
117121
blk = ItemPointerGetBlockNumber(&(it->t_tid));
118122

119-
ReleaseBuffer(b);
120-
b = ReadBuffer(s->indexRelation, blk);
123+
b = ReleaseAndReadBuffer(b, s->indexRelation, blk);
121124
p = BufferGetPage(b);
122125
po = (GISTPageOpaque) PageGetSpecialPointer(p);
123126
}
@@ -137,6 +140,8 @@ gistnext(IndexScanDesc s, ScanDirection dir)
137140
BlockNumber blk;
138141
IndexTuple it;
139142

143+
so = (GISTScanOpaque) s->opaque;
144+
140145
blk = ItemPointerGetBlockNumber(&(s->currentItemData));
141146
n = ItemPointerGetOffsetNumber(&(s->currentItemData));
142147

@@ -148,7 +153,6 @@ gistnext(IndexScanDesc s, ScanDirection dir)
148153
b = ReadBuffer(s->indexRelation, blk);
149154
p = BufferGetPage(b);
150155
po = (GISTPageOpaque) PageGetSpecialPointer(p);
151-
so = (GISTScanOpaque) s->opaque;
152156

153157
for (;;)
154158
{
@@ -157,20 +161,23 @@ gistnext(IndexScanDesc s, ScanDirection dir)
157161

158162
while (n < FirstOffsetNumber || n > maxoff)
159163
{
160-
ReleaseBuffer(b);
161-
if (so->s_stack == NULL)
164+
stk = so->s_stack;
165+
if (stk == NULL)
166+
{
167+
ReleaseBuffer(b);
162168
return false;
169+
}
163170

164-
stk = so->s_stack;
165-
b = ReadBuffer(s->indexRelation, stk->gs_blk);
171+
b = ReleaseAndReadBuffer(b, s->indexRelation, stk->gs_blk);
166172
p = BufferGetPage(b);
167-
maxoff = PageGetMaxOffsetNumber(p);
168173
po = (GISTPageOpaque) PageGetSpecialPointer(p);
174+
maxoff = PageGetMaxOffsetNumber(p);
169175

170176
if (ScanDirectionIsBackward(dir))
171177
n = OffsetNumberPrev(stk->gs_child);
172178
else
173179
n = OffsetNumberNext(stk->gs_child);
180+
174181
so->s_stack = stk->gs_parent;
175182
pfree(stk);
176183

@@ -198,8 +205,7 @@ gistnext(IndexScanDesc s, ScanDirection dir)
198205
it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n));
199206
blk = ItemPointerGetBlockNumber(&(it->t_tid));
200207

201-
ReleaseBuffer(b);
202-
b = ReadBuffer(s->indexRelation, blk);
208+
b = ReleaseAndReadBuffer(b, s->indexRelation, blk);
203209
p = BufferGetPage(b);
204210
po = (GISTPageOpaque) PageGetSpecialPointer(p);
205211

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy