diff --git a/src/Databases/DatabaseReplicated.cpp b/src/Databases/DatabaseReplicated.cpp index c51864740f5..db27b4fa975 100644 --- a/src/Databases/DatabaseReplicated.cpp +++ b/src/Databases/DatabaseReplicated.cpp @@ -30,6 +30,8 @@ #include #include +#include + namespace DB { namespace ErrorCodes @@ -862,7 +864,19 @@ void DatabaseReplicated::recoverLostReplica(const ZooKeeperPtr & current_zookeep for (const auto & id : dropped_tables) DatabaseCatalog::instance().waitTableFinallyDropped(id); - for (const auto & name_and_meta : table_name_to_metadata) + /// FIXME: Use proper dependency calculation instead of just moving MV to the end + using NameToMetadata = std::pair; + std::vector table_name_to_metadata_sorted; + table_name_to_metadata_sorted.reserve(table_name_to_metadata.size()); + std::move(table_name_to_metadata.begin(), table_name_to_metadata.end(), std::back_inserter(table_name_to_metadata_sorted)); + std::sort(table_name_to_metadata_sorted.begin(), table_name_to_metadata_sorted.end(), [](const NameToMetadata & lhs, const NameToMetadata & rhs) -> bool + { + const bool is_materialized_view_lhs = lhs.second.find("MATERIALIZED VIEW") != std::string::npos; + const bool is_materialized_view_rhs = rhs.second.find("MATERIALIZED VIEW") != std::string::npos; + return is_materialized_view_lhs < is_materialized_view_rhs; + }); + + for (const auto & name_and_meta : table_name_to_metadata_sorted) { if (isTableExist(name_and_meta.first, getContext())) {