Optimizer: Fix null filtering logic for IN list (#53370) #53459
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This is an automated cherry-pick of #53370
What problem does this PR solve?
Issue Number: close #49476
Problem Summary:
Incorrect outer to inner join conversion for some cases of IN list incorrectly treated as null filtering.
An example in #49476
CREATE TABLE t0(c0 INT);
CREATE TABLE t1(c0 BOOLEAN);
INSERT INTO t0 (c0) VALUES (0);
SELECT * FROM t1 NATURAL RIGHT JOIN t0; -- 0
SELECT (false IN (t1.c0, t0.c0)) FROM t1 NATURAL RIGHT JOIN t0; -- 1
SELECT * FROM t1 NATURAL RIGHT JOIN t0 WHERE (false IN (t1.c0, t0.c0));
-- Expected: 0
-- Actual: Empty set
The problem is in the constant folding logic when it is used to evaluate null rejection logic.
The logic is risky and just fills in constant 1 for non-inner side. In the example above the IN list becomes
false in (null,1) which is false (null filter is true).
What changed and how does it work?
Fix done at the top level code for null filtering logic used in outer to inner. The fix use the OR logic instead of IN list.
For example, alse IN (t1.c0, t0.c0)) is checked for nullability using (false = t1.c0) or (false = t0.c0) which is not null filter.
Also, this PR consolidates the null rejection code from outer to inner code and the general utility code. This includes cleans up of previous special cases.
Check List
Tests
Side effects
Documentation
Release note
Please refer to Release Notes Language Style Guide to write a quality release note.