# LogicTest: local-vec

# Test that the exec HashJoiner follows SQL NULL semantics for ON predicate
# equivalence. The use of sorts here force the planning of merge join.

statement ok
CREATE TABLE  t1 (k INT PRIMARY KEY, v INT)

statement ok
INSERT INTO t1 VALUES (0, 4), (2, 1), (5, 4), (3, 4), (-1, -1)

statement ok
CREATE TABLE t2 (x INT PRIMARY KEY, y INT)

statement ok
INSERT INTO t2 VALUES (1, 3), (4, 6), (0, 5), (3, 2)

statement ok
CREATE TABLE a (k INT, v INT)

statement ok
INSERT INTO a VALUES (0, 1), (1, 2), (2, 0)

statement ok
CREATE TABLE b (a INT, b INT, c STRING)

statement ok
INSERT INTO b VALUES (0, 1, 'a'), (2, 1, 'b'), (0, 2, 'c'), (0, 1, 'd')

statement ok
CREATE TABLE c (a INT, b STRING)

statement ok
INSERT INTO c VALUES (1, 'a'), (1, 'b'), (2, 'c')

query IIII
SELECT * FROM t1 JOIN t2 ON t1.k = t2.x
----
0  4  0  5
3  4  3  2

query IIII rowsort
SELECT * FROM a AS a1 JOIN a AS a2 ON a1.k = a2.v
----
0  1  2  0
1  2  0  1
2  0  1  2

query IIII rowsort
SELECT * FROM a AS a2 JOIN a AS a1 ON a1.k = a2.v
----
0  1  1  2
1  2  2  0
2  0  0  1

query II
SELECT t2.y, t1.v FROM t1 JOIN t2 ON t1.k = t2.x
----
5  4
2  4

query IIII rowsort
SELECT * FROM t1 JOIN t2 ON t1.v = t2.x
----
0  4  4  6
2  1  1  3
3  4  4  6
5  4  4  6

query IIII rowsort
SELECT * FROM t1 LEFT JOIN t2 ON t1.v = t2.x
----
-1  -1  NULL  NULL
0   4   4     6
2   1   1     3
3   4   4     6
5   4   4     6

query IIII rowsort
SELECT * FROM t1 RIGHT JOIN t2 ON t1.v = t2.x
----
0     4     4  6
2     1     1  3
3     4     4  6
5     4     4  6
NULL  NULL  0  5
NULL  NULL  3  2

query IIII rowsort
SELECT * FROM t1 FULL JOIN t2 ON t1.v = t2.x
----
-1    -1    NULL  NULL
0     4     4     6
2     1     1     3
3     4     4     6
5     4     4     6
NULL  NULL  3     2
NULL  NULL  0     5

query IIT rowsort
SELECT b.a, b.b, b.c FROM b JOIN a ON b.a = a.k AND a.v = b.b
----
0  1  a
0  1  d

query ITI
SELECT b.a, b.c, c.a FROM b JOIN c ON b.b = c.a AND b.c = c.b
----
0  a  1
2  b  1
0  c  2
