Repository navigation
Commit 72ec2bf
[SPARK-59975][SQL] Handle all-null partial and final tuple/theta intersection aggregates
### What changes were proposed in this pull request?
Previously `theta_intersection_agg`, `tuple_intersection_agg_double` and
`tuple_intersection_agg_integer` threw an error when all input sketches were NULL,
even for group by, when a single all-NULL group caused the entire query to fail, even if
other groups contained valid sketches. The same happens, even without NULL sketches,
for a global aggregate with an empty input partition or zero input rows, and for a query
with two or more DISTINCT aggregates (`RewriteDistinctAggregates` replaces the regular
aggregates' inputs with NULL on the expanded rows).
The error could also occur during partial aggregation when one partition contained
only NULL sketches for a group, even if another partition contained valid sketches
for that same group.
This change serializes untouched intermediate states as NULL and skips them
during merging. Final evaluation returns an empty sketch when all inputs for
the group are NULL.
We changed so that:
- `serialize()`: return an empty byte array for an untouched intersection state instead of calling `getResult()`, which throws
- `merge()`: skip untouched incoming states or untouched incoming states, real empty sketches still participate in the intersection
### Why are the changes needed?
Intersection aggregates currently throw when a partial aggregation receives only
null sketches, which can fail a query even when another partition has a valid sketch
for the same group. Untouched partials should be passed through as null and only
an all-null final result should become an empty sketch.
### Does this PR introduce _any_ user-facing change?
Yes. `theta_intersection_agg`, `tuple_intersection_agg_double` and
`tuple_intersection_agg_integer` now return an empty sketch for all-null
input instead of throwing. Null-only partials also no longer cause otherwise
valid distributed aggregations to fail.
### How was this patch tested?
Added unit tests for the updated serialization, deserialization, merge and
final-evaluation behavior and integration tests covering:
- all-NULL input across partitions returns an empty final sketch
- grouped input correctly handles both an all-NULL group and a
group with a NULL-only partition plus a valid-sketch partition
- a global aggregate with an empty input partition and with zero input rows
- a query with multiple DISTINCT aggregates
- a window aggregate whose frame contains only NULL sketches
### Was this patch authored or co-authored using generative AI tooling?
Generated-by: Codex
Closes #59252 from SavicStefan/fix_intersection.
Lead-authored-by: bajka <50296686+SavicStefan@users.noreply.github.com>
Co-authored-by: Stefan Savić <stefan.savic@databricks.com>
Signed-off-by: Daniel Tenedorio <daniel.tenedorio@databricks.com>
(cherry picked from commit 2305552)
Signed-off-by: Daniel Tenedorio <daniel.tenedorio@databricks.com>1 parent 79c86b3 commit 72ec2bf
6 files changed
Lines changed: 464 additions & 7 deletions
File tree
- sql
- catalyst/src
- main/scala/org/apache/spark/sql/catalyst/expressions/aggregate
- test/scala/org/apache/spark/sql/catalyst/expressions/aggregate
- core/src/test/scala/org/apache/spark/sql
Lines changed: 26 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
44 | 44 | | |
45 | 45 | | |
46 | 46 | | |
47 | | - | |
48 | | - | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
49 | 63 | | |
50 | 64 | | |
51 | 65 | | |
| |||
522 | 536 | | |
523 | 537 | | |
524 | 538 | | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
525 | 546 | | |
526 | 547 | | |
527 | 548 | | |
| |||
617 | 638 | | |
618 | 639 | | |
619 | 640 | | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
620 | 644 | | |
621 | 645 | | |
622 | 646 | | |
| |||
Lines changed: 17 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
67 | 67 | | |
68 | 68 | | |
69 | 69 | | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
70 | 77 | | |
71 | 78 | | |
72 | 79 | | |
| |||
165 | 172 | | |
166 | 173 | | |
167 | 174 | | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
168 | 182 | | |
169 | 183 | | |
170 | 184 | | |
| |||
315 | 329 | | |
316 | 330 | | |
317 | 331 | | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
318 | 335 | | |
319 | 336 | | |
320 | 337 | | |
| |||
Lines changed: 17 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
20 | | - | |
| 20 | + | |
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
| |||
45 | 45 | | |
46 | 46 | | |
47 | 47 | | |
48 | | - | |
49 | | - | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
50 | 64 | | |
51 | 65 | | |
52 | 66 | | |
| |||
Lines changed: 123 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
25 | | - | |
26 | | - | |
| 25 | + | |
| 26 | + | |
27 | 27 | | |
28 | 28 | | |
29 | 29 | | |
| |||
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
76 | 101 | | |
77 | 102 | | |
78 | 103 | | |
| |||
172 | 197 | | |
173 | 198 | | |
174 | 199 | | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
175 | 296 | | |
0 commit comments