blob: d4f37d0e901496f152fb76d47365c1f18daa7b7f [file] [log] [blame]
set hive.strict.checks.cartesian.product=false;
set hive.join.emit.interval=2;
CREATE TABLE test1_n2 (key INT, value INT, col_1 STRING);
INSERT INTO test1_n2 VALUES (NULL, NULL, 'None'), (98, NULL, 'None'),
(99, 0, 'Alice'), (99, 2, 'Mat'), (100, 1, 'Bob'), (101, 2, 'Car');
CREATE TABLE test2_n0 (key INT, value INT, col_2 STRING);
INSERT INTO test2_n0 VALUES (102, 2, 'Del'), (103, 2, 'Ema'),
(104, 3, 'Fli'), (105, NULL, 'None');
-- Basic outer join
EXPLAIN
SELECT *
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value);
SELECT *
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value);
-- Conjunction with pred on multiple inputs and single inputs (left outer join)
EXPLAIN
SELECT *
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
AND test1_n2.key between 100 and 102
AND test2_n0.key between 100 and 102);
SELECT *
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
AND test1_n2.key between 100 and 102
AND test2_n0.key between 100 and 102);
-- Conjunction with pred on single inputs (left outer join)
EXPLAIN
SELECT *
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.key between 100 and 102
AND test2_n0.key between 100 and 102);
SELECT *
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.key between 100 and 102
AND test2_n0.key between 100 and 102);
-- Conjunction with pred on multiple inputs and none (left outer join)
EXPLAIN
SELECT *
FROM test1_n2 RIGHT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value AND true);
SELECT *
FROM test1_n2 RIGHT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value AND true);
-- Condition on one input (left outer join)
EXPLAIN
SELECT *
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.key between 100 and 102);
SELECT *
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.key between 100 and 102);
-- Disjunction with pred on multiple inputs and single inputs (left outer join)
EXPLAIN
SELECT *
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test1_n2.key between 100 and 102
OR test2_n0.key between 100 and 102);
SELECT *
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test1_n2.key between 100 and 102
OR test2_n0.key between 100 and 102);
-- Disjunction with pred on multiple inputs and left input (left outer join)
EXPLAIN
SELECT *
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test1_n2.key between 100 and 102);
SELECT *
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test1_n2.key between 100 and 102);
-- Disjunction with pred on multiple inputs and right input (left outer join)
EXPLAIN
SELECT *
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test2_n0.key between 100 and 102);
SELECT *
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test2_n0.key between 100 and 102);
-- Keys plus residual (left outer join)
EXPLAIN
SELECT *
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
AND (test1_n2.key between 100 and 102
OR test2_n0.key between 100 and 102));
SELECT *
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
AND (test1_n2.key between 100 and 102
OR test2_n0.key between 100 and 102));
-- Complex condition, projecting columns
EXPLAIN
SELECT col_1, col_2
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test1_n2.key=test2_n0.key);
SELECT col_1, col_2
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test1_n2.key=test2_n0.key);
-- Disjunction with pred on multiple inputs and single inputs (right outer join)
EXPLAIN
SELECT *
FROM test1_n2 RIGHT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test1_n2.key between 100 and 102
OR test2_n0.key between 100 and 102);
SELECT *
FROM test1_n2 RIGHT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test1_n2.key between 100 and 102
OR test2_n0.key between 100 and 102);
-- Disjunction with pred on multiple inputs and left input (right outer join)
EXPLAIN
SELECT *
FROM test1_n2 RIGHT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test1_n2.key between 100 and 102);
SELECT *
FROM test1_n2 RIGHT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test1_n2.key between 100 and 102);
-- Disjunction with pred on multiple inputs and right input (right outer join)
EXPLAIN
SELECT *
FROM test1_n2 RIGHT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test2_n0.key between 100 and 102);
SELECT *
FROM test1_n2 RIGHT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test2_n0.key between 100 and 102);
-- Keys plus residual (right outer join)
EXPLAIN
SELECT *
FROM test1_n2 RIGHT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
AND (test1_n2.key between 100 and 102
OR test2_n0.key between 100 and 102));
SELECT *
FROM test1_n2 RIGHT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
AND (test1_n2.key between 100 and 102
OR test2_n0.key between 100 and 102));
-- Disjunction with pred on multiple inputs and single inputs (full outer join)
EXPLAIN
SELECT *
FROM test1_n2 FULL OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test1_n2.key between 100 and 102
OR test2_n0.key between 100 and 102);
SELECT *
FROM test1_n2 FULL OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test1_n2.key between 100 and 102
OR test2_n0.key between 100 and 102);
-- Disjunction with pred on multiple inputs and left input (full outer join)
EXPLAIN
SELECT *
FROM test1_n2 FULL OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test1_n2.key between 100 and 102);
SELECT *
FROM test1_n2 FULL OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test1_n2.key between 100 and 102);
-- Disjunction with pred on multiple inputs and right input (full outer join)
EXPLAIN
SELECT *
FROM test1_n2 FULL OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test2_n0.key between 100 and 102);
SELECT *
FROM test1_n2 FULL OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
OR test2_n0.key between 100 and 102);
-- Keys plus residual (full outer join)
EXPLAIN
SELECT *
FROM test1_n2 FULL OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
AND (test1_n2.key between 100 and 102
OR test2_n0.key between 100 and 102));
SELECT *
FROM test1_n2 FULL OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
AND (test1_n2.key between 100 and 102
OR test2_n0.key between 100 and 102));
-- Mixed ( FOJ (ROJ, LOJ) )
EXPLAIN
SELECT *
FROM (
SELECT test1_n2.key AS key1, test1_n2.value AS value1, test1_n2.col_1 AS col_1,
test2_n0.key AS key2, test2_n0.value AS value2, test2_n0.col_2 AS col_2
FROM test1_n2 RIGHT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
AND (test1_n2.key between 100 and 102
OR test2_n0.key between 100 and 102))
) sq1
FULL OUTER JOIN (
SELECT test1_n2.key AS key3, test1_n2.value AS value3, test1_n2.col_1 AS col_3,
test2_n0.key AS key4, test2_n0.value AS value4, test2_n0.col_2 AS col_4
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
AND (test1_n2.key between 100 and 102
OR test2_n0.key between 100 and 102))
) sq2
ON (sq1.value1 is null or sq2.value4 is null and sq2.value3 != sq1.value2);
SELECT *
FROM (
SELECT test1_n2.key AS key1, test1_n2.value AS value1, test1_n2.col_1 AS col_1,
test2_n0.key AS key2, test2_n0.value AS value2, test2_n0.col_2 AS col_2
FROM test1_n2 RIGHT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
AND (test1_n2.key between 100 and 102
OR test2_n0.key between 100 and 102))
) sq1
FULL OUTER JOIN (
SELECT test1_n2.key AS key3, test1_n2.value AS value3, test1_n2.col_1 AS col_3,
test2_n0.key AS key4, test2_n0.value AS value4, test2_n0.col_2 AS col_4
FROM test1_n2 LEFT OUTER JOIN test2_n0
ON (test1_n2.value=test2_n0.value
AND (test1_n2.key between 100 and 102
OR test2_n0.key between 100 and 102))
) sq2
ON (sq1.value1 is null or sq2.value4 is null and sq2.value3 != sq1.value2);
CREATE TABLE table1 (a INT, b INT);
INSERT INTO table1 VALUES (1, 2), (1, 2), (1, 2), (1, 2);
EXPLAIN CBO
SELECT sub1.r FROM
(
SELECT
RANK() OVER (ORDER BY t1.b desc) as r
FROM table1 t1
JOIN table1 t2 ON t1.a = t2.b
) sub1
LEFT OUTER JOIN table1 t3
ON sub1.r = t3.a;
DROP TABLE table1;