From 4c45832c39eb4c6f74ecf507a354697ac9056798 Mon Sep 17 00:00:00 2001
From: "Vadim B. Mikheev" <vadim4o@yahoo.com>
Date: Mon, 7 Jun 1999 15:14:54 +0000
Subject: [PATCH] Concurrency... Highest one... DO NOT EVEN TRY TO DO
 PageGetMaxOffsetNumber BEFORE LockBuffer! -:)

---
 src/backend/access/nbtree/nbtree.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c
index 700b11380a0..59fa09094e7 100644
--- a/src/backend/access/nbtree/nbtree.c
+++ b/src/backend/access/nbtree/nbtree.c
@@ -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
-- 
GitLab