dbms: better [#METR-10841].

This commit is contained in:
Alexey Milovidov 2014-04-13 13:46:36 +04:00
parent 813406b01b
commit fedcc0081a
2 changed files with 14 additions and 16 deletions

View File

@ -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;
};
}

View File

@ -61,16 +61,10 @@ BlockInputStreams StorageMerge::read(
processed_stage = QueryProcessingStage::Complete;
QueryProcessingStage::Enum tmp_processed_stage = QueryProcessingStage::Complete;
/// Список таблиц могут менять в другом потоке.
{
Poco::ScopedLock<Poco::Mutex> lock(context.getMutex());
context.assertDatabaseExists(source_database);
/** Сначала составим список выбранных таблиц, чтобы узнать его размер.
* Это нужно, чтобы правильно передать в каждую таблицу рекомендацию по количеству потоков.
*/
getSelectedTables(selected_tables);
}
/** Сначала составим список выбранных таблиц, чтобы узнать его размер.
* Это нужно, чтобы правильно передать в каждую таблицу рекомендацию по количеству потоков.
*/
getSelectedTables(selected_tables);
/// Если в запросе используется PREWHERE, надо убедиться, что все таблицы это поддерживают.
if (dynamic_cast<const ASTSelectQuery &>(*query).prewhere_expression)
@ -159,12 +153,16 @@ Block StorageMerge::getBlockWithVirtualColumns(const std::vector<StoragePtr> & s
return res;
}
void StorageMerge::getSelectedTables(StorageVector & selected_tables)
void StorageMerge::getSelectedTables(StorageVector & selected_tables) const
{
/// Список таблиц могут менять в другом потоке.
Poco::ScopedLock<Poco::Mutex> 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);
}