mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 15:42:02 +00:00
Code cleanup. [#METR-14099]
This commit is contained in:
parent
10b33bdc2e
commit
bbdbc9c9d3
@ -78,6 +78,11 @@ private:
|
||||
|
||||
void init(BlockInputStreamPtr input, const NamesAndTypesList & table_column_names = NamesAndTypesList());
|
||||
|
||||
/// Выполнить один запрос SELECT из цепочки UNION ALL.
|
||||
void executeSingleQuery(bool should_perform_union_hint = true);
|
||||
|
||||
bool isFirstSelectInsideUnionAll() const;
|
||||
|
||||
/** Из какой таблицы читать. JOIN-ы не поддерживаются.
|
||||
*/
|
||||
void getDatabaseAndTableNames(String & database_name, String & table_name);
|
||||
@ -91,9 +96,6 @@ private:
|
||||
/// Вынимает данные из таблицы. Возвращает стадию, до которой запрос был обработан в Storage.
|
||||
QueryProcessingStage::Enum executeFetchColumns(BlockInputStreams & streams);
|
||||
|
||||
/// Выполнить один запрос SELECT из цепочки UNION ALL.
|
||||
void executeSingleQuery(bool is_inside_union_all = false);
|
||||
|
||||
void executeWhere( BlockInputStreams & streams, ExpressionActionsPtr expression);
|
||||
void executeAggregation( BlockInputStreams & streams, ExpressionActionsPtr expression,
|
||||
bool overflow_row, bool final);
|
||||
|
@ -30,9 +30,6 @@
|
||||
|
||||
#include <DB/Core/Field.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
@ -89,11 +86,11 @@ void InterpreterSelectQuery::init(BlockInputStreamPtr input_, const NamesAndType
|
||||
if (input_)
|
||||
streams.push_back(input_);
|
||||
|
||||
if (is_union_all_head && (!query.next_union_all.isNull()))
|
||||
if (isFirstSelectInsideUnionAll())
|
||||
{
|
||||
// Проверить, что результаты всех запросов SELECT cовместимые.
|
||||
// NOTE Мы можем безопасно применить static_cast вместо typeid_cast, потому что знаем, что в цепочке UNION ALL
|
||||
// имеются только деревья типа SELECT.
|
||||
// Создаем цепочку запросов SELECT и проверяем, что результаты всех запросов SELECT cовместимые.
|
||||
// NOTE Мы можем безопасно применить static_cast вместо typeid_cast,
|
||||
// потому что знаем, что в цепочке UNION ALL имеются только деревья типа SELECT.
|
||||
InterpreterSelectQuery * interpreter = this;
|
||||
Block first = interpreter->getSampleBlock();
|
||||
for (ASTPtr tree = query.next_union_all; !tree.isNull(); tree = (static_cast<ASTSelectQuery &>(*tree)).next_union_all)
|
||||
@ -152,6 +149,11 @@ InterpreterSelectQuery::InterpreterSelectQuery(ASTPtr query_ptr_, const Context
|
||||
init(input_, table_column_names);
|
||||
}
|
||||
|
||||
bool InterpreterSelectQuery::isFirstSelectInsideUnionAll() const
|
||||
{
|
||||
return is_union_all_head && !query.next_union_all.isNull();
|
||||
}
|
||||
|
||||
void InterpreterSelectQuery::getDatabaseAndTableNames(String & database_name, String & table_name)
|
||||
{
|
||||
/** Если таблица не указана - используем таблицу system.one.
|
||||
@ -214,12 +216,12 @@ static inline BlockInputStreamPtr maybeAsynchronous(BlockInputStreamPtr in, bool
|
||||
|
||||
BlockInputStreamPtr InterpreterSelectQuery::execute()
|
||||
{
|
||||
if (is_union_all_head && !query.next_union_all.isNull())
|
||||
if (isFirstSelectInsideUnionAll())
|
||||
{
|
||||
executeSingleQuery(true);
|
||||
executeSingleQuery(false);
|
||||
for (auto p = next_select_in_union_all.get(); p != nullptr; p = p->query.next_select_in_union_all.get())
|
||||
{
|
||||
p->query.executeSingleQuery(true);
|
||||
p->query.executeSingleQuery(false);
|
||||
const auto & others = p->query.streams;
|
||||
streams.insert(streams.end(), others.begin(), others.end());
|
||||
}
|
||||
@ -263,7 +265,7 @@ BlockInputStreamPtr InterpreterSelectQuery::execute()
|
||||
}
|
||||
|
||||
|
||||
void InterpreterSelectQuery::executeSingleQuery(bool is_inside_union_all)
|
||||
void InterpreterSelectQuery::executeSingleQuery(bool should_perform_union_hint)
|
||||
{
|
||||
/** Потоки данных. При параллельном выполнении запроса, имеем несколько потоков данных.
|
||||
* Если нет GROUP BY, то выполним все операции до ORDER BY и LIMIT параллельно, затем
|
||||
@ -277,7 +279,7 @@ void InterpreterSelectQuery::executeSingleQuery(bool is_inside_union_all)
|
||||
* то объединение источников данных выполняется не на этом уровне, а на верхнем уровне.
|
||||
*/
|
||||
|
||||
bool do_execute_union = !is_inside_union_all;
|
||||
bool do_execute_union = should_perform_union_hint;
|
||||
|
||||
/** Вынем данные из Storage. from_stage - до какой стадии запрос был выполнен в Storage. */
|
||||
QueryProcessingStage::Enum from_stage = executeFetchColumns(streams);
|
||||
|
@ -1 +1 @@
|
||||
SELECT nn,vv FROM (SELECT name AS nn, value AS vv FROM data2013 UNION ALL SELECT name AS nn, value AS vv FROM data2014) ORDER BY nn ASC;
|
||||
SELECT nn,vv FROM (SELECT name AS nn, value AS vv FROM data2013 UNION ALL SELECT name AS nn, value AS vv FROM data2014) ORDER BY nn,vv ASC;
|
||||
|
Loading…
Reference in New Issue
Block a user