dbms: allowed more easily to specify cluster name with hyphens [#METR-16610].

This commit is contained in:
Alexey Milovidov 2015-06-05 23:04:54 +03:00
parent b4f60297d2
commit cac3ce7e27
2 changed files with 28 additions and 2 deletions

View File

@ -112,6 +112,7 @@ bool ParserLeftAssociativeBinaryOperatorList::parseImpl(Pos & pos, Pos end, ASTP
{
bool first = true;
ParserWhiteSpaceOrComments ws;
Pos begin = pos;
while (1)
{
@ -129,7 +130,6 @@ bool ParserLeftAssociativeBinaryOperatorList::parseImpl(Pos & pos, Pos end, ASTP
ws.ignore(pos, end);
/// пробуем найти какой-нибудь из допустимых операторов
Pos begin = pos;
const char ** it;
for (it = operators; *it; it += 2)

View File

@ -299,7 +299,33 @@ StoragePtr StorageFactory::get(
if (args.size() != 3 && args.size() != 4)
throw Exception(params_error_message, ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
String cluster_name = typeid_cast<ASTIdentifier &>(*args[0]).name;
/** Имя кластера - это имя тега в xml-конфигурации.
* Обычно оно парсится как идентификатор. То есть, оно может содержать подчёркивания, но не может содержать дефисы,
* при условии, что идентификатор не находится в обратных кавычках.
* Но в xml в качестве имени тега более привычно использовать дефисы.
* Такое имя будет парситься как выражение с оператором минус - совсем не то, что нужно.
* Поэтому, рассмотрим такой случай отдельно.
*/
String cluster_name;
if (const ASTIdentifier * ast_id = typeid_cast<const ASTIdentifier *>(args[0].get()))
{
cluster_name = ast_id->name;
}
else if (const ASTLiteral * ast_lit = typeid_cast<const ASTLiteral *>(args[0].get()))
{
cluster_name = ast_lit->value.safeGet<String>();
}
else if (const ASTFunction * ast_func = typeid_cast<const ASTFunction *>(args[0].get()))
{
if (!ast_func->range.first || !ast_func->range.second)
throw Exception("Illegal expression instead of cluster name.", ErrorCodes::BAD_ARGUMENTS);
cluster_name = String(ast_func->range.first, ast_func->range.second);
}
else
throw Exception("Illegal expression instead of cluster name.", ErrorCodes::BAD_ARGUMENTS);
String remote_database = reinterpretAsIdentifier(args[1], local_context).name;
String remote_table = typeid_cast<ASTIdentifier &>(*args[2]).name;