Merge pull request #14704 from ClickHouse/fix_misleading_message_uuid_macro

Fix misleading exception message about uuid macro
This commit is contained in:
tavplubix 2020-09-11 12:45:32 +03:00 committed by GitHub
commit 1f47b1ff6b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 5 deletions

View File

@ -68,8 +68,14 @@ String Macros::expand(const String & s,
res += database_name; res += database_name;
else if (macro_name == "table" && !table_name.empty()) else if (macro_name == "table" && !table_name.empty())
res += table_name; res += table_name;
else if (macro_name == "uuid" && uuid != UUIDHelpers::Nil) else if (macro_name == "uuid")
{
if (uuid == UUIDHelpers::Nil)
throw Exception("Macro 'uuid' and empty arguments of ReplicatedMergeTree "
"are supported only for ON CLUSTER queries with Atomic database engine",
ErrorCodes::SYNTAX_ERROR);
res += toString(uuid); res += toString(uuid);
}
else else
throw Exception("No macro '" + macro_name + throw Exception("No macro '" + macro_name +
"' in config while processing substitutions in '" + s + "' at '" "' in config while processing substitutions in '" + s + "' at '"

View File

@ -395,9 +395,10 @@ static StoragePtr create(const StorageFactory::Arguments & args)
if (replicated) if (replicated)
{ {
bool has_arguments = arg_num + 2 <= arg_cnt && engine_args[arg_num]->as<ASTLiteral>() && engine_args[arg_num + 1]->as<ASTLiteral>(); bool has_arguments = arg_num + 2 <= arg_cnt;
bool has_valid_arguments = has_arguments && engine_args[arg_num]->as<ASTLiteral>() && engine_args[arg_num + 1]->as<ASTLiteral>();
if (has_arguments) if (has_valid_arguments)
{ {
const auto * ast = engine_args[arg_num]->as<ASTLiteral>(); const auto * ast = engine_args[arg_num]->as<ASTLiteral>();
if (ast && ast->value.getType() == Field::Types::String) if (ast && ast->value.getType() == Field::Types::String)
@ -420,7 +421,7 @@ static StoragePtr create(const StorageFactory::Arguments & args)
"No replica name in config" + getMergeTreeVerboseHelp(is_extended_storage_def), ErrorCodes::NO_REPLICA_NAME_GIVEN); "No replica name in config" + getMergeTreeVerboseHelp(is_extended_storage_def), ErrorCodes::NO_REPLICA_NAME_GIVEN);
++arg_num; ++arg_num;
} }
else if (is_extended_storage_def) else if (is_extended_storage_def && !has_arguments)
{ {
/// Try use default values if arguments are not specified. /// Try use default values if arguments are not specified.
/// It works for ON CLUSTER queries when database engine is Atomic and there are {shard} and {replica} in config. /// It works for ON CLUSTER queries when database engine is Atomic and there are {shard} and {replica} in config.
@ -428,7 +429,7 @@ static StoragePtr create(const StorageFactory::Arguments & args)
replica_name = "{replica}"; /// TODO maybe use hostname if {replica} is not defined? replica_name = "{replica}"; /// TODO maybe use hostname if {replica} is not defined?
} }
else else
throw Exception("Expected zookeper_path and replica_name arguments", ErrorCodes::BAD_ARGUMENTS); throw Exception("Expected two string literal arguments: zookeper_path and replica_name", ErrorCodes::BAD_ARGUMENTS);
/// Allow implicit {uuid} macros only for zookeeper_path in ON CLUSTER queries /// Allow implicit {uuid} macros only for zookeeper_path in ON CLUSTER queries
bool is_on_cluster = args.local_context.getClientInfo().query_kind == ClientInfo::QueryKind::SECONDARY_QUERY; bool is_on_cluster = args.local_context.getClientInfo().query_kind == ClientInfo::QueryKind::SECONDARY_QUERY;