blob: 3ea077874dad59c93a6744bb9c50271878dde827 [file] [log] [blame]
# name: test/sql/join/test_not_distinct_from.test
# description: Test join on is not distinct from query
# group: [join]
statement ok
create table tbl_1 (a integer, b integer)
statement ok
insert into tbl_1 values (1,NULL),(2,3),(NULL,NULL)
statement ok
create table tbl_2 (b integer)
statement ok
insert into tbl_2 values (1),(2),(NULL)
query I rowsort
SELECT a from tbl_1 WHERE a IS DISTINCT FROM b
----
1
2
query I
SELECT a from tbl_1 WHERE a IS NOT DISTINCT FROM b
----
NULL
query II rowsort
select a,tbl_2.b from tbl_1 inner join tbl_2 on (a IS NOT DISTINCT FROM tbl_2.b)
----
1 1
2 2
NULL NULL
query II
select a,tbl_2.b from tbl_1 inner join tbl_2 on (a IS DISTINCT FROM tbl_2.b) order by a,tbl_2.b
----
NULL 1
NULL 2
1 NULL
1 2
2 NULL
2 1
#Vector with vector
query III
select a.a, b.b, a.a IS NOT DISTINCT FROM b.b AS "Is Not Distinct From" FROM (VALUES (1), (2), (NULL)) AS a (a), (VALUES(1), (2), (NULL)) AS b (b) ORDER BY a.a NULLS LAST;
----
1 1 true
1 2 false
1 NULL false
2 1 false
2 2 true
2 NULL false
NULL 1 false
NULL 2 false
NULL NULL true
query III
select a.a, b.b, a.a IS DISTINCT FROM b.b AS "Is Distinct From" FROM (VALUES (1), (2), (NULL)) AS a (a), (VALUES (1), (2), (NULL)) AS b (b) ORDER BY a.a NULLS LAST;
----
1 1 false
1 2 true
1 NULL true
2 1 true
2 2 false
2 NULL true
NULL 1 true
NULL 2 true
NULL NULL false
#constant with constant
query I
select null is not distinct from null;
----
true
query I
select null is distinct from null;
----
false
# Vector with constant
query II
select a.a, a.a IS NOT DISTINCT FROM 1 AS "Is Not Distinct From" FROM (VALUES (1), (2), (NULL)) AS a (a) ORDER BY a.a NULLS LAST;
----
1 true
2 false
NULL false
query II
select a.a, a.a IS DISTINCT FROM 1 AS "Is Not Distinct From" FROM (VALUES (1), (2), (NULL)) AS a (a) ORDER BY a.a NULLS LAST;
----
1 false
2 true
NULL true
query II
select a.a, a.a IS NOT DISTINCT FROM NULL AS "Is Not Distinct From" FROM (VALUES (1), (2), (NULL)) AS a (a) ORDER BY a.a NULLS LAST;
----
1 false
2 false
NULL true
query II
select a.a, a.a IS DISTINCT FROM NULL AS "Is Not Distinct From" FROM (VALUES (1), (2), (NULL)) AS a (a) ORDER BY a.a NULLS LAST;
----
1 true
2 true
NULL false
# More types (all numeric types, strings, dates, times, timestamps, interval)
statement ok
CREATE TABLE test_types(a tinyint, b smallint, c integer, d bigint, e double, f real, g varchar);
statement ok
INSERT INTO test_types values (NULL,NULL,NULL,NULL,NULL,NULL,NULL),(1,1,1,1,1,1,'1'),(10,10,10,10,10,10,'10')
query I
select count(*) FROM test_types where a IS DISTINCT FROM NULL
----
2
query I
select count(*) FROM test_types where b IS DISTINCT FROM NULL
----
2
query I
select count(*) FROM test_types where c IS DISTINCT FROM NULL
----
2
query I
select count(*) FROM test_types where d IS DISTINCT FROM NULL
----
2
query I
select count(*) FROM test_types where e IS DISTINCT FROM NULL
----
2
query I
select count(*) FROM test_types where f IS DISTINCT FROM NULL
----
2
query I
select count(*) FROM test_types where g IS DISTINCT FROM NULL
----
2
query I
select count(*) FROM test_types where a IS NOT DISTINCT FROM NULL
----
1
query I
select count(*) FROM test_types where b IS NOT DISTINCT FROM NULL
----
1
query I
select count(*) FROM test_types where c IS NOT DISTINCT FROM NULL
----
1
query I
select count(*) FROM test_types where d IS NOT DISTINCT FROM NULL
----
1
query I
select count(*) FROM test_types where e IS NOT DISTINCT FROM NULL
----
1
query I
select count(*) FROM test_types where f IS NOT DISTINCT FROM NULL
----
1
query I
select count(*) FROM test_types where g IS NOT DISTINCT FROM NULL
----
1
query T
SELECT INTERVAL '30' DAY is distinct from NULL
----
true
query T
SELECT INTERVAL '30' DAY is not distinct from NULL
----
false
# Use on a bigger table (~10K elements)
statement ok
CREATE table big(a int);
statement ok
insert into big select x from table(system_range(1, 9999));
statement ok
insert into big values (NULL)
query I
select count(*) from big inner join tbl_2 on (a IS NOT DISTINCT FROM tbl_2.b)
----
3
# Use with filter (e.g. SELECT x IS NOT DISTINCT FROM y FROM tbl WHERE z%2=0, where the expression filters like 50% of the rows)
query I
select count(*) from big inner join tbl_2 on (a IS NOT DISTINCT FROM tbl_2.b) where a >1 and a < 5000
----
1
# Use in subqueries with correlated expressions
query II rowsort
SELECT a, (select count(*) from tbl_1 where tbl_1.a is distinct from t.b) from tbl_1 as t ORDER BY a NULLS LAST
----
1 2
2 3
NULL 2