From fedcc0081a29713243fc4cfee8156d9be9131d71 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Sun, 13 Apr 2014 13:46:36 +0400 Subject: [PATCH] dbms: better [#METR-10841]. --- dbms/include/DB/Storages/StorageMerge.h | 4 ++-- dbms/src/Storages/StorageMerge.cpp | 26 ++++++++++++------------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/dbms/include/DB/Storages/StorageMerge.h b/dbms/include/DB/Storages/StorageMerge.h index 82cf841181f..651ce90e8c9 100644 --- a/dbms/include/DB/Storages/StorageMerge.h +++ b/dbms/include/DB/Storages/StorageMerge.h @@ -47,8 +47,6 @@ public: void drop() override {} void rename(const String & new_path_to_db, const String & new_name) { name = new_name; } - void getSelectedTables(StorageVector & selected_tables); - /// в подтаблицах добавлять и удалять столбы нужно вручную /// структура подтаблиц не проверяется void alter(const ASTAlterQuery::Parameters & params); @@ -70,6 +68,8 @@ private: const String & source_database_, const String & table_name_regexp_, const Context & context_); + + void getSelectedTables(StorageVector & selected_tables) const; }; } diff --git a/dbms/src/Storages/StorageMerge.cpp b/dbms/src/Storages/StorageMerge.cpp index bd676384b10..49888f1c99a 100644 --- a/dbms/src/Storages/StorageMerge.cpp +++ b/dbms/src/Storages/StorageMerge.cpp @@ -61,16 +61,10 @@ BlockInputStreams StorageMerge::read( processed_stage = QueryProcessingStage::Complete; QueryProcessingStage::Enum tmp_processed_stage = QueryProcessingStage::Complete; - /// Список таблиц могут менять в другом потоке. - { - Poco::ScopedLock lock(context.getMutex()); - context.assertDatabaseExists(source_database); - - /** Сначала составим список выбранных таблиц, чтобы узнать его размер. - * Это нужно, чтобы правильно передать в каждую таблицу рекомендацию по количеству потоков. - */ - getSelectedTables(selected_tables); - } + /** Сначала составим список выбранных таблиц, чтобы узнать его размер. + * Это нужно, чтобы правильно передать в каждую таблицу рекомендацию по количеству потоков. + */ + getSelectedTables(selected_tables); /// Если в запросе используется PREWHERE, надо убедиться, что все таблицы это поддерживают. if (dynamic_cast(*query).prewhere_expression) @@ -159,12 +153,16 @@ Block StorageMerge::getBlockWithVirtualColumns(const std::vector & s return res; } -void StorageMerge::getSelectedTables(StorageVector & selected_tables) +void StorageMerge::getSelectedTables(StorageVector & selected_tables) const { + /// Список таблиц могут менять в другом потоке. + Poco::ScopedLock lock(context.getMutex()); + context.assertDatabaseExists(source_database); + const Tables & tables = context.getDatabases().at(source_database); - for (Tables::const_iterator it = tables.begin(); it != tables.end(); ++it) - if (it->second.get() != this && table_name_regexp.match(it->first)) - selected_tables.push_back(it->second); + for (const auto & name_table_pair : tables) + if (name_table_pair.second.get() != this && table_name_regexp.match(name_table_pair.first)) + selected_tables.push_back(name_table_pair.second); }