| 722 | } |
| 723 | |
| 724 | void DatabaseAtomic::renameDatabase(ContextPtr query_context, const String & new_name) |
| 725 | { |
| 726 | auto component_guard = Coordination::setCurrentComponent("DatabaseAtomic::renameDatabase"); |
| 727 | /// CREATE, ATTACH, DROP, DETACH and RENAME DATABASE must hold DDLGuard |
| 728 | createDirectories(); |
| 729 | waitDatabaseStarted(); |
| 730 | std::lock_guard lock(mutex); |
| 731 | |
| 732 | bool check_ref_deps = query_context->getSettingsRef()[Setting::check_referential_table_dependencies]; |
| 733 | bool check_loading_deps = !check_ref_deps && query_context->getSettingsRef()[Setting::check_table_dependencies]; |
| 734 | if (check_ref_deps || check_loading_deps) |
| 735 | { |
| 736 | for (auto & table : tables) |
| 737 | { |
| 738 | checkTableNameLengthUnlocked(new_name, table.first, getContext()); |
| 739 | |
| 740 | DatabaseCatalog::instance().checkTableCanBeRemovedOrRenamed({database_name, table.first}, check_ref_deps, check_loading_deps); |
| 741 | } |
| 742 | } |
| 743 | |
| 744 | |
| 745 | try |
| 746 | { |
| 747 | auto db_disk = getDisk(); |
| 748 | if (db_disk->isSymlinkSupported()) |
| 749 | db_disk->removeFileIfExists(path_to_metadata_symlink); |
| 750 | } |
| 751 | catch (...) |
| 752 | { |
| 753 | LOG_WARNING(log, getCurrentExceptionMessageAndPattern(/* with_stacktrace */ true)); |
| 754 | } |
| 755 | |
| 756 | auto old_metadata_file_path = DatabaseCatalog::getMetadataFilePath(database_name); |
| 757 | auto new_metadata_file_path = DatabaseCatalog::getMetadataFilePath(new_name); |
| 758 | auto default_db_disk = getContext()->getDatabaseDisk(); |
| 759 | default_db_disk->moveFile(old_metadata_file_path, new_metadata_file_path); |
| 760 | |
| 761 | String old_path_to_table_symlinks; |
| 762 | |
| 763 | { |
| 764 | { |
| 765 | Strings table_names; |
| 766 | table_names.reserve(tables.size()); |
| 767 | for (auto & table : tables) |
| 768 | table_names.push_back(table.first); |
| 769 | DatabaseCatalog::instance().updateDatabaseName(database_name, new_name, table_names); |
| 770 | } |
| 771 | database_name = new_name; |
| 772 | |
| 773 | for (auto & table : tables) |
| 774 | { |
| 775 | auto table_id = table.second->getStorageID(); |
| 776 | table_id.database_name = database_name; |
| 777 | table.second->renameInMemory(table_id); |
| 778 | } |
| 779 | |
| 780 | for (auto & [detached_table_name, snapshot] : snapshot_detached_tables) |
| 781 | { |
nothing calls this directly
no test coverage detected