| 35 | } |
| 36 | |
| 37 | LoadTaskPtrs TablesLoader::loadTablesAsync(LoadJobSet load_after) |
| 38 | { |
| 39 | bool need_resolve_dependencies = !global_context->getConfigRef().has("ignore_table_dependencies_on_metadata_loading"); |
| 40 | |
| 41 | /// Load all Lazy, MySQL, PostgreSQL, SQLite, etc databases first. |
| 42 | /// Note that this loading is NOT async because it should be fast and it cannot have any dependencies |
| 43 | for (auto & database : databases) |
| 44 | { |
| 45 | if (need_resolve_dependencies && database.second->supportsLoadingInTopologicalOrder()) |
| 46 | databases_to_load.push_back(database.first); |
| 47 | else |
| 48 | database.second->loadStoredObjects(global_context, strictness_mode); |
| 49 | } |
| 50 | |
| 51 | if (databases_to_load.empty()) |
| 52 | return {}; |
| 53 | |
| 54 | LoadTaskPtrs result; |
| 55 | |
| 56 | /// Read and parse metadata from Ordinary, Atomic, Materialized*, Replicated, etc databases. Build dependency graph. |
| 57 | for (auto & database_name : databases_to_load) |
| 58 | { |
| 59 | databases[database_name]->beforeLoadingMetadata(global_context, strictness_mode); |
| 60 | databases[database_name]->loadTablesMetadata(global_context, metadata, isLoadingFromExistingMetadata(strictness_mode)); |
| 61 | } |
| 62 | |
| 63 | LOG_INFO(log, "Parsed metadata of {} tables in {} databases in {} sec", |
| 64 | metadata.parsed_tables.size(), databases_to_load.size(), stopwatch.elapsedSeconds()); |
| 65 | |
| 66 | stopwatch.restart(); |
| 67 | |
| 68 | buildDependencyGraph(); |
| 69 | |
| 70 | /// Update existing info (it's important for ATTACH DATABASE) |
| 71 | DatabaseCatalog::instance().addDependencies(referential_dependencies, loading_dependencies, mv_from_dependencies); |
| 72 | |
| 73 | /// Remove tables that do not exist |
| 74 | removeUnresolvableDependencies(); |
| 75 | |
| 76 | /// Compatibility setting which should be enabled by default on attach |
| 77 | /// Otherwise server will be unable to start for some old-format of IPv6/IPv4 types of columns |
| 78 | ContextMutablePtr load_context = Context::createCopy(global_context); |
| 79 | load_context->setSetting("cast_ipv4_ipv6_default_on_conversion_error", 1); |
| 80 | |
| 81 | for (const auto & table_id : all_loading_dependencies.getTablesSortedByDependency()) |
| 82 | { |
| 83 | /// Gather tasks to load before this table |
| 84 | LoadTaskPtrs load_dependency_tasks; |
| 85 | for (const StorageID & dependency_id : all_loading_dependencies.getDependencies(table_id)) |
| 86 | load_dependency_tasks.push_back(load_table[dependency_id.getFullTableName()]); |
| 87 | |
| 88 | // Make load table task |
| 89 | auto table_name = table_id.getQualifiedName(); |
| 90 | const auto & path_and_query = metadata.parsed_tables[table_name]; |
| 91 | auto task = databases[table_name.database]->loadTableFromMetadataAsync( |
| 92 | async_loader, |
| 93 | getGoals(load_dependency_tasks, load_after), |
| 94 | load_context, |
no test coverage detected