Commit 2f25454
authored
fix: preserve aggregate filter pushdown order (#22926)
## Which issue does this PR close?
- Closes #22925.
## Rationale for this change
`FilterPushdown` maps each child pushdown result back to its original
parent
filter by position. `AggregateExec::gather_filters_for_pushdown`
previously
split parent filters into safe and unsafe buckets and then concatenated
the
results, which changed their order.
For example, in `cnt@2 = 1 AND b@1 = bar`, the grouping-column predicate
on
`b` can cross the aggregate, while the predicate on aggregate output
`cnt`
must remain above it. Reordering the returned results could make the
optimizer
associate the pushed-down `b` result with the `cnt` predicate and
incorrectly
remove the latter.
Aggregate pushdown also needs to account for empty-input semantics. A
global
aggregate, or a grouping-sets aggregate containing `()`, can emit a row
even
when its input is empty. Moving any parent predicate below such an
aggregate —
including a column-free predicate such as `false` — can therefore change
the
result.
## What changes are included in this PR?
- Preserve parent-filter order by constructing each child description
once
with `ChildFilterDescription::from_child_with_allowed_indices`.
- Allow only grouping-output columns that are present in every grouping
set;
aggregate-result columns remain above the aggregate.
- Mark all parent filters unsupported for global aggregates and grouping
sets
containing an empty grouping set, while retaining aggregate-generated
dynamic filters.
- Validate that every child returns one parent-filter result per input
filter
before positional remapping.
- Add physical optimizer and SQL regression coverage for mixed filter
order,
global-aggregate name collisions, constant predicates, and grouping
sets.
## Are these changes tested?
Yes:
- `cargo test -p datafusion --test core_integration
physical_optimizer::filter_pushdown`
- `cargo fmt --all -- --check`
- `cargo check -p datafusion-physical-plan -p
datafusion-physical-optimizer`
- `git diff --check upstream/main`
- Full GitHub CI, including Rust tests, clippy, and sqllogictests
## Are there any user-facing changes?
There are no public API changes. Filter pushdown now preserves mixed
aggregate
predicates correctly and avoids moving predicates across aggregates when
doing
so could change empty-input results.1 parent 2fb472a commit 2f25454
6 files changed
Lines changed: 253 additions & 91 deletions
File tree
- datafusion
- core/tests/physical_optimizer
- physical-optimizer/src
- physical-plan/src
- aggregates
- sqllogictest/test_files
Lines changed: 171 additions & 28 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
44 | | - | |
45 | | - | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
46 | 51 | | |
47 | 52 | | |
48 | 53 | | |
| |||
738 | 743 | | |
739 | 744 | | |
740 | 745 | | |
| 746 | + | |
| 747 | + | |
| 748 | + | |
| 749 | + | |
| 750 | + | |
| 751 | + | |
| 752 | + | |
| 753 | + | |
| 754 | + | |
| 755 | + | |
| 756 | + | |
| 757 | + | |
| 758 | + | |
| 759 | + | |
| 760 | + | |
| 761 | + | |
| 762 | + | |
| 763 | + | |
| 764 | + | |
| 765 | + | |
| 766 | + | |
| 767 | + | |
| 768 | + | |
| 769 | + | |
| 770 | + | |
| 771 | + | |
| 772 | + | |
| 773 | + | |
| 774 | + | |
| 775 | + | |
| 776 | + | |
| 777 | + | |
| 778 | + | |
| 779 | + | |
| 780 | + | |
| 781 | + | |
| 782 | + | |
| 783 | + | |
| 784 | + | |
| 785 | + | |
| 786 | + | |
| 787 | + | |
| 788 | + | |
| 789 | + | |
| 790 | + | |
| 791 | + | |
| 792 | + | |
| 793 | + | |
| 794 | + | |
| 795 | + | |
| 796 | + | |
| 797 | + | |
| 798 | + | |
| 799 | + | |
| 800 | + | |
| 801 | + | |
| 802 | + | |
| 803 | + | |
| 804 | + | |
741 | 805 | | |
742 | 806 | | |
743 | 807 | | |
| |||
1753 | 1817 | | |
1754 | 1818 | | |
1755 | 1819 | | |
| 1820 | + | |
| 1821 | + | |
| 1822 | + | |
| 1823 | + | |
| 1824 | + | |
| 1825 | + | |
| 1826 | + | |
| 1827 | + | |
| 1828 | + | |
| 1829 | + | |
1756 | 1830 | | |
1757 | 1831 | | |
1758 | 1832 | | |
| |||
1997 | 2071 | | |
1998 | 2072 | | |
1999 | 2073 | | |
| 2074 | + | |
| 2075 | + | |
| 2076 | + | |
| 2077 | + | |
| 2078 | + | |
| 2079 | + | |
| 2080 | + | |
| 2081 | + | |
| 2082 | + | |
| 2083 | + | |
| 2084 | + | |
| 2085 | + | |
| 2086 | + | |
| 2087 | + | |
| 2088 | + | |
| 2089 | + | |
| 2090 | + | |
| 2091 | + | |
| 2092 | + | |
| 2093 | + | |
| 2094 | + | |
| 2095 | + | |
| 2096 | + | |
| 2097 | + | |
| 2098 | + | |
| 2099 | + | |
| 2100 | + | |
| 2101 | + | |
| 2102 | + | |
| 2103 | + | |
| 2104 | + | |
| 2105 | + | |
| 2106 | + | |
| 2107 | + | |
| 2108 | + | |
| 2109 | + | |
| 2110 | + | |
| 2111 | + | |
| 2112 | + | |
| 2113 | + | |
| 2114 | + | |
| 2115 | + | |
| 2116 | + | |
| 2117 | + | |
| 2118 | + | |
| 2119 | + | |
| 2120 | + | |
| 2121 | + | |
| 2122 | + | |
| 2123 | + | |
| 2124 | + | |
| 2125 | + | |
| 2126 | + | |
| 2127 | + | |
| 2128 | + | |
| 2129 | + | |
2000 | 2130 | | |
2001 | | - | |
2002 | | - | |
2003 | | - | |
2004 | | - | |
| 2131 | + | |
2005 | 2132 | | |
2006 | | - | |
2007 | 2133 | | |
2008 | 2134 | | |
2009 | 2135 | | |
| |||
2012 | 2138 | | |
2013 | 2139 | | |
2014 | 2140 | | |
| 2141 | + | |
| 2142 | + | |
| 2143 | + | |
| 2144 | + | |
| 2145 | + | |
| 2146 | + | |
| 2147 | + | |
| 2148 | + | |
| 2149 | + | |
| 2150 | + | |
| 2151 | + | |
| 2152 | + | |
| 2153 | + | |
2015 | 2154 | | |
2016 | | - | |
2017 | | - | |
| 2155 | + | |
| 2156 | + | |
2018 | 2157 | | |
| 2158 | + | |
| 2159 | + | |
| 2160 | + | |
| 2161 | + | |
| 2162 | + | |
| 2163 | + | |
| 2164 | + | |
| 2165 | + | |
| 2166 | + | |
| 2167 | + | |
| 2168 | + | |
| 2169 | + | |
| 2170 | + | |
| 2171 | + | |
| 2172 | + | |
| 2173 | + | |
| 2174 | + | |
| 2175 | + | |
| 2176 | + | |
| 2177 | + | |
2019 | 2178 | | |
2020 | 2179 | | |
2021 | 2180 | | |
2022 | 2181 | | |
2023 | | - | |
| 2182 | + | |
2024 | 2183 | | |
2025 | 2184 | | |
2026 | 2185 | | |
2027 | 2186 | | |
2028 | 2187 | | |
2029 | 2188 | | |
2030 | | - | |
2031 | | - | |
2032 | | - | |
| 2189 | + | |
2033 | 2190 | | |
2034 | 2191 | | |
2035 | | - | |
2036 | | - | |
2037 | | - | |
2038 | | - | |
2039 | | - | |
2040 | | - | |
2041 | | - | |
2042 | | - | |
2043 | | - | |
2044 | | - | |
2045 | | - | |
2046 | | - | |
2047 | | - | |
2048 | | - | |
2049 | | - | |
| 2192 | + | |
2050 | 2193 | | |
2051 | 2194 | | |
2052 | 2195 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
486 | 486 | | |
487 | 487 | | |
488 | 488 | | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
489 | 497 | | |
490 | 498 | | |
491 | 499 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
159 | 159 | | |
160 | 160 | | |
161 | 161 | | |
162 | | - | |
| 162 | + | |
163 | 163 | | |
164 | 164 | | |
165 | 165 | | |
| |||
168 | 168 | | |
169 | 169 | | |
170 | 170 | | |
171 | | - | |
172 | 171 | | |
173 | 172 | | |
174 | 173 | | |
| |||
2041 | 2040 | | |
2042 | 2041 | | |
2043 | 2042 | | |
2044 | | - | |
2045 | | - | |
2046 | | - | |
2047 | | - | |
2048 | | - | |
2049 | | - | |
2050 | | - | |
2051 | | - | |
2052 | | - | |
2053 | | - | |
2054 | | - | |
2055 | | - | |
2056 | | - | |
2057 | | - | |
2058 | | - | |
2059 | | - | |
2060 | | - | |
2061 | | - | |
2062 | | - | |
2063 | | - | |
2064 | | - | |
2065 | | - | |
2066 | | - | |
2067 | | - | |
2068 | | - | |
2069 | | - | |
2070 | | - | |
2071 | | - | |
2072 | | - | |
2073 | | - | |
2074 | | - | |
2075 | | - | |
2076 | | - | |
2077 | | - | |
2078 | | - | |
2079 | | - | |
2080 | | - | |
2081 | | - | |
2082 | | - | |
2083 | | - | |
2084 | | - | |
2085 | | - | |
2086 | | - | |
2087 | | - | |
2088 | | - | |
2089 | | - | |
2090 | | - | |
2091 | | - | |
2092 | | - | |
2093 | | - | |
2094 | | - | |
2095 | | - | |
| 2043 | + | |
| 2044 | + | |
| 2045 | + | |
| 2046 | + | |
| 2047 | + | |
| 2048 | + | |
| 2049 | + | |
2096 | 2050 | | |
2097 | 2051 | | |
2098 | | - | |
2099 | 2052 | | |
2100 | | - | |
2101 | | - | |
2102 | | - | |
2103 | | - | |
2104 | | - | |
2105 | | - | |
2106 | | - | |
2107 | | - | |
| 2053 | + | |
| 2054 | + | |
| 2055 | + | |
| 2056 | + | |
| 2057 | + | |
| 2058 | + | |
| 2059 | + | |
| 2060 | + | |
| 2061 | + | |
| 2062 | + | |
| 2063 | + | |
| 2064 | + | |
| 2065 | + | |
| 2066 | + | |
| 2067 | + | |
| 2068 | + | |
| 2069 | + | |
| 2070 | + | |
| 2071 | + | |
2108 | 2072 | | |
2109 | 2073 | | |
2110 | 2074 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
664 | 664 | | |
665 | 665 | | |
666 | 666 | | |
| 667 | + | |
| 668 | + | |
| 669 | + | |
| 670 | + | |
| 671 | + | |
| 672 | + | |
667 | 673 | | |
668 | 674 | | |
669 | 675 | | |
| |||
0 commit comments