88 * Portions Copyright (c) 1994, Regents of the University of California
99 *
1010 * IDENTIFICATION
11- * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.97 2005/11/22 18:17:06 momjian Exp $
11+ * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.98 2005/12/07 18:03:48 tgl Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
@@ -889,9 +889,9 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
889889bool
890890_bt_step (IndexScanDesc scan ,Buffer * bufP ,ScanDirection dir )
891891{
892- Relation rel = scan -> indexRelation ;
893892ItemPointer current = & (scan -> currentItemData );
894893BTScanOpaque so = (BTScanOpaque )scan -> opaque ;
894+ Relation rel ;
895895Page page ;
896896BTPageOpaque opaque ;
897897OffsetNumber offnum ,
@@ -905,16 +905,17 @@ _bt_step(IndexScanDesc scan, Buffer *bufP, ScanDirection dir)
905905offnum = current -> ip_posid ;
906906
907907page = BufferGetPage (* bufP );
908- opaque = (BTPageOpaque )PageGetSpecialPointer (page );
909908maxoff = PageGetMaxOffsetNumber (page );
910909
911910if (ScanDirectionIsForward (dir ))
912911{
913- if (! PageIsEmpty ( page ) && offnum < maxoff )
912+ if (offnum < maxoff )
914913offnum = OffsetNumberNext (offnum );
915914else
916915{
917916/* Walk right to the next page with data */
917+ rel = scan -> indexRelation ;
918+ opaque = (BTPageOpaque )PageGetSpecialPointer (page );
918919for (;;)
919920{
920921/* if we're at end of scan, release the buffer and return */
@@ -932,10 +933,10 @@ _bt_step(IndexScanDesc scan, Buffer *bufP, ScanDirection dir)
932933opaque = (BTPageOpaque )PageGetSpecialPointer (page );
933934if (!P_IGNORE (opaque ))
934935{
935- maxoff = PageGetMaxOffsetNumber (page );
936936/* done if it's not empty */
937+ maxoff = PageGetMaxOffsetNumber (page );
937938offnum = P_FIRSTDATAKEY (opaque );
938- if (! PageIsEmpty ( page ) && offnum <=maxoff )
939+ if (offnum <=maxoff )
939940break ;
940941}
941942}
@@ -944,6 +945,7 @@ _bt_step(IndexScanDesc scan, Buffer *bufP, ScanDirection dir)
944945else
945946{
946947/* backwards scan */
948+ opaque = (BTPageOpaque )PageGetSpecialPointer (page );
947949if (offnum > P_FIRSTDATAKEY (opaque ))
948950offnum = OffsetNumberPrev (offnum );
949951else
@@ -955,6 +957,7 @@ _bt_step(IndexScanDesc scan, Buffer *bufP, ScanDirection dir)
955957 * plus the possibility that the page we were on gets deleted
956958 * after we leave it. See nbtree/README for details.
957959 */
960+ rel = scan -> indexRelation ;
958961for (;;)
959962{
960963* bufP = _bt_walk_left (rel ,* bufP );
@@ -978,8 +981,7 @@ _bt_step(IndexScanDesc scan, Buffer *bufP, ScanDirection dir)
978981{
979982maxoff = PageGetMaxOffsetNumber (page );
980983offnum = maxoff ;
981- if (!PageIsEmpty (page )&&
982- maxoff >=P_FIRSTDATAKEY (opaque ))
984+ if (maxoff >=P_FIRSTDATAKEY (opaque ))
983985break ;
984986}
985987}