From 349b69f55c6e4267318080e81ac0c2060fde2a43 Mon Sep 17 00:00:00 2001
From: Peter Geoghegan <pg@bowt.ie>
Date: Tue, 29 Oct 2024 09:35:34 -0400
Subject: [PATCH v1] Avoid nbtree array scrollable cursor confusion.

Oversight in commit 5bf748b8, which enhanced nbtree ScalarArrayOp
execution.

Author: Peter Geoghegan <pg@bowt.ie>
Backpatch: 17-, where commit 5bf748b8 first appears.
---
 src/backend/access/nbtree/nbtsearch.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/backend/access/nbtree/nbtsearch.c b/src/backend/access/nbtree/nbtsearch.c
index c33438c4b..c81e4844f 100644
--- a/src/backend/access/nbtree/nbtsearch.c
+++ b/src/backend/access/nbtree/nbtsearch.c
@@ -1568,6 +1568,7 @@ _bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum,
 
 	Assert(!P_IGNORE(opaque));
 	Assert(BTScanPosIsPinned(so->currPos));
+	Assert(!so->needPrimScan);
 
 	if (scan->parallel_scan)
 	{
@@ -2088,7 +2089,7 @@ _bt_steppage(IndexScanDesc scan, ScanDirection dir)
 		 */
 		if (so->needPrimScan)
 		{
-			if (ScanDirectionIsForward(dir))
+			if (ScanDirectionIsForward(so->currPos.dir))
 				so->markPos.moreRight = true;
 			else
 				so->markPos.moreLeft = true;
@@ -2109,6 +2110,13 @@ _bt_steppage(IndexScanDesc scan, ScanDirection dir)
 		else
 			blkno = so->currPos.prevPage;
 		lastcurrblkno = so->currPos.currPage;
+
+		/*
+		 * Unschedule primitive index scans that were only supposed to happen
+		 * if we continued in the direction used within _bt_readpage
+		 */
+		if (dir != so->currPos.dir)
+			so->needPrimScan = false;
 	}
 	else
 	{
@@ -2118,6 +2126,8 @@ _bt_steppage(IndexScanDesc scan, ScanDirection dir)
 		 */
 		if (!_bt_parallel_seize(scan, &blkno, &lastcurrblkno, false))
 			return false;
+
+		Assert(!so->needPrimScan);
 	}
 
 	return _bt_readnextpage(scan, blkno, lastcurrblkno, dir);
-- 
2.45.2

