diff options
Diffstat (limited to 'mysql-test/t/subselect_sj_nonmerged.test')
-rw-r--r-- | mysql-test/t/subselect_sj_nonmerged.test | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/mysql-test/t/subselect_sj_nonmerged.test b/mysql-test/t/subselect_sj_nonmerged.test new file mode 100644 index 00000000000..9ef96c87eba --- /dev/null +++ b/mysql-test/t/subselect_sj_nonmerged.test @@ -0,0 +1,76 @@ +# +# Tests for non-merged semi-joins +# +--disable_warnings +drop table if exists t0, t1, t2, t3, t4; +--enable_warnings + +set @save_optimizer_switch=@@optimizer_switch; + +create table t0 (a int); +insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); + + +# Check the case of subquery having agggregates but not having grouping + +create table t1 as select * from t0; +--echo # The following should use full scan on <subquery2> and it must scan 1 row: +explain select * from t0 where a in (select max(a) from t1); +select * from t0 where a in (select max(a) from t1); + +# Ok, now check the trivial match/no-match/NULL on the left/NULL on the right cases +insert into t1 values (11); +select * from t0 where a in (select max(a) from t1); +delete from t1 where a=11; + +insert into t0 values (NULL); +select * from t0 where a in (select max(a) from t1); +delete from t0 where a is NULL; + +delete from t1; +select * from t0 where a in (select max(a) from t1); + +insert into t0 values (NULL); +select * from t0 where a in (select max(a) from t1); +delete from t0 where a is NULL; + +drop table t1; + +# +# Try with join subqueries +# + +create table t1 (a int, b int); +insert into t1 select a,a from t0; # 10 rows +create table t2 as select * from t1 where a<5; # 5 rows +create table t3 as select (A.a + 10*B.a) as a from t0 A, t0 B; # 100 rows +alter table t3 add primary key(a); + +--echo # The following should have do a full scan on <subquery2> and scan 5 rows +--echo # (despite that subquery's join output estimate is 50 rows) +explain select * from t3 where a in (select max(t2.a) from t1, t2 group by t2.b); + +--echo # Compare to this which really will have 50 record combinations: +explain select * from t3 where a in (select max(t2.a) from t1, t2 group by t2.b, t1.b); + +--echo # Outer joins also work: +explain select * from t3 +where a in (select max(t2.a) from t1 left join t2 on t1.a=t2.a group by t2.b, t1.b); + +# +# Check if joins on the outer side also work +# +create table t4 (a int, b int, filler char(20), unique key(a,b)); +insert into t4 select A.a + 10*B.a, A.a + 10*B.a, 'filler' from t0 A, t0 B; # 100 rows +explain select * from t0, t4 where + t4.b=t0.a and t4.a in (select max(t2.a) from t1, t2 group by t2.b); + +insert into t4 select 100 + (B.a *100 + A.a), 100 + (B.a*100 + A.a), 'filler' from t4 A, t0 B; +explain select * from t4 where + t4.a in (select max(t2.a) from t1, t2 group by t2.b) and + t4.b in (select max(t2.a) from t1, t2 group by t2.b); + +drop table t1,t2,t3,t4; + +drop table t0; + |