diff --git a/dbms/src/Databases/DatabaseAtomic.cpp b/dbms/src/Databases/DatabaseAtomic.cpp index c0bbc7e78f0..8fdffd54623 100644 --- a/dbms/src/Databases/DatabaseAtomic.cpp +++ b/dbms/src/Databases/DatabaseAtomic.cpp @@ -10,6 +10,7 @@ namespace ErrorCodes { extern const int UNKNOWN_TABLE; extern const int TABLE_ALREADY_EXISTS; + extern const int FILE_DOESNT_EXIST; } DatabaseAtomic::DatabaseAtomic(String name_, String metadata_path_, const Context & context_) @@ -62,6 +63,31 @@ StoragePtr DatabaseAtomic::detachTable(const String & name) return DatabaseWithDictionaries::detachTable(name); } +void DatabaseAtomic::renameTable(const Context & context, const String & table_name, IDatabase & to_database, + const String & to_table_name, TableStructureWriteLockHolder &) +{ + //FIXME + if (typeid(*this) != typeid(to_database)) + throw Exception("Moving tables between databases of different engines is not supported", ErrorCodes::NOT_IMPLEMENTED); + + StoragePtr table = tryGetTable(context, table_name); + + if (!table) + throw Exception("Table " + backQuote(getDatabaseName()) + "." + backQuote(table_name) + " doesn't exist.", ErrorCodes::UNKNOWN_TABLE); + + /// Notify the table that it is renamed. If the table does not support renaming, exception is thrown. + table->renameInMemory(to_database.getDatabaseName(), to_table_name); + + ASTPtr ast = getQueryFromMetadata(getObjectMetadataPath(table_name)); + if (!ast) + throw Exception("There is no metadata file for table " + backQuote(table_name) + ".", ErrorCodes::FILE_DOESNT_EXIST); + ast->as().table = to_table_name; + + /// NOTE Non-atomic. + to_database.createTable(context, to_table_name, table, ast); + removeTable(context, table_name); +} + } diff --git a/dbms/src/Databases/DatabaseAtomic.h b/dbms/src/Databases/DatabaseAtomic.h index 8e1be19daf9..1f36083d3d0 100644 --- a/dbms/src/Databases/DatabaseAtomic.h +++ b/dbms/src/Databases/DatabaseAtomic.h @@ -21,6 +21,13 @@ public: const StoragePtr & table, const ASTPtr & query) override; + void renameTable( + const Context & context, + const String & table_name, + IDatabase & to_database, + const String & to_table_name, + TableStructureWriteLockHolder & lock) override; + void attachTable(const String & name, const StoragePtr & table, const String & relative_table_path = {}) override; StoragePtr detachTable(const String & name) override; diff --git a/dbms/src/Storages/IStorage.h b/dbms/src/Storages/IStorage.h index e2a4d69d9a1..ced16263544 100644 --- a/dbms/src/Storages/IStorage.h +++ b/dbms/src/Storages/IStorage.h @@ -301,21 +301,21 @@ public: * In this function, you need to rename the directory with the data, if any. * Called when the table structure is locked for write. */ - virtual void rename(const String & /*new_path_to_db*/, const String & /*new_database_name*/, const String & /*new_table_name*/, + virtual void rename(const String & /*new_path_to_table_data*/, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) { - throw Exception("Method rename is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED); + renameInMemory(new_database_name, new_table_name); } - // TODO refactor rename() and renameAtomic() + // TODO refactor rename() and renameInMemory() /** * Just updates names of database and table without moving any data on disk * Can be called only from DatabaseAtomic. */ - virtual void renameAtomic(const String & /*new_database_name*/, const String & /*new_table_name*/) + virtual void renameInMemory(const String & /*new_database_name*/, const String & /*new_table_name*/) { - throw Exception("Method renameAtomic is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED); + throw Exception("Method rename is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED); } /** ALTER tables in the form of column changes that do not affect the change to Storage or its parameters. diff --git a/dbms/src/Storages/Kafka/StorageKafka.cpp b/dbms/src/Storages/Kafka/StorageKafka.cpp index f33a237a56a..02d59f42542 100644 --- a/dbms/src/Storages/Kafka/StorageKafka.cpp +++ b/dbms/src/Storages/Kafka/StorageKafka.cpp @@ -192,7 +192,7 @@ void StorageKafka::shutdown() } -void StorageKafka::rename(const String & /* new_path_to_db */, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) +void StorageKafka::renameInMemory(const String & new_database_name, const String & new_table_name) { table_name = new_table_name; database_name = new_database_name; diff --git a/dbms/src/Storages/Kafka/StorageKafka.h b/dbms/src/Storages/Kafka/StorageKafka.h index 492d1d65411..492ec987cb8 100644 --- a/dbms/src/Storages/Kafka/StorageKafka.h +++ b/dbms/src/Storages/Kafka/StorageKafka.h @@ -49,7 +49,7 @@ public: const ASTPtr & query, const Context & context) override; - void rename(const String & /* new_path_to_db */, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + void renameInMemory(const String & new_database_name, const String & new_table_name) override; void updateDependencies() override; diff --git a/dbms/src/Storages/MergeTree/MergeTreeData.cpp b/dbms/src/Storages/MergeTree/MergeTreeData.cpp index 29939e5d12f..d07044915cf 100644 --- a/dbms/src/Storages/MergeTree/MergeTreeData.cpp +++ b/dbms/src/Storages/MergeTree/MergeTreeData.cpp @@ -1177,17 +1177,14 @@ void MergeTreeData::clearPartsFromFilesystem(const DataPartsVector & parts_to_re } void MergeTreeData::rename( - const String & /*new_path_to_db*/, const String & new_database_name, + const String & new_path_to_table_data, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) { - auto new_file_db_name = escapeForFileName(new_database_name); - auto new_file_table_name = escapeForFileName(new_table_name); - auto disks = storage_policy->getDisks(); for (const auto & disk : disks) { - auto new_full_path = disk->getClickHouseDataPath() + new_file_db_name + '/' + new_file_table_name + '/'; + auto new_full_path = disk->getPath() + new_path_to_table_data; if (Poco::File{new_full_path}.exists()) throw Exception{"Target path already exists: " + new_full_path, ErrorCodes::DIRECTORY_ALREADY_EXISTS}; @@ -1196,21 +1193,19 @@ void MergeTreeData::rename( for (const auto & disk : disks) { auto full_path = disk->getPath() + relative_data_path; - auto new_db_path = disk->getClickHouseDataPath() + new_file_db_name + '/'; + auto new_full_path = disk->getPath() + new_path_to_table_data; - Poco::File db_file{new_db_path}; - if (!db_file.exists()) - db_file.createDirectory(); + Poco::File new_full_path_parent{Poco::Path(new_full_path).makeParent()}; + if (!new_full_path_parent.exists()) + new_full_path_parent.createDirectories(); - auto new_full_path = new_db_path + new_file_table_name + '/'; Poco::File{full_path}.renameTo(new_full_path); } global_context.dropCaches(); database_name = new_database_name; - table_name = new_table_name; - relative_data_path = "data/" + new_file_db_name + '/' + new_file_table_name + '/'; + renameInMemory(new_database_name, new_table_name); } void MergeTreeData::dropAllData() diff --git a/dbms/src/Storages/MergeTree/MergeTreeData.h b/dbms/src/Storages/MergeTree/MergeTreeData.h index dcb80f0d1c8..2448769135f 100644 --- a/dbms/src/Storages/MergeTree/MergeTreeData.h +++ b/dbms/src/Storages/MergeTree/MergeTreeData.h @@ -538,9 +538,15 @@ public: /// Moves the entire data directory. /// Flushes the uncompressed blocks cache and the marks cache. /// Must be called with locked lockStructureForAlter(). - void rename(const String & new_path_to_db, const String & new_database_name, + void rename(const String & new_path_to_table_data, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + void renameInMemory(const String & new_database_name, const String & new_table_name) override + { + table_name = new_table_name; + database_name = new_database_name; + } + /// Check if the ALTER can be performed: /// - all needed columns are present. /// - all type conversions can be done. diff --git a/dbms/src/Storages/StorageBuffer.h b/dbms/src/Storages/StorageBuffer.h index 1c565a7d8f0..10fd20aec4e 100644 --- a/dbms/src/Storages/StorageBuffer.h +++ b/dbms/src/Storages/StorageBuffer.h @@ -73,7 +73,7 @@ public: void shutdown() override; bool optimize(const ASTPtr & query, const ASTPtr & partition, bool final, bool deduplicate, const Context & context) override; - void rename(const String & /*new_path_to_db*/, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override + void renameInMemory(const String & new_database_name, const String & new_table_name) override { table_name = new_table_name; database_name = new_database_name; diff --git a/dbms/src/Storages/StorageDistributed.h b/dbms/src/Storages/StorageDistributed.h index b6cf349c770..c8bef378d95 100644 --- a/dbms/src/Storages/StorageDistributed.h +++ b/dbms/src/Storages/StorageDistributed.h @@ -82,8 +82,9 @@ public: /// Removes temporary data in local filesystem. void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; - void rename(const String & /*new_path_to_db*/, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override + void rename(const String & /*new_path_to_table_data*/, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override { + //TODO do we need no move data on disk and update path? table_name = new_table_name; database_name = new_database_name; } diff --git a/dbms/src/Storages/StorageFile.cpp b/dbms/src/Storages/StorageFile.cpp index eb6e45ecc72..438c48c3ef6 100644 --- a/dbms/src/Storages/StorageFile.cpp +++ b/dbms/src/Storages/StorageFile.cpp @@ -323,7 +323,7 @@ Strings StorageFile::getDataPaths() const return paths; } -void StorageFile::rename(const String & new_path_to_db, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) +void StorageFile::rename(const String & new_path_to_table_data, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) { if (!is_db_table) throw Exception("Can't rename table '" + table_name + "' binded to user-defined file (or FD)", ErrorCodes::DATABASE_ACCESS_DENIED); @@ -333,7 +333,7 @@ void StorageFile::rename(const String & new_path_to_db, const String & new_datab std::unique_lock lock(rwlock); - std::string path_new = getTablePath(new_path_to_db + escapeForFileName(new_table_name), format_name); + std::string path_new = getTablePath(context_global.getPath() + new_path_to_table_data, format_name); Poco::File(Poco::Path(path_new).parent()).createDirectories(); Poco::File(paths[0]).renameTo(path_new); diff --git a/dbms/src/Storages/StorageFile.h b/dbms/src/Storages/StorageFile.h index 66e3760821e..e8fd83a627d 100644 --- a/dbms/src/Storages/StorageFile.h +++ b/dbms/src/Storages/StorageFile.h @@ -38,7 +38,13 @@ public: const ASTPtr & query, const Context & context) override; - void rename(const String & new_path_to_db, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + void rename(const String & new_path_to_table_data, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + + void renameInMemory(const String & new_database_name, const String & new_table_name) override + { + table_name = new_table_name; + database_name = new_database_name; + } Strings getDataPaths() const override; diff --git a/dbms/src/Storages/StorageHDFS.cpp b/dbms/src/Storages/StorageHDFS.cpp index 4b68bed871c..18ce7780faf 100644 --- a/dbms/src/Storages/StorageHDFS.cpp +++ b/dbms/src/Storages/StorageHDFS.cpp @@ -209,7 +209,7 @@ BlockInputStreams StorageHDFS::read( return result; } -void StorageHDFS::rename(const String & /*new_path_to_db*/, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) +void StorageHDFS::renameInMemory(const String & new_database_name, const String & new_table_name) { table_name = new_table_name; database_name = new_database_name; diff --git a/dbms/src/Storages/StorageHDFS.h b/dbms/src/Storages/StorageHDFS.h index 8361916e0e2..319914e78eb 100644 --- a/dbms/src/Storages/StorageHDFS.h +++ b/dbms/src/Storages/StorageHDFS.h @@ -30,7 +30,7 @@ public: BlockOutputStreamPtr write(const ASTPtr & query, const Context & context) override; - void rename(const String & new_path_to_db, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + void renameInMemory(const String & new_database_name, const String & new_table_name) override; protected: StorageHDFS(const String & uri_, diff --git a/dbms/src/Storages/StorageLog.cpp b/dbms/src/Storages/StorageLog.cpp index 1fe41634239..ac6cd79b552 100644 --- a/dbms/src/Storages/StorageLog.cpp +++ b/dbms/src/Storages/StorageLog.cpp @@ -425,7 +425,7 @@ StorageLog::StorageLog( const ConstraintsDescription & constraints_, size_t max_compress_block_size_, const Context & context_) - : path(context_.getPath() + relative_path_), table_name(table_name_), database_name(database_name_), + : base_path(context_.getPath()), path(base_path + relative_path_), table_name(table_name_), database_name(database_name_), max_compress_block_size(max_compress_block_size_), file_checker(path + "sizes.json") { @@ -513,17 +513,16 @@ void StorageLog::loadMarks() } -void StorageLog::rename(const String & new_path_to_db, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) +void StorageLog::rename(const String & new_path_to_table_data, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) { std::unique_lock lock(rwlock); /// Rename directory with data. - String new_path = new_path_to_db + escapeForFileName(new_table_name) + '/'; + String new_path = base_path + new_path_to_table_data; Poco::File(path).renameTo(new_path); path = new_path; - table_name = new_table_name; - database_name = new_database_name; + renameInMemory(new_database_name, new_table_name); file_checker.setPath(path + "sizes.json"); for (auto & file : files) diff --git a/dbms/src/Storages/StorageLog.h b/dbms/src/Storages/StorageLog.h index b911c5ab4fe..f52c0d804fb 100644 --- a/dbms/src/Storages/StorageLog.h +++ b/dbms/src/Storages/StorageLog.h @@ -38,7 +38,13 @@ public: BlockOutputStreamPtr write(const ASTPtr & query, const Context & context) override; - void rename(const String & new_path_to_db, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + void rename(const String & new_path_to_table_data, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + + void renameInMemory(const String & new_database_name, const String & new_table_name) override + { + table_name = new_table_name; + database_name = new_database_name; + } CheckResults checkData(const ASTPtr & /* query */, const Context & /* context */) override; @@ -63,6 +69,7 @@ protected: const Context & context_); private: + String base_path; String path; String table_name; String database_name; diff --git a/dbms/src/Storages/StorageMaterializedView.cpp b/dbms/src/Storages/StorageMaterializedView.cpp index 24a6461bdab..6b3082b9efb 100644 --- a/dbms/src/Storages/StorageMaterializedView.cpp +++ b/dbms/src/Storages/StorageMaterializedView.cpp @@ -299,8 +299,7 @@ static void executeRenameQuery(Context & global_context, const String & database } -void StorageMaterializedView::rename( - const String & /*new_path_to_db*/, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) +void StorageMaterializedView::renameInMemory(const String & new_database_name, const String & new_table_name) { if (has_inner_table && tryGetTargetTable()) { diff --git a/dbms/src/Storages/StorageMaterializedView.h b/dbms/src/Storages/StorageMaterializedView.h index 4ac608d96d2..7a5e2e7a528 100644 --- a/dbms/src/Storages/StorageMaterializedView.h +++ b/dbms/src/Storages/StorageMaterializedView.h @@ -43,7 +43,7 @@ public: void mutate(const MutationCommands & commands, const Context & context) override; - void rename(const String & new_path_to_db, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + void renameInMemory(const String & new_database_name, const String & new_table_name) override; void shutdown() override; diff --git a/dbms/src/Storages/StorageMemory.h b/dbms/src/Storages/StorageMemory.h index eb2d6ff2e21..bc1d46c0017 100644 --- a/dbms/src/Storages/StorageMemory.h +++ b/dbms/src/Storages/StorageMemory.h @@ -44,7 +44,7 @@ public: void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; - void rename(const String & /*new_path_to_db*/, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override + void renameInMemory(const String & new_database_name, const String & new_table_name) override { table_name = new_table_name; database_name = new_database_name; diff --git a/dbms/src/Storages/StorageMerge.h b/dbms/src/Storages/StorageMerge.h index debcb4da58e..b143bad901f 100644 --- a/dbms/src/Storages/StorageMerge.h +++ b/dbms/src/Storages/StorageMerge.h @@ -42,7 +42,7 @@ public: size_t max_block_size, unsigned num_streams) override; - void rename(const String & /*new_path_to_db*/, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override + void renameInMemory(const String & new_database_name, const String & new_table_name) override { table_name = new_table_name; database_name = new_database_name; diff --git a/dbms/src/Storages/StorageNull.h b/dbms/src/Storages/StorageNull.h index e1a80f3fbaf..faffa88cebb 100644 --- a/dbms/src/Storages/StorageNull.h +++ b/dbms/src/Storages/StorageNull.h @@ -38,7 +38,7 @@ public: return std::make_shared(getSampleBlock()); } - void rename(const String & /*new_path_to_db*/, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override + void renameInMemory(const String & new_database_name, const String & new_table_name) override { table_name = new_table_name; database_name = new_database_name; diff --git a/dbms/src/Storages/StorageReplicatedMergeTree.cpp b/dbms/src/Storages/StorageReplicatedMergeTree.cpp index 327ecf0d1b6..7e83bfe3440 100644 --- a/dbms/src/Storages/StorageReplicatedMergeTree.cpp +++ b/dbms/src/Storages/StorageReplicatedMergeTree.cpp @@ -3746,10 +3746,10 @@ void StorageReplicatedMergeTree::drop(TableStructureWriteLockHolder &) void StorageReplicatedMergeTree::rename( - const String & new_path_to_db, const String & new_database_name, + const String & new_path_to_table_data, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder & lock) { - MergeTreeData::rename(new_path_to_db, new_database_name, new_table_name, lock); + MergeTreeData::rename(new_path_to_table_data, new_database_name, new_table_name, lock); /// Update table name in zookeeper auto zookeeper = getZooKeeper(); diff --git a/dbms/src/Storages/StorageReplicatedMergeTree.h b/dbms/src/Storages/StorageReplicatedMergeTree.h index 0cc2b9930e2..8fab6aad094 100644 --- a/dbms/src/Storages/StorageReplicatedMergeTree.h +++ b/dbms/src/Storages/StorageReplicatedMergeTree.h @@ -117,7 +117,7 @@ public: void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; - void rename(const String & new_path_to_db, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + void rename(const String & new_path_to_table_data, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; bool supportsIndexForIn() const override { return true; } diff --git a/dbms/src/Storages/StorageS3.cpp b/dbms/src/Storages/StorageS3.cpp index 488a38c3e83..14560f77f38 100644 --- a/dbms/src/Storages/StorageS3.cpp +++ b/dbms/src/Storages/StorageS3.cpp @@ -164,7 +164,7 @@ BlockInputStreams StorageS3::read( return {std::make_shared(block_input, column_defaults, context)}; } -void StorageS3::rename(const String & /*new_path_to_db*/, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) +void StorageS3::renameInMemory(const String & new_database_name, const String & new_table_name) { table_name = new_table_name; database_name = new_database_name; diff --git a/dbms/src/Storages/StorageS3.h b/dbms/src/Storages/StorageS3.h index 65cd65458c6..fbd4c0c9c7d 100644 --- a/dbms/src/Storages/StorageS3.h +++ b/dbms/src/Storages/StorageS3.h @@ -51,7 +51,7 @@ public: BlockOutputStreamPtr write(const ASTPtr & query, const Context & context) override; - void rename(const String & new_path_to_db, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + void renameInMemory(const String & new_database_name, const String & new_table_name) override; private: Poco::URI uri; diff --git a/dbms/src/Storages/StorageSet.cpp b/dbms/src/Storages/StorageSet.cpp index 50f8773df90..037c307386d 100644 --- a/dbms/src/Storages/StorageSet.cpp +++ b/dbms/src/Storages/StorageSet.cpp @@ -101,7 +101,8 @@ StorageSetOrJoinBase::StorageSetOrJoinBase( if (relative_path_.empty()) throw Exception("Join and Set storages require data path", ErrorCodes::INCORRECT_FILE_NAME); - path = context_.getPath() + relative_path_; + base_path = context_.getPath(); + path = base_path + relative_path_; } @@ -196,15 +197,14 @@ void StorageSetOrJoinBase::restoreFromFile(const String & file_path) void StorageSetOrJoinBase::rename( - const String & new_path_to_db, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) + const String & new_path_to_table_data, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) { /// Rename directory with data. - String new_path = new_path_to_db + escapeForFileName(new_table_name) + "/"; + String new_path = base_path + new_path_to_table_data; Poco::File(path).renameTo(new_path); path = new_path; - table_name = new_table_name; - database_name = new_database_name; + renameInMemory(new_database_name, new_table_name); } diff --git a/dbms/src/Storages/StorageSet.h b/dbms/src/Storages/StorageSet.h index e993039c304..b250e9f9836 100644 --- a/dbms/src/Storages/StorageSet.h +++ b/dbms/src/Storages/StorageSet.h @@ -22,7 +22,13 @@ public: String getTableName() const override { return table_name; } String getDatabaseName() const override { return database_name; } - void rename(const String & new_path_to_db, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + void rename(const String & new_path_to_table_data, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + + void renameInMemory(const String & new_database_name, const String & new_table_name) override + { + table_name = new_table_name; + database_name = new_database_name; + } BlockOutputStreamPtr write(const ASTPtr & query, const Context & context) override; @@ -37,6 +43,7 @@ protected: const ConstraintsDescription & constraints_, const Context & context_); + String base_path; String path; String table_name; String database_name; diff --git a/dbms/src/Storages/StorageStripeLog.cpp b/dbms/src/Storages/StorageStripeLog.cpp index f6e8259ac77..b8e27bac89a 100644 --- a/dbms/src/Storages/StorageStripeLog.cpp +++ b/dbms/src/Storages/StorageStripeLog.cpp @@ -202,7 +202,7 @@ StorageStripeLog::StorageStripeLog( bool attach, size_t max_compress_block_size_, const Context & context_) - : path(context_.getPath() + relative_path_), table_name(table_name_), database_name(database_name_), + : base_path(context_.getPath()), path(base_path + relative_path_), table_name(table_name_), database_name(database_name_), max_compress_block_size(max_compress_block_size_), file_checker(path + "sizes.json"), log(&Logger::get("StorageStripeLog")) @@ -218,17 +218,16 @@ StorageStripeLog::StorageStripeLog( } -void StorageStripeLog::rename(const String & new_path_to_db, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) +void StorageStripeLog::rename(const String & new_path_to_table_data, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) { std::unique_lock lock(rwlock); /// Rename directory with data. - String new_path = new_path_to_db + escapeForFileName(new_table_name) + "/"; - Poco::File(path).renameTo(new_path_to_db + escapeForFileName(new_table_name)); + String new_path = base_path + new_path_to_table_data; + Poco::File(path).renameTo(new_path); path = new_path; - table_name = new_table_name; - database_name = new_database_name; + renameInMemory(new_database_name, new_table_name); file_checker.setPath(path + "sizes.json"); } diff --git a/dbms/src/Storages/StorageStripeLog.h b/dbms/src/Storages/StorageStripeLog.h index 4263ab14946..78f51264031 100644 --- a/dbms/src/Storages/StorageStripeLog.h +++ b/dbms/src/Storages/StorageStripeLog.h @@ -40,7 +40,13 @@ public: BlockOutputStreamPtr write(const ASTPtr & query, const Context & context) override; - void rename(const String & new_path_to_db, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + void rename(const String & new_path_to_table_data, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + + void renameInMemory(const String & new_database_name, const String & new_table_name) override + { + table_name = new_table_name; + database_name = new_database_name; + } CheckResults checkData(const ASTPtr & /* query */, const Context & /* context */) override; @@ -58,6 +64,7 @@ public: void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; private: + String base_path; String path; String table_name; String database_name; diff --git a/dbms/src/Storages/StorageTinyLog.cpp b/dbms/src/Storages/StorageTinyLog.cpp index 3cc64e11154..ecb1496363e 100644 --- a/dbms/src/Storages/StorageTinyLog.cpp +++ b/dbms/src/Storages/StorageTinyLog.cpp @@ -331,7 +331,7 @@ StorageTinyLog::StorageTinyLog( bool attach, size_t max_compress_block_size_, const Context & context_) - : path(context_.getPath() + relative_path_), table_name(table_name_), database_name(database_name_), + : base_path(context_.getPath()), path(base_path + relative_path_), table_name(table_name_), database_name(database_name_), max_compress_block_size(max_compress_block_size_), file_checker(path + "sizes.json"), log(&Logger::get("StorageTinyLog")) @@ -373,17 +373,16 @@ void StorageTinyLog::addFiles(const String & column_name, const IDataType & type } -void StorageTinyLog::rename(const String & new_path_to_db, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) +void StorageTinyLog::rename(const String & new_path_to_table_data, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) { std::unique_lock lock(rwlock); /// Rename directory with data. - String new_path = new_path_to_db + escapeForFileName(new_table_name) + "/"; + String new_path = base_path + new_path_to_table_data; Poco::File(path).renameTo(new_path); path = new_path; - table_name = new_table_name; - database_name = new_database_name; + renameInMemory(new_database_name, new_table_name); file_checker.setPath(path + "sizes.json"); for (Files_t::iterator it = files.begin(); it != files.end(); ++it) diff --git a/dbms/src/Storages/StorageTinyLog.h b/dbms/src/Storages/StorageTinyLog.h index 8c33b9ff164..1be73181e05 100644 --- a/dbms/src/Storages/StorageTinyLog.h +++ b/dbms/src/Storages/StorageTinyLog.h @@ -39,7 +39,13 @@ public: BlockOutputStreamPtr write(const ASTPtr & query, const Context & context) override; - void rename(const String & new_path_to_db, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + void rename(const String & new_path_to_table_data, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + + void renameInMemory(const String & new_database_name, const String & new_table_name) override + { + table_name = new_table_name; + database_name = new_database_name; + } CheckResults checkData(const ASTPtr & /* query */, const Context & /* context */) override; @@ -57,6 +63,7 @@ public: void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; private: + String base_path; String path; String table_name; String database_name; diff --git a/dbms/src/Storages/StorageURL.cpp b/dbms/src/Storages/StorageURL.cpp index 70c401ba417..0832f56d2cf 100644 --- a/dbms/src/Storages/StorageURL.cpp +++ b/dbms/src/Storages/StorageURL.cpp @@ -186,7 +186,7 @@ BlockInputStreams IStorageURLBase::read(const Names & column_names, return {std::make_shared(block_input, column_defaults, context)}; } -void IStorageURLBase::rename(const String & /*new_path_to_db*/, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) +void IStorageURLBase::renameInMemory(const String & new_database_name, const String & new_table_name) { table_name = new_table_name; database_name = new_database_name; diff --git a/dbms/src/Storages/StorageURL.h b/dbms/src/Storages/StorageURL.h index cdd78c7b60f..102fb3d4425 100644 --- a/dbms/src/Storages/StorageURL.h +++ b/dbms/src/Storages/StorageURL.h @@ -29,7 +29,7 @@ public: BlockOutputStreamPtr write(const ASTPtr & query, const Context & context) override; - void rename(const String & new_path_to_db, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; + void renameInMemory(const String & new_database_name, const String & new_table_name) override; protected: IStorageURLBase( diff --git a/dbms/src/Storages/StorageView.h b/dbms/src/Storages/StorageView.h index 6d2e1d04e6f..13c835f5364 100644 --- a/dbms/src/Storages/StorageView.h +++ b/dbms/src/Storages/StorageView.h @@ -30,7 +30,7 @@ public: size_t max_block_size, unsigned num_streams) override; - void rename(const String & /*new_path_to_db*/, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override + void renameInMemory(const String & new_database_name, const String & new_table_name) override { table_name = new_table_name; database_name = new_database_name;