From b672ffdd17c751ca6eb2c5344f93201d4b753e31 Mon Sep 17 00:00:00 2001 From: Arenatlx <314806019@qq.com> Date: Mon, 29 Jan 2024 15:21:22 +0800 Subject: [PATCH] This is an automated cherry-pick of #36012 Signed-off-by: ti-chi-bot --- pkg/planner/core/logical_plan_builder.go | 46 + .../r/executor/jointest/join.result | 1605 +++++++++++++++++ .../t/executor/jointest/join.test | 1106 ++++++++++++ 3 files changed, 2757 insertions(+) create mode 100644 tests/integrationtest/r/executor/jointest/join.result create mode 100644 tests/integrationtest/t/executor/jointest/join.test diff --git a/pkg/planner/core/logical_plan_builder.go b/pkg/planner/core/logical_plan_builder.go index ef92345181b6c..f8190dced58b9 100644 --- a/pkg/planner/core/logical_plan_builder.go +++ b/pkg/planner/core/logical_plan_builder.go @@ -1248,6 +1248,52 @@ func (b *PlanBuilder) coalesceCommonColumns(p *LogicalJoin, leftPlan, rightPlan if err != nil { return err } + } else { + // Even with no using filter, we still should check the checkAmbiguous name before we try to find the common column from both side. + // (t3 cross join t4) natural join t1 + // t1 natural join (t3 cross join t4) + // t3 and t4 may generate the same name column from cross join. + // for every common column of natural join, the name from right or left should be exactly one. + commonNames := make([]string, 0, len(lNames)) + lNameMap := make(map[string]int, len(lNames)) + rNameMap := make(map[string]int, len(rNames)) + for _, name := range lNames { + // Natural join should ignore _tidb_rowid + if name.ColName.L == "_tidb_rowid" { + continue + } + // record left map + if cnt, ok := lNameMap[name.ColName.L]; ok { + lNameMap[name.ColName.L] = cnt + 1 + } else { + lNameMap[name.ColName.L] = 1 + } + } + for _, name := range rNames { + // Natural join should ignore _tidb_rowid + if name.ColName.L == "_tidb_rowid" { + continue + } + // record right map + if cnt, ok := rNameMap[name.ColName.L]; ok { + rNameMap[name.ColName.L] = cnt + 1 + } else { + rNameMap[name.ColName.L] = 1 + } + // check left map + if cnt, ok := lNameMap[name.ColName.L]; ok { + if cnt > 1 { + return plannererrors.ErrAmbiguous.GenWithStackByArgs(name.ColName.L, "from clause") + } + commonNames = append(commonNames, name.ColName.L) + } + } + // check right map + for _, commonName := range commonNames { + if rNameMap[commonName] > 1 { + return plannererrors.ErrAmbiguous.GenWithStackByArgs(commonName, "from clause") + } + } } // Find out all the common columns and put them ahead. diff --git a/tests/integrationtest/r/executor/jointest/join.result b/tests/integrationtest/r/executor/jointest/join.result new file mode 100644 index 0000000000000..431e45630ccd6 --- /dev/null +++ b/tests/integrationtest/r/executor/jointest/join.result @@ -0,0 +1,1605 @@ +drop table if exists t35,t40,t14,t42,t15,t7,t64,t19,t8,t57,t37,t44,t38,t18,t62,t4,t48,t31,t16,t12; +create table t35(a35 int primary key, b35 int, x35 int); +create table t40(a40 int primary key, b40 int, x40 int); +create table t14(a14 int primary key, b14 int, x14 int); +create table t42(a42 int primary key, b42 int, x42 int); +create table t15(a15 int primary key, b15 int, x15 int); +create table t7(a7 int primary key, b7 int, x7 int); +create table t64(a64 int primary key, b64 int, x64 int); +create table t19(a19 int primary key, b19 int, x19 int); +create table t9(a9 int primary key, b9 int, x9 int); +create table t8(a8 int primary key, b8 int, x8 int); +create table t57(a57 int primary key, b57 int, x57 int); +create table t37(a37 int primary key, b37 int, x37 int); +create table t44(a44 int primary key, b44 int, x44 int); +create table t38(a38 int primary key, b38 int, x38 int); +create table t18(a18 int primary key, b18 int, x18 int); +create table t62(a62 int primary key, b62 int, x62 int); +create table t4(a4 int primary key, b4 int, x4 int); +create table t48(a48 int primary key, b48 int, x48 int); +create table t31(a31 int primary key, b31 int, x31 int); +create table t16(a16 int primary key, b16 int, x16 int); +create table t12(a12 int primary key, b12 int, x12 int); +insert into t35 values(1,1,1); +insert into t40 values(1,1,1); +insert into t14 values(1,1,1); +insert into t42 values(1,1,1); +insert into t15 values(1,1,1); +insert into t7 values(1,1,1); +insert into t64 values(1,1,1); +insert into t19 values(1,1,1); +insert into t9 values(1,1,1); +insert into t8 values(1,1,1); +insert into t57 values(1,1,1); +insert into t37 values(1,1,1); +insert into t44 values(1,1,1); +insert into t38 values(1,1,1); +insert into t18 values(1,1,1); +insert into t62 values(1,1,1); +insert into t4 values(1,1,1); +insert into t48 values(1,1,1); +insert into t31 values(1,1,1); +insert into t16 values(1,1,1); +insert into t12 values(1,1,1); +insert into t35 values(7,7,7); +insert into t40 values(7,7,7); +insert into t14 values(7,7,7); +insert into t42 values(7,7,7); +insert into t15 values(7,7,7); +insert into t7 values(7,7,7); +insert into t64 values(7,7,7); +insert into t19 values(7,7,7); +insert into t9 values(7,7,7); +insert into t8 values(7,7,7); +insert into t57 values(7,7,7); +insert into t37 values(7,7,7); +insert into t44 values(7,7,7); +insert into t38 values(7,7,7); +insert into t18 values(7,7,7); +insert into t62 values(7,7,7); +insert into t4 values(7,7,7); +insert into t48 values(7,7,7); +insert into t31 values(7,7,7); +insert into t16 values(7,7,7); +insert into t12 values(7,7,7); +SELECT x4,x8,x38,x44,x31,x9,x57,x48,x19,x40,x14,x12,x7,x64,x37,x18,x62,x35,x42,x15,x16 FROM +t35,t40,t14,t42,t15,t7,t64,t19,t9,t8,t57,t37,t44,t38,t18,t62,t4,t48,t31,t16,t12 +WHERE b48=a57 +AND a4=b19 +AND a14=b16 +AND b37=a48 +AND a40=b42 +AND a31=7 +AND a15=b40 +AND a38=b8 +AND b15=a31 +AND b64=a18 +AND b12=a44 +AND b7=a8 +AND b35=a16 +AND a12=b14 +AND a64=b57 +AND b62=a7 +AND a35=b38 +AND b9=a19 +AND a62=b18 +AND b4=a37 +AND b44=a42; +x4 x8 x38 x44 x31 x9 x57 x48 x19 x40 x14 x12 x7 x64 x37 x18 x62 x35 x42 x15 x16 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 +drop table if exists t; +create table t (a int); +insert t values (1), (2); +select a from t where exists(select 1 from t as x where x.a < t.a); +a +2 +select a from t where not exists(select 1 from t as x where x.a < t.a); +a +1 +drop table if exists t; +create table t (a int, b int); +insert t values (1, 1), (2, 1); +select m1.a from t as m1 where m1.a in (select m2.b from t as m2); +a +1 +select m1.a from t as m1 where (3, m1.b) not in (select * from t as m2); +a +1 +2 +select m1.a from t as m1 where m1.a in (select m2.b+1 from t as m2); +a +2 +prepare stmt1 from 'select m1.a from t as m1 where m1.a in (select m2.b+? from t as m2)'; +set @a = 1; +execute stmt1 using @a; +a +2 +set @a = 0; +execute stmt1 using @a; +a +1 +select m1.a from t as m1 where m1.a in (1, 3, 5); +a +1 +drop table if exists t1; +create table t1 (a float); +insert t1 values (281.37); +select a from t1 where (a in (select a from t1)); +a +281.37 +drop table if exists t1, t2; +create table t1 (a int, b int); +insert into t1 values (0,0),(1,1),(2,2),(3,3),(4,4); +create table t2 (a int); +insert into t2 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); +select a from t1 where (1,1) in (select * from t2 s , t2 t where t1.a = s.a and s.a = t.a limit 1); +a +1 +drop table if exists t1, t2; +create table t1 (a int); +create table t2 (a int); +insert into t1 values (1),(2); +insert into t2 values (1),(2); +set @@session.tidb_opt_insubq_to_join_and_agg = 0; +select * from t1 where a in (select * from t2); +a +1 +2 +select * from t1 where a in (select * from t2 where false); +a +select * from t1 where a not in (select * from t2 where false); +a +1 +2 +set @@session.tidb_opt_insubq_to_join_and_agg = 1; +select * from t1 where a in (select * from t2); +a +1 +2 +select * from t1 where a in (select * from t2 where false); +a +select * from t1 where a not in (select * from t2 where false); +a +1 +2 +drop table if exists t1, t2; +create table t1 (a int, key b (a)); +create table t2 (a int, key b (a)); +insert into t1 values (1),(2),(2); +insert into t2 values (1),(2),(2); +select * from t1 where a in (select * from t2) order by a desc; +a +1 +2 +2 +select * from t1 where a in (select count(*) from t2 where t1.a = t2.a) order by a desc; +a +1 +2 +2 +set @@session.tidb_opt_insubq_to_join_and_agg = default; +drop table if exists t1, t2; +create table t1(a int, b date, c float, primary key(a, b)); +create table t2(a int primary key); +insert into t1 values(1, '2017-11-29', 2.2); +insert into t2 values(1); +select /*+ INL_JOIN(t1) */ * from t1 join t2 on t1.a=t2.a; +a b c a +1 2017-11-29 2.2 1 +select /*+ INL_HASH_JOIN(t1) */ * from t1 join t2 on t1.a=t2.a; +a b c a +1 2017-11-29 2.2 1 +select /*+ INL_MERGE_JOIN(t1) */ * from t1 join t2 on t1.a=t2.a; +a b c a +1 2017-11-29 2.2 1 +drop table if exists t, tt; +create table t(a int, b int); +create table tt(a varchar(10), b int); +insert into t values(1, 1); +select * from t left join tt on t.a=tt.a left join t ttt on t.a=ttt.a; +a b a b a b +1 1 NULL NULL 1 1 +drop table if exists t, k; +create table k (a int, pk int primary key, index(a)); +create table t (a int, pk int primary key, index(a)); +insert into k values(0,8),(0,23),(1,21),(1,33),(1,52),(2,17),(2,34),(2,39),(2,40),(2,66),(2,67),(3,9),(3,25),(3,41),(3,48),(4,4),(4,11),(4,15),(4,26),(4,27),(4,31),(4,35),(4,45),(4,47),(4,49); +insert into t values(3,4),(3,5),(3,27),(3,29),(3,57),(3,58),(3,79),(3,84),(3,92),(3,95); +select /*+ inl_join(t) */ count(*) from k left join t on k.a = t.a and k.pk > t.pk; +count(*) +33 +select /*+ inl_hash_join(t) */ count(*) from k left join t on k.a = t.a and k.pk > t.pk; +count(*) +33 +select /*+ inl_merge_join(t) */ count(*) from k left join t on k.a = t.a and k.pk > t.pk; +count(*) +33 +drop table if exists t1, t2; +create table t1(a bigint primary key, b bigint); +create table t2(a bigint primary key, b bigint); +insert into t1 values(1, 100), (2, 100), (3, 100), (4, 100), (5, 100); +insert into t2 select a*100, b*100 from t1; +explain format = 'brief' select /*+ TIDB_SMJ(t2) */ * from t1 left outer join t2 on t1.a=t2.a and t1.a!=3 order by t1.a; +id estRows task access object operator info +MergeJoin 10000.00 root left outer join, left key:executor__jointest__join.t1.a, right key:executor__jointest__join.t2.a, left cond:[ne(executor__jointest__join.t1.a, 3)] +├─TableReader(Build) 6666.67 root data:TableRangeScan +│ └─TableRangeScan 6666.67 cop[tikv] table:t2 range:[-inf,3), (3,+inf], keep order:true, stats:pseudo +└─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo +set @@tidb_init_chunk_size=1; +select /*+ TIDB_SMJ(t2) */ * from t1 left outer join t2 on t1.a=t2.a and t1.a!=3 order by t1.a; +a b a b +1 100 NULL NULL +2 100 NULL NULL +3 100 NULL NULL +4 100 NULL NULL +5 100 NULL NULL +drop table if exists t; +create table t(a bigint, b bigint, index idx_1(a,b)); +insert into t values(1, 1), (1, 2), (2, 1), (2, 2); +select /*+ TIDB_SMJ(t1, t2) */ * from t t1 join t t2 on t1.b = t2.b and t1.a=t2.a; +a b a b +1 1 1 1 +1 2 1 2 +2 1 2 1 +2 2 2 2 +drop table if exists t; +create table t(a decimal(6,2), index idx(a)); +insert into t values(1.01), (2.02), (NULL); +select /*+ TIDB_SMJ(t1) */ t1.a from t t1 join t t2 on t1.a=t2.a order by t1.a; +a +1.01 +2.02 +set @@tidb_init_chunk_size=default; +drop table if exists t1, t2; +create table t1(a int, b int); +create table t2(a int, b int); +insert into t1 values(1, 1); +select * from (t1 left join t2 on t1.a = t2.a) left join (t2 t3 left join t2 t4 on t3.a = t4.a) on t2.b = 1; +a b a b a b a b +1 1 NULL NULL NULL NULL NULL NULL +Drop table if exists t1; +Create table t1 (v int); +Insert into t1 value (1); +Insert into t1 value (2); +Insert into t1 value (3); +Drop table if exists t2; +Create table t2 (v decimal(12, 3)); +Insert into t2 value (1); +Insert into t2 value (2.0); +Insert into t2 value (000003.000000); +Select * from t1, t2 where t1.v = t2.v order by t1.v; +v v +1 1.000 +2 2.000 +3 3.000 +drop table if exists t; +create table t(a int, b int); +insert into t values(null, 1), (1, 2); +drop table if exists s; +create table s(a varchar(20), b varchar(20)); +insert into s values(null, '1'); +select a in (select a from s) from t; +a in (select a from s) +NULL +NULL +drop table s; +create table s(a int, b int); +insert into s values(null, 1); +select a in (select a+b from s) from t; +a in (select a+b from s) +NULL +NULL +drop table if exists t1; +drop table if exists t2; +create table t1(a bigint, b bigint); +create table t2(a bigint, b bigint); +insert into t1 values(1, 1); +select t1.a+t1.b as result from t1 left join t2 on 1 = 0 order by result limit 20; +result +2 +drop table if exists 11544t, 11544tt; +create table 11544t(a int); +create table 11544tt(a int, b varchar(10), index idx(a, b(3))); +insert into 11544t values(1); +insert into 11544tt values(1, 'aaaaaaa'), (1, 'aaaabbb'), (1, 'aaaacccc'); +select /*+ INL_JOIN(tt) */ * from 11544t t, 11544tt tt where t.a=tt.a and (tt.b = 'aaaaaaa' or tt.b = 'aaaabbb'); +a a b +1 1 aaaaaaa +1 1 aaaabbb +select /*+ INL_HASH_JOIN(tt) */ * from 11544t t, 11544tt tt where t.a=tt.a and (tt.b = 'aaaaaaa' or tt.b = 'aaaabbb'); +a a b +1 1 aaaaaaa +1 1 aaaabbb +select /*+ INL_MERGE_JOIN(tt) */ * from 11544t t, 11544tt tt where t.a=tt.a and (tt.b = 'aaaaaaa' or tt.b = 'aaaabbb'); +a a b +1 1 aaaaaaa +1 1 aaaabbb +select /*+ INL_JOIN(tt) */ * from 11544t t, 11544tt tt where t.a=tt.a and tt.b in ('aaaaaaa', 'aaaabbb', 'aaaacccc'); +a a b +1 1 aaaaaaa +1 1 aaaabbb +1 1 aaaacccc +select /*+ INL_HASH_JOIN(tt) */ * from 11544t t, 11544tt tt where t.a=tt.a and tt.b in ('aaaaaaa', 'aaaabbb', 'aaaacccc'); +a a b +1 1 aaaaaaa +1 1 aaaabbb +1 1 aaaacccc +select /*+ INL_MERGE_JOIN(tt) */ * from 11544t t, 11544tt tt where t.a=tt.a and tt.b in ('aaaaaaa', 'aaaabbb', 'aaaacccc'); +a a b +1 1 aaaaaaa +1 1 aaaabbb +1 1 aaaacccc +drop table if exists 11390t; +create table 11390t (k1 int unsigned, k2 int unsigned, key(k1, k2)); +insert into 11390t values(1, 1); +select /*+ INL_JOIN(t1, t2) */ * from 11390t t1, 11390t t2 where t1.k2 > 0 and t1.k2 = t2.k2 and t2.k1=1; +k1 k2 k1 k2 +1 1 1 1 +select /*+ INL_HASH_JOIN(t1, t2) */ * from 11390t t1, 11390t t2 where t1.k2 > 0 and t1.k2 = t2.k2 and t2.k1=1; +k1 k2 k1 k2 +1 1 1 1 +select /*+ INL_MERGE_JOIN(t1, t2) */ * from 11390t t1, 11390t t2 where t1.k2 > 0 and t1.k2 = t2.k2 and t2.k1=1; +k1 k2 k1 k2 +1 1 1 1 +drop table if exists t1, t2; +create table t1(a varchar(20), b int, c int); +create table t2(a varchar(20), b int, c int, primary key(a, b)); +insert into t1 values("abcd", 1, 1), ("bacd", 2, 2), ("cbad", 3, 3); +insert into t2 values("bcd", 1, 1), ("acd", 2, 2), ("bad", 3, 3); +select /*+ inl_join(t1, t2) */ * from t1 join t2 on substr(t1.a, 2, 4) = t2.a and t1.b = t2.b where t1.c between 1 and 5; +a b c a b c +abcd 1 1 bcd 1 1 +bacd 2 2 acd 2 2 +cbad 3 3 bad 3 3 +select /*+ inl_hash_join(t1, t2) */ * from t1 join t2 on substr(t1.a, 2, 4) = t2.a and t1.b = t2.b where t1.c between 1 and 5; +a b c a b c +abcd 1 1 bcd 1 1 +bacd 2 2 acd 2 2 +cbad 3 3 bad 3 3 +select /*+ inl_merge_join(t1, t2) */ * from t1 join t2 on substr(t1.a, 2, 4) = t2.a and t1.b = t2.b where t1.c between 1 and 5; +a b c a b c +abcd 1 1 bcd 1 1 +bacd 2 2 acd 2 2 +cbad 3 3 bad 3 3 +select /*+ inl_join(t1, t2) */ t1.* from t1 join t2 on substr(t1.a, 2, 4) = t2.a and t1.b = t2.b where t1.c between 1 and 5; +a b c +abcd 1 1 +bacd 2 2 +cbad 3 3 +select /*+ inl_hash_join(t1, t2) */ t1.* from t1 join t2 on substr(t1.a, 2, 4) = t2.a and t1.b = t2.b where t1.c between 1 and 5; +a b c +abcd 1 1 +bacd 2 2 +cbad 3 3 +select /*+ inl_merge_join(t1, t2) */ t1.* from t1 join t2 on substr(t1.a, 2, 4) = t2.a and t1.b = t2.b where t1.c between 1 and 5; +a b c +abcd 1 1 +bacd 2 2 +cbad 3 3 +drop table if exists t; +create table t (pk varchar(14) primary key, a varchar(12)); +select * from (select t1.pk or '/' as c from t as t1 left join t as t2 on t1.a = t2.pk) as t where t.c = 1; +c +drop table if exists testjoin; +create table testjoin(a int); +set @@tidb_max_chunk_size=2; +insert into testjoin values (NULL); +insert into testjoin values (1); +insert into testjoin values (2), (2), (2); +SELECT * FROM testjoin t1 RIGHT JOIN testjoin t2 ON t1.a > t2.a order by t1.a, t2.a; +a a +NULL NULL +NULL 2 +NULL 2 +NULL 2 +2 1 +2 1 +2 1 +set @@tidb_max_chunk_size=default; +drop table if exists t1, t2; +create table t1(a int, b int, primary key(a), index idx(b,a)); +create table t2(a int, b int, primary key(a), index idx(b,a)); +insert into t1 values(1, 1); +insert into t2 values(1, 1); +select /*+ INL_JOIN(t1) */ * from t1 FORCE INDEX (idx) join t2 on t1.b=t2.b and t1.a = t2.a; +a b a b +1 1 1 1 +set sql_mode = ''; +drop table if exists t1; +create table t1(c1 enum('a', 'b')); +insert into t1 values('a'); +insert into t1 values(0); +insert into t1 values(100); +select /*+ hash_join(t_alias1, t_alias2)*/ * from t1 t_alias1 inner join t1 t_alias2 on t_alias1.c1 = t_alias2.c1; +c1 c1 +a a + + + + +set sql_mode = default; +drop table if exists t1, t2; +create table t1(a int); +create table t2(a int); +insert into t1 values(1); +insert into t2 values(1); +select count(1), (select count(1) from t2 where t2.a > t1.a) as field from t1 where t1.a = 100; +count(1) field +0 NULL +select /*+ agg_to_cop() */ count(1), (select count(1) from t2 where t2.a > t1.a) as field from t1 where t1.a = 100; +count(1) field +0 NULL +select count(1), (select count(1) from t2 where t2.a > t1.a) as field from t1 where t1.a = 1; +count(1) field +1 0 +select /*+ agg_to_cop() */ count(1), (select count(1) from t2 where t2.a > t1.a) as field from t1 where t1.a = 1; +count(1) field +1 0 +drop table if exists t1, t2; +create table t1 ( c_int int, c_decimal decimal(12, 6), key(c_int), unique key(c_decimal) ); +create table t2 like t1; +insert into t1 (c_int, c_decimal) values (1, 4.064000), (2, 0.257000), (3, 1.010000); +insert into t2 (c_int, c_decimal) values (1, 4.064000), (3, 1.010000); +select /*+ HASH_JOIN(t1,t2) */ * from t1 join t2 on t1.c_decimal = t2.c_decimal order by t1.c_int; +c_int c_decimal c_int c_decimal +1 4.064000 1 4.064000 +3 1.010000 3 1.010000 +drop table if exists t; +drop table if exists t1; +create table t(c1 bigint); +create table t1(c1 bit(64)); +insert into t value(1); +insert into t1 value(1); +select t.c1, hex(t1.c1) from t, t1 where t.c1 = t1.c1; +c1 hex(t1.c1) +1 1 +drop table if exists t; +drop table if exists t1; +create table t(c1 int); +create table t1(c1 bit(32)); +insert into t value(1); +insert into t1 value(1); +select t.c1, hex(t1.c1) from t, t1 where t.c1 = t1.c1; +c1 hex(t1.c1) +1 1 +drop table if exists t; +drop table if exists t1; +create table t(c1 mediumint); +create table t1(c1 bit(24)); +insert into t value(1); +insert into t1 value(1); +select t.c1, hex(t1.c1) from t, t1 where t.c1 = t1.c1; +c1 hex(t1.c1) +1 1 +drop table if exists t; +drop table if exists t1; +create table t(c1 smallint); +create table t1(c1 bit(16)); +insert into t value(1); +insert into t1 value(1); +select t.c1, hex(t1.c1) from t, t1 where t.c1 = t1.c1; +c1 hex(t1.c1) +1 1 +drop table if exists t; +drop table if exists t1; +create table t(c1 tinyint); +create table t1(c1 bit(8)); +insert into t value(1); +insert into t1 value(1); +select t.c1, hex(t1.c1) from t, t1 where t.c1 = t1.c1; +c1 hex(t1.c1) +1 1 +drop table if exists t1; +create table t1 (c_int int, primary key (c_int)); +insert into t1 values (1),(2),(3),(4); +drop table if exists t2; +create table t2 (c_str varchar(40)); +insert into t2 values ('zen sammet'); +insert into t2 values ('happy fermat'); +insert into t2 values ('happy archimedes'); +insert into t2 values ('happy hypatia'); +drop table if exists t3; +create table t3 (c_int int, c_str varchar(40), primary key (c_int), key (c_str)); +insert into t3 values (1, 'sweet hoover'); +insert into t3 values (2, 'awesome elion'); +insert into t3 values (3, 'hungry khayyam'); +insert into t3 values (4, 'objective kapitsa'); +select c_str, (select /*+ INL_JOIN(t1,t3) */ max(t1.c_int) from t1, t3 where t1.c_int = t3.c_int and t2.c_str > t3.c_str) q from t2 order by c_str; +c_str q +happy archimedes 2 +happy fermat 2 +happy hypatia 2 +zen sammet 4 +select c_str, (select /*+ INL_HASH_JOIN(t1,t3) */ max(t1.c_int) from t1, t3 where t1.c_int = t3.c_int and t2.c_str > t3.c_str) q from t2 order by c_str; +c_str q +happy archimedes 2 +happy fermat 2 +happy hypatia 2 +zen sammet 4 +select c_str, (select /*+ INL_MERGE_JOIN(t1,t3) */ max(t1.c_int) from t1, t3 where t1.c_int = t3.c_int and t2.c_str > t3.c_str) q from t2 order by c_str; +c_str q +happy archimedes 2 +happy fermat 2 +happy hypatia 2 +zen sammet 4 +drop table if exists t1; +create table t1 (c_int int, primary key (c_int)); +insert into t1 values (1),(2),(3),(4),(5); +drop table if exists t2; +create table t2 (c_int int unsigned, c_str varchar(40), primary key (c_int), key (c_str)); +insert into t2 values (1, 'dazzling panini'),(2, 'infallible perlman'),(3, 'recursing cannon'),(4, 'vigorous satoshi'),(5, 'vigilant gauss'),(6, 'nervous jackson'); +drop table if exists t3; +create table t3 (c_int int, c_str varchar(40), key (c_str)); +insert into t3 values (1, 'sweet morse'),(2, 'reverent golick'),(3, 'clever rubin'),(4, 'flamboyant morse'); +select (select (select sum(c_int) from t3 where t3.c_str > t2.c_str) from t2 where t2.c_int > t1.c_int order by c_int limit 1) q from t1 order by q; +q +NULL +NULL +3 +3 +3 +drop table if exists t; +drop table if exists s; +create table t(a int, b int); +create table s(a int, b int, index(a)); +insert into t values(1,1),(1,2),(2,2); +insert into s values(1,1),(2,2),(2,1); +select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.b = s.b; +a b a b +1 1 1 1 +2 2 2 2 +select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.b = s.a; +a b a b +1 1 1 1 +2 2 2 2 +2 2 2 1 +select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.a = s.b; +a b a b +1 1 1 1 +1 2 1 1 +2 2 2 2 +select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.b = s.b; +a b a b +1 1 1 1 +2 2 2 2 +select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.b = s.a; +a b a b +1 1 1 1 +2 2 2 2 +2 2 2 1 +select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.a = s.b; +a b a b +1 1 1 1 +1 2 1 1 +2 2 2 2 +drop table if exists t,s ; +CREATE TABLE `t` ( `a` set('a','b','c','d','e','f','g','h','i','j') DEFAULT NULL ); +insert into t values('i'), ('j'); +CREATE TABLE `s` ( `a` char(1) DEFAULT NULL, KEY `a` (`a`) ); +insert into s values('i'), ('j'); +select /*+ inl_hash_join(s)*/ t.a from t left join s on t.a = s.a; +a +i +j +select /*+ inl_join(s)*/ t.a from t left join s on t.a = s.a; +a +i +j +drop table if exists tt1,tt2,tt3; +create table tt1 (ts timestamp); +create table tt2 (ts varchar(32)); +create table tt3 (ts datetime); +insert into tt1 values ("2001-01-01 00:00:00"); +insert into tt2 values ("2001-01-01 00:00:00"); +insert into tt3 values ("2001-01-01 00:00:00"); +select * from tt1 where ts in (select ts from tt2); +ts +2001-01-01 00:00:00 +select * from tt1 where ts in (select ts from tt3); +ts +2001-01-01 00:00:00 +set @@session.time_zone = '+10:00'; +select * from tt1 where ts in (select ts from tt2); +ts +set @@session.time_zone = default; +drop table if exists t1, t2, t3, t4; +create table t1(a int, b int, c int); +create table t2(a int, b int, c int); +create table t3(a int, b int, c int); +create table t4(a int, b int, c int); +INSERT INTO t1 VALUES (1,3,0), (2,2,0), (3,2,0); +INSERT INTO t2 VALUES (3,3,0), (4,2,0), (5,3,0); +INSERT INTO t3 VALUES (1,2,0), (2,2,0); +INSERT INTO t4 VALUES (3,2,0), (4,2,0); +SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b from (t3, t4) left join (t1, t2) on t3.a=1 AND t3.b=t2.b AND t2.b=t4.b order by 1, 2, 3, 4, 5; +a b a b a b +NULL NULL 2 2 3 2 +NULL NULL 2 2 4 2 +4 2 1 2 3 2 +4 2 1 2 3 2 +4 2 1 2 3 2 +4 2 1 2 4 2 +4 2 1 2 4 2 +4 2 1 2 4 2 +drop table if exists t1, t2, t3; +create table t1 (a1 int, a2 int); +create table t2 (b1 int not null, b2 int); +create table t3 (c1 int, c2 int); +insert into t1 values (1,2), (2,2), (3,2); +insert into t2 values (1,3), (2,3); +insert into t3 values (2,4), (3,4); +select * from t1 left join t2 on b1 = a1 left join t3 on c1 = a1 and b1 is null order by 1, 2, 3, 4, 5, 6; +a1 a2 b1 b2 c1 c2 +1 2 1 3 NULL NULL +2 2 2 3 NULL NULL +3 2 NULL NULL 3 4 +set sql_mode = 'ONLY_FULL_GROUP_BY'; +drop table if exists events; +create table events (clock int, source int); +SELECT * FROM events e JOIN (SELECT MAX(clock) AS clock FROM events e2 GROUP BY e2.source) e3 ON e3.clock=e.clock; +clock source clock +SELECT * FROM events e JOIN (SELECT clock FROM events e2 GROUP BY e2.source) e3 ON e3.clock=e.clock; +Error 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'executor__jointest__join.e2.clock' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by +drop table if exists tpj1,tpj2; +create table tpj1 (id int, b int, unique index (id)); +create table tpj2 (id int, b int, unique index (id)); +insert into tpj1 values (1,1); +insert into tpj2 values (1,1); +select tpj1.b,tpj2.b from tpj1 left join tpj2 on tpj1.id=tpj2.id where tpj1.id=1; +b b +1 1 +set sql_mode = default; +drop table if exists t1; +drop table if exists t2; +create table t1 (id int); +create table t2 (id int); +insert into t1 values (1); +insert into t2 values (1); +SELECT * FROM t1 JOIN t2 on (t2.id < all (SELECT 1)); +Error 1105 (HY000): ON condition doesn't support subqueries yet +SELECT * FROM (select null) v NATURAL LEFT JOIN (select null) v1; +NULL +NULL +drop table if exists t0; +drop view if exists v0; +CREATE TABLE t0(c0 TEXT); +CREATE VIEW v0(c0) AS SELECT NULL; +SELECT /*+ HASH_JOIN(v0) */ * FROM v0 NATURAL LEFT JOIN t0; +c0 +NULL +SELECT /*+ MERGE_JOIN(v0) */ * FROM v0 NATURAL LEFT JOIN t0; +c0 +NULL +drop table if exists t; +set @@session.tidb_enable_null_aware_anti_join=0; +create table t(a decimal(40,0), b bigint(20) not null); +insert into t values(7,8),(7,8),(3,4),(3,4),(9,2),(9,2),(2,0),(2,0),(0,4),(0,4),(8,8),(8,8),(6,1),(6,1),(NULL, 0),(NULL,0); +select ( table1 . a , table1 . b ) NOT IN ( SELECT 3 , 2 UNION SELECT 9, 2 ) AS field2 from t as table1 order by field2; +field2 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +set @@session.tidb_enable_null_aware_anti_join=1; +select ( table1 . a , table1 . b ) NOT IN ( SELECT 3 , 2 UNION SELECT 9, 2 ) AS field2 from t as table1 order by field2; +field2 +0 +0 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +set @@session.tidb_enable_null_aware_anti_join=default; +drop table if exists t1, t2; +create table t1 (a int, b int); +create table t2 (a int, c int); +insert t1 values (1,2), (10,20), (0,0); +insert t2 values (1,3), (100,200), (0,0); +explain format = 'brief' select * from t1 natural join t2; +id estRows task access object operator info +HashJoin 12487.50 root inner join, equal:[eq(executor__jointest__join.t1.a, executor__jointest__join.t2.a)] +├─TableReader(Build) 9990.00 root data:Selection +│ └─Selection 9990.00 cop[tikv] not(isnull(executor__jointest__join.t2.a)) +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─TableReader(Probe) 9990.00 root data:Selection + └─Selection 9990.00 cop[tikv] not(isnull(executor__jointest__join.t1.a)) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +select * from t1 natural join t2; +a b c +0 0 0 +1 2 3 +explain format = 'brief' select * from t1 natural left join t2 order by a; +id estRows task access object operator info +Sort 12487.50 root executor__jointest__join.t1.a +└─HashJoin 12487.50 root left outer join, equal:[eq(executor__jointest__join.t1.a, executor__jointest__join.t2.a)] + ├─TableReader(Build) 9990.00 root data:Selection + │ └─Selection 9990.00 cop[tikv] not(isnull(executor__jointest__join.t2.a)) + │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +select * from t1 natural left join t2 order by a; +a b c +0 0 0 +1 2 3 +10 20 NULL +explain format = 'brief' select * from t1 natural right join t2 order by a; +id estRows task access object operator info +Sort 12487.50 root executor__jointest__join.t2.a +└─Projection 12487.50 root executor__jointest__join.t2.a, executor__jointest__join.t2.c, executor__jointest__join.t1.b + └─HashJoin 12487.50 root right outer join, equal:[eq(executor__jointest__join.t1.a, executor__jointest__join.t2.a)] + ├─TableReader(Build) 9990.00 root data:Selection + │ └─Selection 9990.00 cop[tikv] not(isnull(executor__jointest__join.t1.a)) + │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +select * from t1 natural right join t2 order by a; +a c b +0 0 0 +1 3 2 +100 200 NULL +explain format = 'brief' SELECT * FROM t1 NATURAL LEFT JOIN t2 WHERE not(t1.a <=> t2.a); +id estRows task access object operator info +Projection 9990.00 root executor__jointest__join.t1.a, executor__jointest__join.t1.b, executor__jointest__join.t2.c +└─Selection 9990.00 root not(nulleq(executor__jointest__join.t1.a, executor__jointest__join.t2.a)) + └─HashJoin 12487.50 root left outer join, equal:[eq(executor__jointest__join.t1.a, executor__jointest__join.t2.a)] + ├─TableReader(Build) 9990.00 root data:Selection + │ └─Selection 9990.00 cop[tikv] not(isnull(executor__jointest__join.t2.a)) + │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +SELECT * FROM t1 NATURAL LEFT JOIN t2 WHERE not(t1.a <=> t2.a); +a b c +10 20 NULL +drop table if exists t1, t2, t3, t4; +create table t1 (c int, b int); +create table t2 (a int, b int); +create table t3 (b int, c int); +create table t4 (y int, c int); +insert into t1 values (10,1); +insert into t1 values (3 ,1); +insert into t1 values (3 ,2); +insert into t2 values (2, 1); +insert into t3 values (1, 3); +insert into t3 values (1,10); +insert into t4 values (11,3); +insert into t4 values (2, 3); +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) natural join (t3 natural join t4); +c b a b b c y c +3 1 2 1 1 3 11 3 +3 1 2 1 1 3 2 3 +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) join (t3 natural join t4) using (b); +c b a b b c y c +10 1 2 1 1 3 11 3 +10 1 2 1 1 3 2 3 +3 1 2 1 1 3 11 3 +3 1 2 1 1 3 2 3 +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) join (t3 natural join t4) using (c); +c b a b b c y c +3 1 2 1 1 3 11 3 +3 1 2 1 1 3 2 3 +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) join (t3 natural join t4) using (c,b); +c b a b b c y c +3 1 2 1 1 3 11 3 +3 1 2 1 1 3 2 3 +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) left outer join (t3 natural join t4) using (b); +c b a b b c y c +10 1 2 1 1 3 11 3 +10 1 2 1 1 3 2 3 +3 1 2 1 1 3 11 3 +3 1 2 1 1 3 2 3 +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) left outer join (t3 natural join t4) using (c); +c b a b b c y c +10 1 2 1 NULL NULL NULL NULL +3 1 2 1 1 3 11 3 +3 1 2 1 1 3 2 3 +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) left outer join (t3 natural join t4) using (c,b); +c b a b b c y c +10 1 2 1 NULL NULL NULL NULL +3 1 2 1 1 3 11 3 +3 1 2 1 1 3 2 3 +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) right outer join (t3 natural join t4) using (b); +c b a b b c y c +10 1 2 1 1 3 11 3 +10 1 2 1 1 3 2 3 +3 1 2 1 1 3 11 3 +3 1 2 1 1 3 2 3 +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) right outer join (t3 natural join t4) using (c); +c b a b b c y c +3 1 2 1 1 3 11 3 +3 1 2 1 1 3 2 3 +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) right outer join (t3 natural join t4) using (c,b); +c b a b b c y c +3 1 2 1 1 3 11 3 +3 1 2 1 1 3 2 3 +select * from (t1 natural join t2) natural join (t3 natural join t4); +b c a y +1 3 2 11 +1 3 2 2 +select * from (t1 natural join t2) join (t3 natural join t4) using (b); +b c a c y +1 10 2 3 11 +1 10 2 3 2 +1 3 2 3 11 +1 3 2 3 2 +select * from (t1 natural join t2) left outer join (t3 natural join t4) using (b); +b c a c y +1 10 2 3 11 +1 10 2 3 2 +1 3 2 3 11 +1 3 2 3 2 +select * from (t1 natural join t2) right outer join (t3 natural join t4) using (c,b); +c b y a +3 1 11 2 +3 1 2 2 +drop table if exists t, t1, t2, t3; +create table t(a int, b enum('A', 'B')); +create table t1(a1 int, b1 enum('B', 'A') NOT NULL, UNIQUE KEY (b1)); +insert into t values (1, 'A'); +insert into t1 values (1, 'A'); +select /*+ INL_HASH_JOIN(t1) */ * from t join t1 on t.b = t1.b1; +a b a1 b1 +1 A 1 A +select /*+ INL_JOIN(t1) */ * from t join t1 on t.b = t1.b1; +a b a1 b1 +1 A 1 A +create table t2(a1 int, b1 enum('C', 'D') NOT NULL, UNIQUE KEY (b1)); +insert into t2 values (1, 'C'); +select /*+ INL_HASH_JOIN(t2) */ * from t join t2 on t.b = t2.b1; +a b a1 b1 +select /*+ INL_JOIN(t2) */ * from t join t2 on t.b = t2.b1; +a b a1 b1 +create table t3(a1 int, b1 enum('A', 'B') NOT NULL, UNIQUE KEY (b1)); +insert into t3 values (1, 'A'); +select /*+ INL_HASH_JOIN(t3) */ * from t join t3 on t.b = t3.b1; +a b a1 b1 +1 A 1 A +select /*+ INL_JOIN(t3) */ * from t join t3 on t.b = t3.b1; +a b a1 b1 +1 A 1 A +drop table if exists t; +drop table if exists t1; +create table t(c1 int); +create table t1(c1 int unsigned); +insert into t values (1); +insert into t1 values (1); +select t.c1 from t , t1 where t.c1 = t1.c1; +c1 +1 +drop table if exists t; +drop table if exists t1; +create table t(c1 bigint); +create table t1(c1 bigint unsigned); +insert into t values (-1); +insert into t1 values (18446744073709551615); +select * from t , t1 where t.c1 = t1.c1; +c1 c1 +drop table if exists t; +drop table if exists t1; +create table t(c1 float); +create table t1(c1 double); +insert into t values (1.0); +insert into t1 values (1.00); +select t.c1 from t , t1 where t.c1 = t1.c1; +c1 +1 +drop table if exists t; +drop table if exists t1; +create table t(c1 varchar(1)); +create table t1(c1 char(1)); +insert into t values ("x"); +insert into t1 values ("x"); +select t.c1 from t , t1 where t.c1 = t1.c1; +c1 +x +drop table if exists t; +drop table if exists t1; +create table t(c1 varchar(1)); +create table t1(c1 char(1)); +insert into t values ("x"); +insert into t1 values ("y"); +select t.c1 from t , t1 where t.c1 = t1.c1; +c1 +drop table if exists t; +drop table if exists t1; +create table t(c1 int,c2 double); +create table t1(c1 double,c2 int); +insert into t values (1, 2), (1, NULL); +insert into t1 values (1, 2), (1, NULL); +select * from t a , t1 b where (a.c1, a.c2) = (b.c1, b.c2); +c1 c2 c1 c2 +1 2 1 2 +drop table if exists t; +drop table if exists t1; +create table t(c1 bigint unsigned); +create table t1(c1 bit(64)); +insert into t value(18446744073709551615); +insert into t1 value(-1); +select * from t, t1 where t.c1 = t1.c1; +c1 c1 +18446744073709551615 ÿÿÿÿÿÿÿÿ +drop table if exists t; +drop table if exists t1; +create table t(c1 bigint); +create table t1(c1 bit(64)); +insert into t value(1); +insert into t1 value(1); +select * from t, t1 where t.c1 = t1.c1; +c1 c1 +1  +drop table if exists t; +drop table if exists t1; +create table t(c1 bigint); +create table t1(c1 bit(64)); +insert into t value(-1); +insert into t1 value(18446744073709551615); +select * from t, t1 where t.c1 = t1.c1; +c1 c1 +drop table if exists t; +drop table if exists t1; +drop table if exists t2; +create table t(c1 bigint); +create table t1(c1 bigint unsigned); +create table t2(c1 Date); +insert into t value(20191111); +insert into t1 value(20191111); +insert into t2 value('2019-11-11'); +select * from t, t1, t2 where t.c1 = t2.c1 and t1.c1 = t2.c1; +c1 c1 c1 +20191111 20191111 2019-11-11 +drop table if exists t; +drop table if exists t1; +drop table if exists t2; +create table t(c1 bigint); +create table t1(c1 bigint unsigned); +create table t2(c1 enum('a', 'b', 'c', 'd')); +insert into t value(3); +insert into t1 value(3); +insert into t2 value('c'); +select * from t, t1, t2 where t.c1 = t2.c1 and t1.c1 = t2.c1; +c1 c1 c1 +3 3 c +drop table if exists t; +drop table if exists t1; +drop table if exists t2; +create table t(c1 bigint); +create table t1(c1 bigint unsigned); +create table t2 (c1 SET('a', 'b', 'c', 'd')); +insert into t value(9); +insert into t1 value(9); +insert into t2 value('a,d'); +select * from t, t1, t2 where t.c1 = t2.c1 and t1.c1 = t2.c1; +c1 c1 c1 +9 9 a,d +drop table if exists t; +drop table if exists t1; +create table t(c1 int); +create table t1(c1 decimal(4,2)); +insert into t values(0), (2); +insert into t1 values(0), (9); +select * from t left join t1 on t1.c1 = t.c1; +c1 c1 +0 0.00 +2 NULL +drop table if exists t; +drop table if exists t1; +create table t(c1 decimal(4,1)); +create table t1(c1 decimal(4,2)); +insert into t values(0), (2); +insert into t1 values(0), (9); +select * from t left join t1 on t1.c1 = t.c1; +c1 c1 +0.0 0.00 +2.0 NULL +drop table if exists t; +drop table if exists t1; +create table t(c1 decimal(4,1)); +create table t1(c1 decimal(4,2)); +create index k1 on t1(c1); +insert into t values(0), (2); +insert into t1 values(0), (9); +select /*+ INL_JOIN(t1) */ * from t left join t1 on t1.c1 = t.c1; +c1 c1 +0.0 0.00 +2.0 NULL +select /*+ INL_HASH_JOIN(t1) */ * from t left join t1 on t1.c1 = t.c1; +c1 c1 +0.0 0.00 +2.0 NULL +select /*+ INL_MERGE_JOIN(t1) */ * from t left join t1 on t1.c1 = t.c1; +c1 c1 +0.0 0.00 +2.0 NULL +drop table if exists t; +drop table if exists t1; +drop table if exists t2; +create table t(c1 char(10)); +create table t1(c1 char(10)); +create table t2(c1 char(10)); +insert into t values('abd'); +insert into t1 values('abc'); +insert into t2 values('abc'); +select * from (select * from t union all select * from t1) t1 join t2 on t1.c1 = t2.c1; +c1 c1 +abc abc +drop table if exists t; +create table t(a varchar(10), index idx(a)); +insert into t values('1'), ('2'), ('3'); +set @@tidb_init_chunk_size=1; +select a from (select /*+ INL_JOIN(t1, t2) */ t1.a from t t1 join t t2 on t1.a=t2.a) t group by a; +a +1 +2 +3 +select a from (select /*+ INL_HASH_JOIN(t1, t2) */ t1.a from t t1 join t t2 on t1.a=t2.a) t group by a; +a +1 +2 +3 +select a from (select /*+ INL_MERGE_JOIN(t1, t2) */ t1.a from t t1 join t t2 on t1.a=t2.a) t group by a; +a +1 +2 +3 +set @@tidb_init_chunk_size=default; +drop table if exists t1, t2, t3, t4; +create table t1 (a int, c int); +create table t2 (a int, d int); +create table t3 (a int); +create table t4 (a int); +insert t1 values (2, 4), (1, 3); +insert t2 values (2, 5), (3, 6); +insert t3 values (1); +select * from t1 join t2 using (a); +a c d +2 4 5 +select t1.a, t2.a from t1 join t2 using (a); +a a +2 2 +select * from t1 right join t2 using (a) order by a; +a d c +2 5 4 +3 6 NULL +select t1.a, t2.a from t1 right join t2 using (a) order by t2.a; +a a +2 2 +NULL 3 +select * from t1 left join t2 using (a) order by a; +a c d +1 3 NULL +2 4 5 +select t1.a, t2.a from t1 left join t2 using (a) order by t1.a; +a a +1 NULL +2 2 +select * from t1 join t2 using (a) right join t3 using (a); +a c d +1 NULL NULL +select * from t1 join t2 using (a) right join t3 on (t2.a = t3.a); +a c d a +NULL NULL NULL 1 +select t2.a from t1 join t2 using (a) right join t3 on (t1.a = t3.a); +a +NULL +select t1.a, t2.a, t3.a from t1 join t2 using (a) right join t3 using (a); +a a a +NULL NULL 1 +select t1.c, t2.d from t1 join t2 using (a) right join t3 using (a); +c d +NULL NULL +alter table t1 add column b int default 1 after a; +alter table t2 add column b int default 1 after a; +select * from t1 join t2 using (b, a); +a b c d +2 1 4 5 +select * from (t1 join t2 using (a)) join (t3 join t4 using (a)) on (t2.a = t4.a and t1.a = t3.a); +a b c b d a +drop table if exists t, tt; +create table t(a int, b int); +create table tt(b int, a int); +insert into t (a, b) values(1, 1); +insert into tt (a, b) values(1, 2); +select * from t join tt using(a); +a b b +1 1 2 +drop table if exists t, tt; +create table t(a float, b int); +create table tt(b bigint, a int); +select * from t join tt using(a); +a b b +drop table if exists t, s; +create table t(a int, b int); +create table s(b int, a int); +insert into t values(1,1), (2,2), (3,3), (null,null); +insert into s values(1,1), (3,3), (null,null); +select t.*, s.* from t join s using(a); +a b b a +1 1 1 1 +3 3 3 3 +select s.a from t join s using(a); +a +1 +3 +select s.a from t join s using(a) where s.a > 1; +a +3 +select s.a from t join s using(a) order by s.a; +a +1 +3 +select s.a from t join s using(a) where s.a > 1 order by s.a; +a +3 +select s.a from t join s using(a) where s.a > 1 order by s.a limit 2; +a +3 +DROP TABLE if exists t1, t2, t3; +create table t1 (i int); +create table t2 (i int); +create table t3 (i int); +select * from t1,t2 natural left join t3 order by t1.i,t2.i,t3.i; +i i +select t1.i,t2.i,t3.i from t2 natural left join t3,t1 order by t1.i,t2.i,t3.i; +i i i +select * from t1,t2 natural right join t3 order by t1.i,t2.i,t3.i; +i i +select t1.i,t2.i,t3.i from t2 natural right join t3,t1 order by t1.i,t2.i,t3.i; +i i i +DROP TABLE if exists t0, t1; +CREATE TABLE t0(c0 INT); +CREATE TABLE t1(c0 INT); +SELECT t0.c0 FROM t0 NATURAL RIGHT JOIN t1 WHERE t1.c0; +c0 +DROP TABLE if exists t1, t2; +create table t1(id int, name varchar(20)); +create table t2(id int, address varchar(30)); +insert into t1 values(1,'gangshen'); +insert into t2 values(1,'HangZhou'); +select t2.* from t1 inner join t2 using (id) limit 1; +id address +1 HangZhou +select t2.* from t1 inner join t2 on t1.id = t2.id limit 1; +id address +1 HangZhou +drop table if exists t1; +create table t1(a int); +insert into t1 (a) values(1); +select t1.*, t2.* from t1 join t1 t2 using(a); +a a +1 1 +select * from t1 join t1 t2 using(a); +a +1 +drop table t; +CREATE TABLE t ( a varchar(55) NOT NULL, b varchar(55) NOT NULL, c int(11) DEFAULT NULL, d int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; +update t t1 join t t2 using(a,b) set t1.c=t2.d; +DROP TABLE if exists t1,t2,t3,t4,t5; +CREATE TABLE t1 (a INT, b INT); +CREATE TABLE t2 (a INT, b INT); +CREATE TABLE t3 (a INT, b INT); +INSERT INTO t1 VALUES (1,1); +INSERT INTO t2 VALUES (1,1); +INSERT INTO t3 VALUES (1,1); +SELECT * FROM t1 JOIN (t2 JOIN t3 USING (b)) USING (a); +Error 1052 (23000): Column 'a' in from clause is ambiguous +drop table if exists t1,t2; +create table t1 (t1 int , t0 int); +create table t2 (t2 int, t0 int); +insert into t1 select 11, 1; +insert into t2 select 22, 1; +select t1.t0, t2.t0 from t1 join t2 using(t0) group by t1.t0; +t0 t0 +1 1 +select t1.t0, t2.t0 from t1 join t2 using(t0) having t1.t0 > 0; +t0 t0 +1 1 +set @@tidb_hash_join_concurrency=1; +set @@tidb_hashagg_partial_concurrency=1; +set @@tidb_hashagg_final_concurrency=1; +drop table if exists t; +create table t (c int, d int); +begin; +insert t values (1, 1); +insert t values (2, 2); +insert t values (3, 4); +commit; +set sql_mode = 'STRICT_TRANS_TABLES'; +select * from t where exists(select * from t k where t.c = k.c having sum(c) = 1); +c d +1 1 +select * from t where exists(select k.c, k.d from t k, t p where t.c = k.d); +c d +1 1 +2 2 +select 1 = (select count(*) from t where t.c = k.d) from t k; +1 = (select count(*) from t where t.c = k.d) +1 +1 +0 +select 1 = (select count(*) from t where exists( select * from t m where t.c = k.d)) from t k; +1 = (select count(*) from t where exists( select * from t m where t.c = k.d)) +0 +1 +1 +select t.c = any (select count(*) from t) from t; +t.c = any (select count(*) from t) +0 +0 +1 +select * from t where (t.c, 6) = any (select count(*), sum(t.c) from t); +c d +3 4 +select t.c from t where (t.c) < all (select count(*) from t); +c +1 +2 +select t.c from t where (t.c, t.d) = any (select * from t); +c +1 +2 +3 +select t.c from t where (t.c, t.d) != all (select * from t); +c +select (select count(*) from t where t.c = k.d) from t k; +(select count(*) from t where t.c = k.d) +0 +1 +1 +select t.c from t where (t.c, t.d) in (select * from t); +c +1 +2 +3 +select t.c from t where (t.c, t.d) not in (select * from t); +c +select * from t A inner join t B on A.c = B.c and A.c > 100; +c d c d +select t.c from t where (t.c, t.d) != all (select * from t where d > 1000); +c +1 +2 +3 +select t.c from t where (t.c) < any (select c from t where d > 1000); +c +insert t values (NULL, NULL); +select (t.c) < any (select c from t) from t; +(t.c) < any (select c from t) +NULL +NULL +1 +1 +select (10) > all (select c from t) from t; +(10) > all (select c from t) +NULL +NULL +NULL +NULL +select (c) > all (select c from t) from t; +(c) > all (select c from t) +0 +0 +0 +NULL +drop table if exists a; +create table a (c int, d int); +insert a values (1, 2); +drop table if exists b; +create table b (c int, d int); +insert b values (2, 1); +select * from a b where c = (select d from b a where a.c = 2 and b.c = 1); +c d +1 2 +drop table if exists t; +create table t(c int); +insert t values(10), (8), (7), (9), (11); +select * from t where 9 in (select c from t s where s.c < t.c limit 3); +c +10 +drop table if exists t; +create table t(id int, v int); +insert into t values(1, 1), (2, 2), (3, 3); +select * from t where v=(select min(t1.v) from t t1, t t2, t t3 where t1.id=t2.id and t2.id=t3.id and t1.id=t.id); +id v +1 1 +2 2 +3 3 +select exists (select t.id from t where s.id < 2 and t.id = s.id) from t s; +exists (select t.id from t where s.id < 2 and t.id = s.id) +1 +0 +0 +drop table if exists t; +create table t(c int); +select exists(select count(*) from t); +exists(select count(*) from t) +1 +drop table if exists t; +create table t(id int primary key, v int); +insert into t values(1, 1), (2, 2), (3, 3); +select (select t.id from t where s.id < 2 and t.id = s.id) from t s; +(select t.id from t where s.id < 2 and t.id = s.id) +NULL +NULL +1 +select (select t.id from t where t.id = t.v and t.v != s.id) from t s; +Error 1242 (21000): Subquery returns more than 1 row +drop table if exists t; +drop table if exists s; +create table t(id int); +create table s(id int); +insert into t values(1), (2); +insert into s values(2), (2); +select id from t where(select count(*) from s where s.id = t.id) > 0; +id +2 +select *, (select count(*) from s where id = t.id limit 1, 1) from t; +id (select count(*) from s where id = t.id limit 1, 1) +1 NULL +2 NULL +drop table if exists t; +drop table if exists s; +create table t(id int primary key); +create table s(id int); +insert into t values(1), (2); +insert into s values(2), (2); +select *, (select count(id) from s where id = t.id) from t; +id (select count(id) from s where id = t.id) +1 0 +2 2 +select *, 0 < any (select count(id) from s where id = t.id) from t; +id 0 < any (select count(id) from s where id = t.id) +1 0 +2 1 +select (select count(*) from t k where t.id = id) from s, t where t.id = s.id limit 1; +(select count(*) from t k where t.id = id) +1 +drop table if exists t, s; +create table t(id int primary key); +create table s(id int, index k(id)); +insert into t values(1), (2); +insert into s values(2), (2); +select (select id from s where s.id = t.id order by s.id limit 1) from t; +(select id from s where s.id = t.id order by s.id limit 1) +NULL +2 +drop table if exists t, s; +create table t(id int); +create table s(id int); +insert into t values(2), (2); +insert into s values(2); +select (select id from s where s.id = t.id order by s.id) from t; +(select id from s where s.id = t.id order by s.id) +2 +2 +drop table if exists t; +create table t(dt datetime); +select (select 1 from t where DATE_FORMAT(o.dt,'%Y-%m')) from t o; +(select 1 from t where DATE_FORMAT(o.dt,'%Y-%m')) +drop table if exists t1, t2; +create table t1(f1 int, f2 int); +create table t2(fa int, fb int); +insert into t1 values (1,1),(1,1),(1,2),(1,2),(1,2),(1,3); +insert into t2 values (1,1),(1,2),(1,3); +select f1,f2 from t1 group by f1,f2 having count(1) >= all (select fb from t2 where fa = f1); +f1 f2 +1 2 +DROP TABLE IF EXISTS t1, t2; +CREATE TABLE t1(a INT); +CREATE TABLE t2 (d BINARY(2), PRIMARY KEY (d(1)), UNIQUE KEY (d)); +INSERT INTO t1 values(1); +SELECT 1 FROM executor__jointest__join.t1, executor__jointest__join.t2 WHERE 1 = (SELECT executor__jointest__join.t2.d FROM executor__jointest__join.t2 WHERE executor__jointest__join.t1.a >= 1) and executor__jointest__join.t2.d = 1; +1 +DROP TABLE IF EXISTS t1; +CREATE TABLE t1(a int, b int default 0); +create index k1 on t1(a); +INSERT INTO t1 (a) values(1), (2), (3), (4), (5); +select (select /*+ INL_JOIN(x2) */ x2.a from t1 x1, t1 x2 where x1.a = t1.a and x1.a = x2.a) from t1; +(select /*+ INL_JOIN(x2) x2.a from t1 x1, t1 x2 where x1.a = t1.a and x1.a = x2.a) +1 +2 +3 +4 +5 +select (select /*+ INL_HASH_JOIN(x2) */ x2.a from t1 x1, t1 x2 where x1.a = t1.a and x1.a = x2.a) from t1; +(select /*+ INL_HASH_JOIN(x2) x2.a from t1 x1, t1 x2 where x1.a = t1.a and x1.a = x2.a) +1 +2 +3 +4 +5 +select (select /*+ INL_MERGE_JOIN(x2) */ x2.a from t1 x1, t1 x2 where x1.a = t1.a and x1.a = x2.a) from t1; +(select /*+ INL_MERGE_JOIN(x2) x2.a from t1 x1, t1 x2 where x1.a = t1.a and x1.a = x2.a) +1 +2 +3 +4 +5 +select 1 from (select t1.a in (select t1.a from t1) from t1) x; +1 +1 +1 +1 +1 +1 +select 1 from (select t1.a not in (select t1.a from t1) from t1) x; +1 +1 +1 +1 +1 +1 +drop table if exists t1, t2; +create table t1(a int); +create table t2(b int); +insert into t1 values(1); +insert into t2 values(1); +select * from t1 where a in (select a from t2); +a +1 +insert into t2 value(null); +select * from t1 where 1 in (select b from t2); +a +1 +select * from t1 where 1 not in (select b from t2); +a +select * from t1 where 2 not in (select b from t2); +a +select * from t1 where 2 in (select b from t2); +a +select 1 in (select b from t2) from t1; +1 in (select b from t2) +1 +select 1 in (select 1 from t2) from t1; +1 in (select 1 from t2) +1 +select 1 not in (select b from t2) from t1; +1 not in (select b from t2) +0 +select 1 not in (select 1 from t2) from t1; +1 not in (select 1 from t2) +0 +delete from t2 where b=1; +select 1 in (select b from t2) from t1; +1 in (select b from t2) +NULL +select 1 not in (select b from t2) from t1; +1 not in (select b from t2) +NULL +select 1 not in (select 1 from t2) from t1; +1 not in (select 1 from t2) +0 +select 1 in (select 1 from t2) from t1; +1 in (select 1 from t2) +1 +select 1 not in (select null from t1) from t2; +1 not in (select null from t1) +NULL +select 1 in (select null from t1) from t2; +1 in (select null from t1) +NULL +drop table if exists s; +create table s(a int not null, b int); +set sql_mode = ''; +select (2,0) in (select s.a, min(s.b) from s) as f; +f +NULL +select (2,0) not in (select s.a, min(s.b) from s) as f; +f +NULL +select (2,0) = any (select s.a, min(s.b) from s) as f; +f +NULL +select (2,0) != all (select s.a, min(s.b) from s) as f; +f +NULL +select (2,0) in (select s.b, min(s.b) from s) as f; +f +NULL +select (2,0) not in (select s.b, min(s.b) from s) as f; +f +NULL +select (2,0) = any (select s.b, min(s.b) from s) as f; +f +NULL +select (2,0) != all (select s.b, min(s.b) from s) as f; +f +NULL +insert into s values(1,null); +select 1 in (select b from s); +1 in (select b from s) +NULL +drop table if exists t; +create table t(a int); +insert into t values(1),(null); +select a not in (select 1) from t; +a not in (select 1) +0 +NULL +select 1 not in (select null from t t1) from t; +1 not in (select null from t t1) +NULL +NULL +select 1 in (select null from t t1) from t; +1 in (select null from t t1) +NULL +NULL +select a in (select 0) xx from (select null as a) x; +xx +NULL +drop table t; +create table t(a int, b int); +insert into t values(1,null),(null, null),(null, 2); +select * from t t1 where (2 in (select a from t t2 where (t2.b=t1.b) is null)); +a b +select (t2.a in (select t1.a from t t1)) is true from t t2; +(t2.a in (select t1.a from t t1)) is true +0 +0 +1 +set sql_mode=default; +set @@tidb_hash_join_concurrency=default; +set @@tidb_hashagg_partial_concurrency=default; +set @@tidb_hashagg_final_concurrency=default; +drop table if exists t; +create table t(a int); +insert into t values(1); +set tidb_mem_quota_query = 1 << 18; +set global tidb_mem_oom_action = 'CANCEL'; +set global tidb_enable_tmp_storage_on_oom = off; +insert into t select * from t; +insert into t select * from t; +insert into t select * from t; +insert into t select * from t; +insert into t select * from t; +insert into t select * from t; +insert into t select * from t; +insert into t select * from t; +desc analyze select * from t t1, t t2, t t3, t t4, t t5, t t6; +Error 8175 (HY000): Your query has been cancelled due to exceeding the allowed memory limit for a single SQL query. Please try narrowing your query scope or increase the tidb_mem_quota_query limit and try again.[conn=] +set tidb_mem_quota_query = default; +set global tidb_mem_oom_action = default; +set global tidb_enable_tmp_storage_on_oom = default; +SET GLOBAL tidb_mem_oom_action='LOG'; +set @@tidb_mem_quota_query=1; +drop table if exists t, t1; +create table t(c1 int, c2 int); +create table t1(c1 int, c2 int); +insert into t values(1,1),(2,2); +insert into t1 values(2,3),(4,4); +select /*+ TIDB_HJ(t, t2) */ * from t, t1 where t.c1 = t1.c1; +c1 c2 c1 c2 +2 2 2 3 +drop table if exists t1,t2,t3,t4; +create table t1 (c int, b int); +create table t2 (a int, b int); +create table t3 (b int, c int); +create table t4 (y int, c int); +select * from t1 natural join (t3 cross join t4); +Error 1052 (23000): Column 'c' in from clause is ambiguous +select * from (t3 cross join t4) natural join t1; +Error 1052 (23000): Column 'c' in from clause is ambiguous +select * from (t1 join t2 on t1.b=t2.b) natural join (t3 natural join t4); +Error 1052 (23000): Column 'b' in from clause is ambiguous +select * from (t3 natural join t4) natural join (t1 join t2 on t1.b=t2.b); +Error 1052 (23000): Column 'b' in from clause is ambiguous diff --git a/tests/integrationtest/t/executor/jointest/join.test b/tests/integrationtest/t/executor/jointest/join.test new file mode 100644 index 0000000000000..0649a3fe2b9e8 --- /dev/null +++ b/tests/integrationtest/t/executor/jointest/join.test @@ -0,0 +1,1106 @@ +# TestMultiJoin +drop table if exists t35,t40,t14,t42,t15,t7,t64,t19,t8,t57,t37,t44,t38,t18,t62,t4,t48,t31,t16,t12; +create table t35(a35 int primary key, b35 int, x35 int); +create table t40(a40 int primary key, b40 int, x40 int); +create table t14(a14 int primary key, b14 int, x14 int); +create table t42(a42 int primary key, b42 int, x42 int); +create table t15(a15 int primary key, b15 int, x15 int); +create table t7(a7 int primary key, b7 int, x7 int); +create table t64(a64 int primary key, b64 int, x64 int); +create table t19(a19 int primary key, b19 int, x19 int); +create table t9(a9 int primary key, b9 int, x9 int); +create table t8(a8 int primary key, b8 int, x8 int); +create table t57(a57 int primary key, b57 int, x57 int); +create table t37(a37 int primary key, b37 int, x37 int); +create table t44(a44 int primary key, b44 int, x44 int); +create table t38(a38 int primary key, b38 int, x38 int); +create table t18(a18 int primary key, b18 int, x18 int); +create table t62(a62 int primary key, b62 int, x62 int); +create table t4(a4 int primary key, b4 int, x4 int); +create table t48(a48 int primary key, b48 int, x48 int); +create table t31(a31 int primary key, b31 int, x31 int); +create table t16(a16 int primary key, b16 int, x16 int); +create table t12(a12 int primary key, b12 int, x12 int); +insert into t35 values(1,1,1); +insert into t40 values(1,1,1); +insert into t14 values(1,1,1); +insert into t42 values(1,1,1); +insert into t15 values(1,1,1); +insert into t7 values(1,1,1); +insert into t64 values(1,1,1); +insert into t19 values(1,1,1); +insert into t9 values(1,1,1); +insert into t8 values(1,1,1); +insert into t57 values(1,1,1); +insert into t37 values(1,1,1); +insert into t44 values(1,1,1); +insert into t38 values(1,1,1); +insert into t18 values(1,1,1); +insert into t62 values(1,1,1); +insert into t4 values(1,1,1); +insert into t48 values(1,1,1); +insert into t31 values(1,1,1); +insert into t16 values(1,1,1); +insert into t12 values(1,1,1); +insert into t35 values(7,7,7); +insert into t40 values(7,7,7); +insert into t14 values(7,7,7); +insert into t42 values(7,7,7); +insert into t15 values(7,7,7); +insert into t7 values(7,7,7); +insert into t64 values(7,7,7); +insert into t19 values(7,7,7); +insert into t9 values(7,7,7); +insert into t8 values(7,7,7); +insert into t57 values(7,7,7); +insert into t37 values(7,7,7); +insert into t44 values(7,7,7); +insert into t38 values(7,7,7); +insert into t18 values(7,7,7); +insert into t62 values(7,7,7); +insert into t4 values(7,7,7); +insert into t48 values(7,7,7); +insert into t31 values(7,7,7); +insert into t16 values(7,7,7); +insert into t12 values(7,7,7); +SELECT x4,x8,x38,x44,x31,x9,x57,x48,x19,x40,x14,x12,x7,x64,x37,x18,x62,x35,x42,x15,x16 FROM +t35,t40,t14,t42,t15,t7,t64,t19,t9,t8,t57,t37,t44,t38,t18,t62,t4,t48,t31,t16,t12 +WHERE b48=a57 +AND a4=b19 +AND a14=b16 +AND b37=a48 +AND a40=b42 +AND a31=7 +AND a15=b40 +AND a38=b8 +AND b15=a31 +AND b64=a18 +AND b12=a44 +AND b7=a8 +AND b35=a16 +AND a12=b14 +AND a64=b57 +AND b62=a7 +AND a35=b38 +AND b9=a19 +AND a62=b18 +AND b4=a37 +AND b44=a42; + +# TestSubquerySameTable +drop table if exists t; +create table t (a int); +insert t values (1), (2); +select a from t where exists(select 1 from t as x where x.a < t.a); +select a from t where not exists(select 1 from t as x where x.a < t.a); + +# TestInSubquery +drop table if exists t; +create table t (a int, b int); +insert t values (1, 1), (2, 1); +select m1.a from t as m1 where m1.a in (select m2.b from t as m2); +--sorted_result +select m1.a from t as m1 where (3, m1.b) not in (select * from t as m2); +select m1.a from t as m1 where m1.a in (select m2.b+1 from t as m2); +prepare stmt1 from 'select m1.a from t as m1 where m1.a in (select m2.b+? from t as m2)'; +set @a = 1; +execute stmt1 using @a; +set @a = 0; +execute stmt1 using @a; +select m1.a from t as m1 where m1.a in (1, 3, 5); +drop table if exists t1; +create table t1 (a float); +insert t1 values (281.37); +select a from t1 where (a in (select a from t1)); +drop table if exists t1, t2; +create table t1 (a int, b int); +insert into t1 values (0,0),(1,1),(2,2),(3,3),(4,4); +create table t2 (a int); +insert into t2 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); +select a from t1 where (1,1) in (select * from t2 s , t2 t where t1.a = s.a and s.a = t.a limit 1); +drop table if exists t1, t2; +create table t1 (a int); +create table t2 (a int); +insert into t1 values (1),(2); +insert into t2 values (1),(2); +set @@session.tidb_opt_insubq_to_join_and_agg = 0; +--sorted_result +select * from t1 where a in (select * from t2); +--sorted_result +select * from t1 where a in (select * from t2 where false); +--sorted_result +select * from t1 where a not in (select * from t2 where false); +set @@session.tidb_opt_insubq_to_join_and_agg = 1; +--sorted_result +select * from t1 where a in (select * from t2); +--sorted_result +select * from t1 where a in (select * from t2 where false); +--sorted_result +select * from t1 where a not in (select * from t2 where false); +drop table if exists t1, t2; +create table t1 (a int, key b (a)); +create table t2 (a int, key b (a)); +insert into t1 values (1),(2),(2); +insert into t2 values (1),(2),(2); +--sorted_result +select * from t1 where a in (select * from t2) order by a desc; +--sorted_result +select * from t1 where a in (select count(*) from t2 where t1.a = t2.a) order by a desc; +set @@session.tidb_opt_insubq_to_join_and_agg = default; + +# TestIssue5255 +drop table if exists t1, t2; +create table t1(a int, b date, c float, primary key(a, b)); +create table t2(a int primary key); +insert into t1 values(1, '2017-11-29', 2.2); +insert into t2 values(1); +select /*+ INL_JOIN(t1) */ * from t1 join t2 on t1.a=t2.a; +select /*+ INL_HASH_JOIN(t1) */ * from t1 join t2 on t1.a=t2.a; +select /*+ INL_MERGE_JOIN(t1) */ * from t1 join t2 on t1.a=t2.a; + +# TestIssue5278 +drop table if exists t, tt; +create table t(a int, b int); +create table tt(a varchar(10), b int); +insert into t values(1, 1); +select * from t left join tt on t.a=tt.a left join t ttt on t.a=ttt.a; + +# TestIssue15686 +drop table if exists t, k; +create table k (a int, pk int primary key, index(a)); +create table t (a int, pk int primary key, index(a)); +insert into k values(0,8),(0,23),(1,21),(1,33),(1,52),(2,17),(2,34),(2,39),(2,40),(2,66),(2,67),(3,9),(3,25),(3,41),(3,48),(4,4),(4,11),(4,15),(4,26),(4,27),(4,31),(4,35),(4,45),(4,47),(4,49); +insert into t values(3,4),(3,5),(3,27),(3,29),(3,57),(3,58),(3,79),(3,84),(3,92),(3,95); +select /*+ inl_join(t) */ count(*) from k left join t on k.a = t.a and k.pk > t.pk; +select /*+ inl_hash_join(t) */ count(*) from k left join t on k.a = t.a and k.pk > t.pk; +select /*+ inl_merge_join(t) */ count(*) from k left join t on k.a = t.a and k.pk > t.pk; + +# TestMergejoinOrder +drop table if exists t1, t2; +create table t1(a bigint primary key, b bigint); +create table t2(a bigint primary key, b bigint); +insert into t1 values(1, 100), (2, 100), (3, 100), (4, 100), (5, 100); +insert into t2 select a*100, b*100 from t1; +explain format = 'brief' select /*+ TIDB_SMJ(t2) */ * from t1 left outer join t2 on t1.a=t2.a and t1.a!=3 order by t1.a; +set @@tidb_init_chunk_size=1; +select /*+ TIDB_SMJ(t2) */ * from t1 left outer join t2 on t1.a=t2.a and t1.a!=3 order by t1.a; +drop table if exists t; +create table t(a bigint, b bigint, index idx_1(a,b)); +insert into t values(1, 1), (1, 2), (2, 1), (2, 2); +select /*+ TIDB_SMJ(t1, t2) */ * from t t1 join t t2 on t1.b = t2.b and t1.a=t2.a; +drop table if exists t; +create table t(a decimal(6,2), index idx(a)); +insert into t values(1.01), (2.02), (NULL); +select /*+ TIDB_SMJ(t1) */ t1.a from t t1 join t t2 on t1.a=t2.a order by t1.a; +set @@tidb_init_chunk_size=default; + +# TestEmbeddedOuterJoin +drop table if exists t1, t2; +create table t1(a int, b int); +create table t2(a int, b int); +insert into t1 values(1, 1); +select * from (t1 left join t2 on t1.a = t2.a) left join (t2 t3 left join t2 t4 on t3.a = t4.a) on t2.b = 1; + +# TestJoinDifferentDecimals +Drop table if exists t1; +Create table t1 (v int); +Insert into t1 value (1); +Insert into t1 value (2); +Insert into t1 value (3); +Drop table if exists t2; +Create table t2 (v decimal(12, 3)); +Insert into t2 value (1); +Insert into t2 value (2.0); +Insert into t2 value (000003.000000); +Select * from t1, t2 where t1.v = t2.v order by t1.v; + +# TestScalarFuncNullSemiJoin +drop table if exists t; +create table t(a int, b int); +insert into t values(null, 1), (1, 2); +drop table if exists s; +create table s(a varchar(20), b varchar(20)); +insert into s values(null, '1'); +select a in (select a from s) from t; +drop table s; +create table s(a int, b int); +insert into s values(null, 1); +select a in (select a+b from s) from t; + +# TestInjectProjOnTopN +drop table if exists t1; +drop table if exists t2; +create table t1(a bigint, b bigint); +create table t2(a bigint, b bigint); +insert into t1 values(1, 1); +select t1.a+t1.b as result from t1 left join t2 on 1 = 0 order by result limit 20; + +# TestIssue11544 +drop table if exists 11544t, 11544tt; +create table 11544t(a int); +create table 11544tt(a int, b varchar(10), index idx(a, b(3))); +insert into 11544t values(1); +insert into 11544tt values(1, 'aaaaaaa'), (1, 'aaaabbb'), (1, 'aaaacccc'); +select /*+ INL_JOIN(tt) */ * from 11544t t, 11544tt tt where t.a=tt.a and (tt.b = 'aaaaaaa' or tt.b = 'aaaabbb'); +select /*+ INL_HASH_JOIN(tt) */ * from 11544t t, 11544tt tt where t.a=tt.a and (tt.b = 'aaaaaaa' or tt.b = 'aaaabbb'); +--sorted_result +select /*+ INL_MERGE_JOIN(tt) */ * from 11544t t, 11544tt tt where t.a=tt.a and (tt.b = 'aaaaaaa' or tt.b = 'aaaabbb'); +select /*+ INL_JOIN(tt) */ * from 11544t t, 11544tt tt where t.a=tt.a and tt.b in ('aaaaaaa', 'aaaabbb', 'aaaacccc'); +select /*+ INL_HASH_JOIN(tt) */ * from 11544t t, 11544tt tt where t.a=tt.a and tt.b in ('aaaaaaa', 'aaaabbb', 'aaaacccc'); +--sorted_result +select /*+ INL_MERGE_JOIN(tt) */ * from 11544t t, 11544tt tt where t.a=tt.a and tt.b in ('aaaaaaa', 'aaaabbb', 'aaaacccc'); + +# TestIssue11390 +drop table if exists 11390t; +create table 11390t (k1 int unsigned, k2 int unsigned, key(k1, k2)); +insert into 11390t values(1, 1); +select /*+ INL_JOIN(t1, t2) */ * from 11390t t1, 11390t t2 where t1.k2 > 0 and t1.k2 = t2.k2 and t2.k1=1; +select /*+ INL_HASH_JOIN(t1, t2) */ * from 11390t t1, 11390t t2 where t1.k2 > 0 and t1.k2 = t2.k2 and t2.k1=1; +select /*+ INL_MERGE_JOIN(t1, t2) */ * from 11390t t1, 11390t t2 where t1.k2 > 0 and t1.k2 = t2.k2 and t2.k1=1; + +# TestIssue13177 +drop table if exists t1, t2; +create table t1(a varchar(20), b int, c int); +create table t2(a varchar(20), b int, c int, primary key(a, b)); +insert into t1 values("abcd", 1, 1), ("bacd", 2, 2), ("cbad", 3, 3); +insert into t2 values("bcd", 1, 1), ("acd", 2, 2), ("bad", 3, 3); +--sorted_result +select /*+ inl_join(t1, t2) */ * from t1 join t2 on substr(t1.a, 2, 4) = t2.a and t1.b = t2.b where t1.c between 1 and 5; +--sorted_result +select /*+ inl_hash_join(t1, t2) */ * from t1 join t2 on substr(t1.a, 2, 4) = t2.a and t1.b = t2.b where t1.c between 1 and 5; +--sorted_result +select /*+ inl_merge_join(t1, t2) */ * from t1 join t2 on substr(t1.a, 2, 4) = t2.a and t1.b = t2.b where t1.c between 1 and 5; +--sorted_result +select /*+ inl_join(t1, t2) */ t1.* from t1 join t2 on substr(t1.a, 2, 4) = t2.a and t1.b = t2.b where t1.c between 1 and 5; +--sorted_result +select /*+ inl_hash_join(t1, t2) */ t1.* from t1 join t2 on substr(t1.a, 2, 4) = t2.a and t1.b = t2.b where t1.c between 1 and 5; +--sorted_result +select /*+ inl_merge_join(t1, t2) */ t1.* from t1 join t2 on substr(t1.a, 2, 4) = t2.a and t1.b = t2.b where t1.c between 1 and 5; + +# TestIssue14514 +drop table if exists t; +create table t (pk varchar(14) primary key, a varchar(12)); +select * from (select t1.pk or '/' as c from t as t1 left join t as t2 on t1.a = t2.pk) as t where t.c = 1; + +# TestOuterMatchStatusIssue14742 +drop table if exists testjoin; +create table testjoin(a int); +set @@tidb_max_chunk_size=2; +insert into testjoin values (NULL); +insert into testjoin values (1); +insert into testjoin values (2), (2), (2); +SELECT * FROM testjoin t1 RIGHT JOIN testjoin t2 ON t1.a > t2.a order by t1.a, t2.a; +set @@tidb_max_chunk_size=default; + +# TestIssue18564 +drop table if exists t1, t2; +create table t1(a int, b int, primary key(a), index idx(b,a)); +create table t2(a int, b int, primary key(a), index idx(b,a)); +insert into t1 values(1, 1); +insert into t2 values(1, 1); +select /*+ INL_JOIN(t1) */ * from t1 FORCE INDEX (idx) join t2 on t1.b=t2.b and t1.a = t2.a; + +# TestInvalidEnumVal +set sql_mode = ''; +drop table if exists t1; +create table t1(c1 enum('a', 'b')); +insert into t1 values('a'); +insert into t1 values(0); +insert into t1 values(100); +select /*+ hash_join(t_alias1, t_alias2)*/ * from t1 t_alias1 inner join t1 t_alias2 on t_alias1.c1 = t_alias2.c1; +set sql_mode = default; + +# TestApplyOuterAggEmptyInput +drop table if exists t1, t2; +create table t1(a int); +create table t2(a int); +insert into t1 values(1); +insert into t2 values(1); +select count(1), (select count(1) from t2 where t2.a > t1.a) as field from t1 where t1.a = 100; +select /*+ agg_to_cop() */ count(1), (select count(1) from t2 where t2.a > t1.a) as field from t1 where t1.a = 100; +select count(1), (select count(1) from t2 where t2.a > t1.a) as field from t1 where t1.a = 1; +select /*+ agg_to_cop() */ count(1), (select count(1) from t2 where t2.a > t1.a) as field from t1 where t1.a = 1; + +# TestIssue19112 +drop table if exists t1, t2; +create table t1 ( c_int int, c_decimal decimal(12, 6), key(c_int), unique key(c_decimal) ); +create table t2 like t1; +insert into t1 (c_int, c_decimal) values (1, 4.064000), (2, 0.257000), (3, 1.010000); +insert into t2 (c_int, c_decimal) values (1, 4.064000), (3, 1.010000); +select /*+ HASH_JOIN(t1,t2) */ * from t1 join t2 on t1.c_decimal = t2.c_decimal order by t1.c_int; + +# TestIssue11896 +drop table if exists t; +drop table if exists t1; +create table t(c1 bigint); +create table t1(c1 bit(64)); +insert into t value(1); +insert into t1 value(1); +select t.c1, hex(t1.c1) from t, t1 where t.c1 = t1.c1; +drop table if exists t; +drop table if exists t1; +create table t(c1 int); +create table t1(c1 bit(32)); +insert into t value(1); +insert into t1 value(1); +select t.c1, hex(t1.c1) from t, t1 where t.c1 = t1.c1; +drop table if exists t; +drop table if exists t1; +create table t(c1 mediumint); +create table t1(c1 bit(24)); +insert into t value(1); +insert into t1 value(1); +select t.c1, hex(t1.c1) from t, t1 where t.c1 = t1.c1; +drop table if exists t; +drop table if exists t1; +create table t(c1 smallint); +create table t1(c1 bit(16)); +insert into t value(1); +insert into t1 value(1); +select t.c1, hex(t1.c1) from t, t1 where t.c1 = t1.c1; +drop table if exists t; +drop table if exists t1; +create table t(c1 tinyint); +create table t1(c1 bit(8)); +insert into t value(1); +insert into t1 value(1); +select t.c1, hex(t1.c1) from t, t1 where t.c1 = t1.c1; + +# TestIssue19498 +drop table if exists t1; +create table t1 (c_int int, primary key (c_int)); +insert into t1 values (1),(2),(3),(4); +drop table if exists t2; +create table t2 (c_str varchar(40)); +insert into t2 values ('zen sammet'); +insert into t2 values ('happy fermat'); +insert into t2 values ('happy archimedes'); +insert into t2 values ('happy hypatia'); +drop table if exists t3; +create table t3 (c_int int, c_str varchar(40), primary key (c_int), key (c_str)); +insert into t3 values (1, 'sweet hoover'); +insert into t3 values (2, 'awesome elion'); +insert into t3 values (3, 'hungry khayyam'); +insert into t3 values (4, 'objective kapitsa'); +select c_str, (select /*+ INL_JOIN(t1,t3) */ max(t1.c_int) from t1, t3 where t1.c_int = t3.c_int and t2.c_str > t3.c_str) q from t2 order by c_str; +select c_str, (select /*+ INL_HASH_JOIN(t1,t3) */ max(t1.c_int) from t1, t3 where t1.c_int = t3.c_int and t2.c_str > t3.c_str) q from t2 order by c_str; +select c_str, (select /*+ INL_MERGE_JOIN(t1,t3) */ max(t1.c_int) from t1, t3 where t1.c_int = t3.c_int and t2.c_str > t3.c_str) q from t2 order by c_str; + +# TestIssue19500 +drop table if exists t1; +create table t1 (c_int int, primary key (c_int)); +insert into t1 values (1),(2),(3),(4),(5); +drop table if exists t2; +create table t2 (c_int int unsigned, c_str varchar(40), primary key (c_int), key (c_str)); +insert into t2 values (1, 'dazzling panini'),(2, 'infallible perlman'),(3, 'recursing cannon'),(4, 'vigorous satoshi'),(5, 'vigilant gauss'),(6, 'nervous jackson'); +drop table if exists t3; +create table t3 (c_int int, c_str varchar(40), key (c_str)); +insert into t3 values (1, 'sweet morse'),(2, 'reverent golick'),(3, 'clever rubin'),(4, 'flamboyant morse'); +select (select (select sum(c_int) from t3 where t3.c_str > t2.c_str) from t2 where t2.c_int > t1.c_int order by c_int limit 1) q from t1 order by q; + +# TestIssue20710 +drop table if exists t; +drop table if exists s; +create table t(a int, b int); +create table s(a int, b int, index(a)); +insert into t values(1,1),(1,2),(2,2); +insert into s values(1,1),(2,2),(2,1); +--enable_warnings +select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.b = s.b; +select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.b = s.a; +select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.a = s.b; +select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.b = s.b; +select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.b = s.a; +select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.a = s.b; +--disable_warnings + +# TestIssue20219 +drop table if exists t,s ; +CREATE TABLE `t` ( `a` set('a','b','c','d','e','f','g','h','i','j') DEFAULT NULL ); +insert into t values('i'), ('j'); +CREATE TABLE `s` ( `a` char(1) DEFAULT NULL, KEY `a` (`a`) ); +insert into s values('i'), ('j'); +--enable_warnings +select /*+ inl_hash_join(s)*/ t.a from t left join s on t.a = s.a; +select /*+ inl_join(s)*/ t.a from t left join s on t.a = s.a; +--disable_warnings + +# TestIssue25902 +drop table if exists tt1,tt2,tt3; +create table tt1 (ts timestamp); +create table tt2 (ts varchar(32)); +create table tt3 (ts datetime); +insert into tt1 values ("2001-01-01 00:00:00"); +insert into tt2 values ("2001-01-01 00:00:00"); +insert into tt3 values ("2001-01-01 00:00:00"); +select * from tt1 where ts in (select ts from tt2); +select * from tt1 where ts in (select ts from tt3); +set @@session.time_zone = '+10:00'; +select * from tt1 where ts in (select ts from tt2); +set @@session.time_zone = default; + +# TestOuterJoin +drop table if exists t1, t2, t3, t4; +create table t1(a int, b int, c int); +create table t2(a int, b int, c int); +create table t3(a int, b int, c int); +create table t4(a int, b int, c int); +INSERT INTO t1 VALUES (1,3,0), (2,2,0), (3,2,0); +INSERT INTO t2 VALUES (3,3,0), (4,2,0), (5,3,0); +INSERT INTO t3 VALUES (1,2,0), (2,2,0); +INSERT INTO t4 VALUES (3,2,0), (4,2,0); +SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b from (t3, t4) left join (t1, t2) on t3.a=1 AND t3.b=t2.b AND t2.b=t4.b order by 1, 2, 3, 4, 5; +drop table if exists t1, t2, t3; +create table t1 (a1 int, a2 int); +create table t2 (b1 int not null, b2 int); +create table t3 (c1 int, c2 int); +insert into t1 values (1,2), (2,2), (3,2); +insert into t2 values (1,3), (2,3); +insert into t3 values (2,4), (3,4); +select * from t1 left join t2 on b1 = a1 left join t3 on c1 = a1 and b1 is null order by 1, 2, 3, 4, 5, 6; + +# TestJoinPanic2 +set sql_mode = 'ONLY_FULL_GROUP_BY'; +drop table if exists events; +create table events (clock int, source int); +SELECT * FROM events e JOIN (SELECT MAX(clock) AS clock FROM events e2 GROUP BY e2.source) e3 ON e3.clock=e.clock; +--error 1055 +SELECT * FROM events e JOIN (SELECT clock FROM events e2 GROUP BY e2.source) e3 ON e3.clock=e.clock; +drop table if exists tpj1,tpj2; +create table tpj1 (id int, b int, unique index (id)); +create table tpj2 (id int, b int, unique index (id)); +insert into tpj1 values (1,1); +insert into tpj2 values (1,1); +select tpj1.b,tpj2.b from tpj1 left join tpj2 on tpj1.id=tpj2.id where tpj1.id=1; +set sql_mode = default; + +# TestSubqueryInJoinOn +drop table if exists t1; +drop table if exists t2; +create table t1 (id int); +create table t2 (id int); +insert into t1 values (1); +insert into t2 values (1); +--error 1105 +SELECT * FROM t1 JOIN t2 on (t2.id < all (SELECT 1)); + +# TestIssue15850JoinNullValue +--enable_warnings +SELECT * FROM (select null) v NATURAL LEFT JOIN (select null) v1; +--disable_warnings +drop table if exists t0; +drop view if exists v0; +CREATE TABLE t0(c0 TEXT); +CREATE VIEW v0(c0) AS SELECT NULL; +--enable_warnings +SELECT /*+ HASH_JOIN(v0) */ * FROM v0 NATURAL LEFT JOIN t0; +SELECT /*+ MERGE_JOIN(v0) */ * FROM v0 NATURAL LEFT JOIN t0; +--disable_warnings + +# TestTiDBNAAJ +drop table if exists t; +set @@session.tidb_enable_null_aware_anti_join=0; +create table t(a decimal(40,0), b bigint(20) not null); +insert into t values(7,8),(7,8),(3,4),(3,4),(9,2),(9,2),(2,0),(2,0),(0,4),(0,4),(8,8),(8,8),(6,1),(6,1),(NULL, 0),(NULL,0); +select ( table1 . a , table1 . b ) NOT IN ( SELECT 3 , 2 UNION SELECT 9, 2 ) AS field2 from t as table1 order by field2; +set @@session.tidb_enable_null_aware_anti_join=1; +select ( table1 . a , table1 . b ) NOT IN ( SELECT 3 , 2 UNION SELECT 9, 2 ) AS field2 from t as table1 order by field2; +set @@session.tidb_enable_null_aware_anti_join=default; + +# TestNaturalJoin +drop table if exists t1, t2; +create table t1 (a int, b int); +create table t2 (a int, c int); +insert t1 values (1,2), (10,20), (0,0); +insert t2 values (1,3), (100,200), (0,0); +explain format = 'brief' select * from t1 natural join t2; +--sorted_result +select * from t1 natural join t2; +explain format = 'brief' select * from t1 natural left join t2 order by a; +--sorted_result +select * from t1 natural left join t2 order by a; +explain format = 'brief' select * from t1 natural right join t2 order by a; +--sorted_result +select * from t1 natural right join t2 order by a; +explain format = 'brief' SELECT * FROM t1 NATURAL LEFT JOIN t2 WHERE not(t1.a <=> t2.a); +--sorted_result +SELECT * FROM t1 NATURAL LEFT JOIN t2 WHERE not(t1.a <=> t2.a); + +# TestUsingAndNaturalJoinSchema +drop table if exists t1, t2, t3, t4; +create table t1 (c int, b int); +create table t2 (a int, b int); +create table t3 (b int, c int); +create table t4 (y int, c int); +insert into t1 values (10,1); +insert into t1 values (3 ,1); +insert into t1 values (3 ,2); +insert into t2 values (2, 1); +insert into t3 values (1, 3); +insert into t3 values (1,10); +insert into t4 values (11,3); +insert into t4 values (2, 3); +--sorted_result +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) natural join (t3 natural join t4); +--sorted_result +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) join (t3 natural join t4) using (b); +--sorted_result +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) join (t3 natural join t4) using (c); +--sorted_result +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) join (t3 natural join t4) using (c,b); +--sorted_result +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) left outer join (t3 natural join t4) using (b); +--sorted_result +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) left outer join (t3 natural join t4) using (c); +--sorted_result +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) left outer join (t3 natural join t4) using (c,b); +--sorted_result +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) right outer join (t3 natural join t4) using (b); +--sorted_result +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) right outer join (t3 natural join t4) using (c); +--sorted_result +select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) right outer join (t3 natural join t4) using (c,b); +--sorted_result +select * from (t1 natural join t2) natural join (t3 natural join t4); +--sorted_result +select * from (t1 natural join t2) join (t3 natural join t4) using (b); +--sorted_result +select * from (t1 natural join t2) left outer join (t3 natural join t4) using (b); +--sorted_result +select * from (t1 natural join t2) right outer join (t3 natural join t4) using (c,b); + +# TestIssue19410 +drop table if exists t, t1, t2, t3; +create table t(a int, b enum('A', 'B')); +create table t1(a1 int, b1 enum('B', 'A') NOT NULL, UNIQUE KEY (b1)); +insert into t values (1, 'A'); +insert into t1 values (1, 'A'); +select /*+ INL_HASH_JOIN(t1) */ * from t join t1 on t.b = t1.b1; +select /*+ INL_JOIN(t1) */ * from t join t1 on t.b = t1.b1; +create table t2(a1 int, b1 enum('C', 'D') NOT NULL, UNIQUE KEY (b1)); +insert into t2 values (1, 'C'); +select /*+ INL_HASH_JOIN(t2) */ * from t join t2 on t.b = t2.b1; +select /*+ INL_JOIN(t2) */ * from t join t2 on t.b = t2.b1; +create table t3(a1 int, b1 enum('A', 'B') NOT NULL, UNIQUE KEY (b1)); +insert into t3 values (1, 'A'); +select /*+ INL_HASH_JOIN(t3) */ * from t join t3 on t.b = t3.b1; +select /*+ INL_JOIN(t3) */ * from t join t3 on t.b = t3.b1; + +# TestJoinCast +drop table if exists t; +drop table if exists t1; +create table t(c1 int); +create table t1(c1 int unsigned); +insert into t values (1); +insert into t1 values (1); +select t.c1 from t , t1 where t.c1 = t1.c1; + +## int64(-1) != uint64(18446744073709551615) +drop table if exists t; +drop table if exists t1; +create table t(c1 bigint); +create table t1(c1 bigint unsigned); +insert into t values (-1); +insert into t1 values (18446744073709551615); +select * from t , t1 where t.c1 = t1.c1; + +## float(1) == double(1) +drop table if exists t; +drop table if exists t1; +create table t(c1 float); +create table t1(c1 double); +insert into t values (1.0); +insert into t1 values (1.00); +select t.c1 from t , t1 where t.c1 = t1.c1; + +## varchar("x") == char("x") +drop table if exists t; +drop table if exists t1; +create table t(c1 varchar(1)); +create table t1(c1 char(1)); +insert into t values ("x"); +insert into t1 values ("x"); +select t.c1 from t , t1 where t.c1 = t1.c1; + +## varchar("x") != char("y") +drop table if exists t; +drop table if exists t1; +create table t(c1 varchar(1)); +create table t1(c1 char(1)); +insert into t values ("x"); +insert into t1 values ("y"); +select t.c1 from t , t1 where t.c1 = t1.c1; +drop table if exists t; +drop table if exists t1; +create table t(c1 int,c2 double); +create table t1(c1 double,c2 int); +insert into t values (1, 2), (1, NULL); +insert into t1 values (1, 2), (1, NULL); +select * from t a , t1 b where (a.c1, a.c2) = (b.c1, b.c2); + +## Issue 11895 +drop table if exists t; +drop table if exists t1; +create table t(c1 bigint unsigned); +create table t1(c1 bit(64)); +insert into t value(18446744073709551615); +insert into t1 value(-1); +select * from t, t1 where t.c1 = t1.c1; + +## Issues 11896 +drop table if exists t; +drop table if exists t1; +create table t(c1 bigint); +create table t1(c1 bit(64)); +insert into t value(1); +insert into t1 value(1); +select * from t, t1 where t.c1 = t1.c1; +drop table if exists t; +drop table if exists t1; +create table t(c1 bigint); +create table t1(c1 bit(64)); +insert into t value(-1); +insert into t1 value(18446744073709551615); +## TODO: MySQL will return one row, because c1 in t1 is 0xffffffff, which equals to -1. +select * from t, t1 where t.c1 = t1.c1; + +drop table if exists t; +drop table if exists t1; +drop table if exists t2; +create table t(c1 bigint); +create table t1(c1 bigint unsigned); +create table t2(c1 Date); +insert into t value(20191111); +insert into t1 value(20191111); +insert into t2 value('2019-11-11'); +select * from t, t1, t2 where t.c1 = t2.c1 and t1.c1 = t2.c1; + +drop table if exists t; +drop table if exists t1; +drop table if exists t2; +create table t(c1 bigint); +create table t1(c1 bigint unsigned); +create table t2(c1 enum('a', 'b', 'c', 'd')); +insert into t value(3); +insert into t1 value(3); +insert into t2 value('c'); +select * from t, t1, t2 where t.c1 = t2.c1 and t1.c1 = t2.c1; + +drop table if exists t; +drop table if exists t1; +drop table if exists t2; +create table t(c1 bigint); +create table t1(c1 bigint unsigned); +create table t2 (c1 SET('a', 'b', 'c', 'd')); +insert into t value(9); +insert into t1 value(9); +insert into t2 value('a,d'); +select * from t, t1, t2 where t.c1 = t2.c1 and t1.c1 = t2.c1; + +drop table if exists t; +drop table if exists t1; +create table t(c1 int); +create table t1(c1 decimal(4,2)); +insert into t values(0), (2); +insert into t1 values(0), (9); +select * from t left join t1 on t1.c1 = t.c1; + +drop table if exists t; +drop table if exists t1; +create table t(c1 decimal(4,1)); +create table t1(c1 decimal(4,2)); +insert into t values(0), (2); +insert into t1 values(0), (9); +select * from t left join t1 on t1.c1 = t.c1; + +drop table if exists t; +drop table if exists t1; +create table t(c1 decimal(4,1)); +create table t1(c1 decimal(4,2)); +create index k1 on t1(c1); +insert into t values(0), (2); +insert into t1 values(0), (9); +--sorted_result +select /*+ INL_JOIN(t1) */ * from t left join t1 on t1.c1 = t.c1; +--sorted_result +select /*+ INL_HASH_JOIN(t1) */ * from t left join t1 on t1.c1 = t.c1; +--sorted_result +select /*+ INL_MERGE_JOIN(t1) */ * from t left join t1 on t1.c1 = t.c1; + +drop table if exists t; +drop table if exists t1; +drop table if exists t2; +create table t(c1 char(10)); +create table t1(c1 char(10)); +create table t2(c1 char(10)); +insert into t values('abd'); +insert into t1 values('abc'); +insert into t2 values('abc'); +--sorted_result +select * from (select * from t union all select * from t1) t1 join t2 on t1.c1 = t2.c1; + +drop table if exists t; +create table t(a varchar(10), index idx(a)); +insert into t values('1'), ('2'), ('3'); +set @@tidb_init_chunk_size=1; +--sorted_result +select a from (select /*+ INL_JOIN(t1, t2) */ t1.a from t t1 join t t2 on t1.a=t2.a) t group by a; +--sorted_result +select a from (select /*+ INL_HASH_JOIN(t1, t2) */ t1.a from t t1 join t t2 on t1.a=t2.a) t group by a; +--sorted_result +select a from (select /*+ INL_MERGE_JOIN(t1, t2) */ t1.a from t t1 join t t2 on t1.a=t2.a) t group by a; +set @@tidb_init_chunk_size=default; + +# TestUsing +drop table if exists t1, t2, t3, t4; +create table t1 (a int, c int); +create table t2 (a int, d int); +create table t3 (a int); +create table t4 (a int); +insert t1 values (2, 4), (1, 3); +insert t2 values (2, 5), (3, 6); +insert t3 values (1); +select * from t1 join t2 using (a); +select t1.a, t2.a from t1 join t2 using (a); +select * from t1 right join t2 using (a) order by a; +select t1.a, t2.a from t1 right join t2 using (a) order by t2.a; +select * from t1 left join t2 using (a) order by a; +select t1.a, t2.a from t1 left join t2 using (a) order by t1.a; +select * from t1 join t2 using (a) right join t3 using (a); +select * from t1 join t2 using (a) right join t3 on (t2.a = t3.a); +select t2.a from t1 join t2 using (a) right join t3 on (t1.a = t3.a); +select t1.a, t2.a, t3.a from t1 join t2 using (a) right join t3 using (a); +select t1.c, t2.d from t1 join t2 using (a) right join t3 using (a); +alter table t1 add column b int default 1 after a; +alter table t2 add column b int default 1 after a; +select * from t1 join t2 using (b, a); +select * from (t1 join t2 using (a)) join (t3 join t4 using (a)) on (t2.a = t4.a and t1.a = t3.a); + +drop table if exists t, tt; +create table t(a int, b int); +create table tt(b int, a int); +insert into t (a, b) values(1, 1); +insert into tt (a, b) values(1, 2); +## Check whether this sql can execute successfully. +select * from t join tt using(a); + +drop table if exists t, tt; +create table t(a float, b int); +create table tt(b bigint, a int); +select * from t join tt using(a); + +drop table if exists t, s; +create table t(a int, b int); +create table s(b int, a int); +insert into t values(1,1), (2,2), (3,3), (null,null); +insert into s values(1,1), (3,3), (null,null); + +## For issue 20477 +select t.*, s.* from t join s using(a); +select s.a from t join s using(a); +select s.a from t join s using(a) where s.a > 1; +select s.a from t join s using(a) order by s.a; +select s.a from t join s using(a) where s.a > 1 order by s.a; +select s.a from t join s using(a) where s.a > 1 order by s.a limit 2; + +## For issue 20441 +DROP TABLE if exists t1, t2, t3; +create table t1 (i int); +create table t2 (i int); +create table t3 (i int); +select * from t1,t2 natural left join t3 order by t1.i,t2.i,t3.i; +select t1.i,t2.i,t3.i from t2 natural left join t3,t1 order by t1.i,t2.i,t3.i; +select * from t1,t2 natural right join t3 order by t1.i,t2.i,t3.i; +select t1.i,t2.i,t3.i from t2 natural right join t3,t1 order by t1.i,t2.i,t3.i; + +## For issue 15844 +DROP TABLE if exists t0, t1; +CREATE TABLE t0(c0 INT); +CREATE TABLE t1(c0 INT); +SELECT t0.c0 FROM t0 NATURAL RIGHT JOIN t1 WHERE t1.c0; + +## For issue 20958 +DROP TABLE if exists t1, t2; +create table t1(id int, name varchar(20)); +create table t2(id int, address varchar(30)); +insert into t1 values(1,'gangshen'); +insert into t2 values(1,'HangZhou'); +select t2.* from t1 inner join t2 using (id) limit 1; +select t2.* from t1 inner join t2 on t1.id = t2.id limit 1; + +## For issue 20476 +drop table if exists t1; +create table t1(a int); +insert into t1 (a) values(1); +select t1.*, t2.* from t1 join t1 t2 using(a); +select * from t1 join t1 t2 using(a); + +## For issue 18992 +drop table t; +CREATE TABLE t ( a varchar(55) NOT NULL, b varchar(55) NOT NULL, c int(11) DEFAULT NULL, d int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; +update t t1 join t t2 using(a,b) set t1.c=t2.d; + +## For issue 20467 +DROP TABLE if exists t1,t2,t3,t4,t5; +CREATE TABLE t1 (a INT, b INT); +CREATE TABLE t2 (a INT, b INT); +CREATE TABLE t3 (a INT, b INT); +INSERT INTO t1 VALUES (1,1); +INSERT INTO t2 VALUES (1,1); +INSERT INTO t3 VALUES (1,1); +-- error 1052 +SELECT * FROM t1 JOIN (t2 JOIN t3 USING (b)) USING (a); + +## For issue 6712 +drop table if exists t1,t2; +create table t1 (t1 int , t0 int); +create table t2 (t2 int, t0 int); +insert into t1 select 11, 1; +insert into t2 select 22, 1; +select t1.t0, t2.t0 from t1 join t2 using(t0) group by t1.t0; +select t1.t0, t2.t0 from t1 join t2 using(t0) having t1.t0 > 0; + +# TestSubquery +set @@tidb_hash_join_concurrency=1; +set @@tidb_hashagg_partial_concurrency=1; +set @@tidb_hashagg_final_concurrency=1; +drop table if exists t; +create table t (c int, d int); +begin; +insert t values (1, 1); +insert t values (2, 2); +insert t values (3, 4); +commit; + +set sql_mode = 'STRICT_TRANS_TABLES'; + +select * from t where exists(select * from t k where t.c = k.c having sum(c) = 1); +select * from t where exists(select k.c, k.d from t k, t p where t.c = k.d); +select 1 = (select count(*) from t where t.c = k.d) from t k; +--sorted_result +select 1 = (select count(*) from t where exists( select * from t m where t.c = k.d)) from t k; +--sorted_result +select t.c = any (select count(*) from t) from t; +select * from t where (t.c, 6) = any (select count(*), sum(t.c) from t); +--sorted_result +select t.c from t where (t.c) < all (select count(*) from t); +--sorted_result +select t.c from t where (t.c, t.d) = any (select * from t); +select t.c from t where (t.c, t.d) != all (select * from t); +--sorted_result +select (select count(*) from t where t.c = k.d) from t k; +--sorted_result +select t.c from t where (t.c, t.d) in (select * from t); +select t.c from t where (t.c, t.d) not in (select * from t); +select * from t A inner join t B on A.c = B.c and A.c > 100; +## = all empty set is true +--sorted_result +select t.c from t where (t.c, t.d) != all (select * from t where d > 1000); +select t.c from t where (t.c) < any (select c from t where d > 1000); +insert t values (NULL, NULL); +--sorted_result +select (t.c) < any (select c from t) from t; +select (10) > all (select c from t) from t; +select (c) > all (select c from t) from t; + +drop table if exists a; +create table a (c int, d int); +insert a values (1, 2); +drop table if exists b; +create table b (c int, d int); +insert b values (2, 1); + +select * from a b where c = (select d from b a where a.c = 2 and b.c = 1); + +drop table if exists t; +create table t(c int); +insert t values(10), (8), (7), (9), (11); +select * from t where 9 in (select c from t s where s.c < t.c limit 3); + +drop table if exists t; +create table t(id int, v int); +insert into t values(1, 1), (2, 2), (3, 3); +select * from t where v=(select min(t1.v) from t t1, t t2, t t3 where t1.id=t2.id and t2.id=t3.id and t1.id=t.id); + +select exists (select t.id from t where s.id < 2 and t.id = s.id) from t s; + +drop table if exists t; +create table t(c int); +select exists(select count(*) from t); + +drop table if exists t; +create table t(id int primary key, v int); +insert into t values(1, 1), (2, 2), (3, 3); +--sorted_result +select (select t.id from t where s.id < 2 and t.id = s.id) from t s; +--error 1242 +select (select t.id from t where t.id = t.v and t.v != s.id) from t s; + +drop table if exists t; +drop table if exists s; +create table t(id int); +create table s(id int); +insert into t values(1), (2); +insert into s values(2), (2); +select id from t where(select count(*) from s where s.id = t.id) > 0; +select *, (select count(*) from s where id = t.id limit 1, 1) from t; + +drop table if exists t; +drop table if exists s; +create table t(id int primary key); +create table s(id int); +insert into t values(1), (2); +insert into s values(2), (2); +select *, (select count(id) from s where id = t.id) from t; +select *, 0 < any (select count(id) from s where id = t.id) from t; +select (select count(*) from t k where t.id = id) from s, t where t.id = s.id limit 1; + +drop table if exists t, s; +create table t(id int primary key); +create table s(id int, index k(id)); +insert into t values(1), (2); +insert into s values(2), (2); +select (select id from s where s.id = t.id order by s.id limit 1) from t; + +drop table if exists t, s; +create table t(id int); +create table s(id int); +insert into t values(2), (2); +insert into s values(2); +select (select id from s where s.id = t.id order by s.id) from t; + +drop table if exists t; +create table t(dt datetime); +select (select 1 from t where DATE_FORMAT(o.dt,'%Y-%m')) from t o; + +drop table if exists t1, t2; +create table t1(f1 int, f2 int); +create table t2(fa int, fb int); +insert into t1 values (1,1),(1,1),(1,2),(1,2),(1,2),(1,3); +insert into t2 values (1,1),(1,2),(1,3); +select f1,f2 from t1 group by f1,f2 having count(1) >= all (select fb from t2 where fa = f1); + +DROP TABLE IF EXISTS t1, t2; +CREATE TABLE t1(a INT); +CREATE TABLE t2 (d BINARY(2), PRIMARY KEY (d(1)), UNIQUE KEY (d)); +INSERT INTO t1 values(1); +SELECT 1 FROM executor__jointest__join.t1, executor__jointest__join.t2 WHERE 1 = (SELECT executor__jointest__join.t2.d FROM executor__jointest__join.t2 WHERE executor__jointest__join.t1.a >= 1) and executor__jointest__join.t2.d = 1; + +DROP TABLE IF EXISTS t1; +CREATE TABLE t1(a int, b int default 0); +create index k1 on t1(a); +INSERT INTO t1 (a) values(1), (2), (3), (4), (5); +select (select /*+ INL_JOIN(x2) */ x2.a from t1 x1, t1 x2 where x1.a = t1.a and x1.a = x2.a) from t1; +select (select /*+ INL_HASH_JOIN(x2) */ x2.a from t1 x1, t1 x2 where x1.a = t1.a and x1.a = x2.a) from t1; +select (select /*+ INL_MERGE_JOIN(x2) */ x2.a from t1 x1, t1 x2 where x1.a = t1.a and x1.a = x2.a) from t1; + +select 1 from (select t1.a in (select t1.a from t1) from t1) x; +select 1 from (select t1.a not in (select t1.a from t1) from t1) x; + +drop table if exists t1, t2; +create table t1(a int); +create table t2(b int); +insert into t1 values(1); +insert into t2 values(1); +select * from t1 where a in (select a from t2); + +insert into t2 value(null); +select * from t1 where 1 in (select b from t2); +select * from t1 where 1 not in (select b from t2); +select * from t1 where 2 not in (select b from t2); +select * from t1 where 2 in (select b from t2); +select 1 in (select b from t2) from t1; +select 1 in (select 1 from t2) from t1; +select 1 not in (select b from t2) from t1; +select 1 not in (select 1 from t2) from t1; + +delete from t2 where b=1; +select 1 in (select b from t2) from t1; +select 1 not in (select b from t2) from t1; +select 1 not in (select 1 from t2) from t1; +select 1 in (select 1 from t2) from t1; +select 1 not in (select null from t1) from t2; +select 1 in (select null from t1) from t2; + +drop table if exists s; +create table s(a int not null, b int); +set sql_mode = ''; +select (2,0) in (select s.a, min(s.b) from s) as f; +select (2,0) not in (select s.a, min(s.b) from s) as f; +select (2,0) = any (select s.a, min(s.b) from s) as f; +select (2,0) != all (select s.a, min(s.b) from s) as f; +select (2,0) in (select s.b, min(s.b) from s) as f; +select (2,0) not in (select s.b, min(s.b) from s) as f; +select (2,0) = any (select s.b, min(s.b) from s) as f; +select (2,0) != all (select s.b, min(s.b) from s) as f; +insert into s values(1,null); +select 1 in (select b from s); + +drop table if exists t; +create table t(a int); +insert into t values(1),(null); +select a not in (select 1) from t; +select 1 not in (select null from t t1) from t; +select 1 in (select null from t t1) from t; +select a in (select 0) xx from (select null as a) x; + +drop table t; +create table t(a int, b int); +insert into t values(1,null),(null, null),(null, 2); +select * from t t1 where (2 in (select a from t t2 where (t2.b=t1.b) is null)); +--sorted_result +select (t2.a in (select t1.a from t t1)) is true from t t2; + +set sql_mode=default; +set @@tidb_hash_join_concurrency=default; +set @@tidb_hashagg_partial_concurrency=default; +set @@tidb_hashagg_final_concurrency=default; + +# TestCartesianJoinPanic +drop table if exists t; +create table t(a int); +insert into t values(1); +set tidb_mem_quota_query = 1 << 18; +set global tidb_mem_oom_action = 'CANCEL'; +set global tidb_enable_tmp_storage_on_oom = off; +insert into t select * from t; +insert into t select * from t; +insert into t select * from t; +insert into t select * from t; +insert into t select * from t; +insert into t select * from t; +insert into t select * from t; +insert into t select * from t; +-- replace_regex /conn=[0-9]+/conn=/ +-- error 8175 +desc analyze select * from t t1, t t2, t t3, t t4, t t5, t t6; + +set tidb_mem_quota_query = default; +set global tidb_mem_oom_action = default; +set global tidb_enable_tmp_storage_on_oom = default; + +# TestJoinInDisk +SET GLOBAL tidb_mem_oom_action='LOG'; +## TODO(fengliyuan): how to ensure that it is using disk really? +set @@tidb_mem_quota_query=1; +drop table if exists t, t1; +create table t(c1 int, c2 int); +create table t1(c1 int, c2 int); +insert into t values(1,1),(2,2); +insert into t1 values(2,3),(4,4); +select /*+ TIDB_HJ(t, t2) */ * from t, t1 where t.c1 = t1.c1; + +# TestIssue30244 +drop table if exists t1,t2,t3,t4; +create table t1 (c int, b int); +create table t2 (a int, b int); +create table t3 (b int, c int); +create table t4 (y int, c int); +--error 1052 +select * from t1 natural join (t3 cross join t4); +--error 1052 +select * from (t3 cross join t4) natural join t1; +--error 1052 +select * from (t1 join t2 on t1.b=t2.b) natural join (t3 natural join t4); +--error 1052 +select * from (t3 natural join t4) natural join (t1 join t2 on t1.b=t2.b);