You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix: Correct join cardinality estimation for semi and anti joins with disjoint column ranges (#22674)
## Which issue does this PR close?
- Closes#22673
## Rationale for this change
`estimate_join_cardinality` for semi-joins checks if ANY of the columns
in the two join inputs are disjoint (comparing columns positionally); if
so, it claims the join will not return any rows. This is wrong, for two
reasons:
1. If two columns don't participate in the join key, they have no impact
on the cardinality of the join result
2. Comparing arbitrary columns positionally is not a sensible thing to
do in the first place
A similar issue exists for anti-joins, except we assume the anti-join
will return the entire join input in this case.
We should instead just check for disjoint ranges between the pairs of
columns that make up the join key.
## What changes are included in this PR?
* Fix `estimate_join_cardinality` behavior in the face of disjoint
column ranges that aren't join key columns
* Refactor `estimate_join_cardinality`, rename a variable for clarity
* Add unit test
## Are these changes tested?
Yes, new test added.
## Are there any user-facing changes?
Better plans / avoid buggy cardinality estimate.
0 commit comments