diff options
Diffstat (limited to 'src/backend/access/nbtree/nbtsearch.c')
-rw-r--r-- | src/backend/access/nbtree/nbtsearch.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/backend/access/nbtree/nbtsearch.c b/src/backend/access/nbtree/nbtsearch.c index 75f49ee5108..78b47000621 100644 --- a/src/backend/access/nbtree/nbtsearch.c +++ b/src/backend/access/nbtree/nbtsearch.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.119 2009/01/01 17:23:35 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.120 2009/05/05 19:36:32 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -18,6 +18,7 @@ #include "access/genam.h" #include "access/nbtree.h" #include "access/relscan.h" +#include "miscadmin.h" #include "pgstat.h" #include "storage/bufmgr.h" #include "utils/lsyscache.h" @@ -1126,16 +1127,16 @@ _bt_steppage(IndexScanDesc scan, ScanDirection dir) for (;;) { - /* if we're at end of scan, release the buffer and return */ + /* release the previous buffer */ + _bt_relbuf(rel, so->currPos.buf); + so->currPos.buf = InvalidBuffer; + /* if we're at end of scan, give up */ if (blkno == P_NONE || !so->currPos.moreRight) - { - _bt_relbuf(rel, so->currPos.buf); - so->currPos.buf = InvalidBuffer; return false; - } + /* check for interrupts while we're not holding any buffer lock */ + CHECK_FOR_INTERRUPTS(); /* step right one page */ - so->currPos.buf = _bt_relandgetbuf(rel, so->currPos.buf, - blkno, BT_READ); + so->currPos.buf = _bt_getbuf(rel, blkno, BT_READ); /* check for deleted page */ page = BufferGetPage(so->currPos.buf); opaque = (BTPageOpaque) PageGetSpecialPointer(page); @@ -1239,7 +1240,10 @@ _bt_walk_left(Relation rel, Buffer buf) obknum = BufferGetBlockNumber(buf); /* step left */ blkno = lblkno = opaque->btpo_prev; - buf = _bt_relandgetbuf(rel, buf, blkno, BT_READ); + _bt_relbuf(rel, buf); + /* check for interrupts while we're not holding any buffer lock */ + CHECK_FOR_INTERRUPTS(); + buf = _bt_getbuf(rel, blkno, BT_READ); page = BufferGetPage(buf); opaque = (BTPageOpaque) PageGetSpecialPointer(page); |