| 465 | } |
| 466 | |
| 467 | static DataTypePtr create(const ASTPtr & arguments) |
| 468 | { |
| 469 | if (!arguments || arguments->children.empty()) |
| 470 | return std::make_shared<DataTypeTuple>(DataTypes{}); |
| 471 | |
| 472 | DataTypes nested_types; |
| 473 | nested_types.reserve(arguments->children.size()); |
| 474 | |
| 475 | Strings names; |
| 476 | names.reserve(arguments->children.size()); |
| 477 | |
| 478 | for (const ASTPtr & child : arguments->children) |
| 479 | { |
| 480 | if (const auto * name_and_type_pair = child->as<ASTNameTypePair>()) |
| 481 | { |
| 482 | nested_types.emplace_back(DataTypeFactory::instance().get(name_and_type_pair->type)); |
| 483 | names.emplace_back(name_and_type_pair->name); |
| 484 | } |
| 485 | else |
| 486 | nested_types.emplace_back(DataTypeFactory::instance().get(child)); |
| 487 | } |
| 488 | |
| 489 | if (names.empty()) |
| 490 | return std::make_shared<DataTypeTuple>(nested_types); |
| 491 | if (names.size() != nested_types.size()) |
| 492 | throw Exception(ErrorCodes::BAD_ARGUMENTS, "Names are specified not for all elements of Tuple type"); |
| 493 | return std::make_shared<DataTypeTuple>(nested_types, names); |
| 494 | } |
| 495 | |
| 496 | |
| 497 | void registerDataTypeTuple(DataTypeFactory & factory) |