mirror of https://github.com/citusdata/citus.git
refactor a bit to make it easier to support lossy bitmap results
parent
01f6c48944
commit
3f89a505d1
|
@ -84,7 +84,7 @@ typedef struct ColumnarScanDescData
|
||||||
Bitmapset *attr_needed;
|
Bitmapset *attr_needed;
|
||||||
List *scanQual;
|
List *scanQual;
|
||||||
|
|
||||||
int tupleindex;
|
Bitmapset *offsets;
|
||||||
} ColumnarScanDescData;
|
} ColumnarScanDescData;
|
||||||
|
|
||||||
typedef struct ColumnarScanDescData *ColumnarScanDesc;
|
typedef struct ColumnarScanDescData *ColumnarScanDesc;
|
||||||
|
@ -2072,7 +2072,35 @@ static bool
|
||||||
columnar_bitmap_next_block(TableScanDesc scan, TBMIterateResult *tbmres)
|
columnar_bitmap_next_block(TableScanDesc scan, TBMIterateResult *tbmres)
|
||||||
{
|
{
|
||||||
ColumnarScanDesc cscan = (ColumnarScanDesc) scan;
|
ColumnarScanDesc cscan = (ColumnarScanDesc) scan;
|
||||||
cscan->tupleindex = 0;
|
|
||||||
|
/* remove any previously left over set of offsets */
|
||||||
|
if (cscan->offsets != NULL)
|
||||||
|
{
|
||||||
|
bms_free(cscan->offsets);
|
||||||
|
cscan->offsets = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Load all unique offset numbers of the tid to load for the current block described
|
||||||
|
* in the tbmres. During the iteration of the block we simply consume the offset
|
||||||
|
* numbers till they are depleted. These offset numbers will be combined with the
|
||||||
|
* block number to construct the tid's.
|
||||||
|
*/
|
||||||
|
Bitmapset *offsets = NULL;
|
||||||
|
if (tbmres->ntuples >= 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tbmres->ntuples; i++)
|
||||||
|
{
|
||||||
|
offsets = bms_add_member(offsets, tbmres->offsets[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* TODO page is lossy, we should add all valid offsets to the bms */
|
||||||
|
Assert(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
cscan->offsets = offsets;
|
||||||
|
|
||||||
return tbmres->blockno == 0;
|
return tbmres->blockno == 0;
|
||||||
}
|
}
|
||||||
|
@ -2083,16 +2111,16 @@ columnar_bitmap_next_tuple(TableScanDesc scan, TBMIterateResult *tbmres,
|
||||||
TupleTableSlot *slot)
|
TupleTableSlot *slot)
|
||||||
{
|
{
|
||||||
ColumnarScanDesc cscan = (ColumnarScanDesc) scan;
|
ColumnarScanDesc cscan = (ColumnarScanDesc) scan;
|
||||||
|
if (bms_is_empty(cscan->offsets))
|
||||||
if (cscan->tupleindex >= tbmres->ntuples)
|
|
||||||
{
|
{
|
||||||
|
/* offsets are empty, we have returned all the tuples for this page */
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* since we already did an empty check we know we will read a valid OffsetNumber */
|
||||||
|
OffsetNumber offset = bms_first_member(cscan->offsets);
|
||||||
ItemPointerData tid = { 0 };
|
ItemPointerData tid = { 0 };
|
||||||
|
ItemPointerSet(&tid, tbmres->blockno, offset);
|
||||||
ItemPointerSet(&tid, tbmres->blockno, tbmres->offsets[cscan->tupleindex]);
|
|
||||||
cscan->tupleindex++;
|
|
||||||
|
|
||||||
ExecClearTuple(slot);
|
ExecClearTuple(slot);
|
||||||
|
|
||||||
|
@ -2101,15 +2129,11 @@ columnar_bitmap_next_tuple(TableScanDesc scan, TBMIterateResult *tbmres,
|
||||||
/* initialize read state for the first row */
|
/* initialize read state for the first row */
|
||||||
if (cscan->cs_readState == NULL)
|
if (cscan->cs_readState == NULL)
|
||||||
{
|
{
|
||||||
/* we need all columns */
|
|
||||||
int natts = rel->rd_att->natts;
|
|
||||||
Bitmapset *attr_needed = bms_add_range(NULL, 0, natts - 1);
|
|
||||||
|
|
||||||
/* no quals for index scan */
|
/* no quals for index scan */
|
||||||
List *scanQual = NIL;
|
List *scanQual = NIL;
|
||||||
|
|
||||||
cscan->cs_readState = init_columnar_read_state(rel, slot->tts_tupleDescriptor,
|
cscan->cs_readState = init_columnar_read_state(rel, slot->tts_tupleDescriptor,
|
||||||
attr_needed, scanQual,
|
cscan->attr_needed, scanQual,
|
||||||
cscan->scanContext,
|
cscan->scanContext,
|
||||||
cscan->cs_base.rs_snapshot);
|
cscan->cs_base.rs_snapshot);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue