--- /src/backend/access/gin/ginget.c +++ /src/backend/access/gin/ginget.c @@ -906,13 +906,20 @@ } else { + bool droppedItem = false; /* A posting tree */ do { /* If we've processed the current batch, load more items */ while (entry->offset >= entry->nlist) { - entryLoadMoreItems(ginstate, entry, advancePast, snapshot); + /* Load items past curItem if item was dropped and curItem is greater than advancePast */ + if (droppedItem == true && ginCompareItemPointers(&entry->curItem, &advancePast) > 0) + { + entryLoadMoreItems(ginstate, entry, entry->curItem, snapshot); + } else { + entryLoadMoreItems(ginstate, entry, advancePast, snapshot); + } if (entry->isFinished) { @@ -923,8 +930,10 @@ entry->curItem = entry->list[entry->offset++]; + droppedItem = false; + } while (ginCompareItemPointers(&entry->curItem, &advancePast) <= 0 || - (entry->reduceResult == true && dropItem(entry))); + (entry->reduceResult == true && (droppedItem = dropItem(entry)))); } }