| 17 | } |
| 18 | |
| 19 | void transformTypesRecursively(DataTypes & types, std::function<void(DataTypes &, TypeIndexesSet &)> transform_simple_types, std::function<void(DataTypes &, TypeIndexesSet &)> transform_complex_types) |
| 20 | { |
| 21 | TypeIndexesSet type_indexes = getTypesIndexes(types); |
| 22 | |
| 23 | /// Nullable |
| 24 | if (type_indexes.contains(TypeIndex::Nullable)) |
| 25 | { |
| 26 | std::vector<UInt8> is_nullable; |
| 27 | is_nullable.reserve(types.size()); |
| 28 | DataTypes nested_types; |
| 29 | nested_types.reserve(types.size()); |
| 30 | for (const auto & type : types) |
| 31 | { |
| 32 | if (const DataTypeNullable * type_nullable = typeid_cast<const DataTypeNullable *>(type.get())) |
| 33 | { |
| 34 | is_nullable.push_back(1); |
| 35 | nested_types.push_back(type_nullable->getNestedType()); |
| 36 | } |
| 37 | else |
| 38 | { |
| 39 | is_nullable.push_back(0); |
| 40 | nested_types.push_back(type); |
| 41 | } |
| 42 | } |
| 43 | |
| 44 | transformTypesRecursively(nested_types, transform_simple_types, transform_complex_types); |
| 45 | for (size_t i = 0; i != types.size(); ++i) |
| 46 | { |
| 47 | /// Type could be changed so it cannot be inside Nullable anymore. |
| 48 | if (is_nullable[i] && nested_types[i]->canBeInsideNullable()) |
| 49 | types[i] = makeNullable(nested_types[i]); |
| 50 | else |
| 51 | types[i] = nested_types[i]; |
| 52 | } |
| 53 | |
| 54 | if (transform_complex_types) |
| 55 | { |
| 56 | /// Some types could be changed. |
| 57 | type_indexes = getTypesIndexes(types); |
| 58 | transform_complex_types(types, type_indexes); |
| 59 | } |
| 60 | |
| 61 | return; |
| 62 | } |
| 63 | |
| 64 | /// Arrays |
| 65 | if (type_indexes.contains(TypeIndex::Array)) |
| 66 | { |
| 67 | /// All types are Array |
| 68 | if (type_indexes.size() == 1) |
| 69 | { |
| 70 | DataTypes nested_types; |
| 71 | for (const auto & type : types) |
| 72 | nested_types.push_back(typeid_cast<const DataTypeArray *>(type.get())->getNestedType()); |
| 73 | |
| 74 | transformTypesRecursively(nested_types, transform_simple_types, transform_complex_types); |
| 75 | for (size_t i = 0; i != types.size(); ++i) |
| 76 | types[i] = std::make_shared<DataTypeArray>(nested_types[i]); |
no test coverage detected