From 1005bbaa55eabc957fa4c3c8dc8e5ee37d9599ef Mon Sep 17 00:00:00 2001 From: Michael Kolupaev Date: Fri, 11 Jul 2014 17:11:06 +0400 Subject: [PATCH] Merge --- dbms/include/DB/Interpreters/Context.h | 3 + dbms/src/Interpreters/Context.cpp | 61 +++++++++++-------- .../Interpreters/InterpreterAlterQuery.cpp | 2 +- dbms/src/Storages/MergeTree/MergeTreeData.cpp | 3 + 4 files changed, 42 insertions(+), 27 deletions(-) diff --git a/dbms/include/DB/Interpreters/Context.h b/dbms/include/DB/Interpreters/Context.h index b837c7fc673..232f75ab5a7 100644 --- a/dbms/include/DB/Interpreters/Context.h +++ b/dbms/include/DB/Interpreters/Context.h @@ -271,6 +271,9 @@ public: /// Получить запрос на CREATE таблицы. ASTPtr getCreateQuery(const String & database_name, const String & table_name) const; + /// Получить запрос на CREATE таблицы. Только если он есть на диске. Нужно вызывать при заблокированной структуре таблицы. + ASTPtr readCreateQueryFromDisk(const String & database_name, const String & table_name) const; + /// Для методов ниже может быть необходимо захватывать mutex самостоятельно. Poco::Mutex & getMutex() const { return shared->mutex; } diff --git a/dbms/src/Interpreters/Context.cpp b/dbms/src/Interpreters/Context.cpp index e35f923b089..3276061e2da 100644 --- a/dbms/src/Interpreters/Context.cpp +++ b/dbms/src/Interpreters/Context.cpp @@ -305,35 +305,13 @@ void Context::detachDatabase(const String & database_name) } -ASTPtr Context::getCreateQuery(const String & database_name, const String & table_name) const +ASTPtr Context::readCreateQueryFromDisk(const String & database_name, const String & table_name) const { - StoragePtr table; - String db; - - { - Poco::ScopedLock lock(shared->mutex); - db = database_name.empty() ? current_database : database_name; - table = getTable(db, table_name); - } - - auto table_lock = table->lockStructure(false); - /// Здесь хранится определение таблицы - String metadata_path = shared->path + "metadata/" + escapeForFileName(db) + "/" + escapeForFileName(table_name) + ".sql"; + String metadata_path = shared->path + "metadata/" + escapeForFileName(database_name) + "/" + escapeForFileName(table_name) + ".sql"; if (!Poco::File(metadata_path).exists()) - { - try - { - /// Если файл .sql не предусмотрен (например, для таблиц типа ChunkRef), то движок может сам предоставить запрос CREATE. - return table->getCustomCreateQuery(*this); - } - catch (...) - { - throw Exception("Metadata file " + metadata_path + " for table " + db + "." + table_name + " doesn't exist.", - ErrorCodes::TABLE_METADATA_DOESNT_EXIST); - } - } + return nullptr; StringPtr query = new String(); { @@ -358,13 +336,44 @@ ASTPtr Context::getCreateQuery(const String & database_name, const String & tabl ASTCreateQuery & ast_create_query = typeid_cast(*ast); ast_create_query.attach = false; - ast_create_query.database = db; + ast_create_query.database = database_name; ast_create_query.query_string = query; return ast; } +ASTPtr Context::getCreateQuery(const String & database_name, const String & table_name) const +{ + StoragePtr table; + String db; + + { + Poco::ScopedLock lock(shared->mutex); + db = database_name.empty() ? current_database : database_name; + table = getTable(db, table_name); + } + + auto table_lock = table->lockStructure(false); + + ASTPtr res = readCreateQueryFromDisk(db, table_name); + + if (res) + return res; + + try + { + /// Если файл .sql не предусмотрен (например, для таблиц типа ChunkRef), то движок может сам предоставить запрос CREATE. + return table->getCustomCreateQuery(*this); + } + catch (...) + { + throw Exception("Metadata file for table " + db + "." + table_name + " doesn't exist.", + ErrorCodes::TABLE_METADATA_DOESNT_EXIST); + } +} + + Settings Context::getSettings() const { Poco::ScopedLock lock(shared->mutex); diff --git a/dbms/src/Interpreters/InterpreterAlterQuery.cpp b/dbms/src/Interpreters/InterpreterAlterQuery.cpp index 70ad90b855b..c603cfcceb5 100644 --- a/dbms/src/Interpreters/InterpreterAlterQuery.cpp +++ b/dbms/src/Interpreters/InterpreterAlterQuery.cpp @@ -97,7 +97,7 @@ void InterpreterAlterQuery::updateMetadata( String metadata_path = path + "metadata/" + database_name_escaped + "/" + table_name_escaped + ".sql"; String metadata_temp_path = metadata_path + ".tmp"; - ASTPtr attach_ptr = context.getCreateQuery(database_name, table_name); + ASTPtr attach_ptr = context.readCreateQueryFromDisk(database_name, table_name); ASTCreateQuery & attach = typeid_cast(*attach_ptr); attach.attach = true; diff --git a/dbms/src/Storages/MergeTree/MergeTreeData.cpp b/dbms/src/Storages/MergeTree/MergeTreeData.cpp index 7849e11bba3..3d9f96ccbc8 100644 --- a/dbms/src/Storages/MergeTree/MergeTreeData.cpp +++ b/dbms/src/Storages/MergeTree/MergeTreeData.cpp @@ -463,6 +463,9 @@ MergeTreeData::AlterDataPartTransactionPtr MergeTreeData::alterDataPart(DataPart transaction->rename_map["checksums.txt.tmp"] = "checksums.txt"; } + if (transaction->rename_map.empty()) + transaction->data_part = nullptr; + return transaction; }