mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-10-05 08:00:51 +00:00
Merge
This commit is contained in:
commit
5a7386d85e
@ -582,35 +582,47 @@ public:
|
|||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
||||||
DataTypePtr getReturnType(const DataTypes & arguments) const override
|
DataTypePtr getReturnType(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if ((arguments.size() < 1) || (arguments.size() > 2))
|
if (arguments.size() == 1)
|
||||||
throw Exception("Number of arguments for function " + getName() + " doesn't match: passed "
|
|
||||||
+ toString(arguments.size()) + ", should be 1 or 2.",
|
|
||||||
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
|
||||||
|
|
||||||
if (typeid_cast<const DataTypeDate *>(&*arguments[0]) != nullptr)
|
|
||||||
{
|
{
|
||||||
if (arguments.size() > 1)
|
if ((typeid_cast<const DataTypeDate *>(&*arguments[0]) == nullptr) &&
|
||||||
throw Exception("Number of arguments for function " + getName() + " doesn't match: passed "
|
(typeid_cast<const DataTypeDateTime *>(&*arguments[0]) == nullptr))
|
||||||
+ toString(arguments.size()) + ", should be 1.",
|
throw Exception{
|
||||||
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
"Illegal type " + arguments[0]->getName() + " of argument of function " + getName() +
|
||||||
|
". Should be a date or a date with time", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT
|
||||||
|
};
|
||||||
}
|
}
|
||||||
else if (typeid_cast<const DataTypeDateTime *>(&*arguments[0]) != nullptr)
|
else if (arguments.size() == 2)
|
||||||
{
|
{
|
||||||
/// Ничего не делаем.
|
std::string error_msg;
|
||||||
|
|
||||||
|
if (typeid_cast<const DataTypeDate *>(&*arguments[0]) != nullptr)
|
||||||
|
error_msg += "Illegal type " + arguments[0]->getName() + " of argument 1."
|
||||||
|
" Should be a date with time (timezones are not supported for dates)";
|
||||||
|
else if (typeid_cast<const DataTypeDateTime *>(&*arguments[0]) != nullptr)
|
||||||
|
{
|
||||||
|
/// Ничего не делаем.
|
||||||
|
}
|
||||||
|
else
|
||||||
|
error_msg += "Illegal type " + arguments[0]->getName() + " of argument 1."
|
||||||
|
" Should be a date with time";
|
||||||
|
|
||||||
|
if (typeid_cast<const DataTypeString *>(&*arguments[1]) == nullptr)
|
||||||
|
{
|
||||||
|
if (!error_msg.empty())
|
||||||
|
error_msg += ". ";
|
||||||
|
error_msg += "Illegal type " + arguments[1]->getName() + " of argument 2."
|
||||||
|
" Should be a string describing a timezone";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!error_msg.empty())
|
||||||
|
throw Exception{
|
||||||
|
"In function " + getName() + ": " + error_msg, ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT
|
||||||
|
};
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
throw Exception{
|
throw Exception("Number of arguments for function " + getName() + " doesn't match: passed "
|
||||||
"Illegal type " + arguments[0]->getName() + " of argument 1 of function " + getName(),
|
+ toString(arguments.size()) + ", should be 1 or 2",
|
||||||
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT
|
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
||||||
};
|
|
||||||
|
|
||||||
if ((arguments.size() == 2) && (typeid_cast<const DataTypeString *>(&*arguments[1]) == nullptr))
|
|
||||||
{
|
|
||||||
throw Exception{
|
|
||||||
"Illegal type " + arguments[1]->getName() + " of argument 2 of function " + getName(),
|
|
||||||
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return new ToDataType;
|
return new ToDataType;
|
||||||
}
|
}
|
||||||
|
@ -208,11 +208,6 @@ private:
|
|||||||
*/
|
*/
|
||||||
void collectJoinedColumns(NameSet & joined_columns, NamesAndTypesList & joined_columns_name_type);
|
void collectJoinedColumns(NameSet & joined_columns, NamesAndTypesList & joined_columns_name_type);
|
||||||
|
|
||||||
/** Добавляет ALIAS столбцы из storage в aliases, если запрос не является SELECT с ARRAY JOIN. При наличии
|
|
||||||
* ARRAY JOIN их добавлять нельзя, иначе ломается логика его выполнения.
|
|
||||||
*/
|
|
||||||
void addStorageAliases();
|
|
||||||
|
|
||||||
/** Создать словарь алиасов.
|
/** Создать словарь алиасов.
|
||||||
*/
|
*/
|
||||||
void addASTAliases(ASTPtr & ast, int ignore_levels = 0);
|
void addASTAliases(ASTPtr & ast, int ignore_levels = 0);
|
||||||
|
@ -120,9 +120,6 @@ void ExpressionAnalyzer::init()
|
|||||||
/// Создаёт словарь aliases: alias -> ASTPtr
|
/// Создаёт словарь aliases: alias -> ASTPtr
|
||||||
addASTAliases(ast);
|
addASTAliases(ast);
|
||||||
|
|
||||||
/// Добавляет ALIAS столбцы из таблицы в aliases, если применимо.
|
|
||||||
addStorageAliases();
|
|
||||||
|
|
||||||
/// Common subexpression elimination. Rewrite rules.
|
/// Common subexpression elimination. Rewrite rules.
|
||||||
normalizeTree();
|
normalizeTree();
|
||||||
|
|
||||||
@ -428,22 +425,6 @@ NamesAndTypesList::iterator ExpressionAnalyzer::findColumn(const String & name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ExpressionAnalyzer::addStorageAliases()
|
|
||||||
{
|
|
||||||
if (select_query && select_query->array_join_expression_list)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!storage)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/// @todo: consider storing default expressions with alias set to avoid cloning
|
|
||||||
/// Добавляем ALIAS из таблицы, только если такого ALIAS еще не объявлено в запросе.
|
|
||||||
for (const auto & alias : storage->alias_columns)
|
|
||||||
if (!aliases.count(alias.name))
|
|
||||||
aliases[alias.name] = setAlias(storage->column_defaults[alias.name].expression->clone(), alias.name);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// ignore_levels - алиасы в скольки верхних уровнях поддерева нужно игнорировать.
|
/// ignore_levels - алиасы в скольки верхних уровнях поддерева нужно игнорировать.
|
||||||
/// Например, при ignore_levels=1 ast не может быть занесен в словарь, но его дети могут.
|
/// Например, при ignore_levels=1 ast не может быть занесен в словарь, но его дети могут.
|
||||||
void ExpressionAnalyzer::addASTAliases(ASTPtr & ast, int ignore_levels)
|
void ExpressionAnalyzer::addASTAliases(ASTPtr & ast, int ignore_levels)
|
||||||
@ -686,7 +667,7 @@ void ExpressionAnalyzer::normalizeTreeImpl(
|
|||||||
|
|
||||||
void ExpressionAnalyzer::addAliasColumns()
|
void ExpressionAnalyzer::addAliasColumns()
|
||||||
{
|
{
|
||||||
if (!(select_query && select_query->array_join_expression_list))
|
if (!select_query)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!storage)
|
if (!storage)
|
||||||
|
@ -668,7 +668,13 @@ QueryProcessingStage::Enum InterpreterSelectQuery::executeFetchColumns()
|
|||||||
ASTPtr required_columns_expr_list{new ASTExpressionList};
|
ASTPtr required_columns_expr_list{new ASTExpressionList};
|
||||||
|
|
||||||
for (const auto & column : required_columns)
|
for (const auto & column : required_columns)
|
||||||
required_columns_expr_list->children.emplace_back(new ASTIdentifier{{}, column});
|
{
|
||||||
|
const auto default_it = storage->column_defaults.find(column);
|
||||||
|
if (default_it != std::end(storage->column_defaults) && default_it->second.type == ColumnDefaultType::Alias)
|
||||||
|
required_columns_expr_list->children.emplace_back(setAlias(default_it->second.expression->clone(), column));
|
||||||
|
else
|
||||||
|
required_columns_expr_list->children.emplace_back(new ASTIdentifier{{}, column});
|
||||||
|
}
|
||||||
|
|
||||||
alias_actions = ExpressionAnalyzer{required_columns_expr_list, context, storage, table_column_names}.getActions(true);
|
alias_actions = ExpressionAnalyzer{required_columns_expr_list, context, storage, table_column_names}.getActions(true);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user