Yaoxuan Wu created FLINK-40928:
----------------------------------

             Summary: DISTINCT over a cross join with an IS NULL filter returns 
rows with NULL that are not in the input
                 Key: FLINK-40928
                 URL: https://issues.apache.org/jira/browse/FLINK-40928
             Project: Flink
          Issue Type: Bug
          Components: Table SQL / Planner
    Affects Versions: 2.3.0
            Reporter: Yaoxuan Wu


{code:java}
CREATE TEMPORARY TABLE a (v INT) WITH ('connector' = 'filesystem', 'path' = 
'file:///tmp/a', 'format' = 'csv');
CREATE TEMPORARY TABLE x (v INT) WITH ('connector' = 'filesystem', 'path' = 
'file:///tmp/x', 'format' = 'csv');
INSERT INTO a VALUES (1), (2);
INSERT INTO x VALUES (5);       -- no NULL anywhereSELECT * FROM (SELECT 
DISTINCT a.v, x.v AS b FROM a, x) WHERE b IS NULL;
-- Flink: (1, NULL), (2, NULL)        expected: empty {code}
The returned rows do not exist in the input: x contains only 5.
 * The wrong result only occurs when a and x are read from tables (here 
filesystem temporary tables). With the same rows written inline, FROM (VALUES 
(1), (2)) AS a(v), (VALUES (5)) AS x(v), the query correctly returns no rows.
 * Without the WHERE b IS NULL filter the result is correct: SELECT DISTINCT 
a.v, x.v AS b FROM a, x returns (1, 5), (2, 5). Removing DISTINCT also gives 
the correct (empty) result.

 

In the optimized plan the DISTINCT is pushed below the join. On the x side the 
filter turns the grouping key into the constant NULL, the key is removed, and 
the grouped aggregate becomes a global aggregate, which returns one row even 
for an empty input:
{code:java}
Calc(select=[v, null:INTEGER AS b])
+- NestedLoopJoin(joinType=[InnerJoin], where=[true], ...)
   :- HashAggregate(groupBy=[v], select=[v])
   +- Values(tuples=[[{ true }]], values=[dummy])     -- 2.0.1: 
HashAggregate(select=[]) {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to