mirror of https://github.com/citusdata/citus.git
Columnar: make projectedColumnList an integer list. (#4869)
Co-authored-by: Jeff Davis <jefdavi@microsoft.com>pull/4823/head^2
parent
d74d358a45
commit
3efdfdd791
|
@ -70,9 +70,8 @@ struct ColumnarReadState
|
||||||
StripeReadState *stripeReadState;
|
StripeReadState *stripeReadState;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* List of Var pointers for columns in the query. We use this both for
|
* Integer list of attribute numbers (1-indexed) for columns needed by the
|
||||||
* getting vector of projected columns, and also when we want to build
|
* query.
|
||||||
* base constraint to find selected row chunks.
|
|
||||||
*/
|
*/
|
||||||
List *projectedColumnList;
|
List *projectedColumnList;
|
||||||
|
|
||||||
|
@ -139,6 +138,8 @@ static Datum ColumnDefaultValue(TupleConstr *tupleConstraints,
|
||||||
/*
|
/*
|
||||||
* ColumnarBeginRead initializes a columnar read operation. This function returns a
|
* ColumnarBeginRead initializes a columnar read operation. This function returns a
|
||||||
* read handle that's used during reading rows and finishing the read operation.
|
* read handle that's used during reading rows and finishing the read operation.
|
||||||
|
*
|
||||||
|
* projectedColumnList is an integer list of attribute numbers (1-indexed).
|
||||||
*/
|
*/
|
||||||
ColumnarReadState *
|
ColumnarReadState *
|
||||||
ColumnarBeginRead(Relation relation, TupleDesc tupleDescriptor,
|
ColumnarBeginRead(Relation relation, TupleDesc tupleDescriptor,
|
||||||
|
@ -415,12 +416,14 @@ ReadChunkGroupNextRow(ChunkGroupReadState *chunkGroupReadState, Datum *columnVal
|
||||||
*/
|
*/
|
||||||
memset(columnNulls, true, sizeof(bool) * chunkGroupReadState->columnCount);
|
memset(columnNulls, true, sizeof(bool) * chunkGroupReadState->columnCount);
|
||||||
|
|
||||||
Var *projectedColumn = NULL;
|
int attno;
|
||||||
foreach_ptr(projectedColumn, chunkGroupReadState->projectedColumnList)
|
foreach_int(attno, chunkGroupReadState->projectedColumnList)
|
||||||
{
|
{
|
||||||
const ChunkData *chunkGroupData = chunkGroupReadState->chunkGroupData;
|
const ChunkData *chunkGroupData = chunkGroupReadState->chunkGroupData;
|
||||||
const int rowIndex = chunkGroupReadState->currentRow;
|
const int rowIndex = chunkGroupReadState->currentRow;
|
||||||
uint32 columnIndex = projectedColumn->varattno - 1;
|
|
||||||
|
/* attno is 1-indexed; existsArray is 0-indexed */
|
||||||
|
const uint32 columnIndex = attno - 1;
|
||||||
|
|
||||||
if (chunkGroupData->existsArray[columnIndex][rowIndex])
|
if (chunkGroupData->existsArray[columnIndex][rowIndex])
|
||||||
{
|
{
|
||||||
|
@ -1010,12 +1013,12 @@ static bool *
|
||||||
ProjectedColumnMask(uint32 columnCount, List *projectedColumnList)
|
ProjectedColumnMask(uint32 columnCount, List *projectedColumnList)
|
||||||
{
|
{
|
||||||
bool *projectedColumnMask = palloc0(columnCount * sizeof(bool));
|
bool *projectedColumnMask = palloc0(columnCount * sizeof(bool));
|
||||||
ListCell *columnCell = NULL;
|
int attno;
|
||||||
|
|
||||||
foreach(columnCell, projectedColumnList)
|
foreach_int(attno, projectedColumnList)
|
||||||
{
|
{
|
||||||
Var *column = (Var *) lfirst(columnCell);
|
/* attno is 1-indexed; projectedColumnMask is 0-indexed */
|
||||||
uint32 columnIndex = column->varattno - 1;
|
int columnIndex = attno - 1;
|
||||||
projectedColumnMask[columnIndex] = true;
|
projectedColumnMask[columnIndex] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -119,34 +119,6 @@ static Datum * detoast_values(TupleDesc tupleDesc, Datum *orig_values, bool *isn
|
||||||
/* Custom tuple slot ops used for columnar. Initialized in columnar_tableam_init(). */
|
/* Custom tuple slot ops used for columnar. Initialized in columnar_tableam_init(). */
|
||||||
static TupleTableSlotOps TTSOpsColumnar;
|
static TupleTableSlotOps TTSOpsColumnar;
|
||||||
|
|
||||||
static List *
|
|
||||||
RelationColumnList(TupleDesc tupdesc)
|
|
||||||
{
|
|
||||||
List *columnList = NIL;
|
|
||||||
|
|
||||||
for (int i = 0; i < tupdesc->natts; i++)
|
|
||||||
{
|
|
||||||
Index varno = 1;
|
|
||||||
AttrNumber varattno = i + 1;
|
|
||||||
Oid vartype = tupdesc->attrs[i].atttypid;
|
|
||||||
int32 vartypmod = tupdesc->attrs[i].atttypmod;
|
|
||||||
Oid varcollid = tupdesc->attrs[i].attcollation;
|
|
||||||
Index varlevelsup = 0;
|
|
||||||
|
|
||||||
if (tupdesc->attrs[i].attisdropped)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Var *var = makeVar(varno, varattno, vartype, vartypmod,
|
|
||||||
varcollid, varlevelsup);
|
|
||||||
columnList = lappend(columnList, var);
|
|
||||||
}
|
|
||||||
|
|
||||||
return columnList;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static const TupleTableSlotOps *
|
static const TupleTableSlotOps *
|
||||||
columnar_slot_callbacks(Relation relation)
|
columnar_slot_callbacks(Relation relation)
|
||||||
{
|
{
|
||||||
|
@ -161,9 +133,9 @@ columnar_beginscan(Relation relation, Snapshot snapshot,
|
||||||
uint32 flags)
|
uint32 flags)
|
||||||
{
|
{
|
||||||
int natts = relation->rd_att->natts;
|
int natts = relation->rd_att->natts;
|
||||||
Bitmapset *attr_needed = NULL;
|
|
||||||
|
|
||||||
attr_needed = bms_add_range(attr_needed, 0, natts - 1);
|
/* attr_needed represents 0-indexed attribute numbers */
|
||||||
|
Bitmapset *attr_needed = bms_add_range(NULL, 0, natts - 1);
|
||||||
|
|
||||||
/* the columnar access method does not use the flags, they are specific to heap */
|
/* the columnar access method does not use the flags, they are specific to heap */
|
||||||
flags = 0;
|
flags = 0;
|
||||||
|
@ -241,18 +213,14 @@ static ColumnarReadState *
|
||||||
init_columnar_read_state(Relation relation, TupleDesc tupdesc, Bitmapset *attr_needed,
|
init_columnar_read_state(Relation relation, TupleDesc tupdesc, Bitmapset *attr_needed,
|
||||||
List *scanQual)
|
List *scanQual)
|
||||||
{
|
{
|
||||||
List *columnList = RelationColumnList(tupdesc);
|
|
||||||
ListCell *columnCell = NULL;
|
|
||||||
|
|
||||||
List *neededColumnList = NIL;
|
List *neededColumnList = NIL;
|
||||||
|
|
||||||
/* only collect columns that we need for the scan */
|
for (int i = 0; i < tupdesc->natts; i++)
|
||||||
foreach(columnCell, columnList)
|
|
||||||
{
|
{
|
||||||
Var *var = castNode(Var, lfirst(columnCell));
|
if (bms_is_member(i, attr_needed) && !tupdesc->attrs[i].attisdropped)
|
||||||
if (bms_is_member(var->varattno - 1, attr_needed))
|
|
||||||
{
|
{
|
||||||
neededColumnList = lappend(neededColumnList, var);
|
/* attr_needed is 0-indexed; neededColumnList is 1-indexed */
|
||||||
|
neededColumnList = lappend_int(neededColumnList, i + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -648,8 +616,18 @@ columnar_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap,
|
||||||
columnarOptions,
|
columnarOptions,
|
||||||
targetDesc);
|
targetDesc);
|
||||||
|
|
||||||
|
List *projectedColumnList = NIL;
|
||||||
|
for (int i = 0; i < sourceDesc->natts; i++)
|
||||||
|
{
|
||||||
|
if (!sourceDesc->attrs[i].attisdropped)
|
||||||
|
{
|
||||||
|
/* projectedColumnList is 1-indexed */
|
||||||
|
projectedColumnList = lappend_int(projectedColumnList, i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ColumnarReadState *readState = ColumnarBeginRead(OldHeap, sourceDesc,
|
ColumnarReadState *readState = ColumnarBeginRead(OldHeap, sourceDesc,
|
||||||
RelationColumnList(sourceDesc),
|
projectedColumnList,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
Datum *values = palloc0(sourceDesc->natts * sizeof(Datum));
|
Datum *values = palloc0(sourceDesc->natts * sizeof(Datum));
|
||||||
|
|
Loading…
Reference in New Issue