diff --git a/src/backend/access/gin/gindatapage.c b/src/backend/access/gin/gindatapage.c index 5b7c49654c65d95626b2edd84d8b673810165bd5..76e0cb3e19f7bdea54edb9e468efea1d902b8940 100644 --- a/src/backend/access/gin/gindatapage.c +++ b/src/backend/access/gin/gindatapage.c @@ -641,20 +641,24 @@ dataPlaceToPageLeaf(GinBtree btree, Buffer buf, GinBtreeStack *stack, { lastleftinfo = dlist_container(leafSegmentInfo, node, leaf->lastleft); - segsize = SizeOfGinPostingList(lastleftinfo->seg); - if (append) + /* ignore deleted segments */ + if (lastleftinfo->action != GIN_SEGMENT_DELETE) { - if ((leaf->lsize - segsize) - (leaf->lsize - segsize) < BLCKSZ / 4) - break; + segsize = SizeOfGinPostingList(lastleftinfo->seg); + if (append) + { + if ((leaf->lsize - segsize) - (leaf->lsize - segsize) < BLCKSZ / 4) + break; + } + else + { + if ((leaf->lsize - segsize) - (leaf->rsize + segsize) < 0) + break; + } + + leaf->lsize -= segsize; + leaf->rsize += segsize; } - else - { - if ((leaf->lsize - segsize) - (leaf->rsize + segsize) < 0) - break; - } - - leaf->lsize -= segsize; - leaf->rsize += segsize; leaf->lastleft = dlist_prev_node(&leaf->segments, leaf->lastleft); } }