Changed-lines coverage: PR changed C/C++ lines covered by tests: 94.74% (378/399) Uncovered changed code (with context): ================================================================================ src/Interpreters/InterpreterExplainQuery.cpp ================================================================================ --- uncovered block 206-206 --- 204 | const auto * func = table_expr.table_function->as(); 205 | if (!func) >> 206 | return; 207 | 208 | auto query_context = data.getContext()->getQueryContext(); --- uncovered block 235-235 --- 233 | const auto * storage_view = storage->as(); 234 | if (!storage_view || !storage_view->isParameterizedView()) >> 235 | return; 236 | 237 | data.referenced_parameterized_view = true; --- uncovered block 345-345 --- 343 | const auto * table_identifier = table_expression->database_and_table_name->as(); 344 | if (!table_identifier) >> 345 | continue; 346 | 347 | auto storage = DatabaseCatalog::instance().tryGetTable(context->resolveStorageID(table_identifier->getTableId()), context); --- uncovered block 393-393 --- 391 | const auto * table_identifier = table_expression->database_and_table_name->as(); 392 | if (!table_identifier) >> 393 | continue; 394 | 395 | /// A nested subquery is looked at before anything resolved it, so its table name may well not --- uncovered block 401-401 --- 399 | auto storage_id = context->tryResolveStorageID(table_identifier->getTableId()); 400 | if (!storage_id) >> 401 | continue; 402 | 403 | auto storage = DatabaseCatalog::instance().tryGetTable(storage_id, context); --- uncovered block 1022-1025 --- 1020 | /// StorageDummy is created on preliminary stages; ignore access check for it (as the planner does). 1021 | if (typeid_cast(storage.get())) >> 1022 | continue; 1023 | 1024 | if (!checked_tables.emplace(node).second) >> 1025 | continue; 1026 | 1027 | /// Columns selected from this specific table instance, so a base table referenced both directly --- uncovered block 1148-1150 --- 1146 | if (run_passes && pass_index >= 1) 1147 | { >> 1148 | query_tree_pass_manager.run(query_tree, pass_index); >> 1149 | checkAccessRightsForQueryTree(query_tree, check_context); >> 1150 | return true; 1151 | } 1152 | --- uncovered block 1166-1166 --- 1164 | { 1165 | if (!ast) >> 1166 | return; 1167 | 1168 | if (ast->as()) --- uncovered block 1185-1185 --- 1183 | /// Nothing that can be resolved into a query tree - the caller must treat this as "check skipped". 1184 | if (selects.empty()) >> 1185 | return false; 1186 | 1187 | bool checked = true; --- uncovered block 1216-1216 --- 1214 | if (settings.dump_passes) 1215 | { >> 1216 | query_tree_pass_manager.dump(buf, pass_index); 1217 | need_newline = true; 1218 | } --- uncovered block 1680-1680 --- 1678 | 1679 | if (settings.graph) >> 1680 | dumpASTInDotFormat(*query_to_dump, buf); 1681 | else 1682 | dumpAST(*query_to_dump, buf); --- uncovered block 1772-1772 --- 1770 | if (analyzer_pre_check_skipped) 1771 | { >> 1772 | query_to_format = explained_query_before_expansion; 1773 | } 1774 | else ================================================================================ src/Planner/PlannerJoinTree.cpp ================================================================================ --- uncovered block 319-319 --- 317 | const auto & table_node = table_node_ptr->as(); 318 | if (typeid_cast(table_node.getStorage().get())) >> 319 | continue; 320 | 321 | const auto & storage_id = table_node.getStorageID(); ================================================================================ src/Planner/collectSelectedColumnsFromTable.cpp ================================================================================ --- uncovered block 65-69 --- 63 | if (const auto * source_table = column_source->as()) 64 | source_storage = source_table->getStorage(); >> 65 | else if (const auto * source_table_function = column_source->as()) >> 66 | source_storage = source_table_function->getStorage(); 67 | 68 | if (source_storage && source_storage->isMergeTree()) >> 69 | return; 70 | } 71 | --- uncovered block 91-91 --- 89 | const auto & column_source = column_node->getColumnSourceOrNull(); 90 | if (!column_source) >> 91 | return false; 92 | /// `TABLE_FUNCTION` is included because a parameterized view is resolved into a `TableFunctionNode`, 93 | /// and `CollectTableExpressionData::isAliasColumn` in the planner treats it as an `ALIAS` column --- uncovered block 137-137 --- 135 | std::vector collectSelectedColumnsForTableNode(QueryTreeNodePtr & query_tree, const TableNode & table_node, const ContextPtr & context) 136 | { >> 137 | return collectSelectedColumnsForTableExpression(query_tree, table_node, table_node.getStorageID(), context); 138 | } 139 | WARNING: Failed to get start time for [Print Uncovered Code] - start time and duration won't be set --- Coverage counts --- Lines : baseline 934,286/1,079,462 -> current 934,306/1,079,846 (delta +20 / +384) Functions : baseline 806,457/877,579 -> current 806,476/877,606 (delta +19 / +27) Branches : baseline 305,943/388,452 -> current 306,008/388,642 (delta +65 / +190)