diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c index b71f65de2c..a766452458 100644 --- a/src/backend/access/nbtree/nbtpage.c +++ b/src/backend/access/nbtree/nbtpage.c @@ -1565,7 +1565,6 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, bool *rightsib_empty) int targetlevel; ItemPointer leafhikey; BlockNumber nextchild; - BlockNumber topblkno; page = BufferGetPage(leafbuf); opaque = (BTPageOpaque) PageGetSpecialPointer(page); @@ -1589,11 +1588,10 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, bool *rightsib_empty) */ if (ItemPointerIsValid(leafhikey)) { - topblkno = ItemPointerGetBlockNumber(leafhikey); - target = topblkno; + target = ItemPointerGetBlockNumber(leafhikey); /* fetch the block number of the topmost parent's left sibling */ - buf = _bt_getbuf(rel, topblkno, BT_READ); + buf = _bt_getbuf(rel, target, BT_READ); page = BufferGetPage(buf); opaque = (BTPageOpaque) PageGetSpecialPointer(page); leftsib = opaque->btpo_prev; @@ -1607,7 +1605,6 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, bool *rightsib_empty) } else { - topblkno = InvalidBlockNumber; target = leafblkno; buf = leafbuf; @@ -1692,9 +1689,11 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, bool *rightsib_empty) elog(ERROR, "half-dead page changed status unexpectedly in block %u of index \"%s\"", target, RelationGetRelationName(rel)); - /* remember the next child down in the branch. */ + /* remember the next non-leaf child down in the branch. */ itemid = PageGetItemId(page, P_FIRSTDATAKEY(opaque)); nextchild = ItemPointerGetBlockNumber(&((IndexTuple) PageGetItem(page, itemid))->t_tid); + if (nextchild == leafblkno) + nextchild = InvalidBlockNumber; } /* @@ -1780,7 +1779,7 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, bool *rightsib_empty) */ if (target != leafblkno) { - if (nextchild == leafblkno) + if (nextchild == InvalidBlockNumber) ItemPointerSetInvalid(leafhikey); else ItemPointerSet(leafhikey, nextchild, P_HIKEY);