| 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; |