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