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)
6060BlockNumber blk ;
6161IndexTuple it ;
6262
63+ so = (GISTScanOpaque )s -> opaque ;
64+
6365b = ReadBuffer (s -> indexRelation ,GISTP_ROOT );
6466p = BufferGetPage (b );
6567po = (GISTPageOpaque )PageGetSpecialPointer (p );
66- so = (GISTScanOpaque )s -> opaque ;
6768
6869for (;;)
6970{
@@ -75,12 +76,14 @@ gistfirst(IndexScanDesc s, ScanDirection dir)
7576
7677while (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 );
8083return 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 );
8487p = BufferGetPage (b );
8588po = (GISTPageOpaque )PageGetSpecialPointer (p );
8689maxoff = PageGetMaxOffsetNumber (p );
@@ -89,6 +92,7 @@ gistfirst(IndexScanDesc s, ScanDirection dir)
8992n = OffsetNumberPrev (stk -> gs_child );
9093else
9194n = OffsetNumberNext (stk -> gs_child );
95+
9296so -> s_stack = stk -> gs_parent ;
9397pfree (stk );
9498
@@ -116,8 +120,7 @@ gistfirst(IndexScanDesc s, ScanDirection dir)
116120it = (IndexTuple )PageGetItem (p ,PageGetItemId (p ,n ));
117121blk = ItemPointerGetBlockNumber (& (it -> t_tid ));
118122
119- ReleaseBuffer (b );
120- b = ReadBuffer (s -> indexRelation ,blk );
123+ b = ReleaseAndReadBuffer (b ,s -> indexRelation ,blk );
121124p = BufferGetPage (b );
122125po = (GISTPageOpaque )PageGetSpecialPointer (p );
123126}
@@ -137,6 +140,8 @@ gistnext(IndexScanDesc s, ScanDirection dir)
137140BlockNumber blk ;
138141IndexTuple it ;
139142
143+ so = (GISTScanOpaque )s -> opaque ;
144+
140145blk = ItemPointerGetBlockNumber (& (s -> currentItemData ));
141146n = ItemPointerGetOffsetNumber (& (s -> currentItemData ));
142147
@@ -148,7 +153,6 @@ gistnext(IndexScanDesc s, ScanDirection dir)
148153b = ReadBuffer (s -> indexRelation ,blk );
149154p = BufferGetPage (b );
150155po = (GISTPageOpaque )PageGetSpecialPointer (p );
151- so = (GISTScanOpaque )s -> opaque ;
152156
153157for (;;)
154158{
@@ -157,20 +161,23 @@ gistnext(IndexScanDesc s, ScanDirection dir)
157161
158162while (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 );
162168return 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 );
166172p = BufferGetPage (b );
167- maxoff = PageGetMaxOffsetNumber (p );
168173po = (GISTPageOpaque )PageGetSpecialPointer (p );
174+ maxoff = PageGetMaxOffsetNumber (p );
169175
170176if (ScanDirectionIsBackward (dir ))
171177n = OffsetNumberPrev (stk -> gs_child );
172178else
173179n = OffsetNumberNext (stk -> gs_child );
180+
174181so -> s_stack = stk -> gs_parent ;
175182pfree (stk );
176183
@@ -198,8 +205,7 @@ gistnext(IndexScanDesc s, ScanDirection dir)
198205it = (IndexTuple )PageGetItem (p ,PageGetItemId (p ,n ));
199206blk = ItemPointerGetBlockNumber (& (it -> t_tid ));
200207
201- ReleaseBuffer (b );
202- b = ReadBuffer (s -> indexRelation ,blk );
208+ b = ReleaseAndReadBuffer (b ,s -> indexRelation ,blk );
203209p = BufferGetPage (b );
204210po = (GISTPageOpaque )PageGetSpecialPointer (p );
205211