From 8a317f076d4e3e1309a8e2ce1c6c3352a3235f96 Mon Sep 17 00:00:00 2001 From: Alexey Arno Date: Fri, 17 Apr 2015 16:56:29 +0300 Subject: [PATCH] Merge --- dbms/include/DB/Interpreters/InterpreterSelectQuery.h | 11 +++++++++-- dbms/src/Interpreters/InterpreterSelectQuery.cpp | 8 +++++--- dbms/src/Storages/StorageView.cpp | 2 +- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/dbms/include/DB/Interpreters/InterpreterSelectQuery.h b/dbms/include/DB/Interpreters/InterpreterSelectQuery.h index 643152b7647..91b9f6b188a 100644 --- a/dbms/include/DB/Interpreters/InterpreterSelectQuery.h +++ b/dbms/include/DB/Interpreters/InterpreterSelectQuery.h @@ -63,8 +63,12 @@ public: */ BlockInputStreamPtr execute(); - /// Выполнить запрос без объединения потоков. - const BlockInputStreams & executeWithoutUnion(); + /** Выполнить запрос без объединения потоков. + * Если force_no_union = false, выполнить объединения, которые не могут быть отложены до оформления окончательного результата. + * Если же force_no_union = true, не выполнять никаких объединений. Это позволяет оптимизировать запросы, в которых таблица + * является представлением. + */ + const BlockInputStreams & executeWithoutUnion(bool force_no_union); /** Выполнить запрос, записать результат в нужном формате в buf. * BlockInputStreamPtr возвращается, чтобы можно было потом получить информацию о плане выполнения запроса. @@ -142,6 +146,9 @@ private: StoragePtr storage; IStorage::TableStructureReadLockPtr table_lock; + /// См. описание функции executeWithoutUnion(). + bool force_no_union = false; + Logger * log; }; diff --git a/dbms/src/Interpreters/InterpreterSelectQuery.cpp b/dbms/src/Interpreters/InterpreterSelectQuery.cpp index daf705cb39c..1fc46ce5012 100644 --- a/dbms/src/Interpreters/InterpreterSelectQuery.cpp +++ b/dbms/src/Interpreters/InterpreterSelectQuery.cpp @@ -293,7 +293,7 @@ Block InterpreterSelectQuery::getSampleBlock() BlockInputStreamPtr InterpreterSelectQuery::execute() { - (void) executeWithoutUnion(); + (void) executeWithoutUnion(false); if (streams.empty()) return new NullBlockInputStream; @@ -323,8 +323,10 @@ BlockInputStreamPtr InterpreterSelectQuery::execute() return streams[0]; } -const BlockInputStreams & InterpreterSelectQuery::executeWithoutUnion() +const BlockInputStreams & InterpreterSelectQuery::executeWithoutUnion(bool force_no_union_) { + force_no_union = force_no_union_; + if (is_first_select_inside_union_all) { executeSingleQuery(); @@ -559,7 +561,7 @@ void InterpreterSelectQuery::executeSingleQuery() if (need_second_distinct_pass) do_execute_union = true; - if (do_execute_union) + if (do_execute_union && !force_no_union) executeUnion(streams); /// Если было более одного источника - то нужно выполнить DISTINCT ещё раз после их слияния. diff --git a/dbms/src/Storages/StorageView.cpp b/dbms/src/Storages/StorageView.cpp index 763023dd347..7cf41d6f56e 100644 --- a/dbms/src/Storages/StorageView.cpp +++ b/dbms/src/Storages/StorageView.cpp @@ -92,7 +92,7 @@ BlockInputStreams StorageView::read( if (outer_select.final && !inner_select.final) inner_select.final = outer_select.final; - return InterpreterSelectQuery(inner_query_clone, context, column_names).executeWithoutUnion(); + return InterpreterSelectQuery(inner_query_clone, context, column_names).executeWithoutUnion(true); }