diff --git a/src/backend/columnar/columnar_tableam.c b/src/backend/columnar/columnar_tableam.c index 517c5826d..91b55191f 100644 --- a/src/backend/columnar/columnar_tableam.c +++ b/src/backend/columnar/columnar_tableam.c @@ -109,6 +109,7 @@ static void ColumnarProcessUtility(PlannedStmt *pstmt, QueryCompletionCompat *completionTag); static bool ConditionalLockRelationWithTimeout(Relation rel, LOCKMODE lockMode, int timeout, int retryInterval); +static List * NeededColumnsList(TupleDesc tupdesc, Bitmapset *attr_needed); static void LogRelationStats(Relation rel, int elevel); static void TruncateColumnar(Relation rel, int elevel); static HeapTuple ColumnarSlotCopyHeapTuple(TupleTableSlot *slot); @@ -212,17 +213,7 @@ static ColumnarReadState * init_columnar_read_state(Relation relation, TupleDesc tupdesc, Bitmapset *attr_needed, List *scanQual) { - List *neededColumnList = NIL; - - for (int i = 0; i < tupdesc->natts; i++) - { - if (bms_is_member(i, attr_needed) && !tupdesc->attrs[i].attisdropped) - { - /* attr_needed is 0-indexed; neededColumnList is 1-indexed */ - neededColumnList = lappend_int(neededColumnList, i + 1); - } - } - + List *neededColumnList = NeededColumnsList(tupdesc, attr_needed); ColumnarReadState *readState = ColumnarBeginRead(relation, tupdesc, neededColumnList, scanQual); @@ -615,16 +606,10 @@ columnar_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap, columnarOptions, 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); - } - } - + /* we need all columns */ + int natts = OldHeap->rd_att->natts; + Bitmapset *attr_needed = bms_add_range(NULL, 0, natts - 1); + List *projectedColumnList = NeededColumnsList(sourceDesc, attr_needed); ColumnarReadState *readState = ColumnarBeginRead(OldHeap, sourceDesc, projectedColumnList, NULL); @@ -647,6 +632,34 @@ columnar_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap, } +/* + * NeededColumnsList returns a list of AttrNumber's for the columns that + * are not dropped and specified by attr_needed. + */ +static List * +NeededColumnsList(TupleDesc tupdesc, Bitmapset *attr_needed) +{ + List *columnList = NIL; + + for (int i = 0; i < tupdesc->natts; i++) + { + if (tupdesc->attrs[i].attisdropped) + { + continue; + } + + /* attr_needed is 0-indexed but columnList is 1-indexed */ + if (bms_is_member(i, attr_needed)) + { + AttrNumber varattno = i + 1; + columnList = lappend_int(columnList, varattno); + } + } + + return columnList; +} + + /* * columnar_vacuum_rel implements VACUUM without FULL option. */