From d21e9e3fbed134020e0c69e7b17b6c95eb784920 Mon Sep 17 00:00:00 2001
From: Peter Geoghegan <pg@bowt.ie>
Date: Sun, 5 Apr 2020 17:08:05 -0700
Subject: [PATCH v1] Fix assertion failure in _bt_killitems().

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

diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c
index aaa0c89c7d..e8d66b73c6 100644
--- a/src/backend/access/nbtree/nbtutils.c
+++ b/src/backend/access/nbtree/nbtutils.c
@@ -1725,6 +1725,7 @@ _bt_killitems(IndexScanDesc scan)
 	int			i;
 	int			numKilled = so->numKilled;
 	bool		killedsomething = false;
+	bool		pagecouldchange PG_USED_FOR_ASSERTS_ONLY;
 
 	Assert(BTScanPosIsValid(so->currPos));
 
@@ -1745,6 +1746,7 @@ _bt_killitems(IndexScanDesc scan)
 		LockBuffer(so->currPos.buf, BT_READ);
 
 		page = BufferGetPage(so->currPos.buf);
+		pagecouldchange = true;
 	}
 	else
 	{
@@ -1766,6 +1768,7 @@ _bt_killitems(IndexScanDesc scan)
 			_bt_relbuf(scan->indexRelation, buf);
 			return;
 		}
+		pagecouldchange = false;
 	}
 
 	opaque = (BTPageOpaque) PageGetSpecialPointer(page);
@@ -1806,8 +1809,11 @@ _bt_killitems(IndexScanDesc scan)
 					if (!ItemPointerEquals(item, &kitem->heapTid))
 						break;	/* out of posting list loop */
 
-					/* kitem must have matching offnum when heap TIDs match */
-					Assert(kitem->indexOffset == offnum);
+					/*
+					 * kitem must have matching offnum when heap TIDs match
+					 * and page unchanged since pin was dropped
+					 */
+					Assert(pagecouldchange || kitem->indexOffset == offnum);
 
 					/*
 					 * Read-ahead to later kitems here.
-- 
2.25.1

