| 393 | } |
| 394 | |
| 395 | static DataTypePtr getLeastCommonTypeForTuple( |
| 396 | const DataTypeTuple & type, const DataTypes & concrete_types, bool check_ambiguos_paths) |
| 397 | { |
| 398 | const auto & element_types = type.getElements(); |
| 399 | DataTypes new_element_types(element_types.size()); |
| 400 | |
| 401 | for (size_t i = 0; i < element_types.size(); ++i) |
| 402 | { |
| 403 | DataTypes concrete_element_types; |
| 404 | concrete_element_types.reserve(concrete_types.size()); |
| 405 | |
| 406 | for (const auto & type_concrete : concrete_types) |
| 407 | { |
| 408 | const auto * type_tuple_conctete = typeid_cast<const DataTypeTuple *>(type_concrete.get()); |
| 409 | if (!type_tuple_conctete) |
| 410 | throw Exception(ErrorCodes::TYPE_MISMATCH, "Expected Tuple type, got {}", type_concrete->getName()); |
| 411 | |
| 412 | concrete_element_types.push_back(type_tuple_conctete->getElement(i)); |
| 413 | } |
| 414 | |
| 415 | new_element_types[i] = getLeastCommonTypeForDynamicColumnsImpl( |
| 416 | element_types[i], concrete_element_types, check_ambiguos_paths); |
| 417 | } |
| 418 | |
| 419 | return recreateTupleWithElements(type, new_element_types); |
| 420 | } |
| 421 | |
| 422 | static DataTypePtr getLeastCommonTypeForDynamicColumnsImpl( |
| 423 | const DataTypePtr & type_in_storage, const DataTypes & concrete_types, bool check_ambiguos_paths) |
no test coverage detected