Changed-lines coverage: PR changed C/C++ lines covered by tests: 79.52% (233/293) Uncovered changed code (with context): ================================================================================ src/Processors/QueryPlan/IQueryPlanStep.h ================================================================================ --- uncovered block 91-91 --- 89 | 90 | /// Get detailed description of step actions. This is shown in EXPLAIN query with options `actions = 1`. >> 91 | virtual void describeActions(JSONBuilder::JSONMap & /*map*/) const {} 92 | virtual void describeActions(FormatSettings & /*settings*/) const {} 93 | --- uncovered block 98-98 --- 96 | 97 | /// Get detailed description of read-from-storage step projections (if any). Shown in with options `projections = 1`. >> 98 | virtual void describeProjections(JSONBuilder::JSONMap & /*map*/) const {} 99 | virtual void describeProjections(FormatSettings & /*settings*/) const {} 100 | ================================================================================ src/Processors/QueryPlan/IndexDescription.h ================================================================================ --- uncovered block 75-76 --- 73 | switch (type) 74 | { >> 75 | case IndexType::None: >> 76 | return "None"; 77 | case IndexType::MinMax: 78 | return "Min-Max"; ================================================================================ src/Processors/QueryPlan/QueryPlan.cpp ================================================================================ --- uncovered block 337-366 --- 335 | if (!stat.distributed.empty()) 336 | { >> 337 | format_settings.out << prefix << indent << indent << "Distributed:" << '\n'; 338 | >> 339 | if (format_settings.compact) 340 | { >> 341 | size_t total_parts_send = 0; >> 342 | size_t total_parts_received = 0; >> 343 | size_t total_granules_send = 0; >> 344 | size_t total_granules_received = 0; >> 345 | for (const auto & node_stat : stat.distributed) 346 | { >> 347 | total_parts_send += node_stat.num_parts_send; >> 348 | total_parts_received += node_stat.num_parts_received; >> 349 | total_granules_send += node_stat.num_granules_send; >> 350 | total_granules_received += node_stat.num_granules_received; 351 | } >> 352 | format_settings.out << prefix << indent << indent << indent << "Replicas: " << stat.distributed.size() << '\n'; >> 353 | format_settings.out << prefix << indent << indent << indent << "Parts send: " << total_parts_send << '\n'; >> 354 | format_settings.out << prefix << indent << indent << indent << "Parts received: " << total_parts_received << '\n'; >> 355 | format_settings.out << prefix << indent << indent << indent << "Granules send: " << total_granules_send << '\n'; >> 356 | format_settings.out << prefix << indent << indent << indent << "Granules received: " << total_granules_received << '\n'; 357 | } 358 | else 359 | { >> 360 | for (const auto & node_stat : stat.distributed) 361 | { >> 362 | format_settings.out << prefix << indent << indent << indent << "Address: " << node_stat.address << '\n'; >> 363 | format_settings.out << prefix << indent << indent << indent << "Parts send: " << node_stat.num_parts_send << '\n'; >> 364 | format_settings.out << prefix << indent << indent << indent << "Parts received: " << node_stat.num_parts_received << '\n'; >> 365 | format_settings.out << prefix << indent << indent << indent << "Granules send: " << node_stat.num_granules_send << '\n'; >> 366 | format_settings.out << prefix << indent << indent << indent << "Granules received: " << node_stat.num_granules_received << '\n'; 367 | } 368 | } --- uncovered block 382-385 --- 380 | 381 | if (index_stats.empty()) >> 382 | return; 383 | 384 | if (index_stats.size() == 1 && index_stats.front().type == IndexType::None) >> 385 | return; 386 | 387 | auto indexes_array = std::make_unique(); --- uncovered block 434-451 --- 432 | if (compact) 433 | { >> 434 | auto distributed_map = std::make_unique(); >> 435 | size_t total_parts_send = 0; >> 436 | size_t total_parts_received = 0; >> 437 | size_t total_granules_send = 0; >> 438 | size_t total_granules_received = 0; >> 439 | for (const auto & node_stat : stat.distributed) 440 | { >> 441 | total_parts_send += node_stat.num_parts_send; >> 442 | total_parts_received += node_stat.num_parts_received; >> 443 | total_granules_send += node_stat.num_granules_send; >> 444 | total_granules_received += node_stat.num_granules_received; 445 | } >> 446 | distributed_map->add("Replicas", stat.distributed.size()); >> 447 | distributed_map->add("Parts send", total_parts_send); >> 448 | distributed_map->add("Parts received", total_parts_received); >> 449 | distributed_map->add("Granules send", total_granules_send); >> 450 | distributed_map->add("Granules received", total_granules_received); >> 451 | index_map->add("Distributed", std::move(distributed_map)); 452 | } 453 | else --- uncovered block 478-478 --- 476 | 477 | if (desc.tables_count > 1) >> 478 | map.add("Tables", desc.tables_count); 479 | } 480 | --- uncovered block 505-505 --- 503 | 504 | if (!plan.isInitialized()) >> 505 | return true; 506 | 507 | std::stack stack; --- uncovered block 531-531 --- 529 | for (auto * child_plan : child_plans) 530 | if (!collectIndexesFromPlan(*child_plan, result)) >> 531 | return false; 532 | 533 | /// A source that contributed nothing would be dropped from the --- uncovered block 612-612 --- 610 | 611 | if (last_index[key] != j) >> 612 | continue; 613 | 614 | if (!by_type.contains(key)) --- uncovered block 694-694 --- 692 | 693 | if (options.projections) >> 694 | step.describeProjections(map); 695 | } 696 | --- uncovered block 719-723 --- 717 | if (supported_shape && !hasPerPartStats(descriptions) && hasIndexOutput(descriptions)) 718 | { >> 719 | auto * node = skipExpressions(root); >> 720 | auto node_map = std::make_unique(); >> 721 | auto header_options = options; >> 722 | header_options.indexes = false; >> 723 | explainStep(*node->step, *node_map, header_options); 724 | 725 | /// `collectIndexesFromPlan` guarantees that every source of the --- uncovered block 730-740 --- 728 | /// the original per-index metadata (name, condition, keys, search 729 | /// algorithm) instead of aggregating and dropping it. >> 730 | if (descriptions.size() == 1) 731 | { >> 732 | formatIndexes(descriptions.front(), *node_map, options.compact); 733 | } 734 | else 735 | { >> 736 | auto aggregated = aggregateIndexes(descriptions, descriptions.size()); >> 737 | formatIndexes(aggregated, *node_map, options.compact); 738 | } 739 | >> 740 | return node_map; 741 | } 742 | } ================================================================================ src/Processors/QueryPlan/ReadFromMergeTree.cpp ================================================================================ --- uncovered block 4767-4767 --- 4765 | 4766 | if (virtual_row_conversion) >> 4767 | map.add("Virtual row conversions", virtual_row_conversion->toTree()); 4768 | } 4769 | WARNING: Failed to get start time for [Print Uncovered Code] - start time and duration won't be set --- Coverage counts --- Lines : baseline 919,435/1,064,502 -> current 919,213/1,064,693 (delta -222 / +191) Functions : baseline 802,648/873,500 -> current 802,665/873,505 (delta +17 / +5) Branches : baseline 298,344/380,034 -> current 298,326/380,136 (delta -18 / +102)