MCPcopy Create free account
hub / github.com/ByConity/ByConity / getCreateQueryFromStorage

Function getCreateQueryFromStorage

src/Databases/DatabasesCommon.cpp:73–130  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

71}
72
73ASTPtr 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}

Callers 2

Calls 11

backQuoteFunction · 0.85
getOrdinaryMethod · 0.80
lengthMethod · 0.80
ExceptionClass · 0.50
getStorageIDMethod · 0.45
setMethod · 0.45
getAllMethod · 0.45
getNameMethod · 0.45
parseMethod · 0.45
emplace_backMethod · 0.45

Tested by

no test coverage detected