From a6048b4e8b8f84e83884c272e46b76943460bca7 Mon Sep 17 00:00:00 2001
From: Peter Geoghegan <pg@bowt.ie>
Date: Sun, 1 Mar 2020 13:31:16 -0800
Subject: [PATCH] Restructure _bt_update_posting().

---
 src/backend/access/nbtree/nbtdedup.c | 47 ++++++++++++++++++----------
 1 file changed, 30 insertions(+), 17 deletions(-)

diff --git a/src/backend/access/nbtree/nbtdedup.c b/src/backend/access/nbtree/nbtdedup.c
index 3175d6fdd1..a52effe078 100644
--- a/src/backend/access/nbtree/nbtdedup.c
+++ b/src/backend/access/nbtree/nbtdedup.c
@@ -664,10 +664,7 @@ _bt_update_posting(BTVacuumPosting vacposting)
 	uint32		keysize,
 				newsize;
 	IndexTuple	itup;
-	int			nhtids;
-	int			ui,
-				d;
-	ItemPointer htids;
+	int			nhtids, d;
 
 	nhtids = BTreeTupleGetNPosting(origtuple) - vacposting->ndeletedtids;
 
@@ -696,31 +693,47 @@ _bt_update_posting(BTVacuumPosting vacposting)
 
 	if (nhtids > 1)
 	{
+		ItemPointer htids;
+		int			ui;
+
 		/* Form posting list tuple */
 		BTreeTupleSetPosting(itup, nhtids, keysize);
 		htids = BTreeTupleGetPosting(itup);
+
+		ui = 0;
+		d = 0;
+		for (int i = 0; i < BTreeTupleGetNPosting(origtuple); i++)
+		{
+			if (d < vacposting->ndeletedtids && vacposting->deletetids[d] == i)
+			{
+				d++;
+				continue;
+			}
+			htids[ui++] = *BTreeTupleGetPostingN(origtuple, i);
+		}
+		Assert(ui == nhtids);
+		Assert(d == vacposting->ndeletedtids);
+		Assert(_bt_posting_valid(itup));
 	}
 	else
 	{
 		/* Form standard non-pivot tuple */
 		itup->t_info &= ~INDEX_ALT_TID_MASK;
-		htids = &itup->t_tid;
-	}
 
-	ui = 0;
-	d = 0;
-	for (int i = 0; i < BTreeTupleGetNPosting(origtuple); i++)
-	{
-		if (d < vacposting->ndeletedtids && vacposting->deletetids[d] == i)
+		Assert(BTreeTupleGetNPosting(origtuple) == vacposting->ndeletedtids + 1);
+		d = 0;
+		for (int i = 0; i < BTreeTupleGetNPosting(origtuple); i++)
 		{
-			d++;
-			continue;
+			if (d < vacposting->ndeletedtids && vacposting->deletetids[d] == i)
+			{
+				d++;
+				continue;
+			}
+			itup->t_tid = *BTreeTupleGetPostingN(origtuple, i);
+			break;
 		}
-		htids[ui++] = *BTreeTupleGetPostingN(origtuple, i);
+		Assert(ItemPointerIsValid(&itup->t_tid));
 	}
-	Assert(ui == nhtids);
-	Assert(d == vacposting->ndeletedtids);
-	Assert(nhtids == 1 || _bt_posting_valid(itup));
 
 	/* vacposting arg's itup will now point to updated version */
 	vacposting->itup = itup;
-- 
2.17.1

