mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Separate TBM[Shared|Private]Iterator and TBMIterateResult
Remove the TBMIterateResult member from the TBMPrivateIterator and TBMSharedIterator and make tbm_[shared|private_]iterate() take a TBMIterateResult as a parameter. This allows tidbitmap API users to manage multiple TBMIterateResults per scan. This is required for bitmap heap scan to use the read stream API, with which there may be multiple I/Os in flight at once, each one with a TBMIterateResult. Reviewed-by: Tomas Vondra <tomas@vondra.me> Discussion: https://postgr.es/m/d4bb26c9-fe07-439e-ac53-c0e244387e01%40vondra.me
This commit is contained in:
@@ -332,8 +332,8 @@ restartScanEntry:
|
||||
entry->list = NULL;
|
||||
entry->nlist = 0;
|
||||
entry->matchBitmap = NULL;
|
||||
entry->matchResult = NULL;
|
||||
entry->matchNtuples = -1;
|
||||
entry->matchResult.blockno = InvalidBlockNumber;
|
||||
entry->reduceResult = false;
|
||||
entry->predictNumberResult = 0;
|
||||
|
||||
@@ -827,20 +827,19 @@ entryGetItem(GinState *ginstate, GinScanEntry entry,
|
||||
{
|
||||
/*
|
||||
* If we've exhausted all items on this block, move to next block
|
||||
* in the bitmap.
|
||||
* in the bitmap. tbm_private_iterate() sets matchResult.blockno
|
||||
* to InvalidBlockNumber when the bitmap is exhausted.
|
||||
*/
|
||||
while (entry->matchResult == NULL ||
|
||||
(!entry->matchResult->lossy &&
|
||||
while ((!BlockNumberIsValid(entry->matchResult.blockno)) ||
|
||||
(!entry->matchResult.lossy &&
|
||||
entry->offset >= entry->matchNtuples) ||
|
||||
entry->matchResult->blockno < advancePastBlk ||
|
||||
entry->matchResult.blockno < advancePastBlk ||
|
||||
(ItemPointerIsLossyPage(&advancePast) &&
|
||||
entry->matchResult->blockno == advancePastBlk))
|
||||
entry->matchResult.blockno == advancePastBlk))
|
||||
{
|
||||
entry->matchResult =
|
||||
tbm_private_iterate(entry->matchIterator);
|
||||
|
||||
if (entry->matchResult == NULL)
|
||||
if (!tbm_private_iterate(entry->matchIterator, &entry->matchResult))
|
||||
{
|
||||
Assert(!BlockNumberIsValid(entry->matchResult.blockno));
|
||||
ItemPointerSetInvalid(&entry->curItem);
|
||||
tbm_end_private_iterate(entry->matchIterator);
|
||||
entry->matchIterator = NULL;
|
||||
@@ -849,14 +848,14 @@ entryGetItem(GinState *ginstate, GinScanEntry entry,
|
||||
}
|
||||
|
||||
/* Exact pages need their tuple offsets extracted. */
|
||||
if (!entry->matchResult->lossy)
|
||||
entry->matchNtuples = tbm_extract_page_tuple(entry->matchResult,
|
||||
if (!entry->matchResult.lossy)
|
||||
entry->matchNtuples = tbm_extract_page_tuple(&entry->matchResult,
|
||||
entry->matchOffsets,
|
||||
TBM_MAX_TUPLES_PER_PAGE);
|
||||
|
||||
/*
|
||||
* Reset counter to the beginning of entry->matchResult. Note:
|
||||
* entry->offset is still greater than entry->matchNtuples if
|
||||
* entry->offset is still greater than matchResult.ntuples if
|
||||
* matchResult is lossy. So, on next call we will get next
|
||||
* result from TIDBitmap.
|
||||
*/
|
||||
@@ -869,10 +868,10 @@ entryGetItem(GinState *ginstate, GinScanEntry entry,
|
||||
* We're now on the first page after advancePast which has any
|
||||
* items on it. If it's a lossy result, return that.
|
||||
*/
|
||||
if (entry->matchResult->lossy)
|
||||
if (entry->matchResult.lossy)
|
||||
{
|
||||
ItemPointerSetLossyPage(&entry->curItem,
|
||||
entry->matchResult->blockno);
|
||||
entry->matchResult.blockno);
|
||||
|
||||
/*
|
||||
* We might as well fall out of the loop; we could not
|
||||
@@ -889,7 +888,7 @@ entryGetItem(GinState *ginstate, GinScanEntry entry,
|
||||
Assert(entry->matchNtuples > -1);
|
||||
|
||||
/* Skip over any offsets <= advancePast, and return that. */
|
||||
if (entry->matchResult->blockno == advancePastBlk)
|
||||
if (entry->matchResult.blockno == advancePastBlk)
|
||||
{
|
||||
Assert(entry->matchNtuples > 0);
|
||||
|
||||
@@ -910,7 +909,7 @@ entryGetItem(GinState *ginstate, GinScanEntry entry,
|
||||
}
|
||||
|
||||
ItemPointerSet(&entry->curItem,
|
||||
entry->matchResult->blockno,
|
||||
entry->matchResult.blockno,
|
||||
entry->matchOffsets[entry->offset]);
|
||||
entry->offset++;
|
||||
|
||||
|
@@ -111,7 +111,7 @@ ginFillScanEntry(GinScanOpaque so, OffsetNumber attnum,
|
||||
ItemPointerSetMin(&scanEntry->curItem);
|
||||
scanEntry->matchBitmap = NULL;
|
||||
scanEntry->matchIterator = NULL;
|
||||
scanEntry->matchResult = NULL;
|
||||
scanEntry->matchResult.blockno = InvalidBlockNumber;
|
||||
scanEntry->matchNtuples = -1;
|
||||
scanEntry->list = NULL;
|
||||
scanEntry->nlist = 0;
|
||||
|
Reference in New Issue
Block a user