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

Function extractPrimaryKeyColumnNames

programs/copier/Internals.cpp:213–258  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

211
212
213Names extractPrimaryKeyColumnNames(const ASTPtr & storage_ast)
214{
215 const auto sorting_key_ast = extractOrderBy(storage_ast);
216 const auto primary_key_ast = extractPrimaryKey(storage_ast);
217
218 const auto sorting_key_expr_list = extractKeyExpressionList(sorting_key_ast);
219 const auto primary_key_expr_list = primary_key_ast
220 ? extractKeyExpressionList(primary_key_ast) : sorting_key_expr_list->clone();
221
222 /// Maybe we have to handle VersionedCollapsing engine separately. But in our case in looks pointless.
223
224 size_t primary_key_size = primary_key_expr_list->children.size();
225 size_t sorting_key_size = sorting_key_expr_list->children.size();
226
227 if (primary_key_size > sorting_key_size)
228 throw Exception("Primary key must be a prefix of the sorting key, but its length: "
229 + toString(primary_key_size) + " is greater than the sorting key length: " + toString(sorting_key_size),
230 ErrorCodes::BAD_ARGUMENTS);
231
232 Names primary_key_columns;
233 NameSet primary_key_columns_set;
234
235 for (size_t i = 0; i < sorting_key_size; ++i)
236 {
237 /// Column name could be represented as a f_1(f_2(...f_n(column_name))).
238 /// Each f_i could take one or more parameters.
239 /// We will wrap identifiers with backticks to allow non-standart identifier names.
240 String sorting_key_column = sorting_key_expr_list->children[i]->getColumnName();
241
242 if (i < primary_key_size)
243 {
244 String pk_column = primary_key_expr_list->children[i]->getColumnName();
245 if (pk_column != sorting_key_column)
246 throw Exception("Primary key must be a prefix of the sorting key, but the column in the position "
247 + toString(i) + " is " + sorting_key_column +", not " + pk_column,
248 ErrorCodes::BAD_ARGUMENTS);
249
250 if (!primary_key_columns_set.emplace(pk_column).second)
251 throw Exception("Primary key contains duplicate columns", ErrorCodes::BAD_ARGUMENTS);
252
253 primary_key_columns.push_back(wrapIdentifiersWithBackticks(primary_key_expr_list->children[i]));
254 }
255 }
256
257 return primary_key_columns;
258}
259
260bool isReplicatedTableEngine(const ASTPtr & storage_ast)
261{

Callers 1

TaskTableMethod · 0.85

Calls 11

extractOrderByFunction · 0.85
extractPrimaryKeyFunction · 0.85
extractKeyExpressionListFunction · 0.85
ExceptionClass · 0.50
toStringFunction · 0.50
cloneMethod · 0.45
sizeMethod · 0.45
getColumnNameMethod · 0.45
emplaceMethod · 0.45
push_backMethod · 0.45

Tested by

no test coverage detected