Skip to content

Prune parquet row groups using fully dictionary-encoded columns - #23851

Draft
DarkWanderer wants to merge 8 commits into
apache:mainfrom
DarkWanderer:dictionary-filter
Draft

DarkWanderer wants to merge 8 commits into
apache:mainfrom
DarkWanderer:dictionary-filter

Conversation

@DarkWanderer

@DarkWanderer DarkWanderer commented Jul 23, 2026 •

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

N/A

Rationale for this change

Dictionary pages are essentially free, exact indexes for IN/NOT IN queries. Bloom filters can prove a target value is absent from a row group (useful for pruning =/IN), but they are probabilistic (non-zero false-positive rate) and cannot prove a NOT IN/!= exclusion, since that would require confirming every distinct value in the row group is excluded -- information a bloom filter doesn't retain. A fully dictionary-encoded column chunk does retain the complete set of distinct values, so it can prune exactly in both directions: IN/= when the dictionary is disjoint from the target set, and NOT IN/!= when the dictionary is a subset of the excluded set. This approach stacks with bloom filters: dictionary pruning subsumes bloom-filter pruning where it applies, and is exact (no false positives) where bloom filters are only probabilistic.

What changes are included in this PR?

  • New opt-in datafusion.execution.parquet.dictionary_filter_on_read
    config option (default false).
  • DictionaryStatistics (dictionary_filter.rs): an exact
    PruningStatistics impl backed by decoded dictionary values, plus
    is_fully_dictionary_encoded, which gates use of a chunk's
    dictionary on its page encoding stats being exactly
    PLAIN_DICTIONARY/RLE_DICTIONARY (a writer that fell back to
    PLAIN partway through no longer has a complete dictionary).
  • RowGroupAccessPlanFilter::prune_by_dictionary and a
    LoadDictionaries/PruneWithDictionaries stage in the Parquet
    opener's state machine, mirroring the existing bloom-filter stage.
  • A new row_groups_pruned_dictionary metric, .slt coverage
    (parquet_dictionary_pruning.slt, plus the metric added to existing
    EXPLAIN ANALYZE golden files), and a criterion benchmark comparing
    statistics-only vs. bloom-filter vs. dictionary pruning.

apache/arrow-rs#10420 (apache/arrow-rs#9010), the arrow-rs API this
depends on for decoding a Parquet dictionary page, is now merged to
arrow-rs main. The [patch.crates-io] block in Cargo.toml tracks
apache/arrow-rs main in the meantime and will be removed once a
release containing it ships and the arrow/parquet version pins are
bumped to it.

Are these changes tested?

Yes: unit tests in dictionary_filter.rs mirroring bloom_filter.rs
(absent value, IN list absent, present value, != sole value,
NOT IN list, and a PLAIN-fallback chunk correctly not pruned), new
.slt coverage showing row_groups_pruned_dictionary in
EXPLAIN ANALYZE, and a criterion benchmark.

Are there any user-facing changes?

Yes: a new opt-in config option dictionary_filter_on_read (default
false, no behavior change unless enabled) and a new
row_groups_pruned_dictionary metric in EXPLAIN ANALYZE.

🤖 Generated with Claude Code

Adds an opt-in `dictionary_filter_on_read` config option (default
false) that uses a fully dictionary-encoded BYTE_ARRAY (Utf8/Binary)
column chunk's dictionary as an exact row-group membership index.
Unlike the existing bloom-filter pruning stage, this is exact rather
than probabilistic, so it can prune both `IN`/`=` (value absent) and
`NOT IN`/`!=` (value is the chunk's only value) predicates.

A column chunk is only used if its page encoding stats prove every
data page came from the dictionary (`PLAIN_DICTIONARY` or
`RLE_DICTIONARY` only) -- chunks that fell back to `PLAIN` encoding
partway through are ignored, since a writer's dictionary fallback
means the dictionary is no longer the complete value set.

This depends on a new arrow-rs API to decode a dictionary page
independent of the row-by-row array reader (arrow-rs#9010), not yet
released; see the following commit for the temporary patch.
…anch

Switches the [patch.crates-io] block from a local filesystem path to
https://github.com/DarkWanderer/arrow-rs/tree/get-dictionary, so the
build is reproducible for anyone (including CI) rather than only on
one machine. Still temporary -- to be removed once arrow-rs releases
a version with the dictionary decode API and the dependency is bumped
normally.
@github-actions github-actions Bot added documentation Improvements or additions to documentation sqllogictest SQL Logic Tests (.slt) common Related to common crate proto Related to proto crate datasource Changes to the datasource crate labels Jul 23, 2026
@github-actions

github-actions Bot commented Jul 23, 2026 •

Copy link
Copy Markdown

Thank you for opening this pull request!

Reviewer note: cargo-semver-checks reported the current version number is not SemVer-compatible with the changes in this pull request (compared against the base branch).

Details
     Cloning apache/main
    Building datafusion v55.1.0 (current)
error: running cargo-doc on crate 'datafusion' failed with output:
-----
   Compiling proc-macro2 v1.0.107
   Compiling quote v1.0.47
   Compiling unicode-ident v1.0.26
    Checking cfg-if v1.0.5
   Compiling libc v0.2.189
   Compiling shlex v2.0.1
   Compiling autocfg v1.5.1
   Compiling syn v3.0.6
   Compiling syn v2.0.119
   Compiling jobserver v0.1.35
   Compiling find-msvc-tools v0.1.14
   Compiling cc v1.5.1
   Compiling libm v0.2.16
    Checking memchr v2.8.3
   Compiling num-traits v0.2.19
   Compiling zerocopy v0.8.59
    Checking bytes v1.12.1
   Compiling serde_core v1.0.229
    Checking foldhash v0.2.0
    Checking allocator-api2 v0.2.21
   Compiling getrandom v0.3.4
    Checking once_cell v1.21.4
    Checking itoa v1.0.18
    Checking equivalent v1.0.2
    Checking hashbrown v0.17.1
    Checking num-integer v0.1.47
   Compiling zmij v1.0.23
    Checking indexmap v2.14.2
   Compiling zerocopy-derive v0.8.59
   Compiling synstructure v0.14.0
   Compiling serde v1.0.229
   Compiling serde_json v1.0.151
   Compiling serde_derive v1.0.229
   Compiling version_check v0.9.5
    Checking iana-time-zone v0.1.65
    Checking siphasher v1.0.4
   Compiling ahash v0.8.12
    Checking phf_shared v0.12.1
    Checking chrono v0.4.45
   Compiling zerofrom-derive v0.1.8
    Checking num-bigint v0.5.1
   Compiling pkg-config v0.3.34
   Compiling chrono-tz v0.10.4
    Checking zerofrom v0.1.8
    Checking phf v0.12.1
   Compiling yoke-derive v0.8.3
    Checking stable_deref_trait v1.2.1
    Checking arrow-schema v60.0.0
    Checking yoke v0.8.3
    Checking num-complex v0.4.6
   Compiling zerovec-derive v0.11.6
   Compiling displaydoc v0.2.7
    Checking half v2.7.1
   Compiling zstd-sys v2.1.0+zstd.1.5.7
    Checking zerovec v0.11.8
    Checking arrow-buffer v60.0.0
    Checking pin-project-lite v0.2.17
    Checking tinystr v0.8.4
    Checking arrow-data v60.0.0
   Compiling zstd-safe v8.0.0
    Checking lexical-util v1.0.7
    Checking futures-sink v0.3.34
    Checking litemap v0.8.3
    Checking futures-core v0.3.34
    Checking smallvec v1.16.2
    Checking writeable v0.6.4
   Compiling object v0.39.1
    Checking icu_locale_core v2.3.0
    Checking potential_utf v0.1.6
    Checking zerotrie v0.2.5
    Checking utf8_iter v1.0.4
   Compiling icu_normalizer_data v2.3.0
    Checking bitflags v2.13.2
   Compiling icu_properties_data v2.3.0
    Checking icu_collections v2.3.0
    Checking arrow-array v60.0.0
    Checking icu_provider v2.3.1
   Compiling tokio-macros v2.7.2
   Compiling semver v1.0.28
   Compiling crc32fast v1.5.2
   Compiling rustc_version v0.4.1
    Checking tokio v1.53.1
    Checking arrow-cmp v60.0.0
    Checking arrow-select v60.0.0
    Checking futures-channel v0.3.34
    Checking lexical-parse-integer v1.0.6
    Checking lexical-write-integer v1.0.6
   Compiling ar_archive_writer v0.5.3
   Compiling futures-macro v0.3.34
    Checking rand_core v0.10.1
    Checking futures-task v0.3.34
    Checking simd-adler32 v0.3.10
   Compiling parking_lot_core v0.9.12
    Checking adler2 v2.0.1
   Compiling getrandom v0.4.3
    Checking slab v0.4.12
    Checking futures-io v0.3.34
    Checking futures-util v0.3.34
    Checking miniz_oxide v0.9.1
   Compiling psm v0.1.32
    Checking lexical-write-float v1.0.6
    Checking lexical-parse-float v1.0.6
    Checking icu_properties v2.3.0
    Checking icu_normalizer v2.3.0
   Compiling flatbuffers v25.12.19
    Checking aho-corasick v1.1.5
    Checking base64 v0.23.1
   Compiling cfg_aliases v0.2.2
    Checking regex-syntax v0.8.11
    Checking zlib-rs v0.6.8
    Checking scopeguard v1.2.0
    Checking ryu v1.0.23
    Checking unicode-segmentation v1.13.3
    Checking unicode-width v0.2.2
    Checking comfy-table v8.0.1
    Checking flate2 v1.1.10
    Checking lock_api v0.4.14
   Compiling nix v0.31.3
    Checking regex-automata v0.4.18
    Checking idna_adapter v1.2.2
    Checking lexical-core v1.0.6
    Checking arrow-ord v60.0.0
    Checking atoi v3.1.0
   Compiling stacker v0.1.25
    Checking percent-encoding v2.3.2
    Checking twox-hash v2.1.4
   Compiling thiserror v2.0.21
    Checking alloc-no-stdlib v3.0.0
   Compiling snap v1.1.2
    Checking alloc-stdlib v0.3.0
    Checking lz4_flex v0.14.0
    Checking form_urlencoded v1.2.2
    Checking arrow-cast v60.0.0
    Checking regex v1.13.1
    Checking idna v1.1.0
    Checking futures-executor v0.3.34
   Compiling thiserror-impl v2.0.21
   Compiling tracing-attributes v0.1.31
    Checking tracing-core v0.1.36
   Compiling ring v0.17.14
    Checking csv-core v0.1.13
    Checking zstd v0.14.0
    Checking simdutf8 v0.1.5
    Checking either v1.18.0
    Checking same-file v1.0.6
    Checking arrow-ipc v60.0.0
    Checking walkdir v2.5.0
    Checking itertools v0.15.0
    Checking tracing v0.1.44
    Checking csv v1.4.0
    Checking url v2.5.8
    Checking futures v0.3.34
    Checking brotli-decompressor v6.0.1
    Checking parking_lot v0.12.5
   Compiling async-trait v0.1.92
   Compiling recursive-proc-macro-impl v0.1.1
    Checking http v1.5.0
    Checking getrandom v0.2.17
    Checking untrusted v0.9.0
    Checking log v0.4.34
    Checking humantime v2.4.0
    Checking brotli v9.0.0
    Checking recursive v0.1.1
    Checking arrow-csv v60.0.0
    Checking object_store v0.14.2
    Checking arrow-json v60.0.0
    Checking arrow-string v60.0.0
    Checking uuid v1.26.1
    Checking arrow-row v60.0.0
    Checking arrow-arith v60.0.0
   Compiling sqlparser_derive v0.6.0
   Compiling seq-macro v0.3.6
    Checking arrow v60.0.0
    Checking sqlparser v0.63.0
    Checking hex v0.4.3
   Compiling pin-project-internal v1.1.13
    Checking typenum v1.20.1
    Checking hybrid-array v0.4.15
    Checking pin-project v1.1.13
    Checking datafusion-doc v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/doc)
    Checking cpufeatures v0.3.1
   Compiling crossbeam-utils v0.8.23
    Checking foldhash v0.1.5
   Compiling rustix v1.1.5
    Checking cmov v0.5.4
    Checking ctutils v0.4.2
    Checking parquet v60.0.0
    Checking block-buffer v0.12.1
    Checking crypto-common v0.2.2
    Checking hashbrown v0.15.5
    Checking ppv-lite86 v0.2.21
    Checking rand_core v0.9.5
    Checking const-oid v0.10.2
    Checking fixedbitset v0.5.7
    Checking linux-raw-sys v0.12.1
    Checking petgraph v0.8.3
    Checking rand_chacha v0.9.0
    Checking digest v0.11.3
    Checking tokio-util v0.7.19
    Checking hashbrown v0.14.5
    Checking fastrand v2.5.0
   Compiling datafusion-macros v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/macros)
    Checking dashmap v6.2.1
    Checking tempfile v3.27.0
    Checking rand v0.9.5
   Compiling blake3 v1.8.7
    Checking arrayvec v0.7.8
    Checking constant_time_eq v0.4.2
    Checking md-5 v0.11.0
    Checking blake2 v0.11.0
    Checking sha2 v0.11.0
   Compiling liblzma-sys v0.4.9
    Checking libbz2-rs-sys v0.2.5
    Checking datafusion-common-runtime v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/common-runtime)
    Checking compression-core v0.4.33
    Checking glob v0.3.4
    Checking chacha20 v0.10.2
    Checking bzip2 v0.6.1
   Compiling bigdecimal v0.4.10
    Checking crc-catalog v2.5.0
   Compiling heck v0.5.0
    Checking crc v3.4.0
   Compiling strum_macros v0.28.0
    Checking rand v0.10.3
    Checking num-bigint v0.4.8
    Checking tokio-stream v0.1.19
    Checking liblzma v0.4.8
    Checking compression-codecs v0.4.43
    Checking arrow-avro v60.0.0
    Checking async-compression v0.4.48
    Checking datafusion-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/common)
    Checking datafusion-expr-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/expr-common)
    Checking datafusion-physical-expr-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-expr-common)
    Checking datafusion-functions-aggregate-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-aggregate-common)
    Checking datafusion-functions-window-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-window-common)
    Checking datafusion-expr v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/expr)
    Checking datafusion-physical-expr v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-expr)
    Checking datafusion-execution v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/execution)
    Checking datafusion-functions v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions)
    Checking datafusion-functions-aggregate v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-aggregate)
    Checking datafusion-functions-window v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-window)
    Checking datafusion-optimizer v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/optimizer)
    Checking datafusion-physical-plan v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-plan)
    Checking datafusion-physical-expr-adapter v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-expr-adapter)
    Checking datafusion-functions-nested v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-nested)
    Checking datafusion-sql v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/sql)
error[E0624]: method `value_offset_at` is private
    --> /home/runner/work/datafusion/datafusion/datafusion/physical-plan/src/unnest.rs:1229:26
     |
1229 |         let start = self.value_offset_at(row) as i64;
     |                          ^^^^^^^^^^^^^^^ private method
     |
    ::: /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/arrow-array-60.0.0/src/array/fixed_size_list_array.rs:388:5
     |
 388 |     const fn value_offset_at(&self, i: usize) -> usize {
     |     -------------------------------------------------- private method defined here

For more information about this error, try `rustc --explain E0624`.
error: could not compile `datafusion-physical-plan` (lib) due to 1 previous error

-----

error: failed to build rustdoc for crate datafusion v55.1.0
note: this is usually due to a compilation error in the crate,
      and is unlikely to be a bug in cargo-semver-checks
note: the following command can be used to reproduce the error:
      cargo new --lib example &&
          cd example &&
          echo '[workspace]' >> Cargo.toml &&
          cargo add --path /home/runner/work/datafusion/datafusion/datafusion/core --features array_expressions,avro,backtrace,bzip2,compression,crypto_expressions,datafusion-datasource-avro,datafusion-datasource-parquet,datafusion-functions-nested,datafusion-sql,datetime_expressions,default,docs_generation,encoding_expressions,extended_tests,flate2,force_hash_collisions,liblzma,math_expressions,nested_expressions,parquet,parquet_encryption,recursive_protection,regex_expressions,serde,sql,sqlparser,string_expressions,unicode_expressions,zstd &&
          cargo check &&
          cargo doc

    Building datafusion-common v55.1.0 (current)
       Built [  34.443s] (current)
     Parsing datafusion-common v55.1.0 (current)
      Parsed [   0.070s] (current)
    Building datafusion-common v55.1.0 (baseline)
       Built [  33.995s] (baseline)
     Parsing datafusion-common v55.1.0 (baseline)
      Parsed [   0.072s] (baseline)
    Checking datafusion-common v55.1.0 -> v55.1.0 (no change; assume patch)
     Checked [   1.087s] 223 checks: 222 pass, 1 fail, 0 warn, 31 skip

--- failure constructible_struct_adds_field: struct exhaustively constructible through public API adds field ---

Description:
A pub struct that could be exhaustively constructed with a literal using only public API has a new pub field, breaking existing exhaustive literals.
        ref: https://doc.rust-lang.org/reference/expressions/struct-expr.html
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.50.0/src/lints/constructible_struct_adds_field.ron

Failed in:
  field ParquetOptions.dictionary_filter_on_read in /home/runner/work/datafusion/datafusion/datafusion/common/src/config.rs:1305

     Summary semver requires new major version: 1 major and 0 minor checks failed
    Finished [  71.003s] datafusion-common
    Building datafusion-datasource-parquet v55.1.0 (current)
error: running cargo-doc on crate 'datafusion-datasource-parquet' failed with output:
-----
   Compiling proc-macro2 v1.0.107
   Compiling quote v1.0.47
   Compiling unicode-ident v1.0.26
    Checking cfg-if v1.0.5
   Compiling libc v0.2.189
   Compiling autocfg v1.5.1
   Compiling libm v0.2.16
    Checking memchr v2.8.3
   Compiling num-traits v0.2.19
   Compiling zerocopy v0.8.59
   Compiling syn v3.0.6
   Compiling syn v2.0.119
    Checking bytes v1.12.1
   Compiling serde_core v1.0.229
    Checking itoa v1.0.18
    Checking equivalent v1.0.2
    Checking allocator-api2 v0.2.21
   Compiling getrandom v0.3.4
    Checking once_cell v1.21.4
    Checking foldhash v0.2.0
    Checking hashbrown v0.17.1
   Compiling zmij v1.0.23
    Checking indexmap v2.14.2
   Compiling serde_json v1.0.151
    Checking num-integer v0.1.47
    Checking iana-time-zone v0.1.65
   Compiling version_check v0.9.5
    Checking siphasher v1.0.4
   Compiling synstructure v0.14.0
    Checking phf_shared v0.12.1
   Compiling ahash v0.8.12
    Checking chrono v0.4.45
    Checking num-bigint v0.5.1
   Compiling zerocopy-derive v0.8.59
    Checking stable_deref_trait v1.2.1
   Compiling chrono-tz v0.10.4
   Compiling zerofrom-derive v0.1.8
   Compiling yoke-derive v0.8.3
    Checking phf v0.12.1
    Checking arrow-schema v60.0.0
    Checking zerofrom v0.1.8
   Compiling jobserver v0.1.35
    Checking yoke v0.8.3
   Compiling zerovec-derive v0.11.6
    Checking num-complex v0.4.6
   Compiling shlex v2.0.1
   Compiling find-msvc-tools v0.1.14
   Compiling cc v1.5.1
    Checking zerovec v0.11.8
   Compiling displaydoc v0.2.7
    Checking tinystr v0.8.4
    Checking litemap v0.8.3
    Checking pin-project-lite v0.2.17
   Compiling pkg-config v0.3.34
    Checking writeable v0.6.4
    Checking lexical-util v1.0.7
    Checking smallvec v1.16.2
   Compiling zstd-sys v2.1.0+zstd.1.5.7
    Checking icu_locale_core v2.3.0
    Checking zerotrie v0.2.5
    Checking potential_utf v0.1.6
   Compiling icu_properties_data v2.3.0
    Checking futures-sink v0.3.34
    Checking bitflags v2.13.2
    Checking futures-core v0.3.34
    Checking utf8_iter v1.0.4
   Compiling icu_normalizer_data v2.3.0
    Checking icu_provider v2.3.1
    Checking half v2.7.1
    Checking icu_collections v2.3.0
    Checking arrow-buffer v60.0.0
   Compiling semver v1.0.28
   Compiling rustc_version v0.4.1
    Checking arrow-data v60.0.0
    Checking futures-channel v0.3.34
    Checking lexical-write-integer v1.0.6
    Checking lexical-parse-integer v1.0.6
   Compiling futures-macro v0.3.34
    Checking futures-task v0.3.34
    Checking arrow-array v60.0.0
    Checking futures-io v0.3.34
   Compiling parking_lot_core v0.9.12
   Compiling zstd-safe v8.0.0
    Checking slab v0.4.12
    Checking lexical-parse-float v1.0.6
    Checking futures-util v0.3.34
    Checking lexical-write-float v1.0.6
    Checking icu_normalizer v2.3.0
    Checking icu_properties v2.3.0
    Checking arrow-cmp v60.0.0
    Checking arrow-select v60.0.0
   Compiling flatbuffers v25.12.19
   Compiling tokio-macros v2.7.2
    Checking aho-corasick v1.1.5
    Checking regex-syntax v0.8.11
    Checking scopeguard v1.2.0
    Checking unicode-width v0.2.2
    Checking base64 v0.23.1
   Compiling cfg_aliases v0.2.2
    Checking unicode-segmentation v1.13.3
    Checking ryu v1.0.23
    Checking comfy-table v8.0.1
   Compiling nix v0.31.3
    Checking lock_api v0.4.14
    Checking arrow-ord v60.0.0
    Checking tokio v1.53.1
    Checking regex-automata v0.4.18
    Checking idna_adapter v1.2.2
    Checking lexical-core v1.0.6
    Checking atoi v3.1.0
    Checking alloc-no-stdlib v3.0.0
    Checking twox-hash v2.1.4
   Compiling getrandom v0.4.3
   Compiling thiserror v2.0.21
    Checking percent-encoding v2.3.2
    Checking form_urlencoded v1.2.2
    Checking lz4_flex v0.14.0
    Checking alloc-stdlib v0.3.0
    Checking arrow-cast v60.0.0
    Checking regex v1.13.1
    Checking idna v1.1.0
    Checking futures-executor v0.3.34
   Compiling ring v0.17.14
   Compiling thiserror-impl v2.0.21
   Compiling tracing-attributes v0.1.31
    Checking tracing-core v0.1.36
    Checking csv-core v0.1.13
    Checking either v1.18.0
   Compiling snap v1.1.2
    Checking same-file v1.0.6
    Checking simdutf8 v0.1.5
    Checking walkdir v2.5.0
    Checking itertools v0.15.0
    Checking csv v1.4.0
    Checking tracing v0.1.44
    Checking futures v0.3.34
    Checking url v2.5.8
    Checking brotli-decompressor v6.0.1
    Checking parking_lot v0.12.5
   Compiling async-trait v0.1.92
    Checking http v1.5.0
    Checking getrandom v0.2.17
    Checking zlib-rs v0.6.8
   Compiling anyhow v1.0.104
    Checking humantime v2.4.0
    Checking untrusted v0.9.0
    Checking object_store v0.14.2
    Checking flate2 v1.1.10
    Checking brotli v9.0.0
    Checking arrow-csv v60.0.0
    Checking zstd v0.14.0
    Checking arrow-ipc v60.0.0
    Checking arrow-json v60.0.0
    Checking arrow-string v60.0.0
    Checking arrow-arith v60.0.0
    Checking arrow-row v60.0.0
    Checking log v0.4.34
   Compiling seq-macro v0.3.6
    Checking arrow v60.0.0
   Compiling itertools v0.14.0
    Checking uuid v1.26.1
    Checking hex v0.4.3
   Compiling pin-project-internal v1.1.13
   Compiling crossbeam-utils v0.8.23
   Compiling rustix v1.1.5
    Checking parquet v60.0.0
    Checking ppv-lite86 v0.2.21
    Checking rand_core v0.9.5
    Checking linux-raw-sys v0.12.1
    Checking pin-project v1.1.13
    Checking datafusion-doc v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/doc)
   Compiling prost-derive v0.14.4
    Checking rand_chacha v0.9.0
    Checking hashbrown v0.14.5
    Checking foldhash v0.1.5
    Checking fastrand v2.5.0
    Checking hashbrown v0.15.5
    Checking prost v0.14.4
    Checking tempfile v3.27.0
    Checking dashmap v6.2.1
    Checking rand v0.9.5
    Checking tokio-util v0.7.19
    Checking fixedbitset v0.5.7
   Compiling datafusion-macros v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/macros)
    Checking datafusion-common-runtime v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/common-runtime)
    Checking petgraph v0.8.3
    Checking glob v0.3.4
    Checking datafusion-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/common)
    Checking datafusion-proto-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/proto-common)
    Checking datafusion-expr-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/expr-common)
    Checking datafusion-proto-models v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/proto-models)
    Checking datafusion-physical-expr-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-expr-common)
    Checking datafusion-functions-aggregate-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-aggregate-common)
    Checking datafusion-functions-window-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-window-common)
    Checking datafusion-expr v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/expr)
    Checking datafusion-execution v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/execution)
    Checking datafusion-physical-expr v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-expr)
    Checking datafusion-functions v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions)
    Checking datafusion-physical-plan v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-plan)
    Checking datafusion-physical-expr-adapter v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-expr-adapter)
error[E0624]: method `value_offset_at` is private
    --> /home/runner/work/datafusion/datafusion/datafusion/physical-plan/src/unnest.rs:1229:26
     |
1229 |         let start = self.value_offset_at(row) as i64;
     |                          ^^^^^^^^^^^^^^^ private method
     |
    ::: /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/arrow-array-60.0.0/src/array/fixed_size_list_array.rs:388:5
     |
 388 |     const fn value_offset_at(&self, i: usize) -> usize {
     |     -------------------------------------------------- private method defined here

For more information about this error, try `rustc --explain E0624`.
error: could not compile `datafusion-physical-plan` (lib) due to 1 previous error

-----

error: failed to build rustdoc for crate datafusion-datasource-parquet v55.1.0
note: this is usually due to a compilation error in the crate,
      and is unlikely to be a bug in cargo-semver-checks
note: the following command can be used to reproduce the error:
      cargo new --lib example &&
          cd example &&
          echo '[workspace]' >> Cargo.toml &&
          cargo add --path /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet --features parquet_encryption,proto &&
          cargo check &&
          cargo doc

    Building datafusion-physical-expr-common v55.1.0 (current)
       Built [  25.405s] (current)
     Parsing datafusion-physical-expr-common v55.1.0 (current)
      Parsed [   0.023s] (current)
    Building datafusion-physical-expr-common v55.1.0 (baseline)
       Built [  25.015s] (baseline)
     Parsing datafusion-physical-expr-common v55.1.0 (baseline)
      Parsed [   0.024s] (baseline)
    Checking datafusion-physical-expr-common v55.1.0 -> v55.1.0 (no change; assume patch)
     Checked [   0.310s] 223 checks: 223 pass, 31 skip
     Summary no semver update required
    Finished [  51.659s] datafusion-physical-expr-common
    Building datafusion-physical-plan v55.1.0 (current)
       Built [  40.252s] (current)
     Parsing datafusion-physical-plan v55.1.0 (current)
      Parsed [   0.183s] (current)
    Building datafusion-physical-plan v55.1.0 (baseline)
       Built [  39.332s] (baseline)
     Parsing datafusion-physical-plan v55.1.0 (baseline)
      Parsed [   0.183s] (baseline)
    Checking datafusion-physical-plan v55.1.0 -> v55.1.0 (no change; assume patch)
     Checked [   1.049s] 223 checks: 223 pass, 31 skip
     Summary no semver update required
    Finished [  82.400s] datafusion-physical-plan
    Building datafusion-proto v55.1.0 (current)
error: running cargo-doc on crate 'datafusion-proto' failed with output:
-----
   Compiling proc-macro2 v1.0.107
   Compiling unicode-ident v1.0.26
   Compiling quote v1.0.47
    Checking cfg-if v1.0.5
   Compiling libc v0.2.189
   Compiling autocfg v1.5.1
   Compiling libm v0.2.16
    Checking memchr v2.8.3
   Compiling num-traits v0.2.19
   Compiling syn v3.0.6
   Compiling syn v2.0.119
   Compiling zerocopy v0.8.59
    Checking bytes v1.12.1
   Compiling jobserver v0.1.35
   Compiling shlex v2.0.1
   Compiling find-msvc-tools v0.1.14
   Compiling serde_core v1.0.229
   Compiling cc v1.5.1
    Checking foldhash v0.2.0
    Checking once_cell v1.21.4
    Checking allocator-api2 v0.2.21
    Checking equivalent v1.0.2
    Checking itoa v1.0.18
   Compiling getrandom v0.3.4
    Checking hashbrown v0.17.1
   Compiling zmij v1.0.23
   Compiling synstructure v0.14.0
   Compiling zerocopy-derive v0.8.59
    Checking indexmap v2.14.2
   Compiling serde_json v1.0.151
    Checking num-integer v0.1.47
    Checking siphasher v1.0.4
   Compiling version_check v0.9.5
    Checking iana-time-zone v0.1.65
    Checking chrono v0.4.45
    Checking phf_shared v0.12.1
    Checking num-bigint v0.5.1
   Compiling ahash v0.8.12
   Compiling zerofrom-derive v0.1.8
   Compiling chrono-tz v0.10.4
    Checking arrow-schema v60.0.0
    Checking phf v0.12.1
   Compiling yoke-derive v0.8.3
    Checking stable_deref_trait v1.2.1
    Checking zerofrom v0.1.8
    Checking num-complex v0.4.6
    Checking yoke v0.8.3
   Compiling pkg-config v0.3.34
   Compiling zerovec-derive v0.11.6
   Compiling displaydoc v0.2.7
    Checking pin-project-lite v0.2.17
   Compiling zstd-sys v2.1.0+zstd.1.5.7
    Checking zerovec v0.11.8
    Checking litemap v0.8.3
    Checking futures-sink v0.3.34
    Checking lexical-util v1.0.7
    Checking tinystr v0.8.4
    Checking smallvec v1.16.2
    Checking writeable v0.6.4
    Checking futures-core v0.3.34
    Checking icu_locale_core v2.3.0
    Checking potential_utf v0.1.6
    Checking half v2.7.1
    Checking zerotrie v0.2.5
    Checking arrow-buffer v60.0.0
   Compiling icu_properties_data v2.3.0
    Checking bitflags v2.13.2
   Compiling icu_normalizer_data v2.3.0
    Checking utf8_iter v1.0.4
    Checking icu_collections v2.3.0
    Checking arrow-data v60.0.0
    Checking icu_provider v2.3.1
   Compiling semver v1.0.28
   Compiling zstd-safe v8.0.0
   Compiling rustc_version v0.4.1
    Checking futures-channel v0.3.34
    Checking lexical-write-integer v1.0.6
    Checking lexical-parse-integer v1.0.6
   Compiling futures-macro v0.3.34
   Compiling tokio-macros v2.7.2
    Checking arrow-array v60.0.0
   Compiling getrandom v0.4.3
    Checking rand_core v0.10.1
    Checking slab v0.4.12
   Compiling parking_lot_core v0.9.12
    Checking futures-task v0.3.34
    Checking futures-io v0.3.34
    Checking tokio v1.53.1
    Checking futures-util v0.3.34
    Checking arrow-cmp v60.0.0
    Checking arrow-select v60.0.0
    Checking lexical-write-float v1.0.6
    Checking lexical-parse-float v1.0.6
   Compiling flatbuffers v25.12.19
    Checking icu_normalizer v2.3.0
    Checking icu_properties v2.3.0
    Checking aho-corasick v1.1.5
    Checking base64 v0.23.1
    Checking unicode-segmentation v1.13.3
    Checking regex-syntax v0.8.11
    Checking scopeguard v1.2.0
    Checking ryu v1.0.23
   Compiling crc32fast v1.5.2
    Checking unicode-width v0.2.2
   Compiling cfg_aliases v0.2.2
   Compiling nix v0.31.3
    Checking comfy-table v8.0.1
    Checking idna_adapter v1.2.2
    Checking lock_api v0.4.14
    Checking lexical-core v1.0.6
    Checking arrow-ord v60.0.0
    Checking atoi v3.1.0
    Checking alloc-no-stdlib v3.0.0
    Checking percent-encoding v2.3.2
    Checking simd-adler32 v0.3.10
   Compiling thiserror v2.0.21
    Checking adler2 v2.0.1
   Compiling snap v1.1.2
    Checking regex-automata v0.4.18
    Checking twox-hash v2.1.4
    Checking lz4_flex v0.14.0
    Checking miniz_oxide v0.9.1
    Checking form_urlencoded v1.2.2
    Checking alloc-stdlib v0.3.0
    Checking arrow-cast v60.0.0
    Checking idna v1.1.0
    Checking futures-executor v0.3.34
   Compiling thiserror-impl v2.0.21
   Compiling tracing-attributes v0.1.31
    Checking regex v1.13.1
    Checking tracing-core v0.1.36
    Checking csv-core v0.1.13
    Checking zlib-rs v0.6.8
    Checking same-file v1.0.6
    Checking either v1.18.0
    Checking simdutf8 v0.1.5
    Checking itertools v0.15.0
    Checking tracing v0.1.44
    Checking walkdir v2.5.0
    Checking csv v1.4.0
    Checking futures v0.3.34
    Checking flate2 v1.1.10
    Checking url v2.5.8
    Checking brotli-decompressor v6.0.1
    Checking parking_lot v0.12.5
   Compiling async-trait v0.1.92
    Checking http v1.5.0
   Compiling serde v1.0.229
   Compiling anyhow v1.0.104
    Checking humantime v2.4.0
    Checking brotli v9.0.0
    Checking arrow-csv v60.0.0
    Checking object_store v0.14.2
    Checking zstd v0.14.0
    Checking arrow-ipc v60.0.0
    Checking arrow-json v60.0.0
    Checking arrow-string v60.0.0
    Checking uuid v1.26.1
    Checking arrow-arith v60.0.0
    Checking arrow-row v60.0.0
   Compiling serde_derive v1.0.229
    Checking log v0.4.34
   Compiling seq-macro v0.3.6
   Compiling itertools v0.14.0
    Checking arrow v60.0.0
    Checking parquet v60.0.0
    Checking base64 v0.22.1
   Compiling pin-project-internal v1.1.13
   Compiling prost-derive v0.14.4
    Checking pin-project v1.1.13
   Compiling crossbeam-utils v0.8.23
   Compiling rustix v1.1.5
    Checking ppv-lite86 v0.2.21
    Checking rand_core v0.9.5
    Checking datafusion-doc v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/doc)
    Checking linux-raw-sys v0.12.1
    Checking prost v0.14.4
    Checking pbjson v0.9.0
    Checking rand_chacha v0.9.0
    Checking tokio-util v0.7.19
    Checking foldhash v0.1.5
    Checking hashbrown v0.14.5
    Checking fastrand v2.5.0
    Checking hashbrown v0.15.5
    Checking dashmap v6.2.1
    Checking rand v0.9.5
    Checking tempfile v3.27.0
    Checking fixedbitset v0.5.7
   Compiling datafusion-macros v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/macros)
    Checking hex v0.4.3
    Checking petgraph v0.8.3
    Checking datafusion-common-runtime v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/common-runtime)
    Checking glob v0.3.4
   Compiling object v0.39.1
   Compiling liblzma-sys v0.4.9
    Checking datafusion-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/common)
    Checking cpufeatures v0.3.1
    Checking chacha20 v0.10.2
   Compiling stacker v0.1.25
   Compiling heck v0.5.0
    Checking crc-catalog v2.5.0
    Checking libbz2-rs-sys v0.2.5
    Checking bzip2 v0.6.1
    Checking crc v3.4.0
   Compiling strum_macros v0.28.0
   Compiling ar_archive_writer v0.5.3
    Checking rand v0.10.3
   Compiling psm v0.1.32
    Checking tokio-stream v0.1.19
    Checking datafusion-proto-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/proto-common)
    Checking datafusion-expr-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/expr-common)
   Compiling recursive-proc-macro-impl v0.1.1
    Checking recursive v0.1.1
    Checking datafusion-proto-models v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/proto-models)
    Checking liblzma v0.4.8
    Checking arrow-avro v60.0.0
    Checking datafusion-physical-expr-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-expr-common)
    Checking datafusion-functions-window-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-window-common)
    Checking datafusion-functions-aggregate-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-aggregate-common)
    Checking datafusion-expr v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/expr)
    Checking datafusion-execution v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/execution)
    Checking datafusion-physical-expr v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-expr)
    Checking datafusion-functions v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions)
    Checking datafusion-physical-plan v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-plan)
    Checking datafusion-physical-expr-adapter v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-expr-adapter)
error[E0624]: method `value_offset_at` is private
    --> /home/runner/work/datafusion/datafusion/datafusion/physical-plan/src/unnest.rs:1229:26
     |
1229 |         let start = self.value_offset_at(row) as i64;
     |                          ^^^^^^^^^^^^^^^ private method
     |
    ::: /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/arrow-array-60.0.0/src/array/fixed_size_list_array.rs:388:5
     |
 388 |     const fn value_offset_at(&self, i: usize) -> usize {
     |     -------------------------------------------------- private method defined here

For more information about this error, try `rustc --explain E0624`.
error: could not compile `datafusion-physical-plan` (lib) due to 1 previous error

-----

error: failed to build rustdoc for crate datafusion-proto v55.1.0
note: this is usually due to a compilation error in the crate,
      and is unlikely to be a bug in cargo-semver-checks
note: the following command can be used to reproduce the error:
      cargo new --lib example &&
          cd example &&
          echo '[workspace]' >> Cargo.toml &&
          cargo add --path /home/runner/work/datafusion/datafusion/datafusion/proto --features avro,datafusion-datasource-avro,datafusion-datasource-parquet,default,json,parquet,recursive_protection,serde_json &&
          cargo check &&
          cargo doc

    Building datafusion-proto-common v55.1.0 (current)
       Built [  22.812s] (current)
     Parsing datafusion-proto-common v55.1.0 (current)
      Parsed [   0.050s] (current)
    Building datafusion-proto-common v55.1.0 (baseline)
       Built [  22.257s] (baseline)
     Parsing datafusion-proto-common v55.1.0 (baseline)
      Parsed [   0.051s] (baseline)
    Checking datafusion-proto-common v55.1.0 -> v55.1.0 (no change; assume patch)
     Checked [   1.595s] 223 checks: 222 pass, 1 fail, 0 warn, 31 skip

--- failure constructible_struct_adds_field: struct exhaustively constructible through public API adds field ---

Description:
A pub struct that could be exhaustively constructed with a literal using only public API has a new pub field, breaking existing exhaustive literals.
        ref: https://doc.rust-lang.org/reference/expressions/struct-expr.html
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.50.0/src/lints/constructible_struct_adds_field.ron

Failed in:
  field ParquetOptions.dictionary_filter_on_read in /home/runner/work/datafusion/datafusion/datafusion/proto-common/src/generated/prost.rs:872
  field ParquetOptions.dictionary_filter_on_read in /home/runner/work/datafusion/datafusion/datafusion/proto-common/src/generated/prost.rs:872
  field ParquetOptions.dictionary_filter_on_read in /home/runner/work/datafusion/datafusion/datafusion/proto-common/src/generated/prost.rs:872

     Summary semver requires new major version: 1 major and 0 minor checks failed
    Finished [  47.851s] datafusion-proto-common
    Building datafusion-proto-models v55.1.0 (current)
       Built [  25.768s] (current)
     Parsing datafusion-proto-models v55.1.0 (current)
      Parsed [   0.140s] (current)
    Building datafusion-proto-models v55.1.0 (baseline)
       Built [  25.722s] (baseline)
     Parsing datafusion-proto-models v55.1.0 (baseline)
      Parsed [   0.144s] (baseline)
    Checking datafusion-proto-models v55.1.0 -> v55.1.0 (no change; assume patch)
     Checked [   2.591s] 223 checks: 222 pass, 1 fail, 0 warn, 31 skip

--- failure constructible_struct_adds_field: struct exhaustively constructible through public API adds field ---

Description:
A pub struct that could be exhaustively constructed with a literal using only public API has a new pub field, breaking existing exhaustive literals.
        ref: https://doc.rust-lang.org/reference/expressions/struct-expr.html
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.50.0/src/lints/constructible_struct_adds_field.ron

Failed in:
  field ParquetOptions.dictionary_filter_on_read in /home/runner/work/datafusion/datafusion/datafusion/proto-models/src/generated/datafusion_proto_common.rs:872
  field ParquetOptions.dictionary_filter_on_read in /home/runner/work/datafusion/datafusion/datafusion/proto-models/src/generated/datafusion_proto_common.rs:872

     Summary semver requires new major version: 1 major and 0 minor checks failed
    Finished [  55.731s] datafusion-proto-models
    Building datafusion-sqllogictest v55.1.0 (current)
error: running cargo-doc on crate 'datafusion-sqllogictest' failed with output:
-----
   Compiling proc-macro2 v1.0.107
   Compiling unicode-ident v1.0.26
   Compiling quote v1.0.47
   Compiling libc v0.2.189
    Checking cfg-if v1.0.5
    Checking bytes v1.12.1
    Checking memchr v2.8.3
   Compiling serde_core v1.0.229
   Compiling autocfg v1.5.1
   Compiling syn v3.0.6
   Compiling syn v2.0.119
   Compiling jobserver v0.1.35
   Compiling shlex v2.0.1
   Compiling find-msvc-tools v0.1.14
    Checking itoa v1.0.18
   Compiling cc v1.5.1
    Checking foldhash v0.2.0
   Compiling libm v0.2.16
    Checking allocator-api2 v0.2.21
    Checking equivalent v1.0.2
    Checking once_cell v1.21.4
   Compiling num-traits v0.2.19
    Checking hashbrown v0.17.1
    Checking indexmap v2.14.2
   Compiling zmij v1.0.23
    Checking pin-project-lite v0.2.17
    Checking futures-core v0.3.34
   Compiling zerocopy v0.8.59
    Checking futures-sink v0.3.34
    Checking errno v0.3.14
    Checking signal-hook-registry v1.4.8
    Checking num-integer v0.1.47
   Compiling tokio-macros v2.7.2
    Checking socket2 v0.6.5
   Compiling zerocopy-derive v0.8.59
    Checking mio v1.2.3
   Compiling version_check v0.9.5
   Compiling serde v1.0.229
   Compiling serde_json v1.0.151
    Checking tokio v1.53.1
   Compiling serde_derive v1.0.229
    Checking slab v0.4.12
   Compiling getrandom v0.3.4
    Checking futures-channel v0.3.34
    Checking smallvec v1.16.2
   Compiling futures-macro v0.3.34
   Compiling synstructure v0.14.0
    Checking http v1.5.0
    Checking futures-io v0.3.34
    Checking iana-time-zone v0.1.65
    Checking futures-task v0.3.34
    Checking futures-util v0.3.34
    Checking chrono v0.4.45
    Checking siphasher v1.0.4
   Compiling zerofrom-derive v0.1.8
   Compiling tracing-attributes v0.1.31
    Checking tracing-core v0.1.36
    Checking zerofrom v0.1.8
   Compiling yoke-derive v0.8.3
    Checking num-complex v0.4.6
    Checking rand_core v0.10.1
   Compiling getrandom v0.4.3
    Checking stable_deref_trait v1.2.1
    Checking cpufeatures v0.3.1
    Checking tracing v0.1.44
    Checking half v2.7.1
    Checking phf_shared v0.12.1
   Compiling ahash v0.8.12
    Checking num-bigint v0.5.1
   Compiling zerovec-derive v0.11.6
    Checking getrandom v0.2.17
   Compiling pkg-config v0.3.34
    Checking yoke v0.8.3
   Compiling chrono-tz v0.10.4
    Checking phf v0.12.1
    Checking arrow-schema v60.0.0
   Compiling displaydoc v0.2.7
    Checking arrow-buffer v60.0.0
    Checking zerovec v0.11.8
    Checking percent-encoding v2.3.2
   Compiling thiserror v2.0.21
    Checking arrow-data v60.0.0
   Compiling thiserror-impl v2.0.21
   Compiling ring v0.17.14
    Checking bitflags v2.13.2
    Checking chacha20 v0.10.2
   Compiling semver v1.0.28
    Checking log v0.4.34
    Checking rand v0.10.3
    Checking tinystr v0.8.4
    Checking untrusted v0.9.0
    Checking writeable v0.6.4
    Checking base64 v0.23.1
    Checking litemap v0.8.3
    Checking icu_locale_core v2.3.0
    Checking potential_utf v0.1.6
    Checking zerotrie v0.2.5
   Compiling zstd-sys v2.1.0+zstd.1.5.7
   Compiling async-trait v0.1.92
    Checking utf8_iter v1.0.4
   Compiling icu_properties_data v2.3.0
   Compiling icu_normalizer_data v2.3.0
    Checking icu_collections v2.3.0
    Checking icu_provider v2.3.1
    Checking tokio-util v0.7.19
    Checking aho-corasick v1.1.5
    Checking lexical-util v1.0.7
    Checking arrow-array v60.0.0
   Compiling object v0.39.1
    Checking regex-syntax v0.8.11
    Checking arrow-cmp v60.0.0
    Checking ryu v1.0.23
   Compiling zstd-safe v8.0.0
    Checking arrow-select v60.0.0
    Checking regex-automata v0.4.18
    Checking icu_normalizer v2.3.0
    Checking icu_properties v2.3.0
   Compiling rustix v1.1.5
    Checking either v1.18.0
    Checking regex v1.13.1
    Checking idna_adapter v1.2.2
    Checking form_urlencoded v1.2.2
   Compiling crc32fast v1.5.2
    Checking unicode-width v0.2.2
   Compiling parking_lot_core v0.9.12
    Checking typenum v1.20.1
    Checking idna v1.1.0
    Checking lexical-write-integer v1.0.6
    Checking lexical-parse-integer v1.0.6
   Compiling rustc_version v0.4.1
    Checking futures-executor v0.3.34
   Compiling pin-project-internal v1.1.13
    Checking adler2 v2.0.1
    Checking scopeguard v1.2.0
    Checking simd-adler32 v0.3.10
    Checking miniz_oxide v0.9.1
    Checking lock_api v0.4.14
    Checking futures v0.3.34
   Compiling flatbuffers v25.12.19
    Checking lexical-parse-float v1.0.6
    Checking pin-project v1.1.13
    Checking lexical-write-float v1.0.6
    Checking url v2.5.8
   Compiling cfg_aliases v0.2.2
    Checking unicode-segmentation v1.13.3
    Checking zlib-rs v0.6.8
    Checking comfy-table v8.0.1
   Compiling ar_archive_writer v0.5.3
   Compiling nix v0.31.3
    Checking lexical-core v1.0.6
    Checking arrow-ord v60.0.0
    Checking flate2 v1.1.10
   Compiling psm v0.1.32
    Checking twox-hash v2.1.4
    Checking atoi v3.1.0
   Compiling stacker v0.1.25
    Checking hex v0.4.3
    Checking alloc-no-stdlib v3.0.0
   Compiling snap v1.1.2
    Checking alloc-stdlib v0.3.0
    Checking arrow-cast v60.0.0
    Checking lz4_flex v0.14.0
    Checking parking_lot v0.12.5
    Checking csv-core v0.1.13
    Checking simdutf8 v0.1.5
    Checking humantime v2.4.0
    Checking same-file v1.0.6
    Checking csv v1.4.0
    Checking walkdir v2.5.0
    Checking brotli-decompressor v6.0.1
    Checking itertools v0.15.0
   Compiling recursive-proc-macro-impl v0.1.1
    Checking recursive v0.1.1
    Checking arrow-json v60.0.0
    Checking brotli v9.0.0
    Checking arrow-csv v60.0.0
    Checking arrow-string v60.0.0
    Checking object_store v0.14.2
    Checking arrow-arith v60.0.0
    Checking arrow-row v60.0.0
    Checking zstd v0.14.0
    Checking arrow-ipc v60.0.0
    Checking uuid v1.26.1
   Compiling sqlparser_derive v0.6.0
   Compiling seq-macro v0.3.6
    Checking hybrid-array v0.4.15
    Checking sqlparser v0.63.0
    Checking arrow v60.0.0
    Checking parquet v60.0.0
    Checking ppv-lite86 v0.2.21
    Checking cmov v0.5.4
    Checking block-buffer v0.12.1
    Checking ctutils v0.4.2
    Checking crypto-common v0.2.2
    Checking const-oid v0.10.2
    Checking linux-raw-sys v0.12.1
    Checking digest v0.11.3
    Checking rand_core v0.9.5
    Checking rand_chacha v0.9.0
    Checking datafusion-doc v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/doc)
    Checking rand v0.9.5
   Compiling crossbeam-utils v0.8.23
    Checking foldhash v0.1.5
    Checking hashbrown v0.15.5
    Checking fastrand v2.5.0
   Compiling heck v0.5.0
    Checking fixedbitset v0.5.7
    Checking tempfile v3.27.0
    Checking petgraph v0.8.3
    Checking md-5 v0.11.0
    Checking sha2 v0.11.0
    Checking hashbrown v0.14.5
    Checking dashmap v6.2.1
   Compiling blake3 v1.8.7
   Compiling datafusion-macros v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/macros)
   Compiling anyhow v1.0.104
    Checking constant_time_eq v0.4.2
    Checking arrayvec v0.7.8
   Compiling itertools v0.14.0
    Checking blake2 v0.11.0
   Compiling liblzma-sys v0.4.9
    Checking libbz2-rs-sys v0.2.5
    Checking bzip2 v0.6.1
    Checking datafusion-common-runtime v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/common-runtime)
   Compiling httparse v1.10.1
   Compiling prost-derive v0.14.4
    Checking compression-core v0.4.33
    Checking http-body v1.1.0
    Checking glob v0.3.4
    Checking base64 v0.22.1
    Checking tower-service v0.3.3
    Checking atomic-waker v1.1.2
    Checking try-lock v0.2.5
    Checking fnv v1.0.7
    Checking h2 v0.4.19
    Checking want v0.3.1
    Checking tokio-stream v0.1.19
    Checking zeroize v1.9.0
    Checking httpdate v1.0.3
    Checking rustls-pki-types v1.15.1
    Checking hyper v1.11.1
    Checking datafusion-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/common)
    Checking hyper-util v0.1.21
   Compiling prost v0.14.4
    Checking http-body-util v0.1.5
    Checking num-bigint v0.4.8
   Compiling prettyplease v0.2.37
    Checking sync_wrapper v1.0.2
    Checking tower-layer v0.3.3
   Compiling rustls v0.23.45
   Compiling prost-types v0.14.4
    Checking liblzma v0.4.8
    Checking compression-codecs v0.4.43
    Checking async-compression v0.4.48
    Checking datafusion-expr-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/expr-common)
    Checking rustls-webpki v0.103.15
   Compiling serde_derive_internals v0.29.1
   Compiling schemars v0.8.22
    Checking datafusion-physical-expr-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-expr-common)
    Checking subtle v2.6.1
    Checking mime v0.3.17
   Compiling hashbrown v0.16.1
   Compiling schemars_derive v0.8.22
    Checking datafusion-functions-aggregate-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-aggregate-common)
    Checking datafusion-functions-window-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-window-common)
    Checking axum-core v0.5.6
    Checking datafusion-expr v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/expr)
    Checking tower v0.5.3
    Checking matchit v0.8.4
   Compiling dyn-clone v1.0.20
   Compiling multimap v0.10.1
   Compiling prost-build v0.14.4
    Checking axum v0.8.9
   Compiling regress v0.10.5
    Checking datafusion-physical-expr v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-expr)
    Checking datafusion-execution v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/execution)
    Checking datafusion-functions v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions)
   Compiling pbjson-build v0.8.0
    Checking hyper-timeout v0.5.2
   Compiling generic-array v0.14.7
   Compiling portable-atomic v1.15.0
   Compiling ident_case v1.0.1
   Compiling strsim v0.11.1
   Compiling darling_core v0.24.1
    Checking tonic v0.14.6
   Compiling typify-impl v0.5.0
   Compiling serde_tokenstream v0.2.3
    Checking ureq-proto v0.6.4
   Compiling bigdecimal v0.4.10
   Compiling bollard-buildkit-proto v0.7.0
    Checking utf8-zero v0.8.1
    Checking utf8parse v0.2.2
    Checking crc-catalog v2.5.0
    Checking crc v3.4.0
    Checking anstyle-parse v1.0.0
    Checking ureq v3.4.2
    Checking datafusion-physical-plan v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-plan)
    Checking datafusion-physical-expr-adapter v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-expr-adapter)
   Compiling darling_macro v0.24.1
    Checking tonic-prost v0.14.6
    Checking datafusion-functions-aggregate v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-aggregate)
   Compiling strum_macros v0.28.0
   Compiling typify-macro v0.5.0
   Compiling structmeta-derive v0.3.0
    Checking deranged v0.5.8
    Checking tinyvec v1.13.3
    Checking colorchoice v1.0.5
    Checking anstyle-query v1.1.5
    Checking is_terminal_polyfill v1.70.2
    Checking powerfmt v0.2.0
    Checking num-conv v0.2.2
   Compiling unsafe-libyaml v0.2.11
    Checking time-core v0.1.9
    Checking anstyle v1.0.14
    Checking time v0.3.55
    Checking anstream v1.0.0
   Compiling structmeta v0.3.0
   Compiling serde_yaml v0.9.34+deprecated
    Checking unicode-normalization v0.1.25
error[E0624]: method `value_offset_at` is private
    --> /home/runner/work/datafusion/datafusion/datafusion/physical-plan/src/unnest.rs:1229:26
     |
1229 |         let start = self.value_offset_at(row) as i64;
     |                          ^^^^^^^^^^^^^^^ private method
     |
    ::: /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/arrow-array-60.0.0/src/array/fixed_size_list_array.rs:388:5
     |
 388 |     const fn value_offset_at(&self, i: usize) -> usize {
     |     -------------------------------------------------- private method defined here

    Checking arrow-avro v60.0.0
    Checking datafusion-functions-nested v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-nested)
   Compiling typify v0.5.0
   Compiling darling v0.24.1
   Compiling pbjson-types v0.8.0
    Checking tokio-rustls v0.26.5
    Checking num-rational v0.4.2
   Compiling async-stream-impl v0.3.6
    Checking num-iter v0.1.46
   Compiling serde_repr v0.1.21
    Checking unicode-bidi v0.3.18
For more information about this error, try `rustc --explain E0624`.
    Checking clap_lex v1.1.1
error: could not compile `datafusion-physical-plan` (lib) due to 1 previous error
warning: build failed, waiting for other jobs to finish...

-----

error: failed to build rustdoc for crate datafusion-sqllogictest v55.1.0
note: this is usually due to a compilation error in the crate,
      and is unlikely to be a bug in cargo-semver-checks
note: the following command can be used to reproduce the error:
      cargo new --lib example &&
          cd example &&
          echo '[workspace]' >> Cargo.toml &&
          cargo add --path /home/runner/work/datafusion/datafusion/datafusion/sqllogictest --features avro,backtrace,bytes,chrono,datafusion-substrait,parquet_encryption,postgres,postgres-types,substrait,testcontainers-modules,tokio-postgres &&
          cargo check &&
          cargo doc

error: aborting due to failure to build rustdoc for crate datafusion v55.1.0

row_groups_pruned_dictionary was sorted after the page-index metrics
in EXPLAIN output; group it with the other row-group-level pruning
metrics (statistics, bloom filter) instead, and update the golden
sqllogictest output accordingly.

Also update the temporary Cargo.toml patch comment to point at
arrow-rs PR apache#10420, which supersedes the now-closed apache#9011.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions github-actions Bot added the physical-expr Changes to the physical-expr crates label Jul 23, 2026
@codecov-commenter

codecov-commenter commented Jul 23, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 88.43137% with 59 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.50%. Comparing base (e8e41ae) to head (840df44).

Files with missing lines Patch % Lines
...fusion/datasource-parquet/src/dictionary_filter.rs 94.13% 15 Missing and 3 partials ⚠️
datafusion/datasource-parquet/src/opener/mod.rs 86.88% 13 Missing and 3 partials ⚠️
datafusion/proto-common/src/generated/pbjson.rs 26.66% 8 Missing and 3 partials ⚠️
datafusion/datasource-parquet/src/source.rs 33.33% 8 Missing ⚠️
...afusion/datasource-parquet/src/row_group_filter.rs 83.33% 4 Missing ⚠️
...tafusion/physical-expr-common/src/metrics/value.rs 88.23% 2 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff            @@
##             main   #23851    +/-   ##
========================================
  Coverage   82.49%   82.50%            
========================================
  Files        1140     1141     +1     
  Lines      438529   439018   +489     
  Branches   438529   439018   +489     
========================================
+ Hits       361783   362200   +417     
- Misses      54874    54933    +59     
- Partials    21872    21885    +13     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@alamb

alamb commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

Thanks @DarkWanderer -- do you have any benchmarks / examples showing this in action / showing how it is faster?

The idea in theory sounds reasonable but it would be good to verify it in practice

@github-actions github-actions Bot added the core Core DataFusion crate label Aug 16, 2026
@DarkWanderer

Copy link
Copy Markdown
Contributor Author

Thanks for feedback @alamb

Here is a benchmark on synthetic dataset mimicking the shape of observability traces data. The specific property that highlights the performance gain is - TraceIDs are pseudo-random (so stats-based pruning doesn't help), but are clustered in time.

I imagine it would be applicable to any "needle in haystack" scan where the search key is clustered along sorting key.

Wall-clock time

Criterion, measurement_time=20s, sample_size=10. Reported as [lower – mean – upper] (95% CI).

query variant time
trace_lookup stats_only 139.07 – 139.77 – 140.59 ms
trace_lookup dictionary 16.570 – 16.668 – 16.745 ms
trace_lookup bloom_filter 26.027 – 26.206 – 26.383 ms
trace_lookup bloom_and_dictionary 12.515 – 12.557 – 12.632 ms
trace_lookup_in stats_only 145.01 – 145.52 – 146.43 ms
trace_lookup_in dictionary 17.070 – 17.141 – 17.280 ms
trace_lookup_in bloom_filter 119.48 – 120.15 – 120.93 ms
trace_lookup_in bloom_and_dictionary 16.675 – 17.050 – 17.262 ms
tenant_not_in stats_only 110.58 – 111.31 – 111.95 ms
tenant_not_in dictionary 42.035 – 43.480 – 44.281 ms
tenant_not_in bloom_filter 111.48 – 111.89 – 112.35 ms
tenant_not_in bloom_and_dictionary 41.197 – 43.731 – 45.428 ms

Dictionary pruning is ~comparable to bloom filter in wall clock, but importantly, doesn't require extra writes; also, it can be used together with bloom filtering, compounding the win. More importantly, it allows better performance for "in" and "not in" scenarios which degrade bloom performance or cannot be handled at all respectively.

Bytes read

This measures the efficiency gain from more precise page pruning. This win is not fully highlighted by using local SSD - but in S3-backed object-store context, I expect that reduction to have a much more pronounced effect.

query variant row groups kept bytes_scanned index bytes data pages
trace_lookup stats_only 64/64 383.09MiB 0 383.09MiB
trace_lookup dictionary 1/64 8.12MiB 2.13MiB (dict) 5.99MiB
trace_lookup bloom_filter 4/64 24.07MiB 129.00KiB (bloom) 23.94MiB
trace_lookup bloom_and_dictionary 1/64 6.25MiB n/a n/a
trace_lookup_in stats_only 64/64 383.09MiB 0 383.09MiB
trace_lookup_in dictionary 1/64 8.12MiB 2.13MiB (dict) 5.99MiB
trace_lookup_in bloom_filter 50/64 299.42MiB 129.00KiB (bloom) 299.29MiB
trace_lookup_in bloom_and_dictionary 1/64 7.78MiB n/a n/a
tenant_not_in stats_only 64/64 335.96MiB 0 335.96MiB
tenant_not_in dictionary 16/64 84.45MiB 4.43KiB (dict) 84.45MiB
tenant_not_in bloom_filter 64/64 335.96MiB 2.94KiB (bloom) 335.96MiB
tenant_not_in bloom_and_dictionary 16/64 84.45MiB n/a n/a

Grain of salt: this dataset mimics a very specific domain I was optimizing for, I am not sure how well the wins translate to general use cases.

@alamb

alamb commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Thank you for this @DarkWanderer

I am sorry I haven't had a chance to review this -- it sounds great. But I am totally swamped at the moment (and for the forseeable future 😢 )

etseidl added a commit to apache/arrow-rs that referenced this pull request Sep 25, 2026
# Which issue does this PR close?

- Closes #9010.
- Supersedes #9011 (closed as stale)

# Rationale for this change

This change provides low-level API necessary for enabling
dictionary-based pruning in DataFusion:
apache/datafusion#23851

# What changes are included in this PR?

- `parquet::file::metadata::dictionary::decode_dictionary_page`: decodes
a BYTE_ARRAY dictionary page (Thrift header parse, decompress, PLAIN
decode) into a `Utf8`/`Binary` Arrow array.
- `ParquetMetaDataReader::read_column_dictionary` (sync) and
`read_column_dictionary_async` (async) to fetch and decode a given row
group/column's dictionary page from a `ParquetMetaData`, returning
`Ok(None)` if the chunk has no dictionary page.
- `ParquetRecordBatchStreamBuilder::get_row_group_column_dictionary`
convenience method mirroring `get_row_group_column_bloom_filter`.

# Are these changes tested?

Yes: a round-trip unit test for a dictionary-encoded string column, a
non-BYTE_ARRAY rejection test, and sync + async reader tests that decode
a real dictionary page written through `ArrowWriter`.

# Are there any user-facing changes?

Yes, three new public APIs (see above). No changes to
existing API.

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Ed Seidl <etseidl@users.noreply.github.com>
DarkWanderer and others added 2 commits September 25, 2026 21:42
# Conflicts:
#	Cargo.lock
#	Cargo.toml
#	datafusion/datasource-parquet/src/metrics.rs
#	datafusion/datasource-parquet/src/opener/mod.rs
#	datafusion/datasource-parquet/src/row_group_filter.rs
#	datafusion/physical-expr-common/src/metrics/value.rs
#	datafusion/proto/src/logical_plan/file_formats.rs
#	datafusion/sqllogictest/test_files/dynamic_filter_pushdown_config.slt
#	datafusion/sqllogictest/test_files/dynamic_row_group_pruning.slt
#	datafusion/sqllogictest/test_files/explain_analyze.slt
#	datafusion/sqllogictest/test_files/limit_pruning.slt
#	datafusion/sqllogictest/test_files/push_down_filter_parquet.slt
apache/arrow-rs#10420 is merged to arrow-rs main as b9b1d5005; the
[patch.crates-io] block (repointed during the upstream/main merge) now
tracks that branch instead of the old DarkWanderer/arrow-rs fork.
Cargo.lock is re-pinned to the merged commit for every patched
arrow-*/parquet crate.

Review changed the final API before merging, so adapt to it:
- ParquetRecordBatchStreamBuilder::get_row_group_column_dictionary was
  renamed to get_column_chunk_dictionary.
- Dictionary pages now always decode as Binary, never Utf8,
  so DictionaryStatistics::insert drops its Utf8/StringArray arm.

Also:
- Fix a tag collision in ParquetOptions' proto message: our
  dictionary_filter_on_read (38) collided with upstream's newly added
  max_in_list_size (also 38). Move ours to the next free tag, 39, and
  regenerate proto-common/proto-models.
- Adapt dictionary_filter.rs's test helper to reader.rs's
  ParquetFileReader, which upstream refactored to build its
  ParquetObjectReader internally rather than taking one as a field.
- Migrate two more PruningPredicate::try_new call sites (deprecated
  since 55.0.0) to PruningPredicateBuilder, needed for a clean
  `-D warnings` clippy run.
- Fix a FixedSizeListArray::value_offset deprecation (arrow-rs 60.0.0)
  in unnest.rs by switching to value_offset_at.
- Add the row_groups_pruned_dictionary / bytes_processed metrics to
  the .slt golden files upstream's merge didn't touch (DataSourceExec
  lines outside the merge's conflict hunks).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions github-actions Bot added the physical-plan Changes to the physical-plan crate label Sep 25, 2026
…_pruning.slt

Blank lines 8 and 10 of the header were missing the leading `#`,
which HawkEye's license header check flagged as a conflict.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

auto detected api change Auto detected API change common Related to common crate core Core DataFusion crate datasource Changes to the datasource crate documentation Improvements or additions to documentation physical-expr Changes to the physical-expr crates physical-plan Changes to the physical-plan crate proto Related to proto crate sqllogictest SQL Logic Tests (.slt)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants