Commit c25728cd authored by Sergey Petrunya's avatar Sergey Petrunya

More semi-join + outer-join testcases.

parent d3fc6695
...@@ -1391,6 +1391,7 @@ create table t0 (a int); ...@@ -1391,6 +1391,7 @@ create table t0 (a int);
insert into t0 values (1),(2); insert into t0 values (1),(2);
set @tmp_20110622= @@optimizer_switch; set @tmp_20110622= @@optimizer_switch;
set optimizer_switch='firstmatch=off,loosescan=off,materialization=off'; set optimizer_switch='firstmatch=off,loosescan=off,materialization=off';
# Check DuplicateWeedout + join buffer
explain explain
select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a); select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a);
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
...@@ -1401,7 +1402,7 @@ select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a); ...@@ -1401,7 +1402,7 @@ select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a);
a a
1 1
2 2
# Try also without join buffer # Check DuplicateWeedout without join buffer
set @tmp_jcl_20110622= @@join_cache_level; set @tmp_jcl_20110622= @@join_cache_level;
set join_cache_level= 0; set join_cache_level= 0;
explain explain
...@@ -1414,6 +1415,7 @@ select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a); ...@@ -1414,6 +1415,7 @@ select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a);
a a
1 1
2 2
# Check FirstMatch without join buffer:
set optimizer_switch='firstmatch=on'; set optimizer_switch='firstmatch=on';
explain explain
select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a); select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a);
...@@ -1425,7 +1427,60 @@ select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a); ...@@ -1425,7 +1427,60 @@ select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a);
a a
1 1
2 2
#
# Now, check the same for multiple inner tables:
alter table t2 add b int;
update t2 set b=a;
create table t3 as select * from t2;
set optimizer_switch='firstmatch=off';
set join_cache_level= 0;
# DuplicateWeedout without join buffer
explain
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t0 ALL NULL NULL NULL NULL 2
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using where; Start temporary
1 PRIMARY t3 ALL NULL NULL NULL NULL 1 Using where
1 PRIMARY t2 ALL NULL NULL NULL NULL 1 Using where; End temporary
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
a
1
2
set @@join_cache_level=@tmp_jcl_20110622; set @@join_cache_level=@tmp_jcl_20110622;
# DuplicateWeedout + join buffer
explain
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t0 ALL NULL NULL NULL NULL 2 Start temporary
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using where; Using join buffer (flat, BNL join)
1 PRIMARY t3 ALL NULL NULL NULL NULL 1 Using where
1 PRIMARY t2 ALL NULL NULL NULL NULL 1 Using where; End temporary
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
a
1
2
# Now, let the inner join side have a 'partial' match
select * from t3;
a b
1 1
insert into t3 values(2,2);
explain
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t0 ALL NULL NULL NULL NULL 2 Start temporary
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using where; Using join buffer (flat, BNL join)
1 PRIMARY t2 ALL NULL NULL NULL NULL 1
1 PRIMARY t3 ALL NULL NULL NULL NULL 2 Using where; End temporary
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
a
1
2
set @@optimizer_switch=@tmp_20110622; set @@optimizer_switch=@tmp_20110622;
drop table t0, t1, t2; drop table t0, t1, t2;
set @@optimizer_switch=@save_optimizer_switch; set @@optimizer_switch=@save_optimizer_switch;
...@@ -1399,6 +1399,7 @@ create table t0 (a int); ...@@ -1399,6 +1399,7 @@ create table t0 (a int);
insert into t0 values (1),(2); insert into t0 values (1),(2);
set @tmp_20110622= @@optimizer_switch; set @tmp_20110622= @@optimizer_switch;
set optimizer_switch='firstmatch=off,loosescan=off,materialization=off'; set optimizer_switch='firstmatch=off,loosescan=off,materialization=off';
# Check DuplicateWeedout + join buffer
explain explain
select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a); select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a);
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
...@@ -1409,7 +1410,7 @@ select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a); ...@@ -1409,7 +1410,7 @@ select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a);
a a
1 1
2 2
# Try also without join buffer # Check DuplicateWeedout without join buffer
set @tmp_jcl_20110622= @@join_cache_level; set @tmp_jcl_20110622= @@join_cache_level;
set join_cache_level= 0; set join_cache_level= 0;
explain explain
...@@ -1422,6 +1423,7 @@ select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a); ...@@ -1422,6 +1423,7 @@ select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a);
a a
1 1
2 2
# Check FirstMatch without join buffer:
set optimizer_switch='firstmatch=on'; set optimizer_switch='firstmatch=on';
explain explain
select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a); select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a);
...@@ -1433,7 +1435,60 @@ select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a); ...@@ -1433,7 +1435,60 @@ select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a);
a a
1 1
2 2
#
# Now, check the same for multiple inner tables:
alter table t2 add b int;
update t2 set b=a;
create table t3 as select * from t2;
set optimizer_switch='firstmatch=off';
set join_cache_level= 0;
# DuplicateWeedout without join buffer
explain
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t0 ALL NULL NULL NULL NULL 2
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using where; Start temporary
1 PRIMARY t3 ALL NULL NULL NULL NULL 1 Using where
1 PRIMARY t2 ALL NULL NULL NULL NULL 1 Using where; End temporary
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
a
1
2
set @@join_cache_level=@tmp_jcl_20110622; set @@join_cache_level=@tmp_jcl_20110622;
# DuplicateWeedout + join buffer
explain
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t0 ALL NULL NULL NULL NULL 2 Start temporary
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using where; Using join buffer (flat, BNL join)
1 PRIMARY t3 ALL NULL NULL NULL NULL 1 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY t2 ALL NULL NULL NULL NULL 1 Using where; End temporary; Using join buffer (incremental, BNL join)
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
a
1
2
# Now, let the inner join side have a 'partial' match
select * from t3;
a b
1 1
insert into t3 values(2,2);
explain
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t0 ALL NULL NULL NULL NULL 2 Start temporary
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using where; Using join buffer (flat, BNL join)
1 PRIMARY t2 ALL NULL NULL NULL NULL 1 Using join buffer (incremental, BNL join)
1 PRIMARY t3 ALL NULL NULL NULL NULL 2 Using where; End temporary; Using join buffer (incremental, BNL join)
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
a
1
2
set @@optimizer_switch=@tmp_20110622; set @@optimizer_switch=@tmp_20110622;
drop table t0, t1, t2; drop table t0, t1, t2;
set @@optimizer_switch=@save_optimizer_switch; set @@optimizer_switch=@save_optimizer_switch;
......
...@@ -1280,11 +1280,12 @@ insert into t0 values (1),(2); ...@@ -1280,11 +1280,12 @@ insert into t0 values (1),(2);
set @tmp_20110622= @@optimizer_switch; set @tmp_20110622= @@optimizer_switch;
set optimizer_switch='firstmatch=off,loosescan=off,materialization=off'; set optimizer_switch='firstmatch=off,loosescan=off,materialization=off';
--echo # Check DuplicateWeedout + join buffer
explain explain
select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a); select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a);
select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a); select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a);
--echo # Try also without join buffer --echo # Check DuplicateWeedout without join buffer
set @tmp_jcl_20110622= @@join_cache_level; set @tmp_jcl_20110622= @@join_cache_level;
set join_cache_level= 0; set join_cache_level= 0;
explain explain
...@@ -1292,12 +1293,48 @@ select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a); ...@@ -1292,12 +1293,48 @@ select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a);
select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a); select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a);
--echo # Check FirstMatch without join buffer:
set optimizer_switch='firstmatch=on'; set optimizer_switch='firstmatch=on';
explain explain
select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a); select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a);
select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a); select * from t0 where a in (select t1.a from t1 left join t2 on t1.a=t2.a);
--echo #
--echo # Now, check the same for multiple inner tables:
alter table t2 add b int;
update t2 set b=a;
create table t3 as select * from t2;
set optimizer_switch='firstmatch=off';
set join_cache_level= 0;
--echo # DuplicateWeedout without join buffer
explain
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
set @@join_cache_level=@tmp_jcl_20110622; set @@join_cache_level=@tmp_jcl_20110622;
--echo # DuplicateWeedout + join buffer
explain
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
--echo # Now, let the inner join side have a 'partial' match
select * from t3;
insert into t3 values(2,2);
explain
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
select * from t0
where a in (select t1.a from t1 left join (t3 join t2 on t3.b=t2.b) on t1.a=t3.a);
set @@optimizer_switch=@tmp_20110622; set @@optimizer_switch=@tmp_20110622;
drop table t0, t1, t2; drop table t0, t1, t2;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment