diff --git a/dbms/src/DataTypes/DataTypeAggregateFunction.cpp b/dbms/src/DataTypes/DataTypeAggregateFunction.cpp index a2c00e18acb..b53b7529f95 100644 --- a/dbms/src/DataTypes/DataTypeAggregateFunction.cpp +++ b/dbms/src/DataTypes/DataTypeAggregateFunction.cpp @@ -366,7 +366,7 @@ static DataTypePtr create(const ASTPtr & arguments) params_row[i] = literal->value; } } - else if (auto opt_name = getIdentifierName(arguments->children[0])) + else if (auto opt_name = tryGetIdentifierName(arguments->children[0])) { function_name = *opt_name; } diff --git a/dbms/src/DataTypes/DataTypeCustomSimpleAggregateFunction.cpp b/dbms/src/DataTypes/DataTypeCustomSimpleAggregateFunction.cpp index 2cb0f87facd..8151ccf1948 100644 --- a/dbms/src/DataTypes/DataTypeCustomSimpleAggregateFunction.cpp +++ b/dbms/src/DataTypes/DataTypeCustomSimpleAggregateFunction.cpp @@ -88,7 +88,7 @@ static std::pair create(const ASTPtr & argum params_row[i] = lit->value; } } - else if (auto opt_name = getIdentifierName(arguments->children[0])) + else if (auto opt_name = tryGetIdentifierName(arguments->children[0])) { function_name = *opt_name; } diff --git a/dbms/src/Interpreters/ActionsVisitor.cpp b/dbms/src/Interpreters/ActionsVisitor.cpp index d0237f7cb88..523343a288e 100644 --- a/dbms/src/Interpreters/ActionsVisitor.cpp +++ b/dbms/src/Interpreters/ActionsVisitor.cpp @@ -463,7 +463,7 @@ void ActionsVisitor::visit(const ASTPtr & ast) for (size_t j = 0; j < lambda_arg_asts.size(); ++j) { - auto opt_arg_name = getIdentifierName(lambda_arg_asts[j]); + auto opt_arg_name = tryGetIdentifierName(lambda_arg_asts[j]); if (!opt_arg_name) throw Exception("lambda argument declarations must be identifiers", ErrorCodes::TYPE_MISMATCH); diff --git a/dbms/src/Interpreters/ColumnNamesContext.h b/dbms/src/Interpreters/ColumnNamesContext.h index 72f5f8f8684..c30102cf8d7 100644 --- a/dbms/src/Interpreters/ColumnNamesContext.h +++ b/dbms/src/Interpreters/ColumnNamesContext.h @@ -39,7 +39,7 @@ struct ColumnNamesContext std::optional name() const { if (expr) - return getIdentifierName(expr->database_and_table_name); + return tryGetIdentifierName(expr->database_and_table_name); return {}; } diff --git a/dbms/src/Interpreters/GlobalSubqueriesVisitor.h b/dbms/src/Interpreters/GlobalSubqueriesVisitor.h index 229fa00a59f..1622c27f62f 100644 --- a/dbms/src/Interpreters/GlobalSubqueriesVisitor.h +++ b/dbms/src/Interpreters/GlobalSubqueriesVisitor.h @@ -75,7 +75,7 @@ public: if (is_table) { /// If this is already an external table, you do not need to add anything. Just remember its presence. - if (external_tables.end() != external_tables.find(*getIdentifierName(subquery_or_table_name))) + if (external_tables.end() != external_tables.find(getIdentifierName(subquery_or_table_name))) return; } diff --git a/dbms/src/Interpreters/QueryNormalizer.cpp b/dbms/src/Interpreters/QueryNormalizer.cpp index cea801c7c2f..844c53c79ac 100644 --- a/dbms/src/Interpreters/QueryNormalizer.cpp +++ b/dbms/src/Interpreters/QueryNormalizer.cpp @@ -74,7 +74,7 @@ void QueryNormalizer::visit(ASTFunction & node, const ASTPtr &, Data & data) if (functionIsInOrGlobalInOperator(func_name)) { auto & ast = func_arguments->children.at(1); - if (auto opt_name = getIdentifierName(ast)) + if (auto opt_name = tryGetIdentifierName(ast)) if (!aliases.count(*opt_name)) setIdentifierSpecial(ast); } diff --git a/dbms/src/Interpreters/TranslateQualifiedNamesVisitor.cpp b/dbms/src/Interpreters/TranslateQualifiedNamesVisitor.cpp index 34b59d4f993..7ae98d3e9c8 100644 --- a/dbms/src/Interpreters/TranslateQualifiedNamesVisitor.cpp +++ b/dbms/src/Interpreters/TranslateQualifiedNamesVisitor.cpp @@ -253,7 +253,7 @@ void TranslateQualifiedNamesMatcher::extractJoinUsingColumns(const ASTPtr ast, D { const auto & keys = table_join.using_expression_list->as(); for (const auto & key : keys.children) - if (auto opt_column = getIdentifierName(key)) + if (auto opt_column = tryGetIdentifierName(key)) data.join_using_columns.insert(*opt_column); else if (key->as()) data.join_using_columns.insert(key->getColumnName()); diff --git a/dbms/src/Interpreters/executeQuery.cpp b/dbms/src/Interpreters/executeQuery.cpp index 5c7617aa8a1..36bdcc27634 100644 --- a/dbms/src/Interpreters/executeQuery.cpp +++ b/dbms/src/Interpreters/executeQuery.cpp @@ -565,7 +565,7 @@ void executeQuery( } String format_name = ast_query_with_output && (ast_query_with_output->format != nullptr) - ? *getIdentifierName(ast_query_with_output->format) + ? getIdentifierName(ast_query_with_output->format) : context.getDefaultFormat(); if (ast_query_with_output && ast_query_with_output->settings_ast) @@ -610,7 +610,7 @@ void executeQuery( } String format_name = ast_query_with_output && (ast_query_with_output->format != nullptr) - ? *getIdentifierName(ast_query_with_output->format) + ? getIdentifierName(ast_query_with_output->format) : context.getDefaultFormat(); if (ast_query_with_output && ast_query_with_output->settings_ast) diff --git a/dbms/src/Parsers/ASTIdentifier.cpp b/dbms/src/Parsers/ASTIdentifier.cpp index fe806ce795a..6f7532d69c5 100644 --- a/dbms/src/Parsers/ASTIdentifier.cpp +++ b/dbms/src/Parsers/ASTIdentifier.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -8,6 +9,12 @@ namespace DB { +namespace ErrorCodes +{ + extern const int UNEXPECTED_AST_STRUCTURE; +} + + ASTPtr ASTIdentifier::clone() const { auto ret = std::make_shared(*this); @@ -92,22 +99,32 @@ ASTPtr createTableIdentifier(const String & database_name, const String & table_ return database_and_table; } -std::optional getIdentifierName(const IAST * const ast) +String getIdentifierName(const IAST * ast) { - if (ast) - if (const auto * node = ast->as()) - return node->name; + String res; + if (tryGetIdentifierNameInto(ast, res)) + return res; + throw Exception(ast ? queryToString(ast) + " is not an identifier" : "AST node is nullptr", ErrorCodes::UNEXPECTED_AST_STRUCTURE); +} + +std::optional tryGetIdentifierName(const IAST * ast) +{ + String res; + if (tryGetIdentifierNameInto(ast, res)) + return res; return {}; } -bool getIdentifierName(const ASTPtr & ast, String & name) +bool tryGetIdentifierNameInto(const ASTPtr & ast, String & name) { if (ast) + { if (const auto * node = ast->as()) { name = node->name; return true; } + } return false; } diff --git a/dbms/src/Parsers/ASTIdentifier.h b/dbms/src/Parsers/ASTIdentifier.h index 01f7766f1ef..1cb9ef515a3 100644 --- a/dbms/src/Parsers/ASTIdentifier.h +++ b/dbms/src/Parsers/ASTIdentifier.h @@ -70,9 +70,13 @@ private: ASTPtr createTableIdentifier(const String & database_name, const String & table_name); void setIdentifierSpecial(ASTPtr & ast); -std::optional getIdentifierName(const IAST * const ast); -inline std::optional getIdentifierName(const ASTPtr & ast) { return getIdentifierName(ast.get()); } -bool getIdentifierName(const ASTPtr & ast, String & name); +String getIdentifierName(const IAST * ast); +std::optional tryGetIdentifierName(const IAST * ast); + +inline String getIdentifierName(const ASTPtr & ast) { return getIdentifierName(ast.get()); } +inline std::optional tryGetIdentifierName(const ASTPtr & ast) { return tryGetIdentifierName(ast.get()); } + +bool tryGetIdentifierNameInto(const ASTPtr & ast, String & name); } diff --git a/dbms/src/Parsers/ExpressionElementParsers.cpp b/dbms/src/Parsers/ExpressionElementParsers.cpp index 33c95cdf1aa..eddbe2abb2f 100644 --- a/dbms/src/Parsers/ExpressionElementParsers.cpp +++ b/dbms/src/Parsers/ExpressionElementParsers.cpp @@ -177,7 +177,7 @@ bool ParserCompoundIdentifier::parseImpl(Pos & pos, ASTPtr & node, Expected & ex { if (!name.empty()) name += '.'; - parts.emplace_back(*getIdentifierName(child)); + parts.emplace_back(getIdentifierName(child)); name += parts.back(); } @@ -225,7 +225,7 @@ bool ParserFunction::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) * If you do not report that the first option is an error, then the argument will be interpreted as 2014 - 01 - 01 - some number, * and the query silently returns an unexpected result. */ - if (*getIdentifierName(identifier) == "toDate" + if (getIdentifierName(identifier) == "toDate" && contents_end - contents_begin == strlen("2014-01-01") && contents_begin[0] >= '2' && contents_begin[0] <= '3' && contents_begin[1] >= '0' && contents_begin[1] <= '9' @@ -267,7 +267,7 @@ bool ParserFunction::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) } auto function_node = std::make_shared(); - getIdentifierName(identifier, function_node->name); + tryGetIdentifierNameInto(identifier, function_node->name); /// func(DISTINCT ...) is equivalent to funcDistinct(...) if (has_distinct_modifier) @@ -1158,7 +1158,7 @@ bool ParserAlias::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) * and in the query "SELECT x FRO FROM t", the word FRO was considered an alias. */ - const String name = *getIdentifierName(node); + const String name = getIdentifierName(node); for (const char ** keyword = restricted_keywords; *keyword != nullptr; ++keyword) if (0 == strcasecmp(name.data(), *keyword)) @@ -1326,7 +1326,7 @@ bool ParserWithOptionalAlias::parseImpl(Pos & pos, ASTPtr & node, Expected & exp */ bool allow_alias_without_as_keyword_now = allow_alias_without_as_keyword; if (allow_alias_without_as_keyword) - if (auto opt_id = getIdentifierName(node)) + if (auto opt_id = tryGetIdentifierName(node)) if (0 == strcasecmp(opt_id->data(), "FROM")) allow_alias_without_as_keyword_now = false; @@ -1336,7 +1336,7 @@ bool ParserWithOptionalAlias::parseImpl(Pos & pos, ASTPtr & node, Expected & exp /// FIXME: try to prettify this cast using `as<>()` if (auto * ast_with_alias = dynamic_cast(node.get())) { - getIdentifierName(alias_node, ast_with_alias->alias); + tryGetIdentifierNameInto(alias_node, ast_with_alias->alias); } else { diff --git a/dbms/src/Parsers/ParserAlterQuery.cpp b/dbms/src/Parsers/ParserAlterQuery.cpp index 98891bbdf5f..1959cd1ddeb 100644 --- a/dbms/src/Parsers/ParserAlterQuery.cpp +++ b/dbms/src/Parsers/ParserAlterQuery.cpp @@ -354,7 +354,7 @@ bool ParserAssignment::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) if (!p_expression.parse(pos, assignment->expression, expected)) return false; - getIdentifierName(column, assignment->column_name); + tryGetIdentifierNameInto(column, assignment->column_name); if (assignment->expression) assignment->children.push_back(assignment->expression); diff --git a/dbms/src/Parsers/ParserCheckQuery.cpp b/dbms/src/Parsers/ParserCheckQuery.cpp index 5ba8119571d..c397e1c33c5 100644 --- a/dbms/src/Parsers/ParserCheckQuery.cpp +++ b/dbms/src/Parsers/ParserCheckQuery.cpp @@ -32,13 +32,13 @@ bool ParserCheckQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) if (!table_parser.parse(pos, table, expected)) return false; - getIdentifierName(database, query->database); - getIdentifierName(table, query->table); + tryGetIdentifierNameInto(database, query->database); + tryGetIdentifierNameInto(table, query->table); } else { table = database; - getIdentifierName(table, query->table); + tryGetIdentifierNameInto(table, query->table); } if (s_partition.ignore(pos, expected)) diff --git a/dbms/src/Parsers/ParserCreateQuery.cpp b/dbms/src/Parsers/ParserCreateQuery.cpp index be0779c4d52..2e7c03a66b9 100644 --- a/dbms/src/Parsers/ParserCreateQuery.cpp +++ b/dbms/src/Parsers/ParserCreateQuery.cpp @@ -39,7 +39,7 @@ bool ParserNestedTable::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) return false; auto func = std::make_shared(); - getIdentifierName(name, func->name); + tryGetIdentifierNameInto(name, func->name); func->arguments = columns; func->children.push_back(columns); node = func; @@ -74,7 +74,7 @@ bool ParserIdentifierWithOptionalParameters::parseImpl(Pos & pos, ASTPtr & node, if (non_parametric.parse(pos, ident, expected)) { auto func = std::make_shared(); - getIdentifierName(ident, func->name); + tryGetIdentifierNameInto(ident, func->name); node = func; return true; } @@ -384,8 +384,8 @@ bool ParserCreateQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) query->if_not_exists = if_not_exists; query->cluster = cluster_str; - getIdentifierName(database, query->database); - getIdentifierName(table, query->table); + tryGetIdentifierNameInto(database, query->database); + tryGetIdentifierNameInto(table, query->table); return true; } @@ -542,18 +542,18 @@ bool ParserCreateQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) query->temporary = is_temporary; query->replace_view = replace_view; - getIdentifierName(database, query->database); - getIdentifierName(table, query->table); + tryGetIdentifierNameInto(database, query->database); + tryGetIdentifierNameInto(table, query->table); query->cluster = cluster_str; - getIdentifierName(to_database, query->to_database); - getIdentifierName(to_table, query->to_table); + tryGetIdentifierNameInto(to_database, query->to_database); + tryGetIdentifierNameInto(to_table, query->to_table); query->set(query->columns_list, columns_list); query->set(query->storage, storage); - getIdentifierName(as_database, query->as_database); - getIdentifierName(as_table, query->as_table); + tryGetIdentifierNameInto(as_database, query->as_database); + tryGetIdentifierNameInto(as_table, query->as_table); query->set(query->select, select); return true; diff --git a/dbms/src/Parsers/ParserCreateQuery.h b/dbms/src/Parsers/ParserCreateQuery.h index 98109ae9893..d95e66566b2 100644 --- a/dbms/src/Parsers/ParserCreateQuery.h +++ b/dbms/src/Parsers/ParserCreateQuery.h @@ -73,7 +73,7 @@ bool IParserNameTypePair::parseImpl(Pos & pos, ASTPtr & node, Expect && type_parser.parse(pos, type, expected)) { auto name_type_pair = std::make_shared(); - getIdentifierName(name, name_type_pair->name); + tryGetIdentifierNameInto(name, name_type_pair->name); name_type_pair->type = type; name_type_pair->children.push_back(type); node = name_type_pair; @@ -189,7 +189,7 @@ bool IParserColumnDeclaration::parseImpl(Pos & pos, ASTPtr & node, E const auto column_declaration = std::make_shared(); node = column_declaration; - getIdentifierName(name, column_declaration->name); + tryGetIdentifierNameInto(name, column_declaration->name); if (type) { diff --git a/dbms/src/Parsers/ParserDropQuery.cpp b/dbms/src/Parsers/ParserDropQuery.cpp index ca757ae6168..9cd9744f2f4 100644 --- a/dbms/src/Parsers/ParserDropQuery.cpp +++ b/dbms/src/Parsers/ParserDropQuery.cpp @@ -116,8 +116,8 @@ bool ParserDropQuery::parseDropQuery(Pos & pos, ASTPtr & node, Expected & expect query->if_exists = if_exists; query->temporary = temporary; - getIdentifierName(database, query->database); - getIdentifierName(table, query->table); + tryGetIdentifierNameInto(database, query->database); + tryGetIdentifierNameInto(table, query->table); query->cluster = cluster_str; diff --git a/dbms/src/Parsers/ParserInsertQuery.cpp b/dbms/src/Parsers/ParserInsertQuery.cpp index e86535e8094..f9b38132f18 100644 --- a/dbms/src/Parsers/ParserInsertQuery.cpp +++ b/dbms/src/Parsers/ParserInsertQuery.cpp @@ -147,11 +147,11 @@ bool ParserInsertQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) } else { - getIdentifierName(database, query->database); - getIdentifierName(table, query->table); + tryGetIdentifierNameInto(database, query->database); + tryGetIdentifierNameInto(table, query->table); } - getIdentifierName(format, query->format); + tryGetIdentifierNameInto(format, query->format); query->columns = columns; query->select = select; diff --git a/dbms/src/Parsers/ParserRenameQuery.cpp b/dbms/src/Parsers/ParserRenameQuery.cpp index aa5fb43742b..9323ca16ee4 100644 --- a/dbms/src/Parsers/ParserRenameQuery.cpp +++ b/dbms/src/Parsers/ParserRenameQuery.cpp @@ -30,8 +30,8 @@ static bool parseDatabaseAndTable( } db_and_table.database.clear(); - getIdentifierName(database, db_and_table.database); - getIdentifierName(table, db_and_table.table); + tryGetIdentifierNameInto(database, db_and_table.database); + tryGetIdentifierNameInto(table, db_and_table.table); return true; } diff --git a/dbms/src/Parsers/ParserSetQuery.cpp b/dbms/src/Parsers/ParserSetQuery.cpp index 1bdb4be6014..99b08bff337 100644 --- a/dbms/src/Parsers/ParserSetQuery.cpp +++ b/dbms/src/Parsers/ParserSetQuery.cpp @@ -31,7 +31,7 @@ static bool parseNameValuePair(SettingChange & change, IParser::Pos & pos, Expec if (!value_p.parse(pos, value, expected)) return false; - getIdentifierName(name, change.name); + tryGetIdentifierNameInto(name, change.name); change.value = value->as().value; return true; diff --git a/dbms/src/Parsers/ParserShowTablesQuery.cpp b/dbms/src/Parsers/ParserShowTablesQuery.cpp index 9c247a284c1..00e5dcd451e 100644 --- a/dbms/src/Parsers/ParserShowTablesQuery.cpp +++ b/dbms/src/Parsers/ParserShowTablesQuery.cpp @@ -65,7 +65,7 @@ bool ParserShowTablesQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expec return false; } - getIdentifierName(database, query->from); + tryGetIdentifierNameInto(database, query->from); if (like) query->like = safeGet(like->as().value); diff --git a/dbms/src/Parsers/ParserTablePropertiesQuery.cpp b/dbms/src/Parsers/ParserTablePropertiesQuery.cpp index f736023e0d5..a75124a322c 100644 --- a/dbms/src/Parsers/ParserTablePropertiesQuery.cpp +++ b/dbms/src/Parsers/ParserTablePropertiesQuery.cpp @@ -75,8 +75,8 @@ bool ParserTablePropertiesQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & } } - getIdentifierName(database, query->database); - getIdentifierName(table, query->table); + tryGetIdentifierNameInto(database, query->database); + tryGetIdentifierNameInto(table, query->table); node = query; diff --git a/dbms/src/Parsers/ParserUseQuery.cpp b/dbms/src/Parsers/ParserUseQuery.cpp index c63a251357c..a71fa17ab78 100644 --- a/dbms/src/Parsers/ParserUseQuery.cpp +++ b/dbms/src/Parsers/ParserUseQuery.cpp @@ -21,7 +21,7 @@ bool ParserUseQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) return false; auto query = std::make_shared(); - getIdentifierName(database, query->database); + tryGetIdentifierNameInto(database, query->database); node = query; return true; diff --git a/dbms/src/Parsers/parseDatabaseAndTableName.cpp b/dbms/src/Parsers/parseDatabaseAndTableName.cpp index d7a199a3486..018fee10731 100644 --- a/dbms/src/Parsers/parseDatabaseAndTableName.cpp +++ b/dbms/src/Parsers/parseDatabaseAndTableName.cpp @@ -29,13 +29,13 @@ bool parseDatabaseAndTableName(IParser::Pos & pos, Expected & expected, String & return false; } - getIdentifierName(database, database_str); - getIdentifierName(table, table_str); + tryGetIdentifierNameInto(database, database_str); + tryGetIdentifierNameInto(table, table_str); } else { database_str = ""; - getIdentifierName(database, table_str); + tryGetIdentifierNameInto(database, table_str); } return true; diff --git a/dbms/src/Parsers/parseIdentifierOrStringLiteral.cpp b/dbms/src/Parsers/parseIdentifierOrStringLiteral.cpp index 815a5d3f3cc..7258d3e39da 100644 --- a/dbms/src/Parsers/parseIdentifierOrStringLiteral.cpp +++ b/dbms/src/Parsers/parseIdentifierOrStringLiteral.cpp @@ -20,7 +20,7 @@ bool parseIdentifierOrStringLiteral(IParser::Pos & pos, Expected & expected, Str result = res->as().value.safeGet(); } else - result = *getIdentifierName(res); + result = getIdentifierName(res); return true; } diff --git a/dbms/src/Storages/AlterCommands.cpp b/dbms/src/Storages/AlterCommands.cpp index 7814f1a6ba0..daa639883d4 100644 --- a/dbms/src/Storages/AlterCommands.cpp +++ b/dbms/src/Storages/AlterCommands.cpp @@ -64,7 +64,7 @@ std::optional AlterCommand::parse(const ASTAlterCommand * command_ command.codec = compression_codec_factory.get(ast_col_decl.codec, command.data_type); if (command_ast->column) - command.after_column = *getIdentifierName(command_ast->column); + command.after_column = getIdentifierName(command_ast->column); if (ast_col_decl.ttl) command.ttl = ast_col_decl.ttl; @@ -80,7 +80,7 @@ std::optional AlterCommand::parse(const ASTAlterCommand * command_ AlterCommand command; command.type = AlterCommand::DROP_COLUMN; - command.column_name = *getIdentifierName(command_ast->column); + command.column_name = getIdentifierName(command_ast->column); command.if_exists = command_ast->if_exists; return command; } @@ -123,7 +123,7 @@ std::optional AlterCommand::parse(const ASTAlterCommand * command_ { AlterCommand command; command.type = COMMENT_COLUMN; - command.column_name = *getIdentifierName(command_ast->column); + command.column_name = getIdentifierName(command_ast->column); const auto & ast_comment = command_ast->comment->as(); command.comment = ast_comment.value.get(); command.if_exists = command_ast->if_exists; diff --git a/dbms/src/Storages/ColumnsDescription.cpp b/dbms/src/Storages/ColumnsDescription.cpp index 2dbe308ea57..b3caeaa767b 100644 --- a/dbms/src/Storages/ColumnsDescription.cpp +++ b/dbms/src/Storages/ColumnsDescription.cpp @@ -91,7 +91,7 @@ void ColumnDescription::writeText(WriteBuffer & buf) const void ColumnDescription::readText(ReadBuffer & buf) { - ParserColumnDeclaration column_parser(true); + ParserColumnDeclaration column_parser(/* require type */ true); String column_line; readEscapedStringUntilEOL(column_line, buf); ASTPtr ast = parseQuery(column_parser, column_line, "column parser", 0); diff --git a/dbms/src/Storages/MergeTree/MergeTreeWhereOptimizer.cpp b/dbms/src/Storages/MergeTree/MergeTreeWhereOptimizer.cpp index 4311fd027ef..ee3bbaaa073 100644 --- a/dbms/src/Storages/MergeTree/MergeTreeWhereOptimizer.cpp +++ b/dbms/src/Storages/MergeTree/MergeTreeWhereOptimizer.cpp @@ -62,7 +62,7 @@ void MergeTreeWhereOptimizer::calculateColumnSizes(const MergeTreeData & data, c static void collectIdentifiersNoSubqueries(const ASTPtr & ast, NameSet & set) { - if (auto opt_name = getIdentifierName(ast)) + if (auto opt_name = tryGetIdentifierNameInto(ast)) return (void)set.insert(*opt_name); if (ast->as()) diff --git a/dbms/src/Storages/MergeTree/registerStorageMergeTree.cpp b/dbms/src/Storages/MergeTree/registerStorageMergeTree.cpp index 138e7c14f9d..19dbe49b27e 100644 --- a/dbms/src/Storages/MergeTree/registerStorageMergeTree.cpp +++ b/dbms/src/Storages/MergeTree/registerStorageMergeTree.cpp @@ -45,13 +45,13 @@ static Names extractColumnNames(const ASTPtr & node) Names res; res.reserve(elements.size()); for (const auto & elem : elements) - res.push_back(*getIdentifierName(elem)); + res.push_back(getIdentifierName(elem)); return res; } else { - return { *getIdentifierName(node) }; + return { getIdentifierName(node) }; } } @@ -502,7 +502,7 @@ static StoragePtr create(const StorageFactory::Arguments & args) if (merging_params.mode == MergeTreeData::MergingParams::Collapsing) { - if (!getIdentifierName(engine_args.back(), merging_params.sign_column)) + if (!tryGetIdentifierNameInto(engine_args.back(), merging_params.sign_column)) throw Exception( "Sign column name must be an unquoted string" + getMergeTreeVerboseHelp(is_extended_storage_def), ErrorCodes::BAD_ARGUMENTS); @@ -514,7 +514,7 @@ static StoragePtr create(const StorageFactory::Arguments & args) /// If the last element is not index_granularity or replica_name (a literal), then this is the name of the version column. if (!engine_args.empty() && !engine_args.back()->as()) { - if (!getIdentifierName(engine_args.back(), merging_params.version_column)) + if (!tryGetIdentifierNameInto(engine_args.back(), merging_params.version_column)) throw Exception( "Version column name must be an unquoted string" + getMergeTreeVerboseHelp(is_extended_storage_def), ErrorCodes::BAD_ARGUMENTS); @@ -552,14 +552,14 @@ static StoragePtr create(const StorageFactory::Arguments & args) } else if (merging_params.mode == MergeTreeData::MergingParams::VersionedCollapsing) { - if (!getIdentifierName(engine_args.back(), merging_params.version_column)) + if (!tryGetIdentifierNameInto(engine_args.back(), merging_params.version_column)) throw Exception( "Version column name must be an unquoted string" + getMergeTreeVerboseHelp(is_extended_storage_def), ErrorCodes::BAD_ARGUMENTS); engine_args.pop_back(); - if (!getIdentifierName(engine_args.back(), merging_params.sign_column)) + if (!tryGetIdentifierNameInto(engine_args.back(), merging_params.sign_column)) throw Exception( "Sign column name must be an unquoted string" + getMergeTreeVerboseHelp(is_extended_storage_def), ErrorCodes::BAD_ARGUMENTS); @@ -616,7 +616,7 @@ static StoragePtr create(const StorageFactory::Arguments & args) /// Now only three parameters remain - date (or partitioning expression), primary_key, index_granularity. - if (!getIdentifierName(engine_args[0], date_column_name)) + if (!tryGetIdentifierNameInto(engine_args[0], date_column_name)) throw Exception( "Date column name must be an unquoted string" + getMergeTreeVerboseHelp(is_extended_storage_def), ErrorCodes::BAD_ARGUMENTS); diff --git a/dbms/src/Storages/PartitionCommands.cpp b/dbms/src/Storages/PartitionCommands.cpp index f6aaee4c70e..69632332b48 100644 --- a/dbms/src/Storages/PartitionCommands.cpp +++ b/dbms/src/Storages/PartitionCommands.cpp @@ -65,7 +65,7 @@ std::optional PartitionCommand::parse(const ASTAlterCommand * PartitionCommand res; res.type = CLEAR_COLUMN; res.partition = command_ast->partition; - res.column_name = *getIdentifierName(command_ast->column); + res.column_name = getIdentifierName(command_ast->column); return res; } else if (command_ast->type == ASTAlterCommand::FREEZE_ALL) diff --git a/dbms/src/Storages/StorageFile.cpp b/dbms/src/Storages/StorageFile.cpp index 35bc1747dee..5bc23d00975 100644 --- a/dbms/src/Storages/StorageFile.cpp +++ b/dbms/src/Storages/StorageFile.cpp @@ -303,7 +303,7 @@ void registerStorageFile(StorageFactory & factory) { /// Will use FD if engine_args[1] is int literal or identifier with std* name - if (auto opt_name = getIdentifierName(engine_args[1])) + if (auto opt_name = tryGetIdentifierName(engine_args[1])) { if (*opt_name == "stdin") source_fd = STDIN_FILENO; diff --git a/dbms/src/Storages/StorageJoin.cpp b/dbms/src/Storages/StorageJoin.cpp index 3c90917b0f6..3de820a5f4e 100644 --- a/dbms/src/Storages/StorageJoin.cpp +++ b/dbms/src/Storages/StorageJoin.cpp @@ -90,7 +90,7 @@ void registerStorageJoin(StorageFactory & factory) "Storage Join requires at least 3 parameters: Join(ANY|ALL, LEFT|INNER, keys...).", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); - auto opt_strictness_id = getIdentifierName(engine_args[0]); + auto opt_strictness_id = tryGetIdentifierName(engine_args[0]); if (!opt_strictness_id) throw Exception("First parameter of storage Join must be ANY or ALL (without quotes).", ErrorCodes::BAD_ARGUMENTS); @@ -103,7 +103,7 @@ void registerStorageJoin(StorageFactory & factory) else throw Exception("First parameter of storage Join must be ANY or ALL (without quotes).", ErrorCodes::BAD_ARGUMENTS); - auto opt_kind_id = getIdentifierName(engine_args[1]); + auto opt_kind_id = tryGetIdentifierName(engine_args[1]); if (!opt_kind_id) throw Exception("Second parameter of storage Join must be LEFT or INNER (without quotes).", ErrorCodes::BAD_ARGUMENTS); @@ -124,7 +124,7 @@ void registerStorageJoin(StorageFactory & factory) key_names.reserve(engine_args.size() - 2); for (size_t i = 2, size = engine_args.size(); i < size; ++i) { - auto opt_key = getIdentifierName(engine_args[i]); + auto opt_key = tryGetIdentifierName(engine_args[i]); if (!opt_key) throw Exception("Parameter №" + toString(i + 1) + " of storage Join don't look like column name.", ErrorCodes::BAD_ARGUMENTS); diff --git a/dbms/src/TableFunctions/TableFunctionRemote.cpp b/dbms/src/TableFunctions/TableFunctionRemote.cpp index c4e0cd1866a..f6fa75bb2d2 100644 --- a/dbms/src/TableFunctions/TableFunctionRemote.cpp +++ b/dbms/src/TableFunctions/TableFunctionRemote.cpp @@ -67,7 +67,7 @@ StoragePtr TableFunctionRemote::executeImpl(const ASTPtr & ast_function, const C } else { - if (!getIdentifierName(args[arg_num], cluster_name)) + if (!tryGetIdentifierNameInto(args[arg_num], cluster_name)) cluster_description = getStringLiteral(*args[arg_num], "Hosts pattern"); } ++arg_num;