Backport #72393 to 24.10: Fix ANY JOIN with parallel replicas

This commit is contained in:
robot-clickhouse 2024-11-27 20:08:26 +00:00
parent 1dc5c7a346
commit 81d21bc151
3 changed files with 60 additions and 1 deletions

View File

@ -962,7 +962,9 @@ JoinTreeQueryPlan buildQueryPlanForTableExpression(QueryTreeNodePtr table_expres
return true;
const auto join_kind = join_node->getKind();
if (join_kind == JoinKind::Left || join_kind == JoinKind::Right || join_kind == JoinKind::Inner)
const auto join_strictness = join_node->getStrictness();
if (join_kind == JoinKind::Left || join_kind == JoinKind::Right
|| (join_kind == JoinKind::Inner && join_strictness == JoinStrictness::All))
return true;
return false;

View File

@ -0,0 +1,26 @@
any left
0 a1 0
1 a2 0
2 a3 2 b1
3 a4 0
4 a5 4 b2
any left (rev)
0 5 b4
2 a3 2 b1
4 a5 4 b2
any inner
2 a3 2 b1
4 a5 4 b2
any inner (rev)
2 a3 2 b1
4 a5 4 b2
any right
0 5 b4
2 a3 2 b1
4 a5 4 b2
any right (rev)
0 a1 0
1 a2 0
2 a3 2 b1
3 a4 0
4 a5 4 b2

View File

@ -0,0 +1,31 @@
DROP TABLE IF EXISTS t1 SYNC;
DROP TABLE IF EXISTS t2 SYNC;
CREATE TABLE t1 (x UInt32, s String) engine = ReplicatedMergeTree('/clickhouse/{database}/t1', 'r1') ORDER BY tuple();
CREATE TABLE t2 (x UInt32, s String) engine = ReplicatedMergeTree('/clickhouse/{database}/t2', 'r1') ORDER BY tuple();
INSERT INTO t1 (x, s) VALUES (0, 'a1'), (1, 'a2'), (2, 'a3'), (3, 'a4'), (4, 'a5');
INSERT INTO t2 (x, s) VALUES (2, 'b1'), (4, 'b2'), (5, 'b4');
set enable_analyzer = 1, enable_parallel_replicas = 1, max_parallel_replicas = 3, cluster_for_parallel_replicas = 'test_cluster_one_shard_three_replicas_localhost';
SELECT 'any left';
SELECT t1.*, t2.* FROM t1 ANY LEFT JOIN t2 USING(x) ORDER BY t1.x, t2.x;
SELECT 'any left (rev)';
SELECT t1.*, t2.* FROM t2 ANY LEFT JOIN t1 USING(x) ORDER BY t1.x, t2.x;
SELECT 'any inner';
SELECT t1.*, t2.* FROM t1 ANY INNER JOIN t2 USING(x) ORDER BY t1.x, t2.x;
SELECT 'any inner (rev)';
SELECT t1.*, t2.* FROM t2 ANY INNER JOIN t1 USING(x) ORDER BY t1.x, t2.x;
SELECT 'any right';
SELECT t1.*, t2.* FROM t1 ANY RIGHT JOIN t2 USING(x) ORDER BY t1.x, t2.x;
SELECT 'any right (rev)';
SELECT t1.*, t2.* FROM t2 ANY RIGHT JOIN t1 USING(x) ORDER BY t1.x, t2.x;
DROP TABLE t1 SYNC;
DROP TABLE t2 SYNC;