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