Concurrency... Highest one...
authorVadim B. Mikheev
Mon, 7 Jun 1999 15:14:54 +0000 (15:14 +0000)
committerVadim B. Mikheev
Mon, 7 Jun 1999 15:14:54 +0000 (15:14 +0000)
DO NOT EVEN TRY TO DO PageGetMaxOffsetNumber BEFORE
LockBuffer!
-:)

src/backend/access/nbtree/nbtree.c

index 700b11380a061d7dc779cb94d4b254e5d755f7fd..59fa09094e7c8f7ac2ed6374788772a3bf381dc3 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.40 1999/05/25 22:04:13 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.41 1999/06/07 15:14:54 vadim Exp $
  *
  * NOTES
  *   This file contains only the public interface routines.
@@ -618,16 +618,19 @@ _bt_restscan(IndexScanDesc scan)
    Relation    rel = scan->relation;
    BTScanOpaque so = (BTScanOpaque) scan->opaque;
    Buffer      buf = so->btso_curbuf;
-   Page        page = BufferGetPage(buf);
+   Page        page;
    ItemPointer current = &(scan->currentItemData);
    OffsetNumber offnum = ItemPointerGetOffsetNumber(current),
-               maxoff = PageGetMaxOffsetNumber(page);
-   BTPageOpaque opaque = (BTPageOpaque) PageGetSpecialPointer(page);
+               maxoff;
+   BTPageOpaque opaque;
    ItemPointerData target = so->curHeapIptr;
    BTItem      item;
    BlockNumber blkno;
 
-   LockBuffer(buf, BT_READ);
+   LockBuffer(buf, BT_READ);       /* lock buffer first! */
+   page = BufferGetPage(buf);
+   maxoff = PageGetMaxOffsetNumber(page);
+   opaque = (BTPageOpaque) PageGetSpecialPointer(page);
 
    /*
     * We use this as flag when first index tuple on page is deleted but