diff --git a/src/backend/access/gin/ginbtree.c b/src/backend/access/gin/ginbtree.c index 030d0f4418..78213dcb4e 100644 --- a/src/backend/access/gin/ginbtree.c +++ b/src/backend/access/gin/ginbtree.c @@ -72,9 +72,13 @@ ginTraverseLock(Buffer buffer, bool searchMode) * If 'searchmode' is false, on return stack->buffer is exclusively locked, * and the stack represents the full path to the root. Otherwise stack->buffer * is share-locked, and stack->parent is NULL. + * + * If 'rootConflictCheck' is true, tree root is checked for serialization + * conflict. */ GinBtreeStack * -ginFindLeafPage(GinBtree btree, bool searchMode, Snapshot snapshot) +ginFindLeafPage(GinBtree btree, bool searchMode, + bool rootConflictCheck, Snapshot snapshot) { GinBtreeStack *stack; @@ -84,7 +88,7 @@ ginFindLeafPage(GinBtree btree, bool searchMode, Snapshot snapshot) stack->parent = NULL; stack->predictNumber = 1; - if (!searchMode) + if (rootConflictCheck) CheckForSerializableConflictIn(btree->index, NULL, stack->buffer); for (;;) diff --git a/src/backend/access/gin/gindatapage.c b/src/backend/access/gin/gindatapage.c index 9f20513811..54d6890912 100644 --- a/src/backend/access/gin/gindatapage.c +++ b/src/backend/access/gin/gindatapage.c @@ -1913,7 +1913,7 @@ ginInsertItemPointers(Relation index, BlockNumber rootBlkno, { /* search for the leaf page where the first item should go to */ btree.itemptr = insertdata.items[insertdata.curitem]; - stack = ginFindLeafPage(&btree, false, NULL); + stack = ginFindLeafPage(&btree, false, true, NULL); ginInsertValue(&btree, stack, &insertdata, buildStats); } @@ -1932,7 +1932,7 @@ ginScanBeginPostingTree(GinBtree btree, Relation index, BlockNumber rootBlkno, btree->fullScan = true; - stack = ginFindLeafPage(btree, true, snapshot); + stack = ginFindLeafPage(btree, true, false, snapshot); return stack; } diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c index 8466d947ea..6bfe18c359 100644 --- a/src/backend/access/gin/ginget.c +++ b/src/backend/access/gin/ginget.c @@ -338,7 +338,7 @@ restartScanEntry: ginPrepareEntryScan(&btreeEntry, entry->attnum, entry->queryKey, entry->queryCategory, ginstate); - stackEntry = ginFindLeafPage(&btreeEntry, true, snapshot); + stackEntry = ginFindLeafPage(&btreeEntry, true, false, snapshot); page = BufferGetPage(stackEntry->buffer); /* ginFindLeafPage() will have already checked snapshot age. */ @@ -679,7 +679,7 @@ entryLoadMoreItems(GinState *ginstate, GinScanEntry entry, OffsetNumberNext(GinItemPointerGetOffsetNumber(&advancePast))); } entry->btree.fullScan = false; - stack = ginFindLeafPage(&entry->btree, true, snapshot); + stack = ginFindLeafPage(&entry->btree, true, false, snapshot); /* we don't need the stack, just the buffer. */ entry->buffer = stack->buffer; diff --git a/src/backend/access/gin/gininsert.c b/src/backend/access/gin/gininsert.c index 5281eb6823..2781d3fdd8 100644 --- a/src/backend/access/gin/gininsert.c +++ b/src/backend/access/gin/gininsert.c @@ -195,7 +195,7 @@ ginEntryInsert(GinState *ginstate, ginPrepareEntryScan(&btree, attnum, key, category, ginstate); - stack = ginFindLeafPage(&btree, false, NULL); + stack = ginFindLeafPage(&btree, false, false, NULL); page = BufferGetPage(stack->buffer); if (btree.findItem(&btree, stack)) diff --git a/src/include/access/gin_private.h b/src/include/access/gin_private.h index 81bf8734ce..bca8246319 100644 --- a/src/include/access/gin_private.h +++ b/src/include/access/gin_private.h @@ -195,7 +195,8 @@ typedef struct * PostingItem */ -extern GinBtreeStack *ginFindLeafPage(GinBtree btree, bool searchMode, Snapshot snapshot); +extern GinBtreeStack *ginFindLeafPage(GinBtree btree, bool searchMode, + bool rootConflictCheck, Snapshot snapshot); extern Buffer ginStepRight(Buffer buffer, Relation index, int lockmode); extern void freeGinBtreeStack(GinBtreeStack *stack); extern void ginInsertValue(GinBtree btree, GinBtreeStack *stack,