From 349b69f55c6e4267318080e81ac0c2060fde2a43 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan 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 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