Skip to content

fix: reset aggregate dynamic filters between recursive iterations - #26056

Draft
mikamikasuki wants to merge 2 commits into
apache:mainfrom
mikamikasuki:fix/26054-reset-aggregate-dynamic-filters
Draft

mikamikasuki wants to merge 2 commits into
apache:mainfrom
mikamikasuki:fix/26054-reset-aggregate-dynamic-filters

Conversation

@mikamikasuki

Copy link
Copy Markdown

Which issue does this PR close?

Closes #26054

Rationale for this change

In a recursive CTE, an uncorrelated MIN/MAX over a Parquet table returns the correct value on the first iteration but NULL or an incorrect value on later iterations because the aggregate reuses the dynamic filter tightened during the first scan.

What changes are included in this PR?

Reset AggregateExec's dynamic filter expression and shared accumulator bounds when the plan is reused, allowing each recursive iteration to scan with fresh bounds.

What is the testing strategy for this PR?

Added a cte.slt regression for the reported recursive MAX query. Validation passed: cargo test -p datafusion-sqllogictest --test sqllogictests -- cte.slt; cargo test -p datafusion-physical-plan --lib (2,441 passed); cargo test -p datafusion-physical-expr --lib (1,686 passed, 2 ignored); cargo fmt --all -- --check; and targeted Clippy with -A clippy::ignore_without_reason -D warnings. The unsuppressed Rust 1.99 Clippy run reports the existing ignore_without_reason lint in datafusion/physical-expr/src/planner.rs.

Are there any user-facing changes?

Recursive CTE iterations now return the correct aggregate result consistently while retaining dynamic-filter pruning.

@github-actions github-actions Bot added physical-expr Changes to the physical-expr crates sqllogictest SQL Logic Tests (.slt) physical-plan Changes to the physical-plan crate labels Oct 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

physical-expr Changes to the physical-expr crates physical-plan Changes to the physical-plan crate sqllogictest SQL Logic Tests (.slt)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Recursive CTE: MIN/MAX aggregate dynamic filter survives reset_state, later iterations return wrong results

1 participant