Changed-lines coverage: PR changed C/C++ lines covered by tests: 95.17% (394/414) 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 1039-1042 --- 1037 | /// StorageDummy is created on preliminary stages; ignore access check for it (as the planner does). 1038 | if (typeid_cast(storage.get())) >> 1039 | continue; 1040 | 1041 | if (!checked_tables.emplace(node).second) >> 1042 | continue; 1043 | 1044 | /// Columns selected from this specific table instance, so a base table referenced both directly --- uncovered block 1173-1174 --- 1171 | if (run_passes && pass_index >= 1) 1172 | { >> 1173 | query_tree_pass_manager.run(query_tree, pass_index); >> 1174 | return checkAccessRightsForQueryTree(query_tree, check_context); 1175 | } 1176 | --- uncovered block 1190-1190 --- 1188 | { 1189 | if (!ast) >> 1190 | return; 1191 | 1192 | if (ast->as()) --- uncovered block 1209-1209 --- 1207 | /// Nothing that can be resolved into a query tree - the caller must treat this as "check skipped". 1208 | if (selects.empty()) >> 1209 | return false; 1210 | 1211 | bool checked = true; --- uncovered block 1234-1234 --- 1232 | { 1233 | if (!node) >> 1234 | return false; 1235 | 1236 | if (const auto * table_expression = node->as()) --- uncovered block 1279-1279 --- 1277 | if (settings.dump_passes) 1278 | { >> 1279 | query_tree_pass_manager.dump(buf, pass_index); 1280 | need_newline = true; 1281 | } --- uncovered block 1861-1861 --- 1859 | if (analyzer_pre_check_skipped) 1860 | { >> 1861 | query_to_format = explained_query_before_expansion; 1862 | } 1863 | else ================================================================================ src/Planner/PlannerJoinTree.cpp ================================================================================ --- uncovered block 320-320 --- 318 | const auto & table_node = table_node_ptr->as(); 319 | if (typeid_cast(table_node.getStorage().get())) >> 320 | continue; 321 | 322 | 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 943,342/1,089,708 -> current 944,144/1,090,118 (delta +802 / +410) Functions : baseline 808,843/880,413 -> current 808,733/880,441 (delta -110 / +28) Branches : baseline 310,062/393,312 -> current 310,439/393,528 (delta +377 / +216)