mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 00:22:29 +00:00
dbms: Server: more optimizations. [#METR-14099]
This commit is contained in:
parent
7b32af1024
commit
b2485444b4
@ -72,7 +72,11 @@ void InterpreterSelectQuery::basicInit(BlockInputStreamPtr input_, const NamesAn
|
||||
if (query.table && typeid_cast<ASTSelectQuery *>(&*query.table))
|
||||
{
|
||||
if (table_column_names.empty())
|
||||
context.setColumns(InterpreterSelectQuery(query.table, context, to_stage, subquery_depth).getSampleBlock().getColumnsList());
|
||||
{
|
||||
/// Оптимизация: мы считаем, что запрос содержит только один SELECT, даже если это может быть
|
||||
/// в самом деле цепочка UNION ALL. Первый запрос достаточен для определения нужных столбцов.
|
||||
context.setColumns(InterpreterSelectQuery(query.table, context, to_stage, subquery_depth, nullptr, false).getSampleBlock().getColumnsList());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -114,6 +118,8 @@ void InterpreterSelectQuery::basicInit(BlockInputStreamPtr input_, const NamesAn
|
||||
if (input_)
|
||||
streams.push_back(input_);
|
||||
|
||||
if (isFirstSelectInsideUnionAll())
|
||||
{
|
||||
/// Создаем цепочку запросов SELECT и проверяем, что результаты всех запросов SELECT cовместимые.
|
||||
/// NOTE Мы можем безопасно применить static_cast вместо typeid_cast,
|
||||
/// потому что знаем, что в цепочке UNION ALL имеются только деревья типа SELECT.
|
||||
@ -130,6 +136,7 @@ void InterpreterSelectQuery::basicInit(BlockInputStreamPtr input_, const NamesAn
|
||||
ErrorCodes::UNION_ALL_RESULT_STRUCTURES_MISMATCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void InterpreterSelectQuery::initQueryAnalyzer()
|
||||
{
|
||||
@ -175,17 +182,20 @@ bool InterpreterSelectQuery::hasAsterisk() const
|
||||
if (query.hasAsterisk())
|
||||
return true;
|
||||
|
||||
if (isFirstSelectInsideUnionAll())
|
||||
for (IAST * tree = query.next_union_all.get(); tree != nullptr; tree = static_cast<ASTSelectQuery *>(tree)->next_union_all.get())
|
||||
{
|
||||
const auto & next_query = static_cast<ASTSelectQuery &>(*tree);
|
||||
if (next_query.hasAsterisk())
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void InterpreterSelectQuery::renameColumns()
|
||||
{
|
||||
if (isFirstSelectInsideUnionAll())
|
||||
for (IAST * tree = query.next_union_all.get(); tree != nullptr; tree = static_cast<ASTSelectQuery *>(tree)->next_union_all.get())
|
||||
{
|
||||
auto & ast = static_cast<ASTSelectQuery &>(*tree);
|
||||
@ -198,6 +208,7 @@ void InterpreterSelectQuery::rewriteExpressionList(const Names & required_column
|
||||
if (query.distinct)
|
||||
return;
|
||||
|
||||
if (isFirstSelectInsideUnionAll())
|
||||
for (IAST* tree = query.next_union_all.get(); tree != nullptr; tree = static_cast<ASTSelectQuery *>(tree)->next_union_all.get())
|
||||
{
|
||||
auto & next_query = static_cast<ASTSelectQuery &>(*tree);
|
||||
@ -206,6 +217,8 @@ void InterpreterSelectQuery::rewriteExpressionList(const Names & required_column
|
||||
}
|
||||
|
||||
query.rewriteSelectExpressionList(required_column_names);
|
||||
|
||||
if (isFirstSelectInsideUnionAll())
|
||||
for (IAST* tree = query.next_union_all.get(); tree != nullptr; tree = static_cast<ASTSelectQuery *>(tree)->next_union_all.get())
|
||||
{
|
||||
auto & next_query = static_cast<ASTSelectQuery &>(*tree);
|
||||
|
Loading…
Reference in New Issue
Block a user