Skip to content

[bench] combine apache#24086 (read-ahead) + apache#25752 (optional filters) - #82

Closed
adriangb wants to merge 65 commits into
mainfrom
combine-24086-25752
Closed

adriangb wants to merge 65 commits into
mainfrom
combine-24086-25752

Conversation

@adriangb

Copy link
Copy Markdown
Member

Combines apache#24086 (batch-granular Parquet scans with read_ahead_bytes) and apache#25752 (optional filters stack) for benchmarking. Do not merge.

The merge resolves conflicts in datafusion/datasource-parquet/src/push_decoder.rs: the read-ahead path (transition_streaming) and the default path share the post-scan filter, coalescer, limit and row group boundary logic (pending_output, push_decoded_batch, handle_row_group_boundary).

Local checks: datafusion-datasource-parquet unit tests pass, parquet sqllogictests pass, and the full sqllogictest suite with read_ahead_bytes forced to 64 KiB returns the same query results (only predicate cache metrics differ).

🤖 Generated with Claude Code

adriangb and others added 30 commits September 28, 2026 01:25
…s nothing

Page-index pruning installed a row selection for each row group that it
examined, also when the selection skipped no rows. The opener treats any
row selection as live, so a select-all selection disabled runtime
(dynamic filter) row-group pruning and statistics-based row-group
reordering for the whole file.

Keep the row group as a full scan when the page index skips no rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…IN list

In partitioned mode the hash join pushes a routed filter:

  CASE hash_repartition % N WHEN i THEN bounds_i AND key IN (list_i) ... END

When every non-empty build partition pushes an InList and no partition is
canceled, the routing is redundant. Routing is a deterministic function of
the join keys, so a build row with key K is in the partition that a probe
row with key K routes to. A test of K against the union of all lists
therefore accepts the same rows as the routed CASE. The per-partition
bounds reject no additional rows either, because every key in a list is
inside the bounds of its partition.

The filter is now `key IN (union)`. This removes the per-row routing hash
from the probe side, and the pruning code can use an InList (up to
`max_in_list_size`), which it cannot do with a CASE.

The union is capped at 1 MiB. Each partition's list is limited
independently by `hash_join_inlist_pushdown_max_size`, so the union grows
with the partition count; past the cap the routed CASE, where a probe row
checks only one list, stays in use. Partitions that push a hash table, and
builds with a canceled partition, also keep the CASE.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The per-partition InList arrays hold one entry per build row, and the
collapsed union concatenated them. On TPC-DS SF1 with 12 partitions, Q65
pushed 54,000 entries for 6 distinct keys, and Q18 pushed 10,848 entries
for 1,178 distinct keys. The pruning code uses an IN list only up to
`max_in_list_size` (20) entries, so these filters gave no pruning term,
and the long lists made the statistics evaluation for each file range
slow.

The union is now deduplicated and sorted with the arrow row format before
the IN list is built. This works for single and struct (multi-column)
keys and dictionaries, keeps one NULL, and makes the list order
deterministic. The 1 MiB cap now applies to the deduplicated union.

The collapsed filter also gets one range per key column,
`col >= min AND col <= max`, from the combined bounds of all non-empty
partitions, before the IN list. Every key in the union is inside this
range, so the filter stays exact, and the pruning code can use the range
when the list has more than `max_in_list_size` entries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… as separate filters

A partitioned hash join pushed one dynamic filter to the probe side:

  DynamicFilter [ CASE hash_repartition % N
                    WHEN i THEN bounds_i AND membership_i ... END ]

The pruning code cannot use a `CASE`, thus the build-side bounds did not
prune files, row groups or pages, even when the probe side is clustered by
the join key.

A partitioned join now pushes two dynamic filters:

  DynamicFilter [ bounds ] AND DynamicFilter [ membership ]

- Bounds: the union of the bounds of all partitions (new `bounds_union`
  module, adapted from the prototype in apache#24235). It does not need routing,
  so the pruning code can use it. With hash partitioning each column gets
  one range. With range partitioning the disjoint ranges of the partitions
  are kept (up to 8 for each column, OR'd), so the filter also rejects keys
  in the gaps between them.
- Membership: the routed `CASE` without the per-partition bounds (they
  reject no row that the membership check of the partition accepts), or
  the collapsed IN list when every partition pushes an IN list.

The bounds stay in the `CASE` (as before) when the union cannot describe
the build side: a canceled partition, or no usable bounds. An empty build
sets both filters to `false`. The NULL escape of null-equal and null-aware
joins wraps each filter.

A collect-left join does not change: it pushes one filter that holds
`bounds AND membership`. It has no routing `CASE`, so the pruning code can
already use its bounds.

Each filter has its own expression id. The join keeps each filter that
reached a consumer, and both get `update()` and `mark_complete()`. The
proto gets a new `dynamic_filter_bounds` field; a plan without it restores
one filter that holds both the bounds and the membership check, as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add the `hj_ordered_subset` SQL benchmark suite. The probe table
(`events`, 100 days x 200k rows, 100k-row row groups) is sorted by the
join key, and the build side matches 1 day, 10 days, or a scattered 1%
of the key range (control). The bounds of the hash join dynamic filter
can prune the probe row groups outside the matched range, and the
membership check passes almost every remaining row.

Subgroups `partitioned` (Q01-Q03) and `collect_left` (Q04-Q06) force
the HashJoinExec mode, which `expect_plan` checks. An assert checks
that every build row matches exactly one event. The load SQL writes the
data inline; HJOS_DAYS, HJOS_ROWS_PER_DAY and HJOS_RG_SIZE size it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d conjuncts post-scan

Rebased onto main. The original commit 1 of this PR ("extract
DecoderProjection from build_stream") landed independently on main as
current `decoder_projection` / single-decoder + `rg_plan` model.

Two changes, both applied inside the parquet scan so the parent
`FilterExec` can be removed unconditionally for pushable filters:

1. Never drop conjuncts the `RowFilter` cannot place.
   `build_row_filter` previously `.flatten()`-ed away conjuncts that
   `FilterCandidateBuilder::build` rejected (whole-struct references,
   per-file physical-schema mismatches) and swallowed whole-build
   errors. By the time it runs, `try_pushdown_filters` has already
   removed the `FilterExec`, so those conjuncts were applied nowhere —
   wrong results. `build_row_filter` now returns
   `(Option<RowFilter>, Vec<rejected>)`, `RowFilterGenerator` exposes
   `rejected_conjuncts()`, and a whole-file build error routes every
   conjunct to the rejected list rather than relaxing the predicate.

2. Always accept pushable filters and run the remainder post-scan.
   `try_pushdown_filters` reports each pushable filter as accepted so the
   `FilterExec` is always removed; the scan owns the predicate. The
   opener routes conjuncts to two places, applying every one:
     - pushdown_filters=true  -> row-filterable conjuncts via the parquet
       `RowFilter`; rejected conjuncts via the in-scan post-scan filter.
     - pushdown_filters=false -> the whole predicate runs as a post-scan
       filter on decoded batches (behaviorally identical to `FilterExec`).

Implementation:
  - `DecoderProjection` (main's `decoder_projection` module) grows a
    `post_scan_conjuncts` parameter: it widens the decoder mask over
    (user projection ∪ post-scan filter columns), rebases the conjuncts
    onto the stream schema, and returns a `PostScanFilter` applied to
    every decoded batch with SQL `WHERE` semantics. Virtual-column
    conjuncts are stripped from the read-plan mask (they aren't file
    columns) but kept in the post-scan predicate, which sees the
    reader-appended virtual columns.
  - `PushDecoderStreamState` applies the post-scan filter in the decoded-
    batch arm, skips empty batches, and re-introduces a stream-level
    `remaining_limit` (main enforces LIMIT decoder-locally, which is
    unsafe once a post-scan filter can reject rows). The opener routes the
    limit to `remaining_limit` iff a post-scan filter is present.
  - New `post_scan_rows_pruned` / `post_scan_rows_matched` counters and
    `post_scan_filter_eval_time` on `ParquetFileMetrics`.

Tests:
  - `build_row_filter_surfaces_rejected_struct_conjunct` (row_filter.rs)
    asserts the rejected struct conjunct is returned, not dropped.
  - `rejected_struct_conjunct_runs_post_scan_not_dropped` (opener) is
    end-to-end: `s IS NOT NULL` over a struct column with pushdown on
    returns 2 (was 3 before the fix).
  - Parquet `.slt` files regenerated: `FilterExec` above `DataSourceExec`
    gone, predicate on the scan, `post_scan_rows_*` metrics on EXPLAIN
    ANALYZE. Opener / core insta / page_pruning assertions updated for the
    now-applied predicate.

Squashed follow-up commits (see their original messages on the
adriangb/parquet-post-scan-filter branch):
  - perf(parquet-datasource): narrow to the projector's columns before
    filtering
  - perf(parquet-datasource): coalesce post-scan filter output back to
    batch_size
  - perf(parquet-datasource): compact between conjuncts in the post-scan
    filter

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Tests and sqllogictest plans that landed on main after apache#22384 was
opened still expect the old "scan only uses the predicate for
pruning" behaviour. With the scan now applying every accepted filter:

- Two opener tests (`test_prune_all_null_column_equality_from_file_statistics`,
  `test_no_prune_when_missing_column_collapses_mixed_predicate`) now
  expect only the matching rows. The missing-column test also checks
  `post_scan_rows_pruned` so it still proves the file was read, not pruned.
- `string_in_list_pruning.rs` measured unpruned rows with the scan's
  `output_rows`. It now uses the post-scan matched + pruned counters,
  which count the rows that the scan decoded.
- Regenerated plans in `dynamic_filter_pushdown_config.slt`,
  `filter_without_sort_exec.slt`, `push_down_filter_parquet.slt`,
  `range_partitioning.slt` and `range_sorted_time_bin_agg.slt`: the
  `FilterExec` above parquet scans is gone and the new
  `post_scan_rows_*` metrics appear.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When the TopK dynamic filter prunes every remaining row group at a row
group boundary, `rebuild_decoder_at_boundary` returns `Ok(true)` and the
stream calls `finish()`. With a batch coalescer (a post-scan filter is
present, for example with the default `pushdown_filters = false`),
`finish()` flushes the coalescer and returns a batch. The next poll then
went back to the decoder, which still pointed at a row group that the
plan had dropped, and `sync_rg_plan_to_decoder_frontier` failed with
"push decoder frontier RG N is not in rg_plan; decoder and plan have
diverged". ClickBench Q23, Q24 and Q26 fail with this error.

After the flush, the stream now only drains the coalescer.

The new sqllogictest in `dynamic_row_group_pruning.slt` fails without
the fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…stribution

Move the check "a round-robin repartition of this input is useful for its
row count" from `EnforceDistribution` into
`repartition::round_robin_beneficial_for_rows`. The behavior does not
change. The next commit uses the same check in the file scan, so that the
scan and the optimizer make the same decision.

PR: apache#22384

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…et partitions

The Parquet scan accepts all pushable filters, thus `FilterPushdown`
removes the `FilterExec`. For a scan of one small file (one partition,
too small to split into byte ranges), main puts a round-robin
`RepartitionExec` between the scan and the `FilterExec`, and a
`CoalescePartitionsExec` above them. Without the `FilterExec`, the
optimizer adds neither. The filter then runs in one partition, and the
scans of the build sides of the hash joins run one after the other in the
task of the probe side, not in parallel tasks. On TPC-DS SF1 this made
short queries 5% to 30% slower than main (for example Q37 1.26x).

`FileScanConfig::try_pushdown_filters` now makes the same decision as
`EnforceDistribution`: if the scan has fewer than `target_partitions`
partitions, `repartitioned` cannot give more, and a round-robin
repartition is useful for the rows that the scan reads, the filters stay
above the scan (`PushedDown::No`). The scan still gets them, through the
new `FileSource::try_pushdown_pruning_filters`, and uses them only to
prune files, row groups and pages. This is what main does with all
filters when `pushdown_filters` is false. The plan is then the plan of
main for these scans.

- Only the filters of a `FilterExec` stay above the scan. A dynamic filter
  (of a join, a TopK or an aggregate) has no `FilterExec` above the scan,
  thus the scan applies it as before.
- The default of `try_pushdown_pruning_filters` returns `None`: other file
  sources get their filters as before.
- The Parquet scan applies all conjuncts of its predicate or none of them.
  A scan with a pruning-only predicate uses later filters only to prune
  too.
- `ParquetScanExecNode` gets `pruning_only_predicate`, thus a decoded scan
  does not apply its predicate again.
- An exact row count of at most one batch keeps the filter in the scan: a
  round-robin repartition cannot split one batch.

Tests:
- unit tests for the decision in `file_scan_config` and for the
  pruning-only predicate of `ParquetSource`;
- a proto round trip of the pruning-only predicate;
- a sqllogictest plan pin in `parquet_filter_pushdown.slt`;
- `parquet_statistics.slt` (no statistics, thus unknown rows): the plan
  is the plan of main again;
- two Parquet integration tests that check the filter in the scan use one
  target partition.

PR: apache#22384

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…orrectness

Add `OptionalFilterPhysicalExpr`, a transparent wrapper that marks a filter
as optional: a consumer can skip it without changing the query result. A
consumer can skip it only when the wrapper is a direct conjunct of the root
AND chain of its predicate. In all other positions the wrapper is
transparent, because `evaluate()` always evaluates the inner expression.
`snapshot()` returns the inner expression, so pruning sees through it.

Also add:
- `split_optional` and `is_optional_filter` helpers in
  `physical_expr::utils` for consumers
- `PhysicalOptionalFilterNode` proto message (field 29 in
  `PhysicalExprNode`) with self-encoding `try_to_proto`/`try_from_proto`

No producer uses the wrapper yet, so there is no behavior change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With `pushdown_filters = false`, the scan evaluates all accepted filters for each row after the decode. This includes the optional filters (hash join, TopK and aggregate dynamic filters, which the producers wrap in `Optional(...)`). The join dynamic filter evaluated for each row in the scan caused a 1.16x TPC-H regression.

Optional filters are not needed for correctness. Thus the post-scan filter now never gets an optional conjunct (a root `AND` conjunct found with `split_optional`):

- `pushdown_filters = false`: only the required conjuncts run post-scan. Optional conjuncts are used only for statistics, page index, bloom filter and file pruning.
- `pushdown_filters = true`: an optional conjunct that the row filter rejects for a file is not used for that file. A required conjunct that is rejected still runs post-scan.
- A whole-file row filter build error sends only the required conjuncts to the post-scan filter.

Accepted optional conjuncts with `pushdown_filters = true` stay row filter predicates, as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add the `datafusion_physical_expr::filter_stats` module with the shared
primitives that adaptive filter code uses to measure filters at runtime:

- `Clock`: a monotonic clock in nanoseconds that tests can replace.
  `SystemClock` is the real clock. `ManualClock` moves only when a test
  moves it, thus decisions that use time are deterministic in tests.
- `FilterCost`: the rows in, the rows out and the evaluation time of one
  filter, and the derived cost for each row and rows removed for each
  nanosecond.
- `duration_nanos`: a `Duration` in nanoseconds, saturated to `u64::MAX`.

No code uses the module yet, thus behavior does not change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add adaptive conjunct reordering behind
`datafusion.execution.adaptive_filter_reordering` (default `false`): each
stream measures its conjuncts over a warm-up, ranks them by rows dropped
per nanosecond, and adopts a new order (built as a plain `BinaryExpr` AND
chain) only if the estimated cost, using `BinaryExpr`'s pre-selection
rule, is at least 5% lower. Predicates with volatile expressions are
never reordered. The decision is made one time for each stream, and
streams do not share state.

The measurements use `Clock` and `FilterCost` of
`datafusion_physical_expr::filter_stats`, so tests use a `ManualClock`.
`PRE_SELECTION_THRESHOLD` is exported (doc-hidden) so that the cost model
uses the same rule as `BinaryExpr`.

New metric: `adaptive_reorders`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… than they save

Add a runtime gate that pauses optional filters (filters that are not
needed for correctness, such as hash join and TopK dynamic filters) when
they cost more than they save. The gate is a per-stream state machine
(Evaluate / Paused with exponential backoff) that restarts evaluation
when the filter changes. The gate finds the dynamic filters one time
with `DynamicFilterTracking::classify` and then polls their
subscriptions, so a check does not walk the filter tree. Gates do not
share state.

At the end of each window of evaluated batches the gate pauses the
filter if the window removed no rows, or if its evaluation time is
larger than the work that the removed rows save:
`(rows_in - rows_out) * saving_ns_per_row`. The saving for each row is
the configured minimum plus an optional value that the consumer measures
and updates (`MeasuredRowSaving`). The cost rule has a margin (pause
above 1.1x the saving, resume below 0.9x) so that a filter does not
switch on and off when cost and saving are almost equal.

Add the `datafusion.execution.optional_filter_min_saving_ns_per_row`
option (default 20). No operator uses the gate yet, so behavior does not
change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A consumer can now give the gate a fixed cost for each evaluated row in
addition to the evaluation time, with
`MeasuredRowSaving::set_overhead_ns_per_row`. The gate adds it to the cost
of each window. The Parquet scan uses it for the fixed cost of a row filter
stage, which is larger than the evaluation time of a cheap predicate.

PR: apache#25674

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each gate paid for its own first window and its own probes. A scan opens
its files at the same time, thus a filter that removes nothing cost one
window in each file (TPC-H Q9: five join filters that remove no rows and a
CASE routing filter that costs 83 ns for each row, in each of 12 files).

`SharedGateVerdict` holds the last pause (or end of a pause) of the gates
of one plan site in one atomic word. A gate without evidence of its own
(before its first decision, after a filter change, after a pause) uses a
pause that another gate published after the last verdict that it saw: a
new gate starts paused, and a gate in its first window or in a probe
window stops and pauses. Thus usually only one gate probes after a pause.
A gate that keeps the filter does not use the pauses of other gates
(skewed data). A filter change clears the shared pause, because it was
measured on the old filter.

PR: apache#25674

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A gate decided after `sample_batches` batches, whatever their size. After
a selective row filter a batch can have 2 to 7 rows, and the fixed cost
of each call then looks like 600 to 8000 ns for each row: ClickBench Q23
paused the TopK filter on `EventTime` (0.4 ns for each row on full
batches) on such windows, and the shared verdict spread these pauses to
the other files.

All decisions (pause, keep, probe) now need a window of at least
`sample_batches` batches and `MIN_OBSERVED_ROWS` rows. The constant moves
to `filter_stats`, so that the gate and the Parquet filter placement use
the same sample size. All published shared pauses come from such windows.

PR: apache#25674

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The gate assumed that each removed row saves `min_saving_ns_per_row`
(20 ns) after the filter. For hash join dynamic filters this is the probe
work of the join, and it is much smaller in star joins with small
dimension tables: 3.5 to 8 ns for each probe row on the TPC-DS SF1
`date_dim` joins (Q65, Q67), 2 ns on Q90, 17 ns on TPC-H Q9. Filters that
cost 3 to 7 ns for each row and remove 80% of the rows thus stayed on,
and cost more than the join work they saved (8-18% slower than
`pruning_only` on the bot).

`RemovedRowWork` (in `filter_stats`) is the work that the producer of a
filter does for each row that the filter removes, as the producer
measures it. Each `DynamicFilterPhysicalExpr` has one, shared by all its
derived filters. The gate uses the smallest measured work of the dynamic
filters in its filter as the saving of a removed row, and
`min_saving_ns_per_row` only until the producer has measured
`MIN_OBSERVED_ROWS` rows (a prior).

PR: apache#25674

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add `OptionalFilterMode` and the
`datafusion.execution.optional_filter_mode` option (default `always`):

- `always`: evaluate optional filters like any other pushed-down filter
  (today's behavior).
- `adaptive`: evaluate each optional filter behind an
  `OptionalFilterGate`, which pauses it while it costs more than it saves
  or removes no rows.
- `pruning_only`: use optional filters only for statistics pruning.

The Parquet scan and `FilterExec` read this option. This commit alone
does not change behavior.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…heir cost

Make the Parquet scan the first consumer of optional filters (conjuncts
wrapped in `OptionalFilterPhysicalExpr`) when row level filter pushdown
(`datafusion.execution.parquet.pushdown_filters`) is enabled. The
`datafusion.execution.optional_filter_mode` option controls the row filter:

- `always` (default): optional conjuncts are normal RowFilter predicates.
  Behavior does not change.
- `adaptive`: each optional conjunct is a separate RowFilter predicate,
  after all required predicates, with an `OptionalFilterGate`. When the
  gate skips a batch, the predicate lets all rows pass without evaluation.
  Each file has its own gates; gates do not share state.
- `pruning_only`: optional conjuncts are not in the RowFilter.

In `adaptive` mode, the gate times each evaluation of the predicate and
pauses a filter that removes no rows or that costs more than it saves.
The saving of a removed row is the configured minimum
(`datafusion.execution.optional_filter_min_saving_ns_per_row`) plus the
decode time of the output columns that the filter does not read. The
scan estimates this decode time from the compressed size of those column
chunks (file metadata) and a decode speed in ns per compressed byte that
it measures over the whole scan (time to produce each output batch from
the decoder, which does not include the row filter).

`ParquetSource::try_pushdown_filters` reads the mode and the minimum
saving from the session configuration.

In all modes, required conjuncts do not change, and statistics pruning
(files, row groups, pages) uses optional conjuncts as before. An optional
conjunct that cannot be pushed down for a file is dropped for that file.

Add the lazily registered metrics `optional_filter_rows_skipped`,
`optional_filter_pauses` and `optional_filter_eval_time`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…path

The Parquet scan evaluates rejected and non-pushed-down required conjuncts after the decode (apache#22384). Optional conjuncts never go to this post-scan filter. These tests show this behaviour through `ParquetSource::try_pushdown_filters` and all `optional_filter_mode` values:

- `optional_filter_is_not_evaluated_post_scan`: with `pushdown_filters = false`, only the required conjuncts run post-scan. The optional conjuncts are used only for statistics pruning.
- `rejected_optional_filter_is_not_evaluated_post_scan`: with `pushdown_filters = true`, an optional conjunct that the row filter cannot evaluate (a whole-struct `IS NOT NULL`) is not used. The same conjunct as a required conjunct runs post-scan.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`FilterExec` now handles optional conjuncts (see `OptionalFilterPhysicalExpr`)
according to `datafusion.execution.optional_filter_mode`:

- `always` (default): the predicate is not split; today's behavior.
- `pruning_only`: optional conjuncts are not evaluated.
- `adaptive`: required conjuncts run as one ordinary `BinaryExpr` AND chain,
  and each optional conjunct runs behind its own `OptionalFilterGate`, so
  optional conjuncts that remove no rows, or that cost more than they
  save, are paused. The gates measure the evaluation time; the saving for
  each removed row is `datafusion.execution.optional_filter_min_saving_ns_per_row`.

Each stream has its own gates; streams and executions do not share state.
Optional conjuncts do not feed equivalence classes or constants.

New metrics: `optional_filter_rows_skipped`, `optional_filter_pauses`,
`optional_filter_eval_time`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A gate decides only on windows of at least `MIN_OBSERVED_ROWS` rows. Each
test batch now repeats `0..100` so that half a batch has at least
`MIN_OBSERVED_ROWS` rows (the smallest window of a gate).

PR: apache#25683

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`HashJoinExec`, `SortExec` (TopK) and `AggregateExec` now push their
dynamic filters down as `Optional(DynamicFilter)`. The operator itself
still removes the rows that the filter would remove, so the filter is
only a performance hint. The producer keeps its own unwrapped
`DynamicFilterPhysicalExpr` for `update()` and `mark_complete()`; only
the pushed copy is wrapped. A partitioned hash join wraps each of its
two pushed filters (bounds and membership) separately, so both stay
direct conjuncts of the scan predicate.

There is no behavior change. `OptionalFilterPhysicalExpr` evaluates its
inner expression and `snapshot()` removes the wrapper, so scans and
pruning use the filter as before. Only the EXPLAIN text changes, from
`DynamicFilter [...]` to `Optional(DynamicFilter [...])`.

Hash join key transfer rewrites a parent filter below the wrapper, so a
transferred optional dynamic filter stays optional. A transferred
required filter stays required: for inner and semi joins it is an exact
replacement of the parent filter.

Direct downcasts that must see through the wrapper:
- `HashJoinExec::consumed_dynamic_filter` unwraps its self filters
  before it looks for a consumer, so the join still produces its filters.
- `NestedLoopJoinExec::gather_filters_for_pushdown` uses the new
  `as_dynamic_filter` helper to route parent dynamic filters.

Add `as_dynamic_filter` and `debug_assert_optional_on_root_chain` to
`physical_expr::utils`. `ParquetSource::try_pushdown_filters` now checks
in debug builds that optional filters are direct conjuncts of the root
AND chain.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Update the expected plans in sqllogictest files. Pushed-down dynamic
filters now show as `Optional(DynamicFilter [...])`. No query result
changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…h removed row

The hash join records, in the `RemovedRowWork` of each dynamic filter
that it produces, the rows of each probe batch and the time of the work
that it does for every probe row, match or no match: the evaluation and
the hashes of the join keys and the hash table lookup. A row that the
filter removes before the join does not get this work. The work for a
matched row (the output) is not in it: the filter does not remove
matched rows.

PR: apache#25681

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A row that a dynamic filter removes is a probe row without a match. Its
saving is the work that such a row gets: the evaluation and the hashes of
the join keys and the hash table lookup. The check of the candidates
(`equal_rows_arr`) and the output indices are work for the matches only.
While the filter is on, most probe rows that reach the join are matches,
thus this work made the measured saving too large.

PR: apache#25681

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add `datafusion.execution.adaptive_filter_placement` (default `false`). With `pushdown_filters = true`, the Parquet scan decides for each conjunct where to evaluate it, at file open and again at each row group boundary:

- Required conjunct: `RowFilter` (late materialization) or the post-scan filter from apache#22384.
- Optional conjunct in the `adaptive` optional filter mode: `RowFilter`, or `Skip` while its gate is paused. A skipped conjunct is not in the `RowFilter`, thus its columns are not decoded. The scan counts down the pause of the gate with the batches of the skipped row groups.

The decision for a required conjunct compares the decode time that a row filter saves with the extra fetch latency of a row filter stage:

    benefit = skippable fraction * unread output bytes per row * decode ns per byte
    cost    = mean fetch latency / rows of the next row group

The skippable fraction counts rows in 64-row windows where no row passes (the decoder only skips long runs of removed rows). The measurements are pooled over all files and partitions of the scan. Before enough rows are measured, a conjunct that reads all output columns starts in the post-scan filter.

When the placement changes, the stream rebuilds the decoder with `ParquetPushDecoder::into_builder` (new `RowFilter` and projection mask) and builds a new `DecoderProjection`. A file with adaptive placement always uses the batch coalescer and the stream-level `LIMIT`. The placement does not change for a file with a live row selection, or when the new post-scan conjuncts change the narrowed batch schema.

The logic is in the new `filter_placement` module: `model` (pure decision), `stats` (pooled measurements) and `FilePlacement` (per-file state).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
adriangb and others added 15 commits September 28, 2026 01:26
…shold of AND

The post-scan filter copied the working batch (all its columns) to the
surviving rows when a conjunct kept at most 80% of them. The caller then
copies the surviving rows again when it applies the final mask. For a
cheap range predicate that keeps about half of the rows, the first copy
costs much more than the evaluation that it saves on the next conjunct.

TPC-DS Q82, `inventory` scan with `inv_quantity_on_hand BETWEEN 100 AND
500`, SF1, all 11.7M rows (EXPLAIN ANALYZE, 3 runs):

| | post-scan filter eval | scan compute |
|---|---|---|
| threshold 0.8 | 28.4 to 29.2 ms | 104 to 106 ms |
| threshold 0.2 | 4.5 to 4.6 ms | 74 to 78 ms |
| main, `FilterExec` above the scan | 11.7 to 14.1 ms (`FilterExec`) | 64 to 66 ms |

The threshold is now `PRE_SELECTION_THRESHOLD` (0.2), the threshold of
`AND` in `BinaryExpr` that a `FilterExec` uses. Thus the post-scan filter
makes the same copy decision as the `FilterExec` that it replaces. The
old comment gave a `CASE` dynamic filter as the reason for 0.8; the
partitioned hash join dynamic filters are no longer `CASE` expressions,
and optional filters have gates and a measured order.

Without a compaction, the working batch also has the rows that the
earlier conjuncts removed. The measurements of a later conjunct (its
placement statistics and its gate) now count these rows as passing, as
they do after a compaction. Before, a later conjunct got the credit for
rows that it did not remove.

Wall time, min of 16 runs, pushdown on: TPC-DS Q82 1.04x -> 0.96x of
main. TPC-H Q14 1.08x -> 0.94x, Q15 1.09x -> 1.00x, Q12 0.94x ->
0.84x. No other TPC-H, TPC-DS or ClickBench query changed outside the
A/A noise. A threshold of 0 (never compact) is slower on TPC-H Q20
(1.14x) and TPC-DS Q42, Q52, Q55 (1.2x), thus the compaction stays.

PR: apache#25727

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The tests of apache#25729 (page index select-all) and the test of apache#25727 for
the coalesced rows at row group boundaries show the TopK dynamic filter
in the scan predicate. With apache#25681 the pushed filter is
`Optional(DynamicFilter [...])`.

Integration of apache#25729, apache#25727 and apache#25681 in the final state branch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
apache#25780 on main added `FileSource::exact_filter`: the part of the filter
that every output row satisfies, the only part that the scan derives
equivalences from. Its `ParquetSource` version returns the pushable
conjuncts when `pushdown_filters` is on, and nothing otherwise. This PR
changes both cases:

- A pruning-only predicate (a filter that stays in a `FilterExec` above
  a scan that cannot give the target partitions) is used only to prune,
  also with `pushdown_filters = true`. `exact_filter` returned it, thus
  the scan claimed that `a` is constant for `a = 5`, the
  order-preserving repartition merged on `b` only, and
  `ORDER BY b LIMIT 1` returned 2 instead of 1. It now returns `None`.
- With `pushdown_filters = false` the scan applies the accepted
  conjuncts in the post-scan filter. They are exact, thus
  `exact_filter` returns them. This keeps the plans of this PR (for
  example no `SortExec` for `ORDER BY b` with `b = 2`).

Tests: a new case in `push_down_filter_parquet.slt` (a plan pin and two
results that were wrong: `2` for `LIMIT 1`, and `5 2 / 5 1` for the
order) and `exact_filter` checks in the pruning-only unit test. The plan
of the apache#25780 case with `pushdown_filters = false` changes: the scan
applies `a = 5` and there is no `FilterExec`.

PR: apache#22384

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`ParquetSource::exact_filter` (apache#25780) returns the conjuncts that every
output row satisfies. An optional conjunct is not one of them: the scan
does not evaluate it after the decode (this PR), and it drops it when
the `RowFilter` cannot evaluate it. `exact_filter` now skips optional
conjuncts, so that the scan claims no equivalence from them.

Test: `exact_filter_excludes_optional_conjuncts` (failed before this
change: `a@0 = 1 AND Optional(b@1 = 2)` with `pushdown_filters = false`).

PR: apache#25722

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`ParquetSource::exact_filter` (apache#25780) returns the conjuncts that every
output row satisfies. An optional conjunct is not one of them: in the
`adaptive` mode its gate can skip it, in the `pruning_only` mode the scan
does not evaluate it, and the scan drops it when the `RowFilter` cannot
evaluate it. `exact_filter` now skips optional conjuncts in all modes, so
that the scan claims no equivalence from them.

Test: `exact_filter_excludes_optional_conjuncts` (failed before this
change: `a@0 = 1 AND Optional(b@1 = 2)`).

PR: apache#25682

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With adaptive filter placement, an optional conjunct can be in the
post-scan filter (its gate asks for each batch) or skipped. Say so in the
documentation of `ParquetSource::exact_filter`, which already excludes
optional conjuncts.

PR: apache#25727

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The new `parquet_statistics.slt` case of apache#25795 on main pins a
`FilterExec` above the scan. With apache#22384 the scan accepts the filter (one
file of two rows keeps the filter in the scan), thus the plan is the
scan alone. Its statistics are still `Rows=Inexact(2)`, not empty, and the
query result does not change.

Integration of apache#22384 and main in the final state branch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e default

Change two defaults:

- `datafusion.execution.optional_filter_mode` = `adaptive` (was `always`).
  The Parquet scan and `FilterExec` pause optional filters (hash join,
  TopK and aggregate dynamic filters) when they remove no rows or cost
  more than they save.
- `datafusion.execution.adaptive_filter_placement` = `true` (was
  `false`). With `pushdown_filters = true`, each filter conjunct starts
  after the decode, and the Parquet scan makes it a row filter only when
  the measurements show that this saves more than it costs.

The Parquet scan uses the two options only when
`datafusion.execution.parquet.pushdown_filters` is true. `ParquetSource::new`
keeps adaptive filter placement off, because the source has no setter for
it: only `try_pushdown_filters` applies the session value.

Tests that check exact row filter metrics (predicate cache, runtime row
group pruning, optional filters in the row filter, EXPLAIN ANALYZE
categories) set the previous values, because the adaptive decisions use
time measurements, and because adaptive filter placement coalesces small
batches, which delays TopK dynamic filters on tiny row groups.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The previous commit made the scan hand the coalesced rows to the TopK at
each row group boundary. Thus the runtime row group pruning tests do not
need the previous defaults any more:

- `dynamic_row_group_pruning.slt` runs with the defaults. A new case
  checks that the scan prunes the same row groups without adaptive
  filter placement.
- The Parquet test harness keeps `optional_filter_mode = 'always'`,
  because its tests check exact metrics, but uses the default adaptive
  filter placement.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With the adaptive filter placement, an optional filter starts in the
post-scan filter like a required conjunct, thus the `EXPLAIN ANALYZE`
metrics move from `pushdown_rows_*` and `predicate_cache_*` to
`post_scan_rows_*`. The results do not change.

PR: apache#25727

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
EXPERIMENT: pin every arrow crate to pydantic/arrow-rs
claude/push-decoder-batch-granular-scan-plan-60.0.0: the 60.0.0 release
plus batch-granular decoding in ParquetPushDecoder (apache/arrow-rs#6946)
and ParquetPushDecoder::scan_plan (apache/arrow-rs#10555).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… read-ahead

Opt-in with datafusion.execution.parquet.read_ahead_bytes (default
unset). If set, the scan builds the same ParquetPushDecoder as the
default path with FetchGranularity::Batch and drives it with try_decode.
ReadAhead fetches ranges from scan_plan() in the background within that
many bytes. datafusion.execution.parquet.read_ahead_conditional (default
false) also reads ahead ranges that a pushed-down filter can make
unnecessary. Filtered scans, runtime row-group pruning and the
per-row-group filter toggle use the same path as main.

Squashed from the history in branch
claude/datafusion-rowgroup-buffering-history (pydantic/datafusion).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ranges

Skipping ranges that a pushed-down filter can make unnecessary made
filtered scans on object storage 2-16x slower. Read-ahead now fetches
them, bounded by the read-ahead window. Proto field 40 is reserved.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each read-ahead stream registers a `ParquetReadAhead[partition]`
consumer. The reservation follows the bytes the decoder holds plus the
bytes in flight. Bytes the decoder asks for are always reserved (grow).
Speculative read-ahead takes only what the pool can grant (try_grow);
ranges that do not fit stay pending.

`FileSource::create_morselizer_with_context` gives the source the scan's
`TaskContext`. The default delegates to `create_morselizer`.
`ParquetSource` uses it to get the memory pool.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@adriangb

Copy link
Copy Markdown
Member Author

run benchmark tpch tpcds clickbench_partitioned

env:
  DATAFUSION_EXECUTION_PARQUET_PUSHDOWN_FILTERS: "true"
  SIMULATE_LATENCY: "true"
changed:
  env:
    DATAFUSION_EXECUTION_PARQUET_READ_AHEAD_BYTES: "104857600"

@macroscopeapp

macroscopeapp Bot commented Sep 29, 2026

Copy link
Copy Markdown

Macroscope skipped reviewing this pull request. Per-review cost limit exceeded (workspace setting).

This review would cost an estimated $56.68, which exceeds your per-review limit of $10.00.

The top 3 files driving up this estimate:

File Diff Size Estimate
datafusion/sqllogictest/test_files/push_down_filter_parquet.slt 92.44KB $4.62
datafusion/datasource-parquet/src/opener/mod.rs 79.24KB $3.96
datafusion/datasource-parquet/src/row_filter.rs 66.24KB $3.31

Tip

To get this pull request reviewed, you can:

  1. Comment @macroscope-app on this PR to request a manual review (monthly spend limits still apply).
  2. Exclude the file(s) above from review by adding a pattern to your .macroscope/ignore.md — note that creating this file replaces Macroscope's built-in default ignores rather than extending them.
  3. Raise your cost limit in your workspace billing settings.

Turn off this reminder going forward

@adriangb

Copy link
Copy Markdown
Member Author

Moved to adriangb#17 (the benchmark bot does not watch this repo).

@adriangb adriangb closed this Sep 29, 2026
@github-actions

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 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 shlex v2.0.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
    Checking memchr v2.8.3
   Compiling libm v0.2.16
   Compiling num-traits v0.2.19
    Checking bytes v1.12.1
   Compiling zerocopy v0.8.59
   Compiling serde_core v1.0.229
   Compiling getrandom v0.3.4
    Checking foldhash v0.2.0
    Checking once_cell v1.21.4
    Checking itoa v1.0.18
    Checking equivalent v1.0.2
    Checking allocator-api2 v0.2.21
    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
    Checking iana-time-zone v0.1.65
   Compiling version_check v0.9.5
    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 chrono-tz v0.10.4
   Compiling pkg-config v0.3.34
    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
   Compiling zstd-sys v2.1.0+zstd.1.5.7
    Checking zerovec v0.11.8
    Checking pin-project-lite v0.2.17
    Checking half v2.7.1
    Checking arrow-buffer v60.0.0
    Checking tinystr v0.8.4
    Checking futures-core v0.3.34
    Checking smallvec v1.16.2
   Compiling object v0.39.1
    Checking arrow-data v60.0.0
    Checking writeable v0.6.4
    Checking futures-sink v0.3.34
   Compiling zstd-safe v8.0.0
    Checking litemap v0.8.3
    Checking lexical-util v1.0.7
    Checking icu_locale_core v2.3.0
    Checking potential_utf v0.1.6
    Checking zerotrie v0.2.5
   Compiling icu_properties_data v2.3.0
    Checking utf8_iter v1.0.4
   Compiling icu_normalizer_data v2.3.0
    Checking bitflags v2.13.2
    Checking arrow-array v60.0.0
    Checking icu_collections v2.3.0
    Checking icu_provider v2.3.1
   Compiling tokio-macros v2.7.2
   Compiling crc32fast v1.5.2
   Compiling semver v1.0.28
   Compiling rustc_version v0.4.1
    Checking arrow-cmp v60.0.0
    Checking tokio v1.53.1
    Checking arrow-select v60.0.0
    Checking lexical-write-integer v1.0.6
    Checking lexical-parse-integer v1.0.6
    Checking futures-channel v0.3.34
   Compiling ar_archive_writer v0.5.3
   Compiling futures-macro v0.3.34
    Checking simd-adler32 v0.3.10
    Checking adler2 v2.0.1
   Compiling parking_lot_core v0.9.12
    Checking futures-io v0.3.34
    Checking futures-task v0.3.34
    Checking slab v0.4.12
   Compiling getrandom v0.4.3
    Checking rand_core v0.10.1
    Checking futures-util v0.3.34
    Checking miniz_oxide v0.9.1
   Compiling psm v0.1.32
    Checking lexical-parse-float v1.0.6
    Checking lexical-write-float v1.0.6
    Checking icu_normalizer v2.3.0
    Checking icu_properties v2.3.0
   Compiling flatbuffers v25.12.19
    Checking aho-corasick v1.1.5
    Checking scopeguard v1.2.0
    Checking base64 v0.23.1
    Checking unicode-width v0.2.2
    Checking ryu v1.0.23
    Checking regex-syntax v0.8.11
    Checking zlib-rs v0.6.8
   Compiling cfg_aliases v0.2.2
    Checking unicode-segmentation v1.13.3
    Checking comfy-table v8.0.1
   Compiling nix v0.31.3
    Checking flate2 v1.1.10
    Checking lock_api v0.4.14
    Checking idna_adapter v1.2.2
    Checking lexical-core v1.0.6
    Checking regex-automata v0.4.18
    Checking arrow-ord v60.0.0
    Checking atoi v3.1.0
   Compiling stacker v0.1.25
    Checking percent-encoding v2.3.2
   Compiling snap v1.1.2
    Checking alloc-no-stdlib v3.0.0
   Compiling thiserror v2.0.21
    Checking twox-hash v2.1.4
    Checking lz4_flex v0.14.0
    Checking alloc-stdlib v0.3.0
    Checking form_urlencoded v1.2.2
    Checking arrow-cast v60.0.0
    Checking idna v1.1.0
    Checking regex v1.13.1
    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 simdutf8 v0.1.5
    Checking same-file v1.0.6
    Checking either v1.18.0
    Checking csv v1.4.0
    Checking walkdir v2.5.0
    Checking tracing v0.1.44
    Checking itertools v0.15.0
    Checking futures v0.3.34
    Checking url v2.5.8
    Checking zstd v0.14.0
    Checking brotli-decompressor v6.0.1
    Checking arrow-ipc v60.0.0
    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 humantime v2.4.0
    Checking untrusted v0.9.0
    Checking log v0.4.34
    Checking recursive v0.1.1
    Checking brotli v9.0.0
    Checking object_store v0.14.2
    Checking arrow-csv 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 sqlparser_derive v0.6.0
   Compiling seq-macro v0.3.6
    Checking sqlparser v0.63.0
    Checking arrow v60.0.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 cmov v0.5.4
   Compiling crossbeam-utils v0.8.23
    Checking foldhash v0.1.5
    Checking cpufeatures v0.3.1
   Compiling rustix v1.1.5
    Checking hashbrown v0.15.5
    Checking parquet v60.0.0
    Checking crypto-common v0.2.2
    Checking block-buffer v0.12.1
    Checking ctutils v0.4.2
    Checking ppv-lite86 v0.2.21
    Checking rand_core v0.9.5
    Checking fixedbitset v0.5.7
    Checking const-oid v0.10.2
    Checking linux-raw-sys v0.12.1
    Checking petgraph v0.8.3
    Checking digest v0.11.3
    Checking rand_chacha v0.9.0
    Checking tokio-util v0.7.19
    Checking fastrand v2.5.0
    Checking hashbrown v0.14.5
   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 constant_time_eq v0.4.2
    Checking arrayvec v0.7.8
    Checking sha2 v0.11.0
    Checking md-5 v0.11.0
    Checking blake2 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 bzip2 v0.6.1
    Checking glob v0.3.4
    Checking chacha20 v0.10.2
   Compiling bigdecimal v0.4.11
    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.44
    Checking arrow-avro v60.0.0
    Checking datafusion-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/common)
    Checking async-compression v0.4.49
    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)
    Checking datafusion-session v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/session)
    Checking datafusion-datasource v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource)
    Checking datafusion-pruning v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/pruning)
    Checking datafusion-catalog v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/catalog)
    Checking datafusion-datasource-json v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource-json)
    Checking datafusion-datasource-avro v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource-avro)
    Checking datafusion-physical-optimizer v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-optimizer)
    Checking datafusion-datasource-parquet v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource-parquet)
    Checking datafusion-datasource-arrow v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource-arrow)
error[E0432]: unresolved import `parquet::arrow::push_decoder::FetchGranularity`
  --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/opener/mod.rs:95:5
   |
95 | use parquet::arrow::push_decoder::FetchGranularity;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^----------------
   |                                   |
   |                                   no `FetchGranularity` in `arrow::push_decoder`

error[E0432]: unresolved imports `parquet::arrow::push_decoder::PlannedRange`, `parquet::arrow::push_decoder::ScanPlan`
  --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/push_decoder.rs:58:52
   |
58 |     ParquetPushDecoder, ParquetPushDecoderBuilder, PlannedRange, RowGroupSelection,
   |                                                    ^^^^^^^^^^^^ no `PlannedRange` in `arrow::push_decoder`
59 |     ScanPlan,
   |     ^^^^^^^^ no `ScanPlan` in `arrow::push_decoder`

    Checking datafusion-catalog-listing v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/catalog-listing)
    Checking datafusion-functions-table v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-table)
    Checking datafusion-datasource-csv v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource-csv)
error[E0599]: no method named `with_fetch_granularity` found for struct `ArrowReaderBuilder<T>` in the current scope
    --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/opener/mod.rs:2005:35
     |
2005 |                 builder = builder.with_fetch_granularity(FetchGranularity::Batch);
     |                                   ^^^^^^^^^^^^^^^^^^^^^^ method not found in `ArrowReaderBuilder<PushDecoderInput>`

error[E0599]: no method named `scan_plan` found for struct `ParquetPushDecoder` in the current scope
    --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/opener/mod.rs:2089:44
     |
2089 |             ReadAhead::new(window, decoder.scan_plan(), memory)
     |                                            ^^^^^^^^^ method not found in `ParquetPushDecoder`

error[E0599]: no method named `scan_plan` found for struct `ParquetPushDecoder` in the current scope
    --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/push_decoder.rs:1116:43
     |
1116 |             read_ahead.reset_plan(decoder.scan_plan());
     |                                           ^^^^^^^^^ method not found in `ParquetPushDecoder`

Some errors have detailed explanations: E0432, E0599.
For more information about an error, try `rustc --explain E0432`.
error: could not compile `datafusion-datasource-parquet` (lib) due to 5 previous errors

-----

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 [  33.875s] (current)
     Parsing datafusion-common v55.1.0 (current)
      Parsed [   0.063s] (current)
    Building datafusion-common v55.1.0 (baseline)
       Built [  33.835s] (baseline)
     Parsing datafusion-common v55.1.0 (baseline)
      Parsed [   0.064s] (baseline)
    Checking datafusion-common v55.1.0 -> v55.1.0 (no change; assume patch)
     Checked [   0.676s] 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 ExecutionOptions.adaptive_filter_reordering in /home/runner/work/datafusion/datafusion/datafusion/common/src/config.rs:952
  field ExecutionOptions.optional_filter_mode in /home/runner/work/datafusion/datafusion/datafusion/common/src/config.rs:952
  field ExecutionOptions.optional_filter_min_saving_ns_per_row in /home/runner/work/datafusion/datafusion/datafusion/common/src/config.rs:952
  field ExecutionOptions.adaptive_filter_placement in /home/runner/work/datafusion/datafusion/datafusion/common/src/config.rs:952
  field ParquetOptions.read_ahead_bytes in /home/runner/work/datafusion/datafusion/datafusion/common/src/config.rs:1417

     Summary semver requires new major version: 1 major and 0 minor checks failed
    Finished [  69.885s] datafusion-common
    Building datafusion-datasource v55.1.0 (current)
       Built [  44.587s] (current)
     Parsing datafusion-datasource v55.1.0 (current)
      Parsed [   0.033s] (current)
    Building datafusion-datasource v55.1.0 (baseline)
       Built [  44.410s] (baseline)
     Parsing datafusion-datasource v55.1.0 (baseline)
      Parsed [   0.034s] (baseline)
    Checking datafusion-datasource v55.1.0 -> v55.1.0 (no change; assume patch)
     Checked [   0.276s] 223 checks: 223 pass, 31 skip
     Summary no semver update required
    Finished [  90.682s] datafusion-datasource
    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 getrandom v0.3.4
    Checking foldhash v0.2.0
    Checking once_cell v1.21.4
    Checking allocator-api2 v0.2.21
    Checking equivalent v1.0.2
   Compiling serde_core v1.0.229
    Checking itoa v1.0.18
    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
    Checking siphasher v1.0.4
   Compiling version_check v0.9.5
   Compiling synstructure v0.14.0
   Compiling ahash v0.8.12
    Checking phf_shared v0.12.1
    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
    Checking arrow-schema v60.0.0
   Compiling zerofrom-derive v0.1.8
   Compiling yoke-derive v0.8.3
    Checking phf v0.12.1
    Checking zerofrom v0.1.8
    Checking yoke v0.8.3
   Compiling zerovec-derive v0.11.6
   Compiling jobserver v0.1.35
    Checking num-complex v0.4.6
   Compiling find-msvc-tools v0.1.14
   Compiling shlex v2.0.1
    Checking zerovec v0.11.8
   Compiling cc v1.5.1
   Compiling displaydoc v0.2.7
    Checking tinystr v0.8.4
    Checking writeable v0.6.4
    Checking lexical-util v1.0.7
    Checking litemap v0.8.3
    Checking smallvec v1.16.2
    Checking pin-project-lite v0.2.17
   Compiling pkg-config v0.3.34
    Checking icu_locale_core v2.3.0
   Compiling zstd-sys v2.1.0+zstd.1.5.7
    Checking zerotrie v0.2.5
    Checking potential_utf v0.1.6
   Compiling icu_normalizer_data v2.3.0
    Checking futures-core v0.3.34
   Compiling icu_properties_data v2.3.0
    Checking bitflags v2.13.2
    Checking futures-sink v0.3.34
    Checking utf8_iter v1.0.4
    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-parse-integer v1.0.6
    Checking lexical-write-integer v1.0.6
   Compiling futures-macro v0.3.34
    Checking futures-task v0.3.34
   Compiling parking_lot_core v0.9.12
    Checking arrow-array v60.0.0
    Checking futures-io v0.3.34
   Compiling zstd-safe v8.0.0
    Checking slab v0.4.12
    Checking lexical-write-float v1.0.6
    Checking futures-util v0.3.34
    Checking lexical-parse-float v1.0.6
    Checking icu_properties v2.3.0
    Checking icu_normalizer 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 ryu v1.0.23
    Checking unicode-segmentation v1.13.3
    Checking regex-syntax v0.8.11
    Checking unicode-width v0.2.2
    Checking base64 v0.23.1
   Compiling cfg_aliases v0.2.2
    Checking scopeguard v1.2.0
    Checking lock_api v0.4.14
   Compiling nix v0.31.3
    Checking comfy-table v8.0.1
    Checking arrow-ord v60.0.0
    Checking tokio v1.53.1
    Checking idna_adapter v1.2.2
    Checking lexical-core v1.0.6
    Checking regex-automata v0.4.18
    Checking atoi v3.1.0
    Checking percent-encoding v2.3.2
   Compiling getrandom v0.4.3
   Compiling thiserror v2.0.21
    Checking alloc-no-stdlib v3.0.0
    Checking twox-hash v2.1.4
    Checking lz4_flex v0.14.0
    Checking alloc-stdlib v0.3.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 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 tracing v0.1.44
    Checking csv v1.4.0
    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 untrusted v0.9.0
   Compiling anyhow v1.0.104
    Checking zlib-rs v0.6.8
    Checking humantime v2.4.0
    Checking object_store v0.14.2
    Checking flate2 v1.1.10
    Checking brotli v9.0.0
    Checking arrow-csv v60.0.0
    Checking arrow-json v60.0.0
    Checking zstd v0.14.0
    Checking arrow-ipc 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
    Checking uuid v1.26.1
   Compiling itertools v0.14.0
    Checking hex v0.4.3
   Compiling pin-project-internal v1.1.13
    Checking parquet v60.0.0
   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 pin-project v1.1.13
    Checking linux-raw-sys v0.12.1
    Checking rand_chacha v0.9.0
   Compiling prost-derive v0.14.4
    Checking foldhash v0.1.5
    Checking hashbrown v0.14.5
    Checking fastrand v2.5.0
    Checking dashmap v6.2.1
    Checking hashbrown v0.15.5
    Checking prost v0.14.4
    Checking tempfile v3.27.0
    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 petgraph v0.8.3
    Checking datafusion-common-runtime v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/common-runtime)
    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)
    Checking datafusion-session v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/session)
    Checking datafusion-datasource v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource)
    Checking datafusion-pruning v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/pruning)
 Documenting datafusion-datasource-parquet v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource-parquet)
error[E0432]: unresolved import `parquet::arrow::push_decoder::FetchGranularity`
  --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/opener/mod.rs:95:5
   |
95 | use parquet::arrow::push_decoder::FetchGranularity;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^----------------
   |                                   |
   |                                   no `FetchGranularity` in `arrow::push_decoder`

error[E0432]: unresolved imports `parquet::arrow::push_decoder::PlannedRange`, `parquet::arrow::push_decoder::ScanPlan`
  --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/push_decoder.rs:58:52
   |
58 |     ParquetPushDecoder, ParquetPushDecoderBuilder, PlannedRange, RowGroupSelection,
   |                                                    ^^^^^^^^^^^^ no `PlannedRange` in `arrow::push_decoder`
59 |     ScanPlan,
   |     ^^^^^^^^ no `ScanPlan` in `arrow::push_decoder`

For more information about this error, try `rustc --explain E0432`.
error: could not document `datafusion-datasource-parquet`

-----

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 v55.1.0 (current)
       Built [  29.501s] (current)
     Parsing datafusion-physical-expr v55.1.0 (current)
      Parsed [   0.053s] (current)
    Building datafusion-physical-expr v55.1.0 (baseline)
       Built [  29.673s] (baseline)
     Parsing datafusion-physical-expr v55.1.0 (baseline)
      Parsed [   0.049s] (baseline)
    Checking datafusion-physical-expr v55.1.0 -> v55.1.0 (no change; assume patch)
     Checked [   0.352s] 223 checks: 223 pass, 31 skip
     Summary no semver update required
    Finished [  60.673s] datafusion-physical-expr
    Building datafusion-physical-optimizer v55.1.0 (current)
       Built [  41.655s] (current)
     Parsing datafusion-physical-optimizer v55.1.0 (current)
      Parsed [   0.021s] (current)
    Building datafusion-physical-optimizer v55.1.0 (baseline)
       Built [  41.845s] (baseline)
     Parsing datafusion-physical-optimizer v55.1.0 (baseline)
      Parsed [   0.022s] (baseline)
    Checking datafusion-physical-optimizer v55.1.0 -> v55.1.0 (no change; assume patch)
     Checked [   0.133s] 223 checks: 223 pass, 31 skip
     Summary no semver update required
    Finished [  84.830s] datafusion-physical-optimizer
    Building datafusion-physical-plan v55.1.0 (current)
       Built [  39.238s] (current)
     Parsing datafusion-physical-plan v55.1.0 (current)
      Parsed [   0.182s] (current)
    Building datafusion-physical-plan v55.1.0 (baseline)
       Built [  41.215s] (baseline)
     Parsing datafusion-physical-plan v55.1.0 (baseline)
      Parsed [   0.175s] (baseline)
    Checking datafusion-physical-plan v55.1.0 -> v55.1.0 (no change; assume patch)
     Checked [   0.639s] 223 checks: 223 pass, 31 skip
     Summary no semver update required
    Finished [  82.690s] 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 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 syn v3.0.6
   Compiling syn v2.0.119
    Checking bytes v1.12.1
   Compiling zerocopy v0.8.59
   Compiling jobserver v0.1.35
   Compiling serde_core v1.0.229
   Compiling shlex v2.0.1
   Compiling find-msvc-tools v0.1.14
   Compiling cc v1.5.1
    Checking allocator-api2 v0.2.21
    Checking equivalent v1.0.2
   Compiling getrandom v0.3.4
    Checking once_cell v1.21.4
    Checking foldhash v0.2.0
    Checking itoa v1.0.18
    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
    Checking iana-time-zone v0.1.65
   Compiling version_check v0.9.5
    Checking phf_shared v0.12.1
    Checking chrono v0.4.45
    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 writeable v0.6.4
    Checking futures-sink v0.3.34
    Checking smallvec v1.16.2
    Checking lexical-util v1.0.7
    Checking tinystr v0.8.4
    Checking futures-core v0.3.34
    Checking litemap v0.8.3
    Checking potential_utf v0.1.6
    Checking icu_locale_core v2.3.0
    Checking half v2.7.1
    Checking zerotrie v0.2.5
    Checking bitflags v2.13.2
    Checking arrow-buffer v60.0.0
   Compiling icu_properties_data v2.3.0
    Checking utf8_iter v1.0.4
   Compiling icu_normalizer_data v2.3.0
    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 lexical-parse-integer v1.0.6
    Checking lexical-write-integer v1.0.6
    Checking futures-channel v0.3.34
   Compiling tokio-macros v2.7.2
   Compiling futures-macro v0.3.34
    Checking arrow-array v60.0.0
   Compiling getrandom v0.4.3
    Checking futures-io v0.3.34
    Checking futures-task v0.3.34
    Checking rand_core v0.10.1
    Checking slab v0.4.12
   Compiling parking_lot_core v0.9.12
    Checking futures-util v0.3.34
    Checking tokio v1.53.1
    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 regex-syntax v0.8.11
    Checking unicode-width v0.2.2
    Checking unicode-segmentation v1.13.3
    Checking ryu v1.0.23
   Compiling crc32fast v1.5.2
   Compiling cfg_aliases v0.2.2
    Checking scopeguard v1.2.0
    Checking base64 v0.23.1
    Checking lock_api v0.4.14
   Compiling nix v0.31.3
    Checking comfy-table v8.0.1
    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
    Checking alloc-no-stdlib v3.0.0
    Checking simd-adler32 v0.3.10
   Compiling snap v1.1.2
    Checking adler2 v2.0.1
    Checking percent-encoding v2.3.2
   Compiling thiserror v2.0.21
    Checking twox-hash v2.1.4
    Checking lz4_flex v0.14.0
    Checking form_urlencoded v1.2.2
    Checking miniz_oxide v0.9.1
    Checking alloc-stdlib v0.3.0
    Checking arrow-cast v60.0.0
    Checking idna v1.1.0
    Checking regex v1.13.1
    Checking futures-executor v0.3.34
   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
    Checking zlib-rs v0.6.8
    Checking simdutf8 v0.1.5
    Checking same-file v1.0.6
    Checking walkdir v2.5.0
    Checking tracing v0.1.44
    Checking itertools v0.15.0
    Checking csv v1.4.0
    Checking futures v0.3.34
    Checking url v2.5.8
    Checking flate2 v1.1.10
    Checking brotli-decompressor v6.0.1
    Checking parking_lot v0.12.5
   Compiling async-trait v0.1.92
    Checking http v1.5.0
   Compiling anyhow v1.0.104
    Checking humantime v2.4.0
   Compiling serde v1.0.229
    Checking brotli v9.0.0
    Checking zstd v0.14.0
    Checking object_store v0.14.2
    Checking arrow-csv v60.0.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-row v60.0.0
    Checking arrow-arith v60.0.0
   Compiling serde_derive v1.0.229
   Compiling seq-macro v0.3.6
    Checking log v0.4.34
    Checking arrow v60.0.0
   Compiling itertools v0.14.0
    Checking base64 v0.22.1
    Checking parquet v60.0.0
   Compiling pin-project-internal v1.1.13
    Checking pin-project v1.1.13
   Compiling prost-derive v0.14.4
   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 pbjson v0.9.0
    Checking prost v0.14.4
    Checking rand_chacha v0.9.0
    Checking tokio-util v0.7.19
    Checking fastrand v2.5.0
    Checking hashbrown v0.14.5
    Checking foldhash v0.1.5
    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
    Checking crc-catalog v2.5.0
   Compiling heck v0.5.0
    Checking libbz2-rs-sys v0.2.5
    Checking bzip2 v0.6.1
   Compiling strum_macros v0.28.0
   Compiling ar_archive_writer v0.5.3
    Checking crc v3.4.0
    Checking rand v0.10.3
    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 psm v0.1.32
    Checking tokio-stream v0.1.19
   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)
    Checking datafusion-session v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/session)
    Checking datafusion-datasource v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource)
    Checking datafusion-catalog v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/catalog)
    Checking datafusion-pruning v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/pruning)
    Checking datafusion-datasource-avro v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource-avro)
    Checking datafusion-datasource-json v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource-json)
    Checking datafusion-datasource-parquet v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource-parquet)
    Checking datafusion-datasource-csv v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource-csv)
    Checking datafusion-datasource-arrow v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource-arrow)
error[E0432]: unresolved import `parquet::arrow::push_decoder::FetchGranularity`
  --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/opener/mod.rs:95:5
   |
95 | use parquet::arrow::push_decoder::FetchGranularity;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^----------------
   |                                   |
   |                                   no `FetchGranularity` in `arrow::push_decoder`

error[E0432]: unresolved imports `parquet::arrow::push_decoder::PlannedRange`, `parquet::arrow::push_decoder::ScanPlan`
  --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/push_decoder.rs:58:52
   |
58 |     ParquetPushDecoder, ParquetPushDecoderBuilder, PlannedRange, RowGroupSelection,
   |                                                    ^^^^^^^^^^^^ no `PlannedRange` in `arrow::push_decoder`
59 |     ScanPlan,
   |     ^^^^^^^^ no `ScanPlan` in `arrow::push_decoder`

    Checking datafusion-functions-table v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-table)
    Checking datafusion-catalog-listing v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/catalog-listing)
error[E0599]: no method named `with_fetch_granularity` found for struct `ArrowReaderBuilder<T>` in the current scope
    --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/opener/mod.rs:2005:35
     |
2005 |                 builder = builder.with_fetch_granularity(FetchGranularity::Batch);
     |                                   ^^^^^^^^^^^^^^^^^^^^^^ method not found in `ArrowReaderBuilder<PushDecoderInput>`

error[E0599]: no method named `scan_plan` found for struct `ParquetPushDecoder` in the current scope
    --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/opener/mod.rs:2089:44
     |
2089 |             ReadAhead::new(window, decoder.scan_plan(), memory)
     |                                            ^^^^^^^^^ method not found in `ParquetPushDecoder`

error[E0599]: no method named `scan_plan` found for struct `ParquetPushDecoder` in the current scope
    --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/push_decoder.rs:1116:43
     |
1116 |             read_ahead.reset_plan(decoder.scan_plan());
     |                                           ^^^^^^^^^ method not found in `ParquetPushDecoder`

Some errors have detailed explanations: E0432, E0599.
For more information about an error, try `rustc --explain E0432`.
error: could not compile `datafusion-datasource-parquet` (lib) due to 5 previous errors

-----

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 [  23.258s] (current)
     Parsing datafusion-proto-common v55.1.0 (current)
      Parsed [   0.049s] (current)
    Building datafusion-proto-common v55.1.0 (baseline)
       Built [  22.670s] (baseline)
     Parsing datafusion-proto-common v55.1.0 (baseline)
      Parsed [   0.049s] (baseline)
    Checking datafusion-proto-common v55.1.0 -> v55.1.0 (no change; assume patch)
     Checked [   1.081s] 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.read_ahead_bytes_opt in /home/runner/work/datafusion/datafusion/datafusion/proto-common/src/generated/prost.rs:917
  field ParquetOptions.read_ahead_bytes_opt in /home/runner/work/datafusion/datafusion/datafusion/proto-common/src/generated/prost.rs:917
  field ParquetOptions.read_ahead_bytes_opt in /home/runner/work/datafusion/datafusion/datafusion/proto-common/src/generated/prost.rs:917

     Summary semver requires new major version: 1 major and 0 minor checks failed
    Finished [  48.357s] datafusion-proto-common
    Building datafusion-proto-models v55.1.0 (current)
       Built [  26.054s] (current)
     Parsing datafusion-proto-models v55.1.0 (current)
      Parsed [   0.135s] (current)
    Building datafusion-proto-models v55.1.0 (baseline)
       Built [  25.861s] (baseline)
     Parsing datafusion-proto-models v55.1.0 (baseline)
      Parsed [   0.133s] (baseline)
    Checking datafusion-proto-models v55.1.0 -> v55.1.0 (no change; assume patch)
     Checked [   1.850s] 223 checks: 221 pass, 2 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 ParquetScanExecNode.pruning_only_predicate in /home/runner/work/datafusion/datafusion/datafusion/proto-models/src/generated/prost.rs:2049
  field ParquetScanExecNode.pruning_only_predicate in /home/runner/work/datafusion/datafusion/datafusion/proto-models/src/generated/prost.rs:2049
  field HashJoinExecNode.dynamic_filter_bounds in /home/runner/work/datafusion/datafusion/datafusion/proto-models/src/generated/prost.rs:2164
  field HashJoinExecNode.dynamic_filter_bounds in /home/runner/work/datafusion/datafusion/datafusion/proto-models/src/generated/prost.rs:2164
  field ParquetOptions.read_ahead_bytes_opt in /home/runner/work/datafusion/datafusion/datafusion/proto-models/src/generated/datafusion_proto_common.rs:917
  field ParquetOptions.read_ahead_bytes_opt in /home/runner/work/datafusion/datafusion/datafusion/proto-models/src/generated/datafusion_proto_common.rs:917

--- failure enum_variant_added: enum variant added on exhaustive enum ---

Description:
A publicly-visible enum without #[non_exhaustive] has a new variant.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#enum-variant-new
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.50.0/src/lints/enum_variant_added.ron

Failed in:
  variant ExprType:OptionalFilter in /home/runner/work/datafusion/datafusion/datafusion/proto-models/src/generated/prost.rs:1686
  variant ExprType:OptionalFilter in /home/runner/work/datafusion/datafusion/datafusion/proto-models/src/generated/prost.rs:1686

     Summary semver requires new major version: 2 major and 0 minor checks failed
    Finished [  55.231s] datafusion-proto-models
    Building datafusion-pruning v55.1.0 (current)
       Built [  41.749s] (current)
     Parsing datafusion-pruning v55.1.0 (current)
      Parsed [   0.015s] (current)
    Building datafusion-pruning v55.1.0 (baseline)
       Built [  41.968s] (baseline)
     Parsing datafusion-pruning v55.1.0 (baseline)
      Parsed [   0.017s] (baseline)
    Checking datafusion-pruning v55.1.0 -> v55.1.0 (no change; assume patch)
     Checked [   0.093s] 223 checks: 223 pass, 31 skip
     Summary no semver update required
    Finished [  85.171s] datafusion-pruning
    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 quote v1.0.47
   Compiling unicode-ident v1.0.26
   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 syn v3.0.6
   Compiling syn v2.0.119
   Compiling autocfg v1.5.1
   Compiling find-msvc-tools v0.1.14
    Checking itoa v1.0.18
   Compiling shlex v2.0.1
   Compiling jobserver v0.1.35
    Checking once_cell v1.21.4
   Compiling libm v0.2.16
   Compiling cc v1.5.1
    Checking equivalent v1.0.2
    Checking allocator-api2 v0.2.21
    Checking foldhash v0.2.0
   Compiling num-traits v0.2.19
    Checking hashbrown v0.17.1
   Compiling zmij v1.0.23
    Checking pin-project-lite v0.2.17
    Checking futures-core v0.3.34
    Checking indexmap v2.14.2
   Compiling zerocopy v0.8.59
   Compiling zerocopy-derive v0.8.59
    Checking futures-sink v0.3.34
    Checking errno v0.3.14
   Compiling tokio-macros v2.7.2
    Checking signal-hook-registry v1.4.8
    Checking num-integer v0.1.47
    Checking socket2 v0.6.5
    Checking mio v1.2.3
   Compiling version_check v0.9.5
   Compiling serde_json v1.0.151
    Checking tokio v1.53.1
   Compiling serde v1.0.229
   Compiling serde_derive v1.0.229
   Compiling getrandom v0.3.4
    Checking slab v0.4.12
    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-task v0.3.34
    Checking iana-time-zone v0.1.65
    Checking futures-io 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 tracing v0.1.44
    Checking stable_deref_trait v1.2.1
   Compiling getrandom v0.4.3
    Checking rand_core v0.10.1
    Checking cpufeatures v0.3.1
    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
   Compiling thiserror v2.0.21
    Checking percent-encoding v2.3.2
    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 writeable v0.6.4
    Checking untrusted v0.9.0
    Checking litemap v0.8.3
    Checking base64 v0.23.1
    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
   Compiling icu_normalizer_data v2.3.0
   Compiling icu_properties_data v2.3.0
    Checking utf8_iter v1.0.4
    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 ryu v1.0.23
   Compiling object v0.39.1
   Compiling zstd-safe v8.0.0
    Checking lexical-util v1.0.7
    Checking arrow-array v60.0.0
    Checking regex-syntax v0.8.11
    Checking regex-automata v0.4.18
    Checking arrow-cmp v60.0.0
    Checking arrow-select v60.0.0
    Checking icu_properties v2.3.0
    Checking icu_normalizer 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 typenum v1.20.1
    Checking unicode-width v0.2.2
   Compiling parking_lot_core v0.9.12
    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 simd-adler32 v0.3.10
    Checking scopeguard v1.2.0
    Checking adler2 v2.0.1
    Checking miniz_oxide v0.9.1
    Checking lock_api v0.4.14
   Compiling flatbuffers v25.12.19
    Checking futures v0.3.34
    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
    Checking zlib-rs v0.6.8
   Compiling cfg_aliases v0.2.2
    Checking unicode-segmentation v1.13.3
    Checking comfy-table v8.0.1
   Compiling nix v0.31.3
   Compiling ar_archive_writer v0.5.3
    Checking lexical-core v1.0.6
    Checking flate2 v1.1.10
    Checking arrow-ord v60.0.0
    Checking twox-hash v2.1.4
    Checking atoi v3.1.0
   Compiling stacker v0.1.25
    Checking hex v0.4.3
   Compiling snap v1.1.2
   Compiling psm v0.1.32
    Checking alloc-no-stdlib v3.0.0
    Checking arrow-cast v60.0.0
    Checking alloc-stdlib v0.3.0
    Checking lz4_flex v0.14.0
    Checking parking_lot v0.12.5
    Checking csv-core v0.1.13
    Checking humantime v2.4.0
    Checking simdutf8 v0.1.5
    Checking same-file v1.0.6
    Checking walkdir v2.5.0
    Checking csv v1.4.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-csv v60.0.0
    Checking brotli v9.0.0
    Checking arrow-json 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 uuid v1.26.1
   Compiling sqlparser_derive v0.6.0
   Compiling seq-macro v0.3.6
    Checking hybrid-array v0.4.15
    Checking zstd v0.14.0
    Checking arrow-ipc v60.0.0
    Checking ppv-lite86 v0.2.21
    Checking cmov v0.5.4
    Checking sqlparser v0.63.0
    Checking block-buffer v0.12.1
    Checking crypto-common v0.2.2
    Checking ctutils v0.4.2
    Checking linux-raw-sys v0.12.1
    Checking const-oid v0.10.2
    Checking digest v0.11.3
    Checking parquet v60.0.0
    Checking arrow v60.0.0
    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 fixedbitset v0.5.7
   Compiling heck v0.5.0
    Checking fastrand v2.5.0
    Checking petgraph v0.8.3
    Checking tempfile v3.27.0
    Checking md-5 v0.11.0
    Checking sha2 v0.11.0
    Checking hashbrown v0.14.5
   Compiling datafusion-macros v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/macros)
   Compiling blake3 v1.8.7
    Checking dashmap v6.2.1
   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
   Compiling prost-derive v0.14.4
    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
    Checking compression-core v0.4.33
    Checking http-body v1.1.0
    Checking base64 v0.22.1
    Checking glob v0.3.4
    Checking tower-service v0.3.3
    Checking fnv v1.0.7
    Checking atomic-waker v1.1.2
    Checking try-lock v0.2.5
    Checking want v0.3.1
    Checking h2 v0.4.19
    Checking tokio-stream v0.1.19
    Checking httpdate v1.0.3
    Checking zeroize v1.9.0
    Checking rustls-pki-types v1.15.1
    Checking hyper v1.11.1
    Checking hyper-util v0.1.21
    Checking datafusion-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/common)
   Compiling prost v0.14.4
    Checking http-body-util v0.1.5
    Checking num-bigint v0.4.8
    Checking tower-layer v0.3.3
   Compiling prettyplease v0.2.37
   Compiling rustls v0.23.45
    Checking sync_wrapper v1.0.2
    Checking liblzma v0.4.8
    Checking compression-codecs v0.4.44
    Checking async-compression v0.4.49
   Compiling prost-types v0.14.4
    Checking rustls-webpki v0.103.15
    Checking datafusion-expr-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/expr-common)
   Compiling serde_derive_internals v0.29.1
   Compiling schemars v0.8.22
    Checking subtle v2.6.1
    Checking datafusion-physical-expr-common v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-expr-common)
    Checking mime v0.3.17
    Checking axum-core v0.5.6
   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 datafusion-expr v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/expr)
    Checking tower v0.5.3
    Checking matchit v0.8.4
   Compiling multimap v0.10.1
   Compiling dyn-clone v1.0.20
    Checking axum v0.8.9
   Compiling prost-build v0.14.4
   Compiling regress v0.10.5
   Compiling pbjson-build v0.8.0
    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 hyper-timeout v0.5.2
   Compiling generic-array v0.14.7
   Compiling ident_case v1.0.1
   Compiling strsim v0.11.1
   Compiling portable-atomic v1.15.0
   Compiling darling_core v0.24.1
   Compiling typify-impl v0.5.0
    Checking tonic v0.14.6
   Compiling serde_tokenstream v0.2.3
    Checking ureq-proto v0.6.4
   Compiling bigdecimal v0.4.11
    Checking utf8parse v0.2.2
    Checking crc-catalog v2.5.0
   Compiling bollard-buildkit-proto v0.7.0
    Checking utf8-zero v0.8.1
    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 crc v3.4.0
    Checking anstyle-parse v1.0.0
    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 anstyle-query v1.1.5
    Checking time-core v0.1.9
    Checking anstyle v1.0.14
   Compiling unsafe-libyaml v0.2.11
    Checking colorchoice v1.0.5
    Checking num-conv v0.2.2
    Checking is_terminal_polyfill v1.70.2
    Checking powerfmt v0.2.0
    Checking tinyvec v1.13.3
    Checking time v0.3.55
    Checking unicode-normalization v0.1.25
   Compiling serde_yaml v0.9.34+deprecated
    Checking anstream v1.0.0
   Compiling structmeta v0.3.0
    Checking arrow-avro v60.0.0
   Compiling typify v0.5.0
    Checking datafusion-functions-nested v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-nested)
   Compiling darling v0.24.1
   Compiling pbjson-types v0.8.0
    Checking tokio-rustls v0.26.6
    Checking num-rational v0.4.2
    Checking num-iter v0.1.46
   Compiling serde_repr v0.1.21
   Compiling async-stream-impl v0.3.6
    Checking unicode-bidi v0.3.18
    Checking unicode-properties v0.1.4
    Checking clap_lex v1.1.1
    Checking openssl-probe v0.2.1
    Checking stringprep v0.1.5
    Checking async-stream v0.3.6
    Checking clap_builder v4.6.7
    Checking rustls-native-certs v0.8.4
    Checking bollard-stubs v1.52.1-rc.29.1.3
    Checking datafusion-sql v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/sql)
    Checking datafusion-session v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/session)
    Checking datafusion-datasource v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource)
    Checking num v0.4.3
    Checking hyper-rustls v0.27.10
   Compiling serde_with_macros v3.24.0
   Compiling substrait v0.63.0
    Checking datafusion-catalog v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/catalog)
    Checking datafusion-pruning v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/pruning)
    Checking datafusion-datasource-json v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource-json)
    Checking datafusion-datasource-parquet v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource-parquet)
    Checking datafusion-catalog-listing v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/catalog-listing)
error[E0432]: unresolved import `parquet::arrow::push_decoder::FetchGranularity`
  --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/opener/mod.rs:95:5
   |
95 | use parquet::arrow::push_decoder::FetchGranularity;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^----------------
   |                                   |
   |                                   no `FetchGranularity` in `arrow::push_decoder`

error[E0432]: unresolved imports `parquet::arrow::push_decoder::PlannedRange`, `parquet::arrow::push_decoder::ScanPlan`
  --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/push_decoder.rs:58:52
   |
58 |     ParquetPushDecoder, ParquetPushDecoderBuilder, PlannedRange, RowGroupSelection,
   |                                                    ^^^^^^^^^^^^ no `PlannedRange` in `arrow::push_decoder`
59 |     ScanPlan,
   |     ^^^^^^^^ no `ScanPlan` in `arrow::push_decoder`

    Checking datafusion-functions-table v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/functions-table)
    Checking datafusion-physical-optimizer v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/physical-optimizer)
    Checking datafusion-datasource-arrow v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource-arrow)
error[E0599]: no method named `with_fetch_granularity` found for struct `ArrowReaderBuilder<T>` in the current scope
    --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/opener/mod.rs:2005:35
     |
2005 |                 builder = builder.with_fetch_granularity(FetchGranularity::Batch);
     |                                   ^^^^^^^^^^^^^^^^^^^^^^ method not found in `ArrowReaderBuilder<PushDecoderInput>`

error[E0599]: no method named `scan_plan` found for struct `ParquetPushDecoder` in the current scope
    --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/opener/mod.rs:2089:44
     |
2089 |             ReadAhead::new(window, decoder.scan_plan(), memory)
     |                                            ^^^^^^^^^ method not found in `ParquetPushDecoder`

error[E0599]: no method named `scan_plan` found for struct `ParquetPushDecoder` in the current scope
    --> /home/runner/work/datafusion/datafusion/datafusion/datasource-parquet/src/push_decoder.rs:1116:43
     |
1116 |             read_ahead.reset_plan(decoder.scan_plan());
     |                                           ^^^^^^^^^ method not found in `ParquetPushDecoder`

    Checking datafusion-datasource-csv v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource-csv)
    Checking datafusion-datasource-avro v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/datasource-avro)
   Compiling parse-display-derive v0.9.1
    Checking block-buffer v0.10.4
    Checking crypto-common v0.1.7
    Checking datafusion-optimizer v55.1.0 (/home/runner/work/datafusion/datafusion/datafusion/optimizer)
Some errors have detailed explanations: E0432, E0599.
For more information about an error, try `rustc --explain E0432`.
error: could not compile `datafusion-datasource-parquet` (lib) due to 5 previous errors
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

@adriangb
adriangb deleted the combine-24086-25752 branch September 30, 2026 02:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant