| 6 | { |
| 7 | |
| 8 | ColumnPtr extractNestedColumnsAndNullMap(ColumnRawPtrs & key_columns, ConstNullMapPtr & null_map, const std::vector<bool> *null_safeColumns) |
| 9 | { |
| 10 | ColumnPtr null_map_holder; |
| 11 | |
| 12 | /* one additional null_map column was added for each null safe column, size always >= 2 */ |
| 13 | if (key_columns.size() == 1) |
| 14 | { |
| 15 | auto & column = key_columns[0]; |
| 16 | if (const auto * column_nullable = checkAndGetColumn<ColumnNullable>(*column)) |
| 17 | { |
| 18 | null_map_holder = column_nullable->getNullMapColumnPtr(); |
| 19 | null_map = &column_nullable->getNullMapData(); |
| 20 | column = &column_nullable->getNestedColumn(); |
| 21 | } |
| 22 | } |
| 23 | else |
| 24 | { |
| 25 | /* mapping with null_map columns for null safe columns */ |
| 26 | std::vector<bool> expanded_null_safes; |
| 27 | if (null_safeColumns) { |
| 28 | for (bool b : *null_safeColumns) { |
| 29 | expanded_null_safes.push_back(false); |
| 30 | if (b) |
| 31 | expanded_null_safes.push_back(true); |
| 32 | } |
| 33 | null_safeColumns = &expanded_null_safes; |
| 34 | } |
| 35 | |
| 36 | for (size_t n = 0; n < key_columns.size(); n++) |
| 37 | { |
| 38 | auto & column = key_columns[n]; |
| 39 | |
| 40 | /* do not construct null_map for null safe column */ |
| 41 | if (const auto * column_nullable = checkAndGetColumn<ColumnNullable>(*column)) |
| 42 | { |
| 43 | column = &column_nullable->getNestedColumn(); |
| 44 | |
| 45 | if (!null_map_holder) |
| 46 | { |
| 47 | if (null_safeColumns && (*null_safeColumns)[n]) |
| 48 | null_map_holder = ColumnUInt8::create(column->size(), 0); |
| 49 | else |
| 50 | null_map_holder = column_nullable->getNullMapColumnPtr(); |
| 51 | } |
| 52 | else |
| 53 | { |
| 54 | if (null_safeColumns && (*null_safeColumns)[n]) |
| 55 | continue; |
| 56 | |
| 57 | MutableColumnPtr mutable_null_map_holder = IColumn::mutate(std::move(null_map_holder)); |
| 58 | |
| 59 | PaddedPODArray<UInt8> & mutable_null_map = assert_cast<ColumnUInt8 &>(*mutable_null_map_holder).getData(); |
| 60 | const PaddedPODArray<UInt8> & other_null_map = column_nullable->getNullMapData(); |
| 61 | for (size_t i = 0, size = mutable_null_map.size(); i < size; ++i) |
| 62 | mutable_null_map[i] |= other_null_map[i]; |
| 63 | |
| 64 | null_map_holder = std::move(mutable_null_map_holder); |
| 65 | } |
no test coverage detected