diff --git a/dbms/src/Storages/StorageJoin.cpp b/dbms/src/Storages/StorageJoin.cpp index a23614060ba28fc1bac452fef8c7db950ac720e0..17116d1b4d62aa4dfa3713fc7a40c1dcdb66ac66 100644 --- a/dbms/src/Storages/StorageJoin.cpp +++ b/dbms/src/Storages/StorageJoin.cpp @@ -73,8 +73,9 @@ HashJoinPtr StorageJoin::getJoin(std::shared_ptr analyzed_join) co if (kind != analyzed_join->kind() || strictness != analyzed_join->strictness()) throw Exception("Table " + table_name + " has incompatible type of JOIN.", ErrorCodes::INCOMPATIBLE_TYPE_OF_JOIN); - if (analyzed_join->forceNullableRight() && !use_nulls) - throw Exception("Table " + table_name + " need join_use_nulls settings to support LEFT or FULL JOIN with join_use_nulls.", + if ((analyzed_join->forceNullableRight() && !use_nulls) || + (!analyzed_join->forceNullableRight() && isLeftOrFull(analyzed_join->kind()) && use_nulls)) + throw Exception("Table " + table_name + " needs the same join_use_nulls setting as present in LEFT or FULL JOIN.", ErrorCodes::INCOMPATIBLE_TYPE_OF_JOIN); /// TODO: check key columns diff --git a/dbms/tests/queries/0_stateless/01051_all_join_engine.reference b/dbms/tests/queries/0_stateless/01051_all_join_engine.reference index 1f69b4c9e64ab92acb4a6fb238d3caa0e3861084..fbb9eca348dd558c7379b5bb2c21c1022d3a0743 100644 --- a/dbms/tests/queries/0_stateless/01051_all_join_engine.reference +++ b/dbms/tests/queries/0_stateless/01051_all_join_engine.reference @@ -75,3 +75,16 @@ full (join_use_nulls) 4 a5 b4 4 a5 b5 5 \N b6 +inner (join_use_nulls mix2) +2 a3 b1 +2 a3 b2 +4 a5 b3 +4 a5 b4 +4 a5 b5 +right (join_use_nulls mix2) +2 a3 b1 +2 a3 b2 +4 a5 b3 +4 a5 b4 +4 a5 b5 +5 b6 diff --git a/dbms/tests/queries/0_stateless/01051_all_join_engine.sql b/dbms/tests/queries/0_stateless/01051_all_join_engine.sql index 6e04b30928519fc8c26bbb9f1ab6b8937480a891..f894ea84962e0e345626f616014e3a39cf956cb4 100644 --- a/dbms/tests/queries/0_stateless/01051_all_join_engine.sql +++ b/dbms/tests/queries/0_stateless/01051_all_join_engine.sql @@ -71,6 +71,17 @@ SELECT * FROM t1 RIGHT JOIN right_join j USING(x) ORDER BY x, str, s; SELECT 'full (join_use_nulls)'; SELECT * FROM t1 FULL JOIN full_join j USING(x) ORDER BY x, str, s; +SET join_use_nulls = 0; + +SELECT * FROM t1 LEFT JOIN left_join j USING(x) ORDER BY x, str, s; -- { serverError 264 } +SELECT * FROM t1 FULL JOIN full_join j USING(x) ORDER BY x, str, s; -- { serverError 264 } + +SELECT 'inner (join_use_nulls mix2)'; +SELECT * FROM t1 INNER JOIN inner_join j USING(x) ORDER BY x, str, s; + +SELECT 'right (join_use_nulls mix2)'; +SELECT * FROM t1 RIGHT JOIN right_join j USING(x) ORDER BY x, str, s; + DROP TABLE t1; DROP TABLE left_join;