mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
Merge pull request #15162 from 4ertus2/joins
Fix crash in not equi join on
This commit is contained in:
commit
0b56bec69c
@ -127,6 +127,12 @@ std::pair<size_t, size_t> CollectJoinOnKeysMatcher::getTableNumbers(const ASTPtr
|
||||
getIdentifiers(left_ast, left_identifiers);
|
||||
getIdentifiers(right_ast, right_identifiers);
|
||||
|
||||
if (left_identifiers.empty() || right_identifiers.empty())
|
||||
{
|
||||
throw Exception("Not equi-join ON expression: " + queryToString(expr) + ". No columns in one of equality side.",
|
||||
ErrorCodes::INVALID_JOIN_ON_EXPRESSION);
|
||||
}
|
||||
|
||||
size_t left_idents_table = getTableForIdentifiers(left_identifiers, data);
|
||||
size_t right_idents_table = getTableForIdentifiers(right_identifiers, data);
|
||||
|
||||
|
@ -106,7 +106,7 @@ def get_node(query_node, table='dist', *args, **kwargs):
|
||||
LIMIT 1
|
||||
) a
|
||||
JOIN system.clusters c
|
||||
ON a._shard_num = c.shard_num AND cluster = 'shards_cluster'
|
||||
ON a._shard_num = c.shard_num WHERE cluster = 'shards_cluster'
|
||||
""".format(query_id=query_id))
|
||||
return rows.strip()
|
||||
|
||||
|
@ -23,8 +23,6 @@ join_use_nulls = 1
|
||||
-
|
||||
\N \N
|
||||
-
|
||||
1 1 \N \N
|
||||
2 2 \N \N
|
||||
-
|
||||
1 1 1 1
|
||||
2 2 \N \N
|
||||
@ -51,8 +49,6 @@ join_use_nulls = 0
|
||||
-
|
||||
-
|
||||
-
|
||||
1 1 0 0
|
||||
2 2 0 0
|
||||
-
|
||||
1 1 1 1
|
||||
2 2 0 0
|
||||
|
@ -30,11 +30,11 @@ select * from t left outer join s on (t.a=s.a and t.b=s.b) where s.a is null;
|
||||
select '-';
|
||||
select s.* from t left outer join s on (t.a=s.a and t.b=s.b) where s.a is null;
|
||||
select '-';
|
||||
select t.*, s.* from t left join s on (s.a=t.a and t.b=s.b and t.a=toInt64(2)) order by t.a;
|
||||
select t.*, s.* from t left join s on (s.a=t.a and t.b=s.b and t.a=toInt64(2)) order by t.a; -- {serverError 403 }
|
||||
select '-';
|
||||
select t.*, s.* from t left join s on (s.a=t.a) order by t.a;
|
||||
select '-';
|
||||
select t.*, s.* from t left join s on (t.b=toInt64(2) and s.a=t.a) where s.b=2;
|
||||
select t.*, s.* from t left join s on (t.b=toInt64(2) and s.a=t.a) where s.b=2; -- {serverError 403 }
|
||||
|
||||
select 'join_use_nulls = 0';
|
||||
set join_use_nulls = 0;
|
||||
@ -58,11 +58,11 @@ select '-';
|
||||
select '-';
|
||||
-- select s.* from t left outer join s on (t.a=s.a and t.b=s.b) where s.a is null; -- TODO
|
||||
select '-';
|
||||
select t.*, s.* from t left join s on (s.a=t.a and t.b=s.b and t.a=toInt64(2)) order by t.a;
|
||||
select t.*, s.* from t left join s on (s.a=t.a and t.b=s.b and t.a=toInt64(2)) order by t.a; -- {serverError 403 }
|
||||
select '-';
|
||||
select t.*, s.* from t left join s on (s.a=t.a) order by t.a;
|
||||
select '-';
|
||||
select t.*, s.* from t left join s on (t.b=toInt64(2) and s.a=t.a) where s.b=2;
|
||||
select t.*, s.* from t left join s on (t.b=toInt64(2) and s.a=t.a) where s.b=2; -- {serverError 403 }
|
||||
|
||||
drop table t;
|
||||
drop table s;
|
||||
|
@ -29,8 +29,6 @@ remote(Distributed)
|
||||
JOIN system.clusters
|
||||
1 10 localhost ::1 9000
|
||||
1 20 localhost ::1 9000
|
||||
1 10 localhost ::1 9000
|
||||
1 20 localhost ::1 9000
|
||||
dist_3
|
||||
100 foo
|
||||
foo 100 foo
|
||||
|
@ -48,11 +48,12 @@ FROM (SELECT *, _shard_num FROM dist_1) a
|
||||
JOIN system.clusters b
|
||||
ON a._shard_num = b.shard_num
|
||||
WHERE b.cluster = 'test_cluster_two_shards_localhost';
|
||||
|
||||
SELECT _shard_num, key, b.host_name, b.host_address, b.port
|
||||
FROM dist_1 a
|
||||
JOIN system.clusters b
|
||||
ON _shard_num = b.shard_num
|
||||
WHERE b.cluster = 'test_cluster_two_shards_localhost';
|
||||
WHERE b.cluster = 'test_cluster_two_shards_localhost'; -- { serverError 403 }
|
||||
|
||||
-- rewrite does not work with aliases, hence Missing columns (47)
|
||||
SELECT a._shard_num, key FROM dist_1 a; -- { serverError 47; }
|
||||
|
@ -2,7 +2,7 @@ drop table if exists test_01081;
|
||||
|
||||
create table test_01081 (key Int) engine=MergeTree() order by key;
|
||||
insert into test_01081 select * from system.numbers limit 10;
|
||||
select 1 from remote('127.{1,2}', currentDatabase(), test_01081) lhs join system.one as rhs on rhs.dummy = 1 order by 1;
|
||||
select 1 from remote('127.{1,2}', currentDatabase(), test_01081) lhs join system.one as rhs on rhs.dummy = 1 order by 1; -- { serverError 403 }
|
||||
|
||||
-- With multiple blocks triggers:
|
||||
--
|
||||
@ -11,6 +11,6 @@ select 1 from remote('127.{1,2}', currentDatabase(), test_01081) lhs join system
|
||||
-- _dummy Int Int32(size = 0), 1 UInt8 Const(size = 0, UInt8(size = 1)).
|
||||
|
||||
insert into test_01081 select * from system.numbers limit 10;
|
||||
select 1 from remote('127.{1,2}', currentDatabase(), test_01081) lhs join system.one as rhs on rhs.dummy = 1 order by 1;
|
||||
select 1 from remote('127.{1,2}', currentDatabase(), test_01081) lhs join system.one as rhs on rhs.dummy = 1 order by 1; -- { serverError 403 }
|
||||
|
||||
drop table if exists test_01081;
|
||||
|
@ -8,7 +8,3 @@ xyzabc 2
|
||||
1 0 0 3
|
||||
\N 1 2 \N 0
|
||||
\N 1 0 \N 3
|
||||
1
|
||||
1
|
||||
1 hello\0\0\0
|
||||
1 hello\0\0\0
|
||||
|
@ -17,7 +17,6 @@ select null, isConstant(null), * from (select 2 x, null) a right join (select 3
|
||||
|
||||
-- other cases with joins and constants
|
||||
|
||||
select cast(1, 'UInt8') from (select arrayJoin([1, 2]) as a) t1 left join (select 1 as b) t2 on b = ignore('UInt8');
|
||||
|
||||
select isConstant('UInt8'), toFixedString('hello', toUInt8(substring('UInt8', 5, 1))) from (select arrayJoin([1, 2]) as a) t1 left join (select 1 as b) t2 on b = ignore('UInt8');
|
||||
select cast(1, 'UInt8') from (select arrayJoin([1, 2]) as a) t1 left join (select 1 as b) t2 on b = ignore('UInt8'); -- { serverError 403 }
|
||||
|
||||
select isConstant('UInt8'), toFixedString('hello', toUInt8(substring('UInt8', 5, 1))) from (select arrayJoin([1, 2]) as a) t1 left join (select 1 as b) t2 on b = ignore('UInt8'); -- { serverError 403 }
|
||||
|
7
tests/queries/0_stateless/01478_not_equi-join_on.sql
Normal file
7
tests/queries/0_stateless/01478_not_equi-join_on.sql
Normal file
@ -0,0 +1,7 @@
|
||||
SELECT * FROM (SELECT NULL AS a, 1 AS b) AS foo
|
||||
RIGHT JOIN (SELECT 1024 AS b) AS bar
|
||||
ON 1 = foo.b; -- { serverError 403 }
|
||||
|
||||
SELECT * FROM (SELECT NULL AS a, 1 AS b) AS foo
|
||||
RIGHT JOIN (SELECT 1024 AS b) AS bar
|
||||
ON 1 = bar.b; -- { serverError 403 }
|
Loading…
Reference in New Issue
Block a user