From e896716077f3604340282a69cc723ccbabdc07d2 Mon Sep 17 00:00:00 2001 From: openGaussDev Date: Tue, 8 Mar 2022 20:07:21 +0800 Subject: [PATCH] fix bug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Offering: openGaussDev More detail: 修复分区表DDL回滚后使用全局分区索引扫描数据丢失的问题 Match-id-a93d94a074d384ac493a696380c7d848fdee36cd --- src/gausskernel/storage/access/nbtree/nbtinsert.cpp | 3 +-- src/gausskernel/storage/access/ubtree/ubtinsert.cpp | 4 +++- src/include/access/nbtree.h | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/gausskernel/storage/access/nbtree/nbtinsert.cpp b/src/gausskernel/storage/access/nbtree/nbtinsert.cpp index 65088796e..5fd5b0f5c 100644 --- a/src/gausskernel/storage/access/nbtree/nbtinsert.cpp +++ b/src/gausskernel/storage/access/nbtree/nbtinsert.cpp @@ -82,7 +82,6 @@ static bool _bt_isequal(Relation idxrel, Page page, OffsetNumber offnum, int key static void _bt_vacuum_one_page(Relation rel, Buffer buffer, Relation heapRel); static bool CheckItemIsAlive(ItemPointer tid, Relation relation, Snapshot snapshot, bool* all_dead, CUDescScan* cudescScan); -static bool CheckPartitionIsInvisible(GPIScanDesc gpiScan); /* * _bt_doinsert() -- Handle insertion of a single index tuple in the tree. @@ -2400,7 +2399,7 @@ static bool CheckItemIsAlive(ItemPointer tid, Relation relation, Snapshot snapsh } } -static bool CheckPartitionIsInvisible(GPIScanDesc gpiScan) +bool CheckPartitionIsInvisible(GPIScanDesc gpiScan) { if (OidRBTreeMemberOid(gpiScan->invisiblePartTreeForVacuum, gpiScan->currPartOid)) { return true; diff --git a/src/gausskernel/storage/access/ubtree/ubtinsert.cpp b/src/gausskernel/storage/access/ubtree/ubtinsert.cpp index ba7a823d0..00062fe6c 100644 --- a/src/gausskernel/storage/access/ubtree/ubtinsert.cpp +++ b/src/gausskernel/storage/access/ubtree/ubtinsert.cpp @@ -763,7 +763,9 @@ static TransactionId UBTreeCheckUnique(Relation rel, IndexTuple itup, Relation h if (curPartOid != gpiScan->currPartOid) { GPISetCurrPartOid(gpiScan, curPartOid); if (!GPIGetNextPartRelation(gpiScan, CurrentMemoryContext, AccessShareLock)) { - ItemIdMarkDead(curitemid); + if (CheckPartitionIsInvisible(gpiScan)) { + ItemIdMarkDead(curitemid); + } opaque->btpo_flags |= BTP_HAS_GARBAGE; if (nbuf != InvalidBuffer) { MarkBufferDirtyHint(nbuf, true); diff --git a/src/include/access/nbtree.h b/src/include/access/nbtree.h index d5207a76a..c7dfe08c7 100644 --- a/src/include/access/nbtree.h +++ b/src/include/access/nbtree.h @@ -1081,6 +1081,7 @@ extern TransactionId _bt_check_unique(Relation rel, IndexTuple itup, Relation he CBIScanDesc cbiScan, CUDescScan* cudesc); extern bool SearchBufferAndCheckUnique(Relation rel, IndexTuple itup, IndexUniqueCheck checkUnique, Relation heapRel, GPIScanDesc gpiScan, CBIScanDesc cbiScan, CUDescScan* cudescScan, BTCheckElement* element); +extern bool CheckPartitionIsInvisible(GPIScanDesc gpiScan); /* * prototypes for functions in nbtpage.c