From 44a0be6f76f6dc9587fb5fa18ec0be3c27712f94 Mon Sep 17 00:00:00 2001
From: Peter Geoghegan <pg@bowt.ie>
Date: Thu, 7 Nov 2024 14:09:47 -0500
Subject: [PATCH v1] Fix confusion with nbtree parallel scan currPos state.

---
 src/backend/access/nbtree/nbtsearch.c | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/src/backend/access/nbtree/nbtsearch.c b/src/backend/access/nbtree/nbtsearch.c
index 1608dd49d..70996a7fd 100644
--- a/src/backend/access/nbtree/nbtsearch.c
+++ b/src/backend/access/nbtree/nbtsearch.c
@@ -2224,6 +2224,7 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno,
 {
 	Relation	rel = scan->indexRelation;
 	BTScanOpaque so = (BTScanOpaque) scan->opaque;
+	bool		seized = true;
 
 	Assert(so->currPos.currPage == lastcurrblkno || scan->parallel_scan != NULL);
 	Assert(!BTScanPosIsPinned(so->currPos));
@@ -2254,6 +2255,15 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno,
 
 		Assert(!so->needPrimScan);
 
+		/* parallel scan must never use so->currPos blkno */
+		if (!seized && scan->parallel_scan != NULL &&
+			!_bt_parallel_seize(scan, &blkno, &lastcurrblkno, false))
+		{
+			BTScanPosInvalidate(so->currPos);
+			return false;
+		}
+		seized = false;
+
 		if (ScanDirectionIsForward(dir))
 		{
 			/* read blkno, but check for interrupts first */
@@ -2308,14 +2318,6 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno,
 
 		/* no matching tuples on this page */
 		_bt_relbuf(rel, so->currPos.buf);
-
-		/* parallel scan seizes another page (won't use so->currPos blkno) */
-		if (scan->parallel_scan != NULL &&
-			!_bt_parallel_seize(scan, &blkno, &lastcurrblkno, false))
-		{
-			BTScanPosInvalidate(so->currPos);
-			return false;
-		}
 	}
 
 	/*
-- 
2.45.2

