This commit is contained in:
Michael Kolupaev 2014-07-11 17:11:06 +04:00
parent e26223d5c8
commit 1005bbaa55
4 changed files with 42 additions and 27 deletions

View File

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

View File

@ -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<Poco::Mutex> 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<ASTCreateQuery &>(*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<Poco::Mutex> 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<Poco::Mutex> lock(shared->mutex);

View File

@ -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<ASTCreateQuery &>(*attach_ptr);
attach.attach = true;

View File

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