v1-0001-Fix-assertion-failure-in-_bt_killitems.patch
application/octet-stream
Filename: v1-0001-Fix-assertion-failure-in-_bt_killitems.patch
Type: application/octet-stream
Part: 0
Patch
Format: format-patch
Series: patch v1-0001
Subject: Fix assertion failure in _bt_killitems().
| File | + | − |
|---|---|---|
| src/backend/access/nbtree/nbtutils.c | 8 | 2 |
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