| 71 | } |
| 72 | |
| 73 | ASTPtr getCreateQueryFromStorage(const StoragePtr & storage, const ASTPtr & ast_storage, bool only_ordinary, uint32_t max_parser_depth, bool throw_on_error) |
| 74 | { |
| 75 | auto table_id = storage->getStorageID(); |
| 76 | auto metadata_ptr = storage->getInMemoryMetadataPtr(); |
| 77 | if (metadata_ptr == nullptr) |
| 78 | { |
| 79 | if (throw_on_error) |
| 80 | throw Exception(ErrorCodes::CANNOT_GET_CREATE_TABLE_QUERY, "Cannot get metadata of {}.{}", backQuote(table_id.database_name), backQuote(table_id.table_name)); |
| 81 | else |
| 82 | return nullptr; |
| 83 | } |
| 84 | |
| 85 | auto create_table_query = std::make_shared<ASTCreateQuery>(); |
| 86 | create_table_query->attach = false; |
| 87 | create_table_query->table = table_id.table_name; |
| 88 | create_table_query->database = table_id.database_name; |
| 89 | create_table_query->set(create_table_query->storage, ast_storage); |
| 90 | |
| 91 | /// setup create table query columns info. |
| 92 | { |
| 93 | auto ast_columns_list = std::make_shared<ASTColumns>(); |
| 94 | auto ast_expression_list = std::make_shared<ASTExpressionList>(); |
| 95 | NamesAndTypesList columns; |
| 96 | if (only_ordinary) |
| 97 | columns = metadata_ptr->columns.getOrdinary(); |
| 98 | else |
| 99 | columns = metadata_ptr->columns.getAll(); |
| 100 | for (const auto & column_name_and_type: columns) |
| 101 | { |
| 102 | const auto & ast_column_declaration = std::make_shared<ASTColumnDeclaration>(); |
| 103 | ast_column_declaration->name = column_name_and_type.name; |
| 104 | /// parser typename |
| 105 | { |
| 106 | ASTPtr ast_type; |
| 107 | auto type_name = column_name_and_type.type->getName(); |
| 108 | const auto * string_end = type_name.c_str() + type_name.length(); |
| 109 | Expected expected; |
| 110 | expected.max_parsed_pos = string_end; |
| 111 | Tokens tokens(type_name.c_str(), string_end); |
| 112 | IParser::Pos pos(tokens, max_parser_depth); |
| 113 | ParserDataType parser; |
| 114 | if (!parser.parse(pos, ast_type, expected)) |
| 115 | { |
| 116 | if (throw_on_error) |
| 117 | throw Exception(ErrorCodes::LOGICAL_ERROR, "Cannot parser metadata of {}.{}", backQuote(table_id.database_name), backQuote(table_id.table_name)); |
| 118 | else |
| 119 | return nullptr; |
| 120 | } |
| 121 | ast_column_declaration->type = ast_type; |
| 122 | } |
| 123 | ast_expression_list->children.emplace_back(ast_column_declaration); |
| 124 | } |
| 125 | |
| 126 | ast_columns_list->set(ast_columns_list->columns, ast_expression_list); |
| 127 | create_table_query->set(create_table_query->columns_list, ast_columns_list); |
| 128 | } |
| 129 | return create_table_query; |
| 130 | } |
no test coverage detected