Changed-lines coverage: PR changed C/C++ lines covered by tests: 90.86% (517/569) Uncovered changed code (with context): ================================================================================ src/Interpreters/ClusterFunctionReadTask.cpp ================================================================================ --- uncovered block 117-117 --- 115 | /// Only the fail-close overwrite guard is lost, which a worker below the required protocol could 116 | /// not run anyway. >> 117 | bucket_info_to_send = nullptr; 118 | } 119 | ================================================================================ src/Processors/Formats/IInputFormat.cpp ================================================================================ --- uncovered block 16-16 --- 14 | UInt64 FileBucketInfo::getMinProtocolVersion() const 15 | { >> 16 | return DBMS_CLUSTER_PROCESSING_PROTOCOL_VERSION_WITH_FILE_BUCKETS_INFO; 17 | } 18 | ================================================================================ src/Processors/Formats/Impl/Parquet/Reader.cpp ================================================================================ --- uncovered block 413-417 --- 411 | for (UInt64 rg : *row_groups_to_read) 412 | if (rg >= file_metadata.row_groups.size()) >> 413 | throw Exception( >> 414 | ErrorCodes::FILE_CHANGED_WHILE_READING, >> 415 | "Row group {} from the bucket assignment is out of range: the file has only {} row groups. " >> 416 | "The file was likely modified concurrently while a parallel single-file read was in progress", >> 417 | rg, file_metadata.row_groups.size()); 418 | } 419 | ================================================================================ src/Processors/Formats/Impl/ParquetV3BlockInputFormat.cpp ================================================================================ --- uncovered block 58-62 --- 56 | { 57 | if (file_num_row_groups != 0 && actual_num_row_groups != file_num_row_groups) >> 58 | throw Exception( >> 59 | ErrorCodes::FILE_CHANGED_WHILE_READING, >> 60 | "The Parquet file has {} row groups, but the parallel single-file bucket assignment was computed for a file " >> 61 | "with {} row groups. The file was likely modified concurrently while a parallel single-file read was in progress", >> 62 | actual_num_row_groups, file_num_row_groups); 63 | } 64 | --- uncovered block 181-185 --- 179 | { 180 | if (rg >= file_metadata.row_groups.size()) >> 181 | throw Exception( >> 182 | ErrorCodes::FILE_CHANGED_WHILE_READING, >> 183 | "Row group {} from the bucket assignment is out of range: the file has only {} row groups. " >> 184 | "The file was likely modified concurrently while a parallel single-file read was in progress", >> 185 | rg, file_metadata.row_groups.size()); 186 | num_rows += size_t(file_metadata.row_groups[rg].num_rows); 187 | } --- uncovered block 347-347 --- 345 | const size_t result_file_num_row_groups = caller_file_num_row_groups != 0 ? caller_file_num_row_groups : file_num_row_groups; 346 | if (matching_row_groups.empty()) >> 347 | return nullptr; 348 | if (row_group_ids.empty()) 349 | return std::make_shared(matching_row_groups, result_file_num_row_groups); --- uncovered block 356-356 --- 354 | filtered.push_back(rg); 355 | if (filtered.empty()) >> 356 | return nullptr; 357 | return std::make_shared(std::move(filtered), result_file_num_row_groups); 358 | } --- uncovered block 459-459 --- 457 | { 458 | if (target_count == 0 || num_row_groups == 0) >> 459 | return {}; 460 | 461 | static constexpr size_t min_row_groups_per_chunk = 16; --- uncovered block 494-494 --- 492 | { 493 | if (idx >= schema.size()) >> 494 | return false; 495 | const parquet::format::SchemaElement & elem = schema[idx]; 496 | ++idx; --- uncovered block 540-540 --- 538 | } 539 | /// Two-level list (e.g. hudi): the repeated element itself is the wrapper level. >> 540 | return collectLogicalPaths(schema, idx, raw, logical, false, out); 541 | } 542 | /// A MAP-annotated group without the expected key/value structure: fall through and treat --- uncovered block 549-549 --- 547 | for (size_t i = 0; i < num_children; ++i) 548 | if (!collectLogicalPaths(schema, idx, raw, logical, true, out)) >> 549 | return false; 550 | return true; 551 | } --- uncovered block 593-593 --- 591 | ok = collectLogicalPaths(md.schema, idx, "", "", true, logical_paths); 592 | if (!ok) >> 593 | logical_paths.clear(); 594 | } 595 | --- uncovered block 602-605 --- 600 | { 601 | if (!col.__isset.meta_data) >> 602 | continue; 603 | const auto & path = col.meta_data.path_in_schema; 604 | if (path.empty()) >> 605 | continue; 606 | if (!requested_columns.empty()) 607 | { --- uncovered block 620-620 --- 618 | matched = anyDottedPrefixRequested(it->second, requested_columns); 619 | else >> 620 | matched = requested_columns.contains(leaf_path); 621 | } 622 | if (!matched) --- uncovered block 647-647 --- 645 | { 646 | if (target_count == 0 || num_row_groups == 0) >> 647 | return {}; 648 | if (min_bytes_to_split > 0 && projected_bytes < min_bytes_to_split) 649 | return computeBucketsByCount(1, num_row_groups); --- uncovered block 669-670 --- 667 | std::vector ParquetBucketSplitter::splitToBucketsByCount(size_t target_count, ReadBuffer & buf, const FormatSettings & format_settings_) 668 | { >> 669 | auto file_metadata = parseFileMetadataNative(buf, format_settings_); >> 670 | return computeBucketsByCount(target_count, file_metadata.row_groups.size()); 671 | } 672 | ================================================================================ src/Storages/ObjectStorage/IObjectIterator.cpp ================================================================================ --- uncovered block 179-182 --- 177 | /// The bucket produced by the splitter already carries the file's total row-group 178 | /// count, so pass 0 ("unknown") here to keep it rather than overwrite it. >> 179 | auto filtered = file_bucket->filterByMatchingRowGroups(matching_row_groups, /*file_num_row_groups=*/ 0); >> 180 | if (!filtered) >> 181 | continue; >> 182 | copy_object_info.file_bucket_info = std::move(filtered); 183 | } 184 | else ================================================================================ src/Storages/ObjectStorage/StorageObjectStorageSource.cpp ================================================================================ --- uncovered block 900-900 --- 898 | auto filtered = file_bucket_info->filterByMatchingRowGroups(matching_row_groups, total_row_groups); 899 | if (!filtered) >> 900 | continue; 901 | object_info->file_bucket_info = std::move(filtered); 902 | } ================================================================================ src/Storages/ObjectStorage/tests/gtest_rendezvous_hashing.cpp ================================================================================ --- uncovered block 100-103 --- 98 | : min_protocol_version(min_protocol_version_) {} 99 | void serialize(WriteBuffer &, size_t) override {} >> 100 | void deserialize(ReadBuffer &, size_t) override {} >> 101 | String getIdentifier() const override { return "stub"; } 102 | String getFormatName() const override { return "Parquet"; } >> 103 | std::shared_ptr filterByMatchingRowGroups(const std::vector &, size_t) const override { return nullptr; } 104 | UInt64 getMinProtocolVersion() const override { return min_protocol_version; } 105 | UInt64 min_protocol_version; ================================================================================ src/Storages/StorageFile.cpp ================================================================================ --- uncovered block 1774-1778 --- 1772 | if (file_bucket_info && expected_file_cache_version.has_value() 1773 | && *expected_file_cache_version != *current_file_cache_version) >> 1774 | throw Exception( >> 1775 | ErrorCodes::FILE_CHANGED_WHILE_READING, >> 1776 | "File {} was modified concurrently while a parallel single-file read was in progress " >> 1777 | "(version changed from {} to {})", >> 1778 | current_path, *expected_file_cache_version, *current_file_cache_version); 1779 | 1780 | /// The version token above proves a rewrite only after the file has settled --- uncovered block 1919-1919 --- 1917 | if (!buckets_to_read) 1918 | { >> 1919 | read_buf.reset(); 1920 | continue; 1921 | } --- uncovered block 2423-2424 --- 2421 | if (info.row_level_filter) 2422 | { >> 2423 | for (const auto & input : info.row_level_filter->actions.getRequiredColumns()) >> 2424 | requested_columns.insert(input.name); 2425 | } 2426 | if (info.prewhere_info) --- uncovered block 2460-2466 --- 2458 | } 2459 | else >> 2460 | #endif 2461 | { >> 2462 | auto buf = createReadBuffer( >> 2463 | single_file_path, file_stat, false, -1, storage->compression_method, ctx); >> 2464 | const auto & format_settings = storage->format_settings.value_or(getFormatSettings(ctx)); >> 2465 | auto splitter = FormatFactory::instance().getSplitter(storage->format_name); >> 2466 | buckets = splitter->splitToBucketsByCount(max_num_streams, *buf, format_settings); 2467 | } 2468 | WARNING: Failed to get start time for [Print Uncovered Code] - start time and duration won't be set --- Coverage counts --- Lines : baseline 933,990/1,079,631 -> current 934,416/1,080,170 (delta +426 / +539) Functions : baseline 805,721/876,858 -> current 805,688/876,934 (delta -33 / +76) Branches : baseline 305,671/388,440 -> current 305,962/388,774 (delta +291 / +334)