mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
MWL#90: Subqueries: Inside-out execution for non-semijoin materialized subqueries that are AND-parts of the WHERE
- Code cleanu. - Make MWL#90 code require @@optimizer_switch='semijoin=on' - Update test results with the above - Fork subselect_mat.test - we want to check both semi-join materialization, which now has broader scope and non-semijoin materialization.
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
set @@optimizer_switch='semijoin=off';
|
||||||
|
set optimizer_switch='firstmatch=off';
|
||||||
drop table if exists t1, t2, t3, t1i, t2i, t3i;
|
drop table if exists t1, t2, t3, t1i, t2i, t3i;
|
||||||
drop view if exists v1, v2, v1m, v2m;
|
drop view if exists v1, v2, v1m, v2m;
|
||||||
create table t1 (a1 char(8), a2 char(8));
|
create table t1 (a1 char(8), a2 char(8));
|
||||||
@@ -30,7 +32,6 @@ create index it3i3 on t3i (c1, c2);
|
|||||||
insert into t1i select * from t1;
|
insert into t1i select * from t1;
|
||||||
insert into t2i select * from t2;
|
insert into t2i select * from t2;
|
||||||
insert into t3i select * from t3;
|
insert into t3i select * from t3;
|
||||||
set @@optimizer_switch='semijoin=off';
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* Simple tests.
|
* Simple tests.
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
@@ -38,11 +39,10 @@ set @@optimizer_switch='semijoin=off';
|
|||||||
explain extended
|
explain extended
|
||||||
select * from t1 where a1 in (select b1 from t2 where b1 > '0');
|
select * from t1 where a1 in (select b1 from t2 where b1 > '0');
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 9 test.t1.a1 1 100.00
|
|
||||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where
|
2 SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from <materialize> (select `test`.`t2`.`b1` AS `b1` from `test`.`t2` where (`test`.`t2`.`b1` > '0')) join `test`.`t1` where (`SUBQUERY#2`.`b1` = `test`.`t1`.`a1`)
|
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where <in_optimizer>(`test`.`t1`.`a1`,`test`.`t1`.`a1` in ( <materialize> (select `test`.`t2`.`b1` AS `b1` from `test`.`t2` where (`test`.`t2`.`b1` > '0') ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where ((`test`.`t1`.`a1` = `SUBQUERY#2`.`b1`)))))
|
||||||
select * from t1 where a1 in (select b1 from t2 where b1 > '0');
|
select * from t1 where a1 in (select b1 from t2 where b1 > '0');
|
||||||
a1 a2
|
a1 a2
|
||||||
1 - 01 2 - 01
|
1 - 01 2 - 01
|
||||||
@@ -50,11 +50,10 @@ a1 a2
|
|||||||
explain extended
|
explain extended
|
||||||
select * from t1 where a1 in (select b1 from t2 where b1 > '0' group by b1);
|
select * from t1 where a1 in (select b1 from t2 where b1 > '0' group by b1);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 9 test.t1.a1 1 100.00
|
|
||||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where; Using temporary; Using filesort
|
2 SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where; Using temporary; Using filesort
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from <materialize> (select `test`.`t2`.`b1` AS `b1` from `test`.`t2` where (`test`.`t2`.`b1` > '0') group by `test`.`t2`.`b1`) join `test`.`t1` where (`SUBQUERY#2`.`b1` = `test`.`t1`.`a1`)
|
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where <in_optimizer>(`test`.`t1`.`a1`,`test`.`t1`.`a1` in ( <materialize> (select `test`.`t2`.`b1` AS `b1` from `test`.`t2` where (`test`.`t2`.`b1` > '0') group by `test`.`t2`.`b1` ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where ((`test`.`t1`.`a1` = `SUBQUERY#2`.`b1`)))))
|
||||||
select * from t1 where a1 in (select b1 from t2 where b1 > '0' group by b1);
|
select * from t1 where a1 in (select b1 from t2 where b1 > '0' group by b1);
|
||||||
a1 a2
|
a1 a2
|
||||||
1 - 01 2 - 01
|
1 - 01 2 - 01
|
||||||
@@ -62,11 +61,10 @@ a1 a2
|
|||||||
explain extended
|
explain extended
|
||||||
select * from t1 where (a1, a2) in (select b1, b2 from t2 where b1 > '0' group by b1, b2);
|
select * from t1 where (a1, a2) in (select b1, b2 from t2 where b1 > '0' group by b1, b2);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 18 test.t1.a1,test.t1.a2 1 100.00
|
|
||||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where; Using temporary; Using filesort
|
2 SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where; Using temporary; Using filesort
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from <materialize> (select `test`.`t2`.`b1` AS `b1`,`test`.`t2`.`b2` AS `b2` from `test`.`t2` where (`test`.`t2`.`b1` > '0') group by `test`.`t2`.`b1`,`test`.`t2`.`b2`) join `test`.`t1` where ((`SUBQUERY#2`.`b2` = `test`.`t1`.`a2`) and (`SUBQUERY#2`.`b1` = `test`.`t1`.`a1`))
|
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where <in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (select `test`.`t2`.`b1` AS `b1`,`test`.`t2`.`b2` AS `b2` from `test`.`t2` where (`test`.`t2`.`b1` > '0') group by `test`.`t2`.`b1`,`test`.`t2`.`b2` ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where ((`test`.`t1`.`a1` = `SUBQUERY#2`.`b1`) and (`test`.`t1`.`a2` = `SUBQUERY#2`.`b2`)))))
|
||||||
select * from t1 where (a1, a2) in (select b1, b2 from t2 where b1 > '0' group by b1, b2);
|
select * from t1 where (a1, a2) in (select b1, b2 from t2 where b1 > '0' group by b1, b2);
|
||||||
a1 a2
|
a1 a2
|
||||||
1 - 01 2 - 01
|
1 - 01 2 - 01
|
||||||
@@ -74,11 +72,10 @@ a1 a2
|
|||||||
explain extended
|
explain extended
|
||||||
select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1);
|
select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 18 test.t1.a1,test.t1.a2 1 100.00
|
|
||||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where; Using temporary; Using filesort
|
2 SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where; Using temporary; Using filesort
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from <materialize> (select `test`.`t2`.`b1` AS `b1`,min(`test`.`t2`.`b2`) AS `min(b2)` from `test`.`t2` where (`test`.`t2`.`b1` > '0') group by `test`.`t2`.`b1`) join `test`.`t1` where ((`SUBQUERY#2`.`min(b2)` = `test`.`t1`.`a2`) and (`SUBQUERY#2`.`b1` = `test`.`t1`.`a1`))
|
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where <in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (select `test`.`t2`.`b1` AS `b1`,min(`test`.`t2`.`b2`) AS `min(b2)` from `test`.`t2` where (`test`.`t2`.`b1` > '0') group by `test`.`t2`.`b1` ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where ((`test`.`t1`.`a1` = `SUBQUERY#2`.`b1`) and (`test`.`t1`.`a2` = `SUBQUERY#2`.`min(b2)`)))))
|
||||||
select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1);
|
select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1);
|
||||||
a1 a2
|
a1 a2
|
||||||
1 - 01 2 - 01
|
1 - 01 2 - 01
|
||||||
@@ -86,11 +83,10 @@ a1 a2
|
|||||||
explain extended
|
explain extended
|
||||||
select * from t1i where a1 in (select b1 from t2i where b1 > '0');
|
select * from t1i where a1 in (select b1 from t2i where b1 > '0');
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1i index it1i1,it1i3 it1i3 18 NULL 3 100.00 Using index
|
1 PRIMARY t1i index NULL it1i3 18 NULL 3 100.00 Using where; Using index
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 9 test.t1i.a1 1 100.00
|
|
||||||
2 SUBQUERY t2i index it2i1,it2i3 it2i1 9 NULL 5 100.00 Using where; Using index
|
2 SUBQUERY t2i index it2i1,it2i3 it2i1 9 NULL 5 100.00 Using where; Using index
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1i`.`a1` AS `a1`,`test`.`t1i`.`a2` AS `a2` from <materialize> (select `test`.`t2i`.`b1` AS `b1` from `test`.`t2i` where (`test`.`t2i`.`b1` > '0')) join `test`.`t1i` where (`SUBQUERY#2`.`b1` = `test`.`t1i`.`a1`)
|
Note 1003 select `test`.`t1i`.`a1` AS `a1`,`test`.`t1i`.`a2` AS `a2` from `test`.`t1i` where <in_optimizer>(`test`.`t1i`.`a1`,`test`.`t1i`.`a1` in ( <materialize> (select `test`.`t2i`.`b1` AS `b1` from `test`.`t2i` where (`test`.`t2i`.`b1` > '0') ), <primary_index_lookup>(`test`.`t1i`.`a1` in <temporary table> on distinct_key where ((`test`.`t1i`.`a1` = `SUBQUERY#2`.`b1`)))))
|
||||||
select * from t1i where a1 in (select b1 from t2i where b1 > '0');
|
select * from t1i where a1 in (select b1 from t2i where b1 > '0');
|
||||||
a1 a2
|
a1 a2
|
||||||
1 - 01 2 - 01
|
1 - 01 2 - 01
|
||||||
@@ -98,11 +94,10 @@ a1 a2
|
|||||||
explain extended
|
explain extended
|
||||||
select * from t1i where a1 in (select b1 from t2i where b1 > '0' group by b1);
|
select * from t1i where a1 in (select b1 from t2i where b1 > '0' group by b1);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY SUBQUERY#2 ALL distinct_key # NULL # 3 100.00 #
|
1 PRIMARY t1i index NULL # 18 # 3 100.00 #
|
||||||
1 PRIMARY t1i ref it1i1,it1i3 # 9 # 1 100.00 #
|
|
||||||
2 SUBQUERY t2i range it2i1,it2i3 # 9 # 3 100.00 #
|
2 SUBQUERY t2i range it2i1,it2i3 # 9 # 3 100.00 #
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1i`.`a1` AS `a1`,`test`.`t1i`.`a2` AS `a2` from <materialize> (select `test`.`t2i`.`b1` AS `b1` from `test`.`t2i` where (`test`.`t2i`.`b1` > '0') group by `test`.`t2i`.`b1`) join `test`.`t1i` where (`test`.`t1i`.`a1` = `SUBQUERY#2`.`b1`)
|
Note 1003 select `test`.`t1i`.`a1` AS `a1`,`test`.`t1i`.`a2` AS `a2` from `test`.`t1i` where <in_optimizer>(`test`.`t1i`.`a1`,`test`.`t1i`.`a1` in ( <materialize> (select `test`.`t2i`.`b1` AS `b1` from `test`.`t2i` where (`test`.`t2i`.`b1` > '0') group by `test`.`t2i`.`b1` ), <primary_index_lookup>(`test`.`t1i`.`a1` in <temporary table> on distinct_key where ((`test`.`t1i`.`a1` = `SUBQUERY#2`.`b1`)))))
|
||||||
select * from t1i where a1 in (select b1 from t2i where b1 > '0' group by b1);
|
select * from t1i where a1 in (select b1 from t2i where b1 > '0' group by b1);
|
||||||
a1 a2
|
a1 a2
|
||||||
1 - 01 2 - 01
|
1 - 01 2 - 01
|
||||||
@@ -110,11 +105,10 @@ a1 a2
|
|||||||
explain extended
|
explain extended
|
||||||
select * from t1i where (a1, a2) in (select b1, b2 from t2i where b1 > '0');
|
select * from t1i where (a1, a2) in (select b1, b2 from t2i where b1 > '0');
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1i index it1i1,it1i2,it1i3 it1i3 18 NULL 3 100.00 Using index
|
1 PRIMARY t1i index NULL it1i3 18 NULL 3 100.00 Using where; Using index
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 18 test.t1i.a1,test.t1i.a2 1 100.00
|
|
||||||
2 SUBQUERY t2i index it2i1,it2i3 it2i3 18 NULL 5 100.00 Using where; Using index
|
2 SUBQUERY t2i index it2i1,it2i3 it2i3 18 NULL 5 100.00 Using where; Using index
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1i`.`a1` AS `a1`,`test`.`t1i`.`a2` AS `a2` from <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b1` > '0')) join `test`.`t1i` where ((`SUBQUERY#2`.`b2` = `test`.`t1i`.`a2`) and (`SUBQUERY#2`.`b1` = `test`.`t1i`.`a1`))
|
Note 1003 select `test`.`t1i`.`a1` AS `a1`,`test`.`t1i`.`a2` AS `a2` from `test`.`t1i` where <in_optimizer>((`test`.`t1i`.`a1`,`test`.`t1i`.`a2`),(`test`.`t1i`.`a1`,`test`.`t1i`.`a2`) in ( <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b1` > '0') ), <primary_index_lookup>(`test`.`t1i`.`a1` in <temporary table> on distinct_key where ((`test`.`t1i`.`a1` = `SUBQUERY#2`.`b1`) and (`test`.`t1i`.`a2` = `SUBQUERY#2`.`b2`)))))
|
||||||
select * from t1i where (a1, a2) in (select b1, b2 from t2i where b1 > '0');
|
select * from t1i where (a1, a2) in (select b1, b2 from t2i where b1 > '0');
|
||||||
a1 a2
|
a1 a2
|
||||||
1 - 01 2 - 01
|
1 - 01 2 - 01
|
||||||
@@ -122,11 +116,10 @@ a1 a2
|
|||||||
explain extended
|
explain extended
|
||||||
select * from t1i where (a1, a2) in (select b1, b2 from t2i where b1 > '0' group by b1, b2);
|
select * from t1i where (a1, a2) in (select b1, b2 from t2i where b1 > '0' group by b1, b2);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1i index it1i1,it1i2,it1i3 # # # 3 100.00 #
|
1 PRIMARY t1i index NULL # # # 3 100.00 #
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key # # # 1 100.00 #
|
|
||||||
2 SUBQUERY t2i range it2i1,it2i3 # # # 3 100.00 #
|
2 SUBQUERY t2i range it2i1,it2i3 # # # 3 100.00 #
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1i`.`a1` AS `a1`,`test`.`t1i`.`a2` AS `a2` from <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b1` > '0') group by `test`.`t2i`.`b1`,`test`.`t2i`.`b2`) join `test`.`t1i` where ((`SUBQUERY#2`.`b2` = `test`.`t1i`.`a2`) and (`SUBQUERY#2`.`b1` = `test`.`t1i`.`a1`))
|
Note 1003 select `test`.`t1i`.`a1` AS `a1`,`test`.`t1i`.`a2` AS `a2` from `test`.`t1i` where <in_optimizer>((`test`.`t1i`.`a1`,`test`.`t1i`.`a2`),(`test`.`t1i`.`a1`,`test`.`t1i`.`a2`) in ( <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b1` > '0') group by `test`.`t2i`.`b1`,`test`.`t2i`.`b2` ), <primary_index_lookup>(`test`.`t1i`.`a1` in <temporary table> on distinct_key where ((`test`.`t1i`.`a1` = `SUBQUERY#2`.`b1`) and (`test`.`t1i`.`a2` = `SUBQUERY#2`.`b2`)))))
|
||||||
select * from t1i where (a1, a2) in (select b1, b2 from t2i where b1 > '0' group by b1, b2);
|
select * from t1i where (a1, a2) in (select b1, b2 from t2i where b1 > '0' group by b1, b2);
|
||||||
a1 a2
|
a1 a2
|
||||||
1 - 01 2 - 01
|
1 - 01 2 - 01
|
||||||
@@ -134,11 +127,10 @@ a1 a2
|
|||||||
explain extended
|
explain extended
|
||||||
select * from t1i where (a1, a2) in (select b1, min(b2) from t2i where b1 > '0' group by b1);
|
select * from t1i where (a1, a2) in (select b1, min(b2) from t2i where b1 > '0' group by b1);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1i index it1i1,it1i2,it1i3 # # # 3 100.00 #
|
1 PRIMARY t1i index NULL # # # 3 100.00 #
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key # # # 1 100.00 #
|
|
||||||
2 SUBQUERY t2i range it2i1,it2i3 # # # 3 100.00 #
|
2 SUBQUERY t2i range it2i1,it2i3 # # # 3 100.00 #
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1i`.`a1` AS `a1`,`test`.`t1i`.`a2` AS `a2` from <materialize> (select `test`.`t2i`.`b1` AS `b1`,min(`test`.`t2i`.`b2`) AS `min(b2)` from `test`.`t2i` where (`test`.`t2i`.`b1` > '0') group by `test`.`t2i`.`b1`) join `test`.`t1i` where ((`SUBQUERY#2`.`min(b2)` = `test`.`t1i`.`a2`) and (`SUBQUERY#2`.`b1` = `test`.`t1i`.`a1`))
|
Note 1003 select `test`.`t1i`.`a1` AS `a1`,`test`.`t1i`.`a2` AS `a2` from `test`.`t1i` where <in_optimizer>((`test`.`t1i`.`a1`,`test`.`t1i`.`a2`),(`test`.`t1i`.`a1`,`test`.`t1i`.`a2`) in ( <materialize> (select `test`.`t2i`.`b1` AS `b1`,min(`test`.`t2i`.`b2`) AS `min(b2)` from `test`.`t2i` where (`test`.`t2i`.`b1` > '0') group by `test`.`t2i`.`b1` ), <primary_index_lookup>(`test`.`t1i`.`a1` in <temporary table> on distinct_key where ((`test`.`t1i`.`a1` = `SUBQUERY#2`.`b1`) and (`test`.`t1i`.`a2` = `SUBQUERY#2`.`min(b2)`)))))
|
||||||
select * from t1i where (a1, a2) in (select b1, min(b2) from t2i where b1 > '0' group by b1);
|
select * from t1i where (a1, a2) in (select b1, min(b2) from t2i where b1 > '0' group by b1);
|
||||||
a1 a2
|
a1 a2
|
||||||
1 - 01 2 - 01
|
1 - 01 2 - 01
|
||||||
@@ -146,11 +138,10 @@ a1 a2
|
|||||||
explain extended
|
explain extended
|
||||||
select * from t1 where (a1, a2) in (select b1, max(b2) from t2i group by b1);
|
select * from t1 where (a1, a2) in (select b1, max(b2) from t2i group by b1);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 18 test.t1.a1,test.t1.a2 1 100.00
|
|
||||||
2 SUBQUERY t2i range NULL it2i3 9 NULL 3 100.00 Using index for group-by
|
2 SUBQUERY t2i range NULL it2i3 9 NULL 3 100.00 Using index for group-by
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from <materialize> (select `test`.`t2i`.`b1` AS `b1`,max(`test`.`t2i`.`b2`) AS `max(b2)` from `test`.`t2i` group by `test`.`t2i`.`b1`) join `test`.`t1` where ((`SUBQUERY#2`.`max(b2)` = `test`.`t1`.`a2`) and (`SUBQUERY#2`.`b1` = `test`.`t1`.`a1`))
|
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where <in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (select `test`.`t2i`.`b1` AS `b1`,max(`test`.`t2i`.`b2`) AS `max(b2)` from `test`.`t2i` group by `test`.`t2i`.`b1` ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where ((`test`.`t1`.`a1` = `SUBQUERY#2`.`b1`) and (`test`.`t1`.`a2` = `SUBQUERY#2`.`max(b2)`)))))
|
||||||
select * from t1 where (a1, a2) in (select b1, max(b2) from t2i group by b1);
|
select * from t1 where (a1, a2) in (select b1, max(b2) from t2i group by b1);
|
||||||
a1 a2
|
a1 a2
|
||||||
1 - 01 2 - 01
|
1 - 01 2 - 01
|
||||||
@@ -158,13 +149,11 @@ a1 a2
|
|||||||
prepare st1 from "explain select * from t1 where (a1, a2) in (select b1, max(b2) from t2i group by b1)";
|
prepare st1 from "explain select * from t1 where (a1, a2) in (select b1, max(b2) from t2i group by b1)";
|
||||||
execute st1;
|
execute st1;
|
||||||
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
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 18 test.t1.a1,test.t1.a2 1
|
|
||||||
2 SUBQUERY t2i range NULL it2i3 9 NULL 3 Using index for group-by
|
2 SUBQUERY t2i range NULL it2i3 9 NULL 3 Using index for group-by
|
||||||
execute st1;
|
execute st1;
|
||||||
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
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 18 test.t1.a1,test.t1.a2 1
|
|
||||||
2 SUBQUERY t2i range NULL it2i3 9 NULL 3 Using index for group-by
|
2 SUBQUERY t2i range NULL it2i3 9 NULL 3 Using index for group-by
|
||||||
prepare st2 from "select * from t1 where (a1, a2) in (select b1, max(b2) from t2i group by b1)";
|
prepare st2 from "select * from t1 where (a1, a2) in (select b1, max(b2) from t2i group by b1)";
|
||||||
execute st2;
|
execute st2;
|
||||||
@@ -178,17 +167,17 @@ a1 a2
|
|||||||
explain extended
|
explain extended
|
||||||
select * from t1 where (a1, a2) in (select b1, min(b2) from t2i where b1 > '0' group by b1);
|
select * from t1 where (a1, a2) in (select b1, min(b2) from t2i where b1 > '0' group by b1);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 18 test.t1.a1,test.t1.a2 1 100.00
|
|
||||||
2 SUBQUERY t2i range it2i1,it2i3 it2i3 18 NULL 3 100.00 Using where; Using index for group-by
|
2 SUBQUERY t2i range it2i1,it2i3 it2i3 18 NULL 3 100.00 Using where; Using index for group-by
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from <materialize> (select `test`.`t2i`.`b1` AS `b1`,min(`test`.`t2i`.`b2`) AS `min(b2)` from `test`.`t2i` where (`test`.`t2i`.`b1` > '0') group by `test`.`t2i`.`b1`) join `test`.`t1` where ((`SUBQUERY#2`.`min(b2)` = `test`.`t1`.`a2`) and (`SUBQUERY#2`.`b1` = `test`.`t1`.`a1`))
|
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where <in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (select `test`.`t2i`.`b1` AS `b1`,min(`test`.`t2i`.`b2`) AS `min(b2)` from `test`.`t2i` where (`test`.`t2i`.`b1` > '0') group by `test`.`t2i`.`b1` ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where ((`test`.`t1`.`a1` = `SUBQUERY#2`.`b1`) and (`test`.`t1`.`a2` = `SUBQUERY#2`.`min(b2)`)))))
|
||||||
select * from t1 where (a1, a2) in (select b1, min(b2) from t2i where b1 > '0' group by b1);
|
select * from t1 where (a1, a2) in (select b1, min(b2) from t2i where b1 > '0' group by b1);
|
||||||
a1 a2
|
a1 a2
|
||||||
1 - 01 2 - 01
|
1 - 01 2 - 01
|
||||||
1 - 02 2 - 02
|
1 - 02 2 - 02
|
||||||
select * from t1 where (a1, a2) in (select b1, min(b2) from t2i limit 1,1);
|
select * from t1 where (a1, a2) in (select b1, min(b2) from t2i limit 1,1);
|
||||||
ERROR 42000: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
ERROR 42000: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||||
|
set @save_optimizer_switch=@@optimizer_switch;
|
||||||
set @@optimizer_switch='default,semijoin=off';
|
set @@optimizer_switch='default,semijoin=off';
|
||||||
prepare st1 from
|
prepare st1 from
|
||||||
"select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1)";
|
"select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1)";
|
||||||
@@ -215,15 +204,14 @@ execute st1;
|
|||||||
a1 a2
|
a1 a2
|
||||||
1 - 01 2 - 01
|
1 - 01 2 - 01
|
||||||
1 - 02 2 - 02
|
1 - 02 2 - 02
|
||||||
set @@optimizer_switch='default,semijoin=off';
|
set @@optimizer_switch=@save_optimizer_switch;
|
||||||
explain extended
|
explain extended
|
||||||
select * from t1 where (a1, a2) in (select b1, b2 from t2 order by b1, b2);
|
select * from t1 where (a1, a2) in (select b1, b2 from t2 order by b1, b2);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 18 test.t1.a1,test.t1.a2 1 100.00
|
|
||||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00
|
2 SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from <materialize> (select `test`.`t2`.`b1` AS `b1`,`test`.`t2`.`b2` AS `b2` from `test`.`t2` order by `test`.`t2`.`b1`,`test`.`t2`.`b2`) join `test`.`t1` where ((`SUBQUERY#2`.`b2` = `test`.`t1`.`a2`) and (`SUBQUERY#2`.`b1` = `test`.`t1`.`a1`))
|
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where <in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (select `test`.`t2`.`b1` AS `b1`,`test`.`t2`.`b2` AS `b2` from `test`.`t2` order by `test`.`t2`.`b1`,`test`.`t2`.`b2` ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where ((`test`.`t1`.`a1` = `SUBQUERY#2`.`b1`) and (`test`.`t1`.`a2` = `SUBQUERY#2`.`b2`)))))
|
||||||
select * from t1 where (a1, a2) in (select b1, b2 from t2 order by b1, b2);
|
select * from t1 where (a1, a2) in (select b1, b2 from t2 order by b1, b2);
|
||||||
a1 a2
|
a1 a2
|
||||||
1 - 01 2 - 01
|
1 - 01 2 - 01
|
||||||
@@ -231,11 +219,10 @@ a1 a2
|
|||||||
explain extended
|
explain extended
|
||||||
select * from t1i where (a1, a2) in (select b1, b2 from t2i order by b1, b2);
|
select * from t1i where (a1, a2) in (select b1, b2 from t2i order by b1, b2);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1i index it1i1,it1i2,it1i3 it1i3 18 NULL 3 100.00 Using index
|
1 PRIMARY t1i index NULL it1i3 18 NULL 3 100.00 Using where; Using index
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 18 test.t1i.a1,test.t1i.a2 1 100.00
|
|
||||||
2 SUBQUERY t2i index NULL it2i3 18 NULL 5 100.00 Using index
|
2 SUBQUERY t2i index NULL it2i3 18 NULL 5 100.00 Using index
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1i`.`a1` AS `a1`,`test`.`t1i`.`a2` AS `a2` from <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` order by `test`.`t2i`.`b1`,`test`.`t2i`.`b2`) join `test`.`t1i` where ((`SUBQUERY#2`.`b2` = `test`.`t1i`.`a2`) and (`SUBQUERY#2`.`b1` = `test`.`t1i`.`a1`))
|
Note 1003 select `test`.`t1i`.`a1` AS `a1`,`test`.`t1i`.`a2` AS `a2` from `test`.`t1i` where <in_optimizer>((`test`.`t1i`.`a1`,`test`.`t1i`.`a2`),(`test`.`t1i`.`a1`,`test`.`t1i`.`a2`) in ( <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` order by `test`.`t2i`.`b1`,`test`.`t2i`.`b2` ), <primary_index_lookup>(`test`.`t1i`.`a1` in <temporary table> on distinct_key where ((`test`.`t1i`.`a1` = `SUBQUERY#2`.`b1`) and (`test`.`t1i`.`a2` = `SUBQUERY#2`.`b2`)))))
|
||||||
select * from t1i where (a1, a2) in (select b1, b2 from t2i order by b1, b2);
|
select * from t1i where (a1, a2) in (select b1, b2 from t2i order by b1, b2);
|
||||||
a1 a2
|
a1 a2
|
||||||
1 - 01 2 - 01
|
1 - 01 2 - 01
|
||||||
@@ -285,15 +272,12 @@ where (a1, a2) in (select b1, b2 from t2 where b1 > '0') and
|
|||||||
(a1, a2) in (select c1, c2 from t3
|
(a1, a2) in (select c1, c2 from t3
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY SUBQUERY#2 ALL distinct_key NULL NULL NULL 5 0.00
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#3 eq_ref distinct_key distinct_key 18 SUBQUERY#2.b1,SUBQUERY#2.b2 1 100.00
|
3 SUBQUERY t3 ALL NULL NULL NULL NULL 4 100.00 Using where
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where; Using join buffer
|
|
||||||
3 SUBQUERY t3 ALL NULL NULL NULL NULL 4 100.00
|
|
||||||
3 SUBQUERY SUBQUERY#4 eq_ref distinct_key distinct_key 18 test.t3.c1,test.t3.c2 1 100.00
|
|
||||||
4 SUBQUERY t2i index it2i2 it2i3 18 NULL 5 100.00 Using where; Using index
|
4 SUBQUERY t2i index it2i2 it2i3 18 NULL 5 100.00 Using where; Using index
|
||||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where
|
2 SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from <materialize> (select `test`.`t3`.`c1` AS `c1`,`test`.`t3`.`c2` AS `c2` from <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b2` > '0')) join `test`.`t3` where ((`SUBQUERY#4`.`b2` = `test`.`t3`.`c2`) and (`SUBQUERY#4`.`b1` = `test`.`t3`.`c1`))) join <materialize> (select `test`.`t2`.`b1` AS `b1`,`test`.`t2`.`b2` AS `b2` from `test`.`t2` where (`test`.`t2`.`b1` > '0')) join `test`.`t1` where ((`SUBQUERY#3`.`c2` = `SUBQUERY#2`.`b2`) and (`test`.`t1`.`a2` = `SUBQUERY#2`.`b2`) and (`SUBQUERY#3`.`c1` = `SUBQUERY#2`.`b1`) and (`test`.`t1`.`a1` = `SUBQUERY#2`.`b1`))
|
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where (<in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (select `test`.`t2`.`b1` AS `b1`,`test`.`t2`.`b2` AS `b2` from `test`.`t2` where (`test`.`t2`.`b1` > '0') ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where ((`test`.`t1`.`a1` = `SUBQUERY#2`.`b1`) and (`test`.`t1`.`a2` = `SUBQUERY#2`.`b2`))))) and <in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (select `test`.`t3`.`c1` AS `c1`,`test`.`t3`.`c2` AS `c2` from `test`.`t3` where <in_optimizer>((`test`.`t3`.`c1`,`test`.`t3`.`c2`),(`test`.`t3`.`c1`,`test`.`t3`.`c2`) in ( <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b2` > '0') ), <primary_index_lookup>(`test`.`t3`.`c1` in <temporary table> on distinct_key where ((`test`.`t3`.`c1` = `SUBQUERY#4`.`b1`) and (`test`.`t3`.`c2` = `SUBQUERY#4`.`b2`))))) ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where ((`test`.`t1`.`a1` = `SUBQUERY#3`.`c1`) and (`test`.`t1`.`a2` = `SUBQUERY#3`.`c2`))))))
|
||||||
select * from t1
|
select * from t1
|
||||||
where (a1, a2) in (select b1, b2 from t2 where b1 > '0') and
|
where (a1, a2) in (select b1, b2 from t2 where b1 > '0') and
|
||||||
(a1, a2) in (select c1, c2 from t3
|
(a1, a2) in (select c1, c2 from t3
|
||||||
@@ -307,15 +291,12 @@ where (a1, a2) in (select b1, b2 from t2i where b1 > '0') and
|
|||||||
(a1, a2) in (select c1, c2 from t3i
|
(a1, a2) in (select c1, c2 from t3i
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY SUBQUERY#2 ALL distinct_key # # # 5 0.00 #
|
1 PRIMARY t1i index NULL # # # 3 100.00 #
|
||||||
1 PRIMARY SUBQUERY#3 eq_ref distinct_key # # # 1 100.00 #
|
3 SUBQUERY t3i index NULL # # # 4 100.00 #
|
||||||
1 PRIMARY t1i ref it1i1,it1i2,it1i3 # # # 1 100.00 #
|
|
||||||
3 SUBQUERY t3i index it3i1,it3i2,it3i3 # # # 4 100.00 #
|
|
||||||
3 SUBQUERY SUBQUERY#4 eq_ref distinct_key # # # 1 100.00 #
|
|
||||||
4 SUBQUERY t2i index it2i2 # # # 5 100.00 #
|
4 SUBQUERY t2i index it2i2 # # # 5 100.00 #
|
||||||
2 SUBQUERY t2i index it2i1,it2i3 # # # 5 100.00 #
|
2 SUBQUERY t2i index it2i1,it2i3 # # # 5 100.00 #
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1i`.`a1` AS `a1`,`test`.`t1i`.`a2` AS `a2` from <materialize> (select `test`.`t3i`.`c1` AS `c1`,`test`.`t3i`.`c2` AS `c2` from <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b2` > '0')) join `test`.`t3i` where ((`SUBQUERY#4`.`b2` = `test`.`t3i`.`c2`) and (`SUBQUERY#4`.`b1` = `test`.`t3i`.`c1`))) join <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b1` > '0')) join `test`.`t1i` where ((`SUBQUERY#3`.`c2` = `SUBQUERY#2`.`b2`) and (`test`.`t1i`.`a2` = `SUBQUERY#2`.`b2`) and (`SUBQUERY#3`.`c1` = `SUBQUERY#2`.`b1`) and (`test`.`t1i`.`a1` = `SUBQUERY#2`.`b1`))
|
Note 1003 select `test`.`t1i`.`a1` AS `a1`,`test`.`t1i`.`a2` AS `a2` from `test`.`t1i` where (<in_optimizer>((`test`.`t1i`.`a1`,`test`.`t1i`.`a2`),(`test`.`t1i`.`a1`,`test`.`t1i`.`a2`) in ( <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b1` > '0') ), <primary_index_lookup>(`test`.`t1i`.`a1` in <temporary table> on distinct_key where ((`test`.`t1i`.`a1` = `SUBQUERY#2`.`b1`) and (`test`.`t1i`.`a2` = `SUBQUERY#2`.`b2`))))) and <in_optimizer>((`test`.`t1i`.`a1`,`test`.`t1i`.`a2`),(`test`.`t1i`.`a1`,`test`.`t1i`.`a2`) in ( <materialize> (select `test`.`t3i`.`c1` AS `c1`,`test`.`t3i`.`c2` AS `c2` from `test`.`t3i` where <in_optimizer>((`test`.`t3i`.`c1`,`test`.`t3i`.`c2`),(`test`.`t3i`.`c1`,`test`.`t3i`.`c2`) in ( <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b2` > '0') ), <primary_index_lookup>(`test`.`t3i`.`c1` in <temporary table> on distinct_key where ((`test`.`t3i`.`c1` = `SUBQUERY#4`.`b1`) and (`test`.`t3i`.`c2` = `SUBQUERY#4`.`b2`))))) ), <primary_index_lookup>(`test`.`t1i`.`a1` in <temporary table> on distinct_key where ((`test`.`t1i`.`a1` = `SUBQUERY#3`.`c1`) and (`test`.`t1i`.`a2` = `SUBQUERY#3`.`c2`))))))
|
||||||
select * from t1i
|
select * from t1i
|
||||||
where (a1, a2) in (select b1, b2 from t2i where b1 > '0') and
|
where (a1, a2) in (select b1, b2 from t2i where b1 > '0') and
|
||||||
(a1, a2) in (select c1, c2 from t3i
|
(a1, a2) in (select c1, c2 from t3i
|
||||||
@@ -331,17 +312,14 @@ b2 in (select c2 from t3 where c2 LIKE '%03')) and
|
|||||||
(a1, a2) in (select c1, c2 from t3
|
(a1, a2) in (select c1, c2 from t3
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY SUBQUERY#2 ALL distinct_key NULL NULL NULL 5 0.00
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#5 eq_ref distinct_key distinct_key 18 SUBQUERY#2.b1,SUBQUERY#2.b2 1 100.00
|
5 SUBQUERY t3 ALL NULL NULL NULL NULL 4 100.00 Using where
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where; Using join buffer
|
|
||||||
5 SUBQUERY t3 ALL NULL NULL NULL NULL 4 100.00
|
|
||||||
5 SUBQUERY SUBQUERY#6 eq_ref distinct_key distinct_key 18 test.t3.c1,test.t3.c2 1 100.00
|
|
||||||
6 SUBQUERY t2i index it2i2 it2i3 18 NULL 5 100.00 Using where; Using index
|
6 SUBQUERY t2i index it2i2 it2i3 18 NULL 5 100.00 Using where; Using index
|
||||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where
|
2 SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where
|
||||||
4 SUBQUERY t3 ALL NULL NULL NULL NULL 4 100.00 Using where
|
4 SUBQUERY t3 ALL NULL NULL NULL NULL 4 100.00 Using where
|
||||||
3 SUBQUERY t3 ALL NULL NULL NULL NULL 4 100.00 Using where
|
3 SUBQUERY t3 ALL NULL NULL NULL NULL 4 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from <materialize> (select `test`.`t3`.`c1` AS `c1`,`test`.`t3`.`c2` AS `c2` from <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b2` > '0')) join `test`.`t3` where ((`SUBQUERY#6`.`b2` = `test`.`t3`.`c2`) and (`SUBQUERY#6`.`b1` = `test`.`t3`.`c1`))) join <materialize> (select `test`.`t2`.`b1` AS `b1`,`test`.`t2`.`b2` AS `b2` from `test`.`t2` where (<in_optimizer>(`test`.`t2`.`b2`,`test`.`t2`.`b2` in ( <materialize> (select `test`.`t3`.`c2` AS `c2` from `test`.`t3` where (`test`.`t3`.`c2` like '%02') ), <primary_index_lookup>(`test`.`t2`.`b2` in <temporary table> on distinct_key where ((`test`.`t2`.`b2` = `SUBQUERY#3`.`c2`))))) or <in_optimizer>(`test`.`t2`.`b2`,`test`.`t2`.`b2` in ( <materialize> (select `test`.`t3`.`c2` AS `c2` from `test`.`t3` where (`test`.`t3`.`c2` like '%03') ), <primary_index_lookup>(`test`.`t2`.`b2` in <temporary table> on distinct_key where ((`test`.`t2`.`b2` = `SUBQUERY#4`.`c2`))))))) join `test`.`t1` where ((`SUBQUERY#5`.`c2` = `SUBQUERY#2`.`b2`) and (`test`.`t1`.`a2` = `SUBQUERY#2`.`b2`) and (`SUBQUERY#5`.`c1` = `SUBQUERY#2`.`b1`) and (`test`.`t1`.`a1` = `SUBQUERY#2`.`b1`))
|
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where (<in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (select `test`.`t2`.`b1` AS `b1`,`test`.`t2`.`b2` AS `b2` from `test`.`t2` where (<in_optimizer>(`test`.`t2`.`b2`,`test`.`t2`.`b2` in ( <materialize> (select `test`.`t3`.`c2` AS `c2` from `test`.`t3` where (`test`.`t3`.`c2` like '%02') ), <primary_index_lookup>(`test`.`t2`.`b2` in <temporary table> on distinct_key where ((`test`.`t2`.`b2` = `SUBQUERY#3`.`c2`))))) or <in_optimizer>(`test`.`t2`.`b2`,`test`.`t2`.`b2` in ( <materialize> (select `test`.`t3`.`c2` AS `c2` from `test`.`t3` where (`test`.`t3`.`c2` like '%03') ), <primary_index_lookup>(`test`.`t2`.`b2` in <temporary table> on distinct_key where ((`test`.`t2`.`b2` = `SUBQUERY#4`.`c2`)))))) ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where ((`test`.`t1`.`a1` = `SUBQUERY#2`.`b1`) and (`test`.`t1`.`a2` = `SUBQUERY#2`.`b2`))))) and <in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (select `test`.`t3`.`c1` AS `c1`,`test`.`t3`.`c2` AS `c2` from `test`.`t3` where <in_optimizer>((`test`.`t3`.`c1`,`test`.`t3`.`c2`),(`test`.`t3`.`c1`,`test`.`t3`.`c2`) in ( <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b2` > '0') ), <primary_index_lookup>(`test`.`t3`.`c1` in <temporary table> on distinct_key where ((`test`.`t3`.`c1` = `SUBQUERY#6`.`b1`) and (`test`.`t3`.`c2` = `SUBQUERY#6`.`b2`))))) ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where ((`test`.`t1`.`a1` = `SUBQUERY#5`.`c1`) and (`test`.`t1`.`a2` = `SUBQUERY#5`.`c2`))))))
|
||||||
select * from t1
|
select * from t1
|
||||||
where (a1, a2) in (select b1, b2 from t2
|
where (a1, a2) in (select b1, b2 from t2
|
||||||
where b2 in (select c2 from t3 where c2 LIKE '%02') or
|
where b2 in (select c2 from t3 where c2 LIKE '%02') or
|
||||||
@@ -359,16 +337,14 @@ b2 in (select c2 from t3 t3b where c2 LIKE '%03')) and
|
|||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#5 eq_ref distinct_key distinct_key 18 test.t1.a1,test.t1.a2 1 100.00
|
5 SUBQUERY t3c ALL NULL NULL NULL NULL 4 100.00 Using where
|
||||||
5 SUBQUERY t3c ALL NULL NULL NULL NULL 4 100.00
|
|
||||||
5 SUBQUERY SUBQUERY#6 eq_ref distinct_key distinct_key 18 test.t3c.c1,test.t3c.c2 1 100.00
|
|
||||||
6 SUBQUERY t2i index it2i2 it2i3 18 NULL 5 100.00 Using where; Using index
|
6 SUBQUERY t2i index it2i2 it2i3 18 NULL 5 100.00 Using where; Using index
|
||||||
2 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where
|
2 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where
|
||||||
4 SUBQUERY t3b ALL NULL NULL NULL NULL 4 100.00 Using where
|
4 SUBQUERY t3b ALL NULL NULL NULL NULL 4 100.00 Using where
|
||||||
3 DEPENDENT SUBQUERY t3a ALL NULL NULL NULL NULL 4 100.00 Using where
|
3 DEPENDENT SUBQUERY t3a ALL NULL NULL NULL NULL 4 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1276 Field or reference 'test.t1.a1' of SELECT #3 was resolved in SELECT #1
|
Note 1276 Field or reference 'test.t1.a1' of SELECT #3 was resolved in SELECT #1
|
||||||
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from <materialize> (select `test`.`t3c`.`c1` AS `c1`,`test`.`t3c`.`c2` AS `c2` from <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b2` > '0')) join `test`.`t3` `t3c` where ((`SUBQUERY#6`.`b2` = `test`.`t3c`.`c2`) and (`SUBQUERY#6`.`b1` = `test`.`t3c`.`c1`))) join `test`.`t1` where ((`SUBQUERY#5`.`c2` = `test`.`t1`.`a2`) and (`SUBQUERY#5`.`c1` = `test`.`t1`.`a1`) and <in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),<exists>(select `test`.`t2`.`b1` AS `b1`,`test`.`t2`.`b2` AS `b2` from `test`.`t2` where ((<in_optimizer>(`test`.`t2`.`b2`,<exists>(select 1 AS `Not_used` from `test`.`t3` `t3a` where ((`test`.`t3a`.`c1` = `test`.`t1`.`a1`) and (<cache>(`test`.`t2`.`b2`) = `test`.`t3a`.`c2`)))) or <in_optimizer>(`test`.`t2`.`b2`,`test`.`t2`.`b2` in ( <materialize> (select `test`.`t3b`.`c2` AS `c2` from `test`.`t3` `t3b` where (`test`.`t3b`.`c2` like '%03') ), <primary_index_lookup>(`test`.`t2`.`b2` in <temporary table> on distinct_key where ((`test`.`t2`.`b2` = `SUBQUERY#4`.`c2`)))))) and (<cache>(`test`.`t1`.`a1`) = `test`.`t2`.`b1`) and (<cache>(`test`.`t1`.`a2`) = `test`.`t2`.`b2`)))))
|
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where (<in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),<exists>(select `test`.`t2`.`b1` AS `b1`,`test`.`t2`.`b2` AS `b2` from `test`.`t2` where ((<in_optimizer>(`test`.`t2`.`b2`,<exists>(select 1 AS `Not_used` from `test`.`t3` `t3a` where ((`test`.`t3a`.`c1` = `test`.`t1`.`a1`) and (<cache>(`test`.`t2`.`b2`) = `test`.`t3a`.`c2`)))) or <in_optimizer>(`test`.`t2`.`b2`,`test`.`t2`.`b2` in ( <materialize> (select `test`.`t3b`.`c2` AS `c2` from `test`.`t3` `t3b` where (`test`.`t3b`.`c2` like '%03') ), <primary_index_lookup>(`test`.`t2`.`b2` in <temporary table> on distinct_key where ((`test`.`t2`.`b2` = `SUBQUERY#4`.`c2`)))))) and (<cache>(`test`.`t1`.`a1`) = `test`.`t2`.`b1`) and (<cache>(`test`.`t1`.`a2`) = `test`.`t2`.`b2`)))) and <in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (select `test`.`t3c`.`c1` AS `c1`,`test`.`t3c`.`c2` AS `c2` from `test`.`t3` `t3c` where <in_optimizer>((`test`.`t3c`.`c1`,`test`.`t3c`.`c2`),(`test`.`t3c`.`c1`,`test`.`t3c`.`c2`) in ( <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b2` > '0') ), <primary_index_lookup>(`test`.`t3c`.`c1` in <temporary table> on distinct_key where ((`test`.`t3c`.`c1` = `SUBQUERY#6`.`b1`) and (`test`.`t3c`.`c2` = `SUBQUERY#6`.`b2`))))) ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where ((`test`.`t1`.`a1` = `SUBQUERY#5`.`c1`) and (`test`.`t1`.`a2` = `SUBQUERY#5`.`c2`))))))
|
||||||
select * from t1
|
select * from t1
|
||||||
where (a1, a2) in (select b1, b2 from t2
|
where (a1, a2) in (select b1, b2 from t2
|
||||||
where b2 in (select c2 from t3 t3a where c1 = a1) or
|
where b2 in (select c2 from t3 t3a where c1 = a1) or
|
||||||
@@ -392,25 +368,19 @@ where (a1, a2) in (select b1, b2 from t2i where b1 > '0') and
|
|||||||
(a1, a2) in (select c1, c2 from t3i
|
(a1, a2) in (select c1, c2 from t3i
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0')));
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0')));
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY SUBQUERY#2 ALL distinct_key # # # 5 0.00 #
|
|
||||||
1 PRIMARY SUBQUERY#5 eq_ref distinct_key # # # 1 100.00 #
|
|
||||||
1 PRIMARY t1 ALL NULL # # # 3 100.00 #
|
1 PRIMARY t1 ALL NULL # # # 3 100.00 #
|
||||||
5 SUBQUERY t3 ALL NULL # # # 4 100.00 #
|
5 SUBQUERY t3 ALL NULL # # # 4 100.00 #
|
||||||
5 SUBQUERY SUBQUERY#6 eq_ref distinct_key # # # 1 100.00 #
|
|
||||||
6 SUBQUERY t2i index it2i2 # # # 5 100.00 #
|
6 SUBQUERY t2i index it2i2 # # # 5 100.00 #
|
||||||
2 SUBQUERY t2 ALL NULL # # # 5 100.00 #
|
2 SUBQUERY t2 ALL NULL # # # 5 100.00 #
|
||||||
4 SUBQUERY t3 ALL NULL # # # 4 100.00 #
|
4 SUBQUERY t3 ALL NULL # # # 4 100.00 #
|
||||||
3 SUBQUERY t3 ALL NULL # # # 4 100.00 #
|
3 SUBQUERY t3 ALL NULL # # # 4 100.00 #
|
||||||
7 UNION SUBQUERY#8 ALL distinct_key # # # 5 0.00 #
|
7 UNION t1i index NULL # # # 3 100.00 #
|
||||||
7 UNION SUBQUERY#9 eq_ref distinct_key # # # 1 100.00 #
|
9 SUBQUERY t3i index NULL # # # 4 100.00 #
|
||||||
7 UNION t1i ref it1i1,it1i2,it1i3 # # # 1 100.00 #
|
|
||||||
9 SUBQUERY t3i index it3i1,it3i2,it3i3 # # # 4 100.00 #
|
|
||||||
9 SUBQUERY SUBQUERY#10 eq_ref distinct_key # # # 1 100.00 #
|
|
||||||
10 SUBQUERY t2i index it2i2 # # # 5 100.00 #
|
10 SUBQUERY t2i index it2i2 # # # 5 100.00 #
|
||||||
8 SUBQUERY t2i index it2i1,it2i3 # # # 5 100.00 #
|
8 SUBQUERY t2i index it2i1,it2i3 # # # 5 100.00 #
|
||||||
NULL UNION RESULT <union1,7> ALL NULL # # # NULL NULL #
|
NULL UNION RESULT <union1,7> ALL NULL # # # NULL NULL #
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 (select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from <materialize> (select `test`.`t3`.`c1` AS `c1`,`test`.`t3`.`c2` AS `c2` from <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b2` > '0')) join `test`.`t3` where ((`SUBQUERY#6`.`b2` = `test`.`t3`.`c2`) and (`SUBQUERY#6`.`b1` = `test`.`t3`.`c1`))) join <materialize> (select `test`.`t2`.`b1` AS `b1`,`test`.`t2`.`b2` AS `b2` from `test`.`t2` where (<in_optimizer>(`test`.`t2`.`b2`,`test`.`t2`.`b2` in ( <materialize> (select `test`.`t3`.`c2` AS `c2` from `test`.`t3` where (`test`.`t3`.`c2` like '%02') ), <primary_index_lookup>(`test`.`t2`.`b2` in <temporary table> on distinct_key where ((`test`.`t2`.`b2` = `SUBQUERY#3`.`c2`))))) or <in_optimizer>(`test`.`t2`.`b2`,`test`.`t2`.`b2` in ( <materialize> (select `test`.`t3`.`c2` AS `c2` from `test`.`t3` where (`test`.`t3`.`c2` like '%03') ), <primary_index_lookup>(`test`.`t2`.`b2` in <temporary table> on distinct_key where ((`test`.`t2`.`b2` = `SUBQUERY#4`.`c2`)))))) group by `test`.`t2`.`b1`,`test`.`t2`.`b2`) join `test`.`t1` where ((`SUBQUERY#5`.`c2` = `SUBQUERY#2`.`b2`) and (`test`.`t1`.`a2` = `SUBQUERY#2`.`b2`) and (`SUBQUERY#5`.`c1` = `SUBQUERY#2`.`b1`) and (`test`.`t1`.`a1` = `SUBQUERY#2`.`b1`))) union (select `test`.`t1i`.`a1` AS `a1`,`test`.`t1i`.`a2` AS `a2` from <materialize> (select `test`.`t3i`.`c1` AS `c1`,`test`.`t3i`.`c2` AS `c2` from <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b2` > '0')) join `test`.`t3i` where ((`SUBQUERY#10`.`b2` = `test`.`t3i`.`c2`) and (`SUBQUERY#10`.`b1` = `test`.`t3i`.`c1`))) join <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b1` > '0')) join `test`.`t1i` where ((`SUBQUERY#9`.`c2` = `SUBQUERY#8`.`b2`) and (`test`.`t1i`.`a2` = `SUBQUERY#8`.`b2`) and (`SUBQUERY#9`.`c1` = `SUBQUERY#8`.`b1`) and (`test`.`t1i`.`a1` = `SUBQUERY#8`.`b1`)))
|
Note 1003 (select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where (<in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (select `test`.`t2`.`b1` AS `b1`,`test`.`t2`.`b2` AS `b2` from `test`.`t2` where (<in_optimizer>(`test`.`t2`.`b2`,`test`.`t2`.`b2` in ( <materialize> (select `test`.`t3`.`c2` AS `c2` from `test`.`t3` where (`test`.`t3`.`c2` like '%02') ), <primary_index_lookup>(`test`.`t2`.`b2` in <temporary table> on distinct_key where ((`test`.`t2`.`b2` = `SUBQUERY#3`.`c2`))))) or <in_optimizer>(`test`.`t2`.`b2`,`test`.`t2`.`b2` in ( <materialize> (select `test`.`t3`.`c2` AS `c2` from `test`.`t3` where (`test`.`t3`.`c2` like '%03') ), <primary_index_lookup>(`test`.`t2`.`b2` in <temporary table> on distinct_key where ((`test`.`t2`.`b2` = `SUBQUERY#4`.`c2`)))))) group by `test`.`t2`.`b1`,`test`.`t2`.`b2` ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where ((`test`.`t1`.`a1` = `SUBQUERY#2`.`b1`) and (`test`.`t1`.`a2` = `SUBQUERY#2`.`b2`))))) and <in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (select `test`.`t3`.`c1` AS `c1`,`test`.`t3`.`c2` AS `c2` from `test`.`t3` where <in_optimizer>((`test`.`t3`.`c1`,`test`.`t3`.`c2`),(`test`.`t3`.`c1`,`test`.`t3`.`c2`) in ( <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b2` > '0') ), <primary_index_lookup>(`test`.`t3`.`c1` in <temporary table> on distinct_key where ((`test`.`t3`.`c1` = `SUBQUERY#6`.`b1`) and (`test`.`t3`.`c2` = `SUBQUERY#6`.`b2`))))) ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where ((`test`.`t1`.`a1` = `SUBQUERY#5`.`c1`) and (`test`.`t1`.`a2` = `SUBQUERY#5`.`c2`))))))) union (select `test`.`t1i`.`a1` AS `a1`,`test`.`t1i`.`a2` AS `a2` from `test`.`t1i` where (<in_optimizer>((`test`.`t1i`.`a1`,`test`.`t1i`.`a2`),(`test`.`t1i`.`a1`,`test`.`t1i`.`a2`) in ( <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b1` > '0') ), <primary_index_lookup>(`test`.`t1i`.`a1` in <temporary table> on distinct_key where ((`test`.`t1i`.`a1` = `SUBQUERY#8`.`b1`) and (`test`.`t1i`.`a2` = `SUBQUERY#8`.`b2`))))) and <in_optimizer>((`test`.`t1i`.`a1`,`test`.`t1i`.`a2`),(`test`.`t1i`.`a1`,`test`.`t1i`.`a2`) in ( <materialize> (select `test`.`t3i`.`c1` AS `c1`,`test`.`t3i`.`c2` AS `c2` from `test`.`t3i` where <in_optimizer>((`test`.`t3i`.`c1`,`test`.`t3i`.`c2`),(`test`.`t3i`.`c1`,`test`.`t3i`.`c2`) in ( <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b2` > '0') ), <primary_index_lookup>(`test`.`t3i`.`c1` in <temporary table> on distinct_key where ((`test`.`t3i`.`c1` = `SUBQUERY#10`.`b1`) and (`test`.`t3i`.`c2` = `SUBQUERY#10`.`b2`))))) ), <primary_index_lookup>(`test`.`t1i`.`a1` in <temporary table> on distinct_key where ((`test`.`t1i`.`a1` = `SUBQUERY#9`.`c1`) and (`test`.`t1i`.`a2` = `SUBQUERY#9`.`c2`)))))))
|
||||||
(select * from t1
|
(select * from t1
|
||||||
where (a1, a2) in (select b1, b2 from t2
|
where (a1, a2) in (select b1, b2 from t2
|
||||||
where b2 in (select c2 from t3 where c2 LIKE '%02') or
|
where b2 in (select c2 from t3 where c2 LIKE '%02') or
|
||||||
@@ -433,15 +403,13 @@ where (a1, a2) in (select * from t1 where a1 > '0' UNION select * from t2 where
|
|||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#4 eq_ref distinct_key distinct_key 18 test.t1.a1,test.t1.a2 1 100.00
|
4 SUBQUERY t3 ALL NULL NULL NULL NULL 4 100.00 Using where
|
||||||
4 SUBQUERY t3 ALL NULL NULL NULL NULL 4 100.00
|
|
||||||
4 SUBQUERY SUBQUERY#5 eq_ref distinct_key distinct_key 18 test.t3.c1,test.t3.c2 1 100.00
|
|
||||||
5 SUBQUERY t2i index it2i2 it2i3 18 NULL 5 100.00 Using where; Using index
|
5 SUBQUERY t2i index it2i2 it2i3 18 NULL 5 100.00 Using where; Using index
|
||||||
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
3 DEPENDENT UNION t2 ALL NULL NULL NULL NULL 5 100.00 Using where
|
3 DEPENDENT UNION t2 ALL NULL NULL NULL NULL 5 100.00 Using where
|
||||||
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL NULL
|
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL NULL
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from <materialize> (select `test`.`t3`.`c1` AS `c1`,`test`.`t3`.`c2` AS `c2` from <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b2` > '0')) join `test`.`t3` where ((`SUBQUERY#5`.`b2` = `test`.`t3`.`c2`) and (`SUBQUERY#5`.`b1` = `test`.`t3`.`c1`))) join `test`.`t1` where ((`SUBQUERY#4`.`c2` = `test`.`t1`.`a2`) and (`SUBQUERY#4`.`c1` = `test`.`t1`.`a1`) and <in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),<exists>(select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where ((`test`.`t1`.`a1` > '0') and (<cache>(`test`.`t1`.`a1`) = `test`.`t1`.`a1`) and (<cache>(`test`.`t1`.`a2`) = `test`.`t1`.`a2`)) union select `test`.`t2`.`b1` AS `b1`,`test`.`t2`.`b2` AS `b2` from `test`.`t2` where ((`test`.`t2`.`b1` < '9') and (<cache>(`test`.`t1`.`a1`) = `test`.`t2`.`b1`) and (<cache>(`test`.`t1`.`a2`) = `test`.`t2`.`b2`)))))
|
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where (<in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),<exists>(select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where ((`test`.`t1`.`a1` > '0') and (<cache>(`test`.`t1`.`a1`) = `test`.`t1`.`a1`) and (<cache>(`test`.`t1`.`a2`) = `test`.`t1`.`a2`)) union select `test`.`t2`.`b1` AS `b1`,`test`.`t2`.`b2` AS `b2` from `test`.`t2` where ((`test`.`t2`.`b1` < '9') and (<cache>(`test`.`t1`.`a1`) = `test`.`t2`.`b1`) and (<cache>(`test`.`t1`.`a2`) = `test`.`t2`.`b2`)))) and <in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),(`test`.`t1`.`a1`,`test`.`t1`.`a2`) in ( <materialize> (select `test`.`t3`.`c1` AS `c1`,`test`.`t3`.`c2` AS `c2` from `test`.`t3` where <in_optimizer>((`test`.`t3`.`c1`,`test`.`t3`.`c2`),(`test`.`t3`.`c1`,`test`.`t3`.`c2`) in ( <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b2` > '0') ), <primary_index_lookup>(`test`.`t3`.`c1` in <temporary table> on distinct_key where ((`test`.`t3`.`c1` = `SUBQUERY#5`.`b1`) and (`test`.`t3`.`c2` = `SUBQUERY#5`.`b2`))))) ), <primary_index_lookup>(`test`.`t1`.`a1` in <temporary table> on distinct_key where ((`test`.`t1`.`a1` = `SUBQUERY#4`.`c1`) and (`test`.`t1`.`a2` = `SUBQUERY#4`.`c2`))))))
|
||||||
select * from t1
|
select * from t1
|
||||||
where (a1, a2) in (select * from t1 where a1 > '0' UNION select * from t2 where b1 < '9') and
|
where (a1, a2) in (select * from t1 where a1 > '0' UNION select * from t2 where b1 < '9') and
|
||||||
(a1, a2) in (select c1, c2 from t3
|
(a1, a2) in (select c1, c2 from t3
|
||||||
@@ -457,16 +425,14 @@ where (c1, c2) in (select b1, b2 from t2i where b2 > '0')) and
|
|||||||
a1 = c1;
|
a1 = c1;
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#4 ALL distinct_key NULL NULL NULL 4 75.00 Using where; Using join buffer
|
|
||||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 4 100.00 Using where; Using join buffer
|
1 PRIMARY t3 ALL NULL NULL NULL NULL 4 100.00 Using where; Using join buffer
|
||||||
4 SUBQUERY t3 ALL NULL NULL NULL NULL 4 100.00
|
4 SUBQUERY t3 ALL NULL NULL NULL NULL 4 100.00 Using where
|
||||||
4 SUBQUERY SUBQUERY#5 eq_ref distinct_key distinct_key 18 test.t3.c1,test.t3.c2 1 100.00
|
|
||||||
5 SUBQUERY t2i index it2i2 it2i3 18 NULL 5 100.00 Using where; Using index
|
5 SUBQUERY t2i index it2i2 it2i3 18 NULL 5 100.00 Using where; Using index
|
||||||
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
3 DEPENDENT UNION t2 ALL NULL NULL NULL NULL 5 100.00 Using where
|
3 DEPENDENT UNION t2 ALL NULL NULL NULL NULL 5 100.00 Using where
|
||||||
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL NULL
|
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL NULL
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2`,`test`.`t3`.`c1` AS `c1`,`test`.`t3`.`c2` AS `c2` from <materialize> (select `test`.`t3`.`c1` AS `c1`,`test`.`t3`.`c2` AS `c2` from <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b2` > '0')) join `test`.`t3` where ((`SUBQUERY#5`.`b2` = `test`.`t3`.`c2`) and (`SUBQUERY#5`.`b1` = `test`.`t3`.`c1`))) join `test`.`t1` join `test`.`t3` where ((`test`.`t3`.`c2` = `SUBQUERY#4`.`c2`) and (`SUBQUERY#4`.`c1` = `test`.`t1`.`a1`) and (`test`.`t3`.`c1` = `test`.`t1`.`a1`) and <in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),<exists>(select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where ((`test`.`t1`.`a1` > '0') and (<cache>(`test`.`t1`.`a1`) = `test`.`t1`.`a1`) and (<cache>(`test`.`t1`.`a2`) = `test`.`t1`.`a2`)) union select `test`.`t2`.`b1` AS `b1`,`test`.`t2`.`b2` AS `b2` from `test`.`t2` where ((`test`.`t2`.`b1` < '9') and (<cache>(`test`.`t1`.`a1`) = `test`.`t2`.`b1`) and (<cache>(`test`.`t1`.`a2`) = `test`.`t2`.`b2`)))))
|
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2`,`test`.`t3`.`c1` AS `c1`,`test`.`t3`.`c2` AS `c2` from `test`.`t1` join `test`.`t3` where ((`test`.`t3`.`c1` = `test`.`t1`.`a1`) and <in_optimizer>((`test`.`t1`.`a1`,`test`.`t1`.`a2`),<exists>(select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where ((`test`.`t1`.`a1` > '0') and (<cache>(`test`.`t1`.`a1`) = `test`.`t1`.`a1`) and (<cache>(`test`.`t1`.`a2`) = `test`.`t1`.`a2`)) union select `test`.`t2`.`b1` AS `b1`,`test`.`t2`.`b2` AS `b2` from `test`.`t2` where ((`test`.`t2`.`b1` < '9') and (<cache>(`test`.`t1`.`a1`) = `test`.`t2`.`b1`) and (<cache>(`test`.`t1`.`a2`) = `test`.`t2`.`b2`)))) and <in_optimizer>((`test`.`t3`.`c1`,`test`.`t3`.`c2`),(`test`.`t3`.`c1`,`test`.`t3`.`c2`) in ( <materialize> (select `test`.`t3`.`c1` AS `c1`,`test`.`t3`.`c2` AS `c2` from `test`.`t3` where <in_optimizer>((`test`.`t3`.`c1`,`test`.`t3`.`c2`),(`test`.`t3`.`c1`,`test`.`t3`.`c2`) in ( <materialize> (select `test`.`t2i`.`b1` AS `b1`,`test`.`t2i`.`b2` AS `b2` from `test`.`t2i` where (`test`.`t2i`.`b2` > '0') ), <primary_index_lookup>(`test`.`t3`.`c1` in <temporary table> on distinct_key where ((`test`.`t3`.`c1` = `SUBQUERY#5`.`b1`) and (`test`.`t3`.`c2` = `SUBQUERY#5`.`b2`))))) ), <primary_index_lookup>(`test`.`t3`.`c1` in <temporary table> on distinct_key where ((`test`.`t3`.`c1` = `SUBQUERY#4`.`c1`) and (`test`.`t3`.`c2` = `SUBQUERY#4`.`c2`))))))
|
||||||
select * from t1, t3
|
select * from t1, t3
|
||||||
where (a1, a2) in (select * from t1 where a1 > '0' UNION select * from t2 where b1 < '9') and
|
where (a1, a2) in (select * from t1 where a1 > '0' UNION select * from t2 where b1 < '9') and
|
||||||
(c1, c2) in (select c1, c2 from t3
|
(c1, c2) in (select c1, c2 from t3
|
||||||
@@ -585,7 +551,6 @@ a1 a2
|
|||||||
Test that BLOBs are not materialized (except when arguments of some functions).
|
Test that BLOBs are not materialized (except when arguments of some functions).
|
||||||
*/
|
*/
|
||||||
# force materialization to be always considered
|
# force materialization to be always considered
|
||||||
set @@optimizer_switch='semijoin=off';
|
|
||||||
set @prefix_len = 6;
|
set @prefix_len = 6;
|
||||||
set @blob_len = 16;
|
set @blob_len = 16;
|
||||||
set @suffix_len = @blob_len - @prefix_len;
|
set @suffix_len = @blob_len - @prefix_len;
|
||||||
@@ -644,11 +609,10 @@ explain extended select left(a1,7), left(a2,7)
|
|||||||
from t1_16
|
from t1_16
|
||||||
where a1 in (select substring(b1,1,16) from t2_16 where b1 > '0');
|
where a1 in (select substring(b1,1,16) from t2_16 where b1 > '0');
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1_16 ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1_16 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 20 test.t1_16.a1 1 100.00 Using where
|
|
||||||
2 SUBQUERY t2_16 ALL NULL NULL NULL NULL 3 100.00 Using where
|
2 SUBQUERY t2_16 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select left(`test`.`t1_16`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_16`.`a2`,7) AS `left(a2,7)` from <materialize> (select substr(`test`.`t2_16`.`b1`,1,16) AS `substring(b1,1,16)` from `test`.`t2_16` where (`test`.`t2_16`.`b1` > '0')) join `test`.`t1_16` where (`test`.`t1_16`.`a1` = `SUBQUERY#2`.`substring(b1,1,16)`)
|
Note 1003 select left(`test`.`t1_16`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_16`.`a2`,7) AS `left(a2,7)` from `test`.`t1_16` where <in_optimizer>(`test`.`t1_16`.`a1`,`test`.`t1_16`.`a1` in ( <materialize> (select substr(`test`.`t2_16`.`b1`,1,16) AS `substring(b1,1,16)` from `test`.`t2_16` where (`test`.`t2_16`.`b1` > '0') ), <primary_index_lookup>(`test`.`t1_16`.`a1` in <temporary table> on distinct_key where ((`test`.`t1_16`.`a1` = `SUBQUERY#2`.`substring(b1,1,16)`)))))
|
||||||
select left(a1,7), left(a2,7)
|
select left(a1,7), left(a2,7)
|
||||||
from t1_16
|
from t1_16
|
||||||
where a1 in (select substring(b1,1,16) from t2_16 where b1 > '0');
|
where a1 in (select substring(b1,1,16) from t2_16 where b1 > '0');
|
||||||
@@ -674,11 +638,10 @@ explain extended select left(a1,7), left(a2,7)
|
|||||||
from t1_16
|
from t1_16
|
||||||
where a1 in (select group_concat(b1) from t2_16 group by b2);
|
where a1 in (select group_concat(b1) from t2_16 group by b2);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1_16 ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1_16 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 261 test.t1_16.a1 1 100.00 Using where
|
|
||||||
2 SUBQUERY t2_16 ALL NULL NULL NULL NULL 3 100.00 Using filesort
|
2 SUBQUERY t2_16 ALL NULL NULL NULL NULL 3 100.00 Using filesort
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select left(`test`.`t1_16`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_16`.`a2`,7) AS `left(a2,7)` from <materialize> (select group_concat(`test`.`t2_16`.`b1` separator ',') AS `group_concat(b1)` from `test`.`t2_16` group by `test`.`t2_16`.`b2`) join `test`.`t1_16` where (`test`.`t1_16`.`a1` = `SUBQUERY#2`.`group_concat(b1)`)
|
Note 1003 select left(`test`.`t1_16`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_16`.`a2`,7) AS `left(a2,7)` from `test`.`t1_16` where <in_optimizer>(`test`.`t1_16`.`a1`,`test`.`t1_16`.`a1` in ( <materialize> (select group_concat(`test`.`t2_16`.`b1` separator ',') AS `group_concat(b1)` from `test`.`t2_16` group by `test`.`t2_16`.`b2` ), <primary_index_lookup>(`test`.`t1_16`.`a1` in <temporary table> on distinct_key where ((`test`.`t1_16`.`a1` = `SUBQUERY#2`.`group_concat(b1)`)))))
|
||||||
select left(a1,7), left(a2,7)
|
select left(a1,7), left(a2,7)
|
||||||
from t1_16
|
from t1_16
|
||||||
where a1 in (select group_concat(b1) from t2_16 group by b2);
|
where a1 in (select group_concat(b1) from t2_16 group by b2);
|
||||||
@@ -698,10 +661,9 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
2 DEPENDENT SUBQUERY t1_16 ALL NULL NULL NULL NULL 3 100.00 Using where
|
2 DEPENDENT SUBQUERY t1_16 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
3 DEPENDENT SUBQUERY t2_16 ALL NULL NULL NULL NULL 3 100.00 Using where
|
3 DEPENDENT SUBQUERY t2_16 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
3 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where; Using join buffer
|
3 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 5 100.00 Using where; Using join buffer
|
||||||
3 DEPENDENT SUBQUERY SUBQUERY#4 eq_ref distinct_key distinct_key 9 test.t2.b1 1 100.00 Using where
|
|
||||||
4 SUBQUERY t3 ALL NULL NULL NULL NULL 4 100.00 Using where
|
4 SUBQUERY t3 ALL NULL NULL NULL NULL 4 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where <in_optimizer>(concat(`test`.`t1`.`a1`,'x'),<exists>(select 1 AS `Not_used` from `test`.`t1_16` where (<in_optimizer>((`test`.`t1_16`.`a1`,`test`.`t1_16`.`a2`),<exists>(select `test`.`t2_16`.`b1` AS `b1`,`test`.`t2_16`.`b2` AS `b2` from <materialize> (select `test`.`t3`.`c1` AS `c1` from `test`.`t3` where (`test`.`t3`.`c2` > '0')) join `test`.`t2_16` join `test`.`t2` where ((`SUBQUERY#4`.`c1` = `test`.`t2`.`b1`) and (`test`.`t2`.`b2` = substr(`test`.`t2_16`.`b2`,1,6)) and (<cache>(`test`.`t1_16`.`a1`) = `test`.`t2_16`.`b1`) and (<cache>(`test`.`t1_16`.`a2`) = `test`.`t2_16`.`b2`)))) and (<cache>(concat(`test`.`t1`.`a1`,'x')) = left(`test`.`t1_16`.`a1`,8)))))
|
Note 1003 select `test`.`t1`.`a1` AS `a1`,`test`.`t1`.`a2` AS `a2` from `test`.`t1` where <in_optimizer>(concat(`test`.`t1`.`a1`,'x'),<exists>(select 1 AS `Not_used` from `test`.`t1_16` where (<in_optimizer>((`test`.`t1_16`.`a1`,`test`.`t1_16`.`a2`),<exists>(select `test`.`t2_16`.`b1` AS `b1`,`test`.`t2_16`.`b2` AS `b2` from `test`.`t2_16` join `test`.`t2` where ((`test`.`t2`.`b2` = substr(`test`.`t2_16`.`b2`,1,6)) and <in_optimizer>(`test`.`t2`.`b1`,`test`.`t2`.`b1` in ( <materialize> (select `test`.`t3`.`c1` AS `c1` from `test`.`t3` where (`test`.`t3`.`c2` > '0') ), <primary_index_lookup>(`test`.`t2`.`b1` in <temporary table> on distinct_key where ((`test`.`t2`.`b1` = `SUBQUERY#4`.`c1`))))) and (<cache>(`test`.`t1_16`.`a1`) = `test`.`t2_16`.`b1`) and (<cache>(`test`.`t1_16`.`a2`) = `test`.`t2_16`.`b2`)))) and (<cache>(concat(`test`.`t1`.`a1`,'x')) = left(`test`.`t1_16`.`a1`,8)))))
|
||||||
drop table t1_16, t2_16, t3_16;
|
drop table t1_16, t2_16, t3_16;
|
||||||
set @blob_len = 512;
|
set @blob_len = 512;
|
||||||
set @suffix_len = @blob_len - @prefix_len;
|
set @suffix_len = @blob_len - @prefix_len;
|
||||||
@@ -760,11 +722,10 @@ explain extended select left(a1,7), left(a2,7)
|
|||||||
from t1_512
|
from t1_512
|
||||||
where a1 in (select substring(b1,1,512) from t2_512 where b1 > '0');
|
where a1 in (select substring(b1,1,512) from t2_512 where b1 > '0');
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1_512 ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1_512 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 517 test.t1_512.a1 1 100.00 Using where
|
|
||||||
2 SUBQUERY t2_512 ALL NULL NULL NULL NULL 3 100.00 Using where
|
2 SUBQUERY t2_512 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select left(`test`.`t1_512`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_512`.`a2`,7) AS `left(a2,7)` from <materialize> (select substr(`test`.`t2_512`.`b1`,1,512) AS `substring(b1,1,512)` from `test`.`t2_512` where (`test`.`t2_512`.`b1` > '0')) join `test`.`t1_512` where (`test`.`t1_512`.`a1` = `SUBQUERY#2`.`substring(b1,1,512)`)
|
Note 1003 select left(`test`.`t1_512`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_512`.`a2`,7) AS `left(a2,7)` from `test`.`t1_512` where <in_optimizer>(`test`.`t1_512`.`a1`,`test`.`t1_512`.`a1` in ( <materialize> (select substr(`test`.`t2_512`.`b1`,1,512) AS `substring(b1,1,512)` from `test`.`t2_512` where (`test`.`t2_512`.`b1` > '0') ), <primary_index_lookup>(`test`.`t1_512`.`a1` in <temporary table> on distinct_key where ((`test`.`t1_512`.`a1` = `SUBQUERY#2`.`substring(b1,1,512)`)))))
|
||||||
select left(a1,7), left(a2,7)
|
select left(a1,7), left(a2,7)
|
||||||
from t1_512
|
from t1_512
|
||||||
where a1 in (select substring(b1,1,512) from t2_512 where b1 > '0');
|
where a1 in (select substring(b1,1,512) from t2_512 where b1 > '0');
|
||||||
@@ -775,11 +736,10 @@ explain extended select left(a1,7), left(a2,7)
|
|||||||
from t1_512
|
from t1_512
|
||||||
where a1 in (select group_concat(b1) from t2_512 group by b2);
|
where a1 in (select group_concat(b1) from t2_512 group by b2);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1_512 ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1_512 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 261 test.t1_512.a1 1 100.00 Using where
|
|
||||||
2 SUBQUERY t2_512 ALL NULL NULL NULL NULL 3 100.00 Using filesort
|
2 SUBQUERY t2_512 ALL NULL NULL NULL NULL 3 100.00 Using filesort
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select left(`test`.`t1_512`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_512`.`a2`,7) AS `left(a2,7)` from <materialize> (select group_concat(`test`.`t2_512`.`b1` separator ',') AS `group_concat(b1)` from `test`.`t2_512` group by `test`.`t2_512`.`b2`) join `test`.`t1_512` where (`test`.`t1_512`.`a1` = `SUBQUERY#2`.`group_concat(b1)`)
|
Note 1003 select left(`test`.`t1_512`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_512`.`a2`,7) AS `left(a2,7)` from `test`.`t1_512` where <in_optimizer>(`test`.`t1_512`.`a1`,`test`.`t1_512`.`a1` in ( <materialize> (select group_concat(`test`.`t2_512`.`b1` separator ',') AS `group_concat(b1)` from `test`.`t2_512` group by `test`.`t2_512`.`b2` ), <primary_index_lookup>(`test`.`t1_512`.`a1` in <temporary table> on distinct_key where ((`test`.`t1_512`.`a1` = `SUBQUERY#2`.`group_concat(b1)`)))))
|
||||||
select left(a1,7), left(a2,7)
|
select left(a1,7), left(a2,7)
|
||||||
from t1_512
|
from t1_512
|
||||||
where a1 in (select group_concat(b1) from t2_512 group by b2);
|
where a1 in (select group_concat(b1) from t2_512 group by b2);
|
||||||
@@ -789,11 +749,10 @@ explain extended select left(a1,7), left(a2,7)
|
|||||||
from t1_512
|
from t1_512
|
||||||
where a1 in (select group_concat(b1) from t2_512 group by b2);
|
where a1 in (select group_concat(b1) from t2_512 group by b2);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1_512 ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1_512 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 261 test.t1_512.a1 1 100.00 Using where
|
|
||||||
2 SUBQUERY t2_512 ALL NULL NULL NULL NULL 3 100.00 Using filesort
|
2 SUBQUERY t2_512 ALL NULL NULL NULL NULL 3 100.00 Using filesort
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select left(`test`.`t1_512`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_512`.`a2`,7) AS `left(a2,7)` from <materialize> (select group_concat(`test`.`t2_512`.`b1` separator ',') AS `group_concat(b1)` from `test`.`t2_512` group by `test`.`t2_512`.`b2`) join `test`.`t1_512` where (`test`.`t1_512`.`a1` = `SUBQUERY#2`.`group_concat(b1)`)
|
Note 1003 select left(`test`.`t1_512`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_512`.`a2`,7) AS `left(a2,7)` from `test`.`t1_512` where <in_optimizer>(`test`.`t1_512`.`a1`,`test`.`t1_512`.`a1` in ( <materialize> (select group_concat(`test`.`t2_512`.`b1` separator ',') AS `group_concat(b1)` from `test`.`t2_512` group by `test`.`t2_512`.`b2` ), <primary_index_lookup>(`test`.`t1_512`.`a1` in <temporary table> on distinct_key where ((`test`.`t1_512`.`a1` = `SUBQUERY#2`.`group_concat(b1)`)))))
|
||||||
select left(a1,7), left(a2,7)
|
select left(a1,7), left(a2,7)
|
||||||
from t1_512
|
from t1_512
|
||||||
where a1 in (select group_concat(b1) from t2_512 group by b2);
|
where a1 in (select group_concat(b1) from t2_512 group by b2);
|
||||||
@@ -859,7 +818,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
1 PRIMARY t1_1024 ALL NULL NULL NULL NULL 3 100.00 Using where
|
1 PRIMARY t1_1024 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
2 DEPENDENT SUBQUERY t2_1024 ALL NULL NULL NULL NULL 3 100.00 Using where
|
2 DEPENDENT SUBQUERY t2_1024 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select left(`test`.`t1_1024`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_1024`.`a2`,7) AS `left(a2,7)` from `test`.`t1_1024` where <in_optimizer>(`test`.`t1_1024`.`a1`,<exists>(select 1 AS `Not_used` from `test`.`t2_1024` where ((`test`.`t2_1024`.`b1` > '0') and (<cache>(`test`.`t1_1024`.`a1`) = substr(`test`.`t2_1024`.`b1`,1,1024)) and (<cache>(`test`.`t1_1024`.`a1`) = 1))))
|
Note 1003 select left(`test`.`t1_1024`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_1024`.`a2`,7) AS `left(a2,7)` from `test`.`t1_1024` where <in_optimizer>(`test`.`t1_1024`.`a1`,`test`.`t1_1024`.`a1` in (select 1 AS `Not_used` from `test`.`t2_1024` where ((`test`.`t2_1024`.`b1` > '0') and (<cache>(`test`.`t1_1024`.`a1`) = substr(`test`.`t2_1024`.`b1`,1,1024)))))
|
||||||
select left(a1,7), left(a2,7)
|
select left(a1,7), left(a2,7)
|
||||||
from t1_1024
|
from t1_1024
|
||||||
where a1 in (select substring(b1,1,1024) from t2_1024 where b1 > '0');
|
where a1 in (select substring(b1,1,1024) from t2_1024 where b1 > '0');
|
||||||
@@ -870,11 +829,10 @@ explain extended select left(a1,7), left(a2,7)
|
|||||||
from t1_1024
|
from t1_1024
|
||||||
where a1 in (select group_concat(b1) from t2_1024 group by b2);
|
where a1 in (select group_concat(b1) from t2_1024 group by b2);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1_1024 ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1_1024 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 261 test.t1_1024.a1 1 100.00 Using where
|
|
||||||
2 SUBQUERY t2_1024 ALL NULL NULL NULL NULL 3 100.00 Using filesort
|
2 SUBQUERY t2_1024 ALL NULL NULL NULL NULL 3 100.00 Using filesort
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select left(`test`.`t1_1024`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_1024`.`a2`,7) AS `left(a2,7)` from <materialize> (select group_concat(`test`.`t2_1024`.`b1` separator ',') AS `group_concat(b1)` from `test`.`t2_1024` group by `test`.`t2_1024`.`b2`) join `test`.`t1_1024` where (`test`.`t1_1024`.`a1` = `SUBQUERY#2`.`group_concat(b1)`)
|
Note 1003 select left(`test`.`t1_1024`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_1024`.`a2`,7) AS `left(a2,7)` from `test`.`t1_1024` where <in_optimizer>(`test`.`t1_1024`.`a1`,`test`.`t1_1024`.`a1` in ( <materialize> (select group_concat(`test`.`t2_1024`.`b1` separator ',') AS `group_concat(b1)` from `test`.`t2_1024` group by `test`.`t2_1024`.`b2` ), <primary_index_lookup>(`test`.`t1_1024`.`a1` in <temporary table> on distinct_key where ((`test`.`t1_1024`.`a1` = `SUBQUERY#2`.`group_concat(b1)`)))))
|
||||||
select left(a1,7), left(a2,7)
|
select left(a1,7), left(a2,7)
|
||||||
from t1_1024
|
from t1_1024
|
||||||
where a1 in (select group_concat(b1) from t2_1024 group by b2);
|
where a1 in (select group_concat(b1) from t2_1024 group by b2);
|
||||||
@@ -884,11 +842,10 @@ explain extended select left(a1,7), left(a2,7)
|
|||||||
from t1_1024
|
from t1_1024
|
||||||
where a1 in (select group_concat(b1) from t2_1024 group by b2);
|
where a1 in (select group_concat(b1) from t2_1024 group by b2);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1_1024 ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1_1024 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 261 test.t1_1024.a1 1 100.00 Using where
|
|
||||||
2 SUBQUERY t2_1024 ALL NULL NULL NULL NULL 3 100.00 Using filesort
|
2 SUBQUERY t2_1024 ALL NULL NULL NULL NULL 3 100.00 Using filesort
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select left(`test`.`t1_1024`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_1024`.`a2`,7) AS `left(a2,7)` from <materialize> (select group_concat(`test`.`t2_1024`.`b1` separator ',') AS `group_concat(b1)` from `test`.`t2_1024` group by `test`.`t2_1024`.`b2`) join `test`.`t1_1024` where (`test`.`t1_1024`.`a1` = `SUBQUERY#2`.`group_concat(b1)`)
|
Note 1003 select left(`test`.`t1_1024`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_1024`.`a2`,7) AS `left(a2,7)` from `test`.`t1_1024` where <in_optimizer>(`test`.`t1_1024`.`a1`,`test`.`t1_1024`.`a1` in ( <materialize> (select group_concat(`test`.`t2_1024`.`b1` separator ',') AS `group_concat(b1)` from `test`.`t2_1024` group by `test`.`t2_1024`.`b2` ), <primary_index_lookup>(`test`.`t1_1024`.`a1` in <temporary table> on distinct_key where ((`test`.`t1_1024`.`a1` = `SUBQUERY#2`.`group_concat(b1)`)))))
|
||||||
select left(a1,7), left(a2,7)
|
select left(a1,7), left(a2,7)
|
||||||
from t1_1024
|
from t1_1024
|
||||||
where a1 in (select group_concat(b1) from t2_1024 group by b2);
|
where a1 in (select group_concat(b1) from t2_1024 group by b2);
|
||||||
@@ -954,7 +911,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
1 PRIMARY t1_1025 ALL NULL NULL NULL NULL 3 100.00 Using where
|
1 PRIMARY t1_1025 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
2 DEPENDENT SUBQUERY t2_1025 ALL NULL NULL NULL NULL 3 100.00 Using where
|
2 DEPENDENT SUBQUERY t2_1025 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select left(`test`.`t1_1025`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_1025`.`a2`,7) AS `left(a2,7)` from `test`.`t1_1025` where <in_optimizer>(`test`.`t1_1025`.`a1`,<exists>(select 1 AS `Not_used` from `test`.`t2_1025` where ((`test`.`t2_1025`.`b1` > '0') and (<cache>(`test`.`t1_1025`.`a1`) = substr(`test`.`t2_1025`.`b1`,1,1025)) and (<cache>(`test`.`t1_1025`.`a1`) = 1))))
|
Note 1003 select left(`test`.`t1_1025`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_1025`.`a2`,7) AS `left(a2,7)` from `test`.`t1_1025` where <in_optimizer>(`test`.`t1_1025`.`a1`,`test`.`t1_1025`.`a1` in (select 1 AS `Not_used` from `test`.`t2_1025` where ((`test`.`t2_1025`.`b1` > '0') and (<cache>(`test`.`t1_1025`.`a1`) = substr(`test`.`t2_1025`.`b1`,1,1025)))))
|
||||||
select left(a1,7), left(a2,7)
|
select left(a1,7), left(a2,7)
|
||||||
from t1_1025
|
from t1_1025
|
||||||
where a1 in (select substring(b1,1,1025) from t2_1025 where b1 > '0');
|
where a1 in (select substring(b1,1,1025) from t2_1025 where b1 > '0');
|
||||||
@@ -965,11 +922,10 @@ explain extended select left(a1,7), left(a2,7)
|
|||||||
from t1_1025
|
from t1_1025
|
||||||
where a1 in (select group_concat(b1) from t2_1025 group by b2);
|
where a1 in (select group_concat(b1) from t2_1025 group by b2);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1_1025 ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1_1025 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 261 test.t1_1025.a1 1 100.00 Using where
|
|
||||||
2 SUBQUERY t2_1025 ALL NULL NULL NULL NULL 3 100.00 Using filesort
|
2 SUBQUERY t2_1025 ALL NULL NULL NULL NULL 3 100.00 Using filesort
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select left(`test`.`t1_1025`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_1025`.`a2`,7) AS `left(a2,7)` from <materialize> (select group_concat(`test`.`t2_1025`.`b1` separator ',') AS `group_concat(b1)` from `test`.`t2_1025` group by `test`.`t2_1025`.`b2`) join `test`.`t1_1025` where (`test`.`t1_1025`.`a1` = `SUBQUERY#2`.`group_concat(b1)`)
|
Note 1003 select left(`test`.`t1_1025`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_1025`.`a2`,7) AS `left(a2,7)` from `test`.`t1_1025` where <in_optimizer>(`test`.`t1_1025`.`a1`,`test`.`t1_1025`.`a1` in ( <materialize> (select group_concat(`test`.`t2_1025`.`b1` separator ',') AS `group_concat(b1)` from `test`.`t2_1025` group by `test`.`t2_1025`.`b2` ), <primary_index_lookup>(`test`.`t1_1025`.`a1` in <temporary table> on distinct_key where ((`test`.`t1_1025`.`a1` = `SUBQUERY#2`.`group_concat(b1)`)))))
|
||||||
select left(a1,7), left(a2,7)
|
select left(a1,7), left(a2,7)
|
||||||
from t1_1025
|
from t1_1025
|
||||||
where a1 in (select group_concat(b1) from t2_1025 group by b2);
|
where a1 in (select group_concat(b1) from t2_1025 group by b2);
|
||||||
@@ -979,11 +935,10 @@ explain extended select left(a1,7), left(a2,7)
|
|||||||
from t1_1025
|
from t1_1025
|
||||||
where a1 in (select group_concat(b1) from t2_1025 group by b2);
|
where a1 in (select group_concat(b1) from t2_1025 group by b2);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1_1025 ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1_1025 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 261 test.t1_1025.a1 1 100.00 Using where
|
|
||||||
2 SUBQUERY t2_1025 ALL NULL NULL NULL NULL 3 100.00 Using filesort
|
2 SUBQUERY t2_1025 ALL NULL NULL NULL NULL 3 100.00 Using filesort
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select left(`test`.`t1_1025`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_1025`.`a2`,7) AS `left(a2,7)` from <materialize> (select group_concat(`test`.`t2_1025`.`b1` separator ',') AS `group_concat(b1)` from `test`.`t2_1025` group by `test`.`t2_1025`.`b2`) join `test`.`t1_1025` where (`test`.`t1_1025`.`a1` = `SUBQUERY#2`.`group_concat(b1)`)
|
Note 1003 select left(`test`.`t1_1025`.`a1`,7) AS `left(a1,7)`,left(`test`.`t1_1025`.`a2`,7) AS `left(a2,7)` from `test`.`t1_1025` where <in_optimizer>(`test`.`t1_1025`.`a1`,`test`.`t1_1025`.`a1` in ( <materialize> (select group_concat(`test`.`t2_1025`.`b1` separator ',') AS `group_concat(b1)` from `test`.`t2_1025` group by `test`.`t2_1025`.`b2` ), <primary_index_lookup>(`test`.`t1_1025`.`a1` in <temporary table> on distinct_key where ((`test`.`t1_1025`.`a1` = `SUBQUERY#2`.`group_concat(b1)`)))))
|
||||||
select left(a1,7), left(a2,7)
|
select left(a1,7), left(a2,7)
|
||||||
from t1_1025
|
from t1_1025
|
||||||
where a1 in (select group_concat(b1) from t2_1025 group by b2);
|
where a1 in (select group_concat(b1) from t2_1025 group by b2);
|
||||||
@@ -997,16 +952,14 @@ insert into t1bit values (b'010', b'110');
|
|||||||
insert into t2bit values (b'001', b'101');
|
insert into t2bit values (b'001', b'101');
|
||||||
insert into t2bit values (b'010', b'110');
|
insert into t2bit values (b'010', b'110');
|
||||||
insert into t2bit values (b'110', b'111');
|
insert into t2bit values (b'110', b'111');
|
||||||
set @@optimizer_switch='semijoin=off';
|
|
||||||
explain extended select bin(a1), bin(a2)
|
explain extended select bin(a1), bin(a2)
|
||||||
from t1bit
|
from t1bit
|
||||||
where (a1, a2) in (select b1, b2 from t2bit);
|
where (a1, a2) in (select b1, b2 from t2bit);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1bit ALL NULL NULL NULL NULL 3 100.00
|
1 PRIMARY t1bit ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 10 test.t1bit.a1,test.t1bit.a2 1 100.00 Using where
|
|
||||||
2 SUBQUERY t2bit ALL NULL NULL NULL NULL 3 100.00
|
2 SUBQUERY t2bit ALL NULL NULL NULL NULL 3 100.00
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select conv(`test`.`t1bit`.`a1`,10,2) AS `bin(a1)`,conv(`test`.`t1bit`.`a2`,10,2) AS `bin(a2)` from <materialize> (select `test`.`t2bit`.`b1` AS `b1`,`test`.`t2bit`.`b2` AS `b2` from `test`.`t2bit`) join `test`.`t1bit` where ((`test`.`t1bit`.`a1` = `SUBQUERY#2`.`b1`) and (`test`.`t1bit`.`a2` = `SUBQUERY#2`.`b2`))
|
Note 1003 select conv(`test`.`t1bit`.`a1`,10,2) AS `bin(a1)`,conv(`test`.`t1bit`.`a2`,10,2) AS `bin(a2)` from `test`.`t1bit` where <in_optimizer>((`test`.`t1bit`.`a1`,`test`.`t1bit`.`a2`),(`test`.`t1bit`.`a1`,`test`.`t1bit`.`a2`) in ( <materialize> (select `test`.`t2bit`.`b1` AS `b1`,`test`.`t2bit`.`b2` AS `b2` from `test`.`t2bit` ), <primary_index_lookup>(`test`.`t1bit`.`a1` in <temporary table> on distinct_key where ((`test`.`t1bit`.`a1` = `SUBQUERY#2`.`b1`) and (`test`.`t1bit`.`a2` = `SUBQUERY#2`.`b2`)))))
|
||||||
select bin(a1), bin(a2)
|
select bin(a1), bin(a2)
|
||||||
from t1bit
|
from t1bit
|
||||||
where (a1, a2) in (select b1, b2 from t2bit);
|
where (a1, a2) in (select b1, b2 from t2bit);
|
||||||
@@ -1041,7 +994,7 @@ drop table t1, t2, t3, t1i, t2i, t3i, columns;
|
|||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* Test the cache of the left operand of IN.
|
* Test the cache of the left operand of IN.
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
set @@optimizer_switch='semijoin=off';
|
# Test that default values of Cached_item are not used for comparison
|
||||||
create table t1 (s1 int);
|
create table t1 (s1 int);
|
||||||
create table t2 (s2 int);
|
create table t2 (s2 int);
|
||||||
insert into t1 values (5),(1),(0);
|
insert into t1 values (5),(1),(0);
|
||||||
@@ -1074,11 +1027,10 @@ insert into t3 values (30);
|
|||||||
explain extended
|
explain extended
|
||||||
select a from t1 where a in (select c from t2 where d >= 20);
|
select a from t1 where a in (select c from t2 where d >= 20);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 7 100.00
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 7 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 4 test.t1.a 1 100.00
|
|
||||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 6 100.00 Using where
|
2 SUBQUERY t2 ALL NULL NULL NULL NULL 6 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a` AS `a` from <materialize> (select `test`.`t2`.`c` AS `c` from `test`.`t2` where (`test`.`t2`.`d` >= 20)) join `test`.`t1` where (`SUBQUERY#2`.`c` = `test`.`t1`.`a`)
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where <in_optimizer>(`test`.`t1`.`a`,`test`.`t1`.`a` in ( <materialize> (select `test`.`t2`.`c` AS `c` from `test`.`t2` where (`test`.`t2`.`d` >= 20) ), <primary_index_lookup>(`test`.`t1`.`a` in <temporary table> on distinct_key where ((`test`.`t1`.`a` = `SUBQUERY#2`.`c`)))))
|
||||||
select a from t1 where a in (select c from t2 where d >= 20);
|
select a from t1 where a in (select c from t2 where d >= 20);
|
||||||
a
|
a
|
||||||
2
|
2
|
||||||
@@ -1089,11 +1041,10 @@ create index it1a on t1(a);
|
|||||||
explain extended
|
explain extended
|
||||||
select a from t1 where a in (select c from t2 where d >= 20);
|
select a from t1 where a in (select c from t2 where d >= 20);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 index it1a it1a 4 NULL 7 100.00 Using index
|
1 PRIMARY t1 index NULL it1a 4 NULL 7 100.00 Using where; Using index
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 4 test.t1.a 1 100.00
|
|
||||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 6 100.00 Using where
|
2 SUBQUERY t2 ALL NULL NULL NULL NULL 6 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a` AS `a` from <materialize> (select `test`.`t2`.`c` AS `c` from `test`.`t2` where (`test`.`t2`.`d` >= 20)) join `test`.`t1` where (`SUBQUERY#2`.`c` = `test`.`t1`.`a`)
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where <in_optimizer>(`test`.`t1`.`a`,`test`.`t1`.`a` in ( <materialize> (select `test`.`t2`.`c` AS `c` from `test`.`t2` where (`test`.`t2`.`d` >= 20) ), <primary_index_lookup>(`test`.`t1`.`a` in <temporary table> on distinct_key where ((`test`.`t1`.`a` = `SUBQUERY#2`.`c`)))))
|
||||||
select a from t1 where a in (select c from t2 where d >= 20);
|
select a from t1 where a in (select c from t2 where d >= 20);
|
||||||
a
|
a
|
||||||
2
|
2
|
||||||
@@ -1104,11 +1055,10 @@ insert into t2 values (1,10);
|
|||||||
explain extended
|
explain extended
|
||||||
select a from t1 where a in (select c from t2 where d >= 20);
|
select a from t1 where a in (select c from t2 where d >= 20);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 index it1a it1a 4 NULL 7 100.00 Using index
|
1 PRIMARY t1 index NULL it1a 4 NULL 7 100.00 Using where; Using index
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 4 test.t1.a 1 100.00
|
|
||||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 7 100.00 Using where
|
2 SUBQUERY t2 ALL NULL NULL NULL NULL 7 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a` AS `a` from <materialize> (select `test`.`t2`.`c` AS `c` from `test`.`t2` where (`test`.`t2`.`d` >= 20)) join `test`.`t1` where (`SUBQUERY#2`.`c` = `test`.`t1`.`a`)
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where <in_optimizer>(`test`.`t1`.`a`,`test`.`t1`.`a` in ( <materialize> (select `test`.`t2`.`c` AS `c` from `test`.`t2` where (`test`.`t2`.`d` >= 20) ), <primary_index_lookup>(`test`.`t1`.`a` in <temporary table> on distinct_key where ((`test`.`t1`.`a` = `SUBQUERY#2`.`c`)))))
|
||||||
select a from t1 where a in (select c from t2 where d >= 20);
|
select a from t1 where a in (select c from t2 where d >= 20);
|
||||||
a
|
a
|
||||||
2
|
2
|
||||||
@@ -1188,12 +1138,11 @@ create table t2 (b1 int);
|
|||||||
insert into t1 values (5);
|
insert into t1 values (5);
|
||||||
explain select min(a1) from t1 where 7 in (select b1 from t2 group by b1);
|
explain select min(a1) from t1 where 7 in (select b1 from t2 group by b1);
|
||||||
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
|
||||||
1 PRIMARY t1 system NULL NULL NULL NULL 1
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
1 PRIMARY SUBQUERY#2 const distinct_key distinct_key 5 const 1
|
2 SUBQUERY t2 system NULL NULL NULL NULL 0 const row not found
|
||||||
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
|
||||||
select min(a1) from t1 where 7 in (select b1 from t2 group by b1);
|
select min(a1) from t1 where 7 in (select b1 from t2 group by b1);
|
||||||
min(a1)
|
min(a1)
|
||||||
NULL
|
set @save_optimizer_switch=@@optimizer_switch;
|
||||||
set @@optimizer_switch='default,materialization=off';
|
set @@optimizer_switch='default,materialization=off';
|
||||||
explain select min(a1) from t1 where 7 in (select b1 from t2 group by b1);
|
explain select min(a1) from t1 where 7 in (select b1 from t2 group by b1);
|
||||||
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
|
||||||
@@ -1204,12 +1153,10 @@ min(a1)
|
|||||||
set @@optimizer_switch='default,semijoin=off';
|
set @@optimizer_switch='default,semijoin=off';
|
||||||
explain select min(a1) from t1 where 7 in (select b1 from t2);
|
explain select min(a1) from t1 where 7 in (select b1 from t2);
|
||||||
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
|
||||||
1 PRIMARY t1 system NULL NULL NULL NULL 1
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
1 PRIMARY SUBQUERY#2 const distinct_key distinct_key 5 const 1
|
2 SUBQUERY t2 system NULL NULL NULL NULL 0 const row not found
|
||||||
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
|
||||||
select min(a1) from t1 where 7 in (select b1 from t2);
|
select min(a1) from t1 where 7 in (select b1 from t2);
|
||||||
min(a1)
|
min(a1)
|
||||||
NULL
|
|
||||||
set @@optimizer_switch='default,materialization=off';
|
set @@optimizer_switch='default,materialization=off';
|
||||||
# with MariaDB and MWL#90, this particular case is solved:
|
# with MariaDB and MWL#90, this particular case is solved:
|
||||||
explain select min(a1) from t1 where 7 in (select b1 from t2);
|
explain select min(a1) from t1 where 7 in (select b1 from t2);
|
||||||
@@ -1225,15 +1172,14 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
select min(a1) from t1 where 7 in (select b1 from t2) or 2> 4;
|
select min(a1) from t1 where 7 in (select b1 from t2) or 2> 4;
|
||||||
min(a1)
|
min(a1)
|
||||||
|
set @@optimizer_switch= @save_optimizer_switch;
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
create table t1 (a char(2), b varchar(10));
|
create table t1 (a char(2), b varchar(10));
|
||||||
insert into t1 values ('a', 'aaa');
|
insert into t1 values ('a', 'aaa');
|
||||||
insert into t1 values ('aa', 'aaaa');
|
insert into t1 values ('aa', 'aaaa');
|
||||||
set @@optimizer_switch='default,semijoin=off';
|
|
||||||
explain select a,b from t1 where b in (select a from t1);
|
explain select a,b from t1 where b in (select a from t1);
|
||||||
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
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 2
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 3 test.t1.b 1 Using where
|
|
||||||
2 SUBQUERY t1 ALL NULL NULL NULL NULL 2
|
2 SUBQUERY t1 ALL NULL NULL NULL NULL 2
|
||||||
select a,b from t1 where b in (select a from t1);
|
select a,b from t1 where b in (select a from t1);
|
||||||
a b
|
a b
|
||||||
@@ -1250,6 +1196,7 @@ INSERT INTO t1 (f1, f2) VALUES (10, 1.668);
|
|||||||
CREATE TABLE t2 LIKE t1;
|
CREATE TABLE t2 LIKE t1;
|
||||||
INSERT INTO t2 VALUES (1, 1.789);
|
INSERT INTO t2 VALUES (1, 1.789);
|
||||||
INSERT INTO t2 VALUES (13, 1.454);
|
INSERT INTO t2 VALUES (13, 1.454);
|
||||||
|
set @save_optimizer_switch=@@optimizer_switch;
|
||||||
SET @@optimizer_switch='default,semijoin=on,materialization=on';
|
SET @@optimizer_switch='default,semijoin=on,materialization=on';
|
||||||
EXPLAIN SELECT COUNT(*) FROM t1 WHERE (f1,f2) IN (SELECT f1,f2 FROM t2);
|
EXPLAIN SELECT COUNT(*) FROM t1 WHERE (f1,f2) IN (SELECT f1,f2 FROM t2);
|
||||||
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
|
||||||
@@ -1259,6 +1206,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
SELECT COUNT(*) FROM t1 WHERE (f1,f2) IN (SELECT f1,f2 FROM t2);
|
SELECT COUNT(*) FROM t1 WHERE (f1,f2) IN (SELECT f1,f2 FROM t2);
|
||||||
COUNT(*)
|
COUNT(*)
|
||||||
2
|
2
|
||||||
|
set @@optimizer_switch= @save_optimizer_switch;
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
pk int,
|
pk int,
|
||||||
@@ -1271,6 +1219,7 @@ PRIMARY KEY (pk)
|
|||||||
INSERT INTO t1 VALUES (1,'o','ffff','ffff','ffoo'),(2,'f','ffff','ffff','ffff');
|
INSERT INTO t1 VALUES (1,'o','ffff','ffff','ffoo'),(2,'f','ffff','ffff','ffff');
|
||||||
CREATE TABLE t2 LIKE t1;
|
CREATE TABLE t2 LIKE t1;
|
||||||
INSERT INTO t2 VALUES (1,'i','iiii','iiii','iiii'),(2,'f','ffff','ffff','ffff');
|
INSERT INTO t2 VALUES (1,'i','iiii','iiii','iiii'),(2,'f','ffff','ffff','ffff');
|
||||||
|
set @save_optimizer_switch=@@optimizer_switch;
|
||||||
SET @@optimizer_switch='default,semijoin=on,materialization=on';
|
SET @@optimizer_switch='default,semijoin=on,materialization=on';
|
||||||
EXPLAIN SELECT pk FROM t1 WHERE (a) IN (SELECT a FROM t2 WHERE pk > 0);
|
EXPLAIN SELECT pk FROM t1 WHERE (a) IN (SELECT a FROM t2 WHERE pk > 0);
|
||||||
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
|
||||||
@@ -1284,6 +1233,7 @@ SELECT pk FROM t1 WHERE (b,c,d) IN (SELECT b,c,d FROM t2 WHERE pk > 0);
|
|||||||
pk
|
pk
|
||||||
2
|
2
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
set optimizer_switch=@save_optimizer_switch;
|
||||||
#
|
#
|
||||||
# BUG#50019: Wrong result for IN-subquery with materialization
|
# BUG#50019: Wrong result for IN-subquery with materialization
|
||||||
#
|
#
|
||||||
@@ -1335,3 +1285,5 @@ a a in (select a from t1)
|
|||||||
1 0
|
1 0
|
||||||
2 0
|
2 0
|
||||||
drop table t0, t1;
|
drop table t0, t1;
|
||||||
|
set optimizer_switch='firstmatch=on';
|
||||||
|
set @@optimizer_switch=default;
|
||||||
|
@@ -1299,34 +1299,31 @@ a
|
|||||||
4
|
4
|
||||||
explain extended select * from t2 where t2.a in (select a from t1);
|
explain extended select * from t2 where t2.a in (select a from t1);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY SUBQUERY#2 ALL distinct_key NULL NULL NULL 4 100.00
|
1 PRIMARY t2 index NULL PRIMARY 4 NULL 4 100.00 Using where; Using index
|
||||||
1 PRIMARY t2 index PRIMARY PRIMARY 4 NULL 4 75.00 Using where; Using index; Using join buffer
|
|
||||||
2 SUBQUERY t1 index NULL PRIMARY 4 NULL 4 100.00 Using index
|
2 SUBQUERY t1 index NULL PRIMARY 4 NULL 4 100.00 Using index
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t2`.`a` AS `a` from <materialize> (select `test`.`t1`.`a` AS `a` from `test`.`t1`) join `test`.`t2` where (`test`.`t2`.`a` = `SUBQUERY#2`.`a`)
|
Note 1003 select `test`.`t2`.`a` AS `a` from `test`.`t2` where <in_optimizer>(`test`.`t2`.`a`,`test`.`t2`.`a` in ( <materialize> (select `test`.`t1`.`a` AS `a` from `test`.`t1` ), <primary_index_lookup>(`test`.`t2`.`a` in <temporary table> on distinct_key where ((`test`.`t2`.`a` = `SUBQUERY#2`.`a`)))))
|
||||||
select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
|
select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
|
||||||
a
|
a
|
||||||
2
|
2
|
||||||
4
|
4
|
||||||
explain extended select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
|
explain extended select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY SUBQUERY#2 ALL distinct_key NULL NULL NULL 4 100.00
|
1 PRIMARY t2 index NULL PRIMARY 4 NULL 4 100.00 Using where; Using index
|
||||||
1 PRIMARY t2 index PRIMARY PRIMARY 4 NULL 4 75.00 Using where; Using index; Using join buffer
|
|
||||||
2 SUBQUERY t1 ALL NULL NULL NULL NULL 4 100.00 Using where
|
2 SUBQUERY t1 ALL NULL NULL NULL NULL 4 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t2`.`a` AS `a` from <materialize> (select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`b` <> 30)) join `test`.`t2` where (`test`.`t2`.`a` = `SUBQUERY#2`.`a`)
|
Note 1003 select `test`.`t2`.`a` AS `a` from `test`.`t2` where <in_optimizer>(`test`.`t2`.`a`,`test`.`t2`.`a` in ( <materialize> (select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`b` <> 30) ), <primary_index_lookup>(`test`.`t2`.`a` in <temporary table> on distinct_key where ((`test`.`t2`.`a` = `SUBQUERY#2`.`a`)))))
|
||||||
select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
|
select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
|
||||||
a
|
a
|
||||||
2
|
2
|
||||||
3
|
3
|
||||||
explain extended select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
|
explain extended select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t2 index PRIMARY PRIMARY 4 NULL 4 100.00 Using index
|
1 PRIMARY t2 index NULL PRIMARY 4 NULL 4 100.00 Using where; Using index
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 4 test.t2.a 1 100.00
|
|
||||||
2 SUBQUERY t3 index PRIMARY PRIMARY 4 NULL 3 100.00 Using index
|
2 SUBQUERY t3 index PRIMARY PRIMARY 4 NULL 3 100.00 Using index
|
||||||
2 SUBQUERY t1 ALL NULL NULL NULL NULL 4 100.00 Using where; Using join buffer
|
2 SUBQUERY t1 ALL NULL NULL NULL NULL 4 100.00 Using where; Using join buffer
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t2`.`a` AS `a` from <materialize> (select `test`.`t1`.`a` AS `a` from `test`.`t1` join `test`.`t3` where (`test`.`t1`.`b` = `test`.`t3`.`a`)) join `test`.`t2` where (`SUBQUERY#2`.`a` = `test`.`t2`.`a`)
|
Note 1003 select `test`.`t2`.`a` AS `a` from `test`.`t2` where <in_optimizer>(`test`.`t2`.`a`,`test`.`t2`.`a` in ( <materialize> (select `test`.`t1`.`a` AS `a` from `test`.`t1` join `test`.`t3` where (`test`.`t1`.`b` = `test`.`t3`.`a`) ), <primary_index_lookup>(`test`.`t2`.`a` in <temporary table> on distinct_key where ((`test`.`t2`.`a` = `SUBQUERY#2`.`a`)))))
|
||||||
drop table t1, t2, t3;
|
drop table t1, t2, t3;
|
||||||
create table t1 (a int, b int, index a (a,b));
|
create table t1 (a int, b int, index a (a,b));
|
||||||
create table t2 (a int, index a (a));
|
create table t2 (a int, index a (a));
|
||||||
@@ -1345,34 +1342,31 @@ a
|
|||||||
4
|
4
|
||||||
explain extended select * from t2 where t2.a in (select a from t1);
|
explain extended select * from t2 where t2.a in (select a from t1);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t2 index a a 5 NULL 4 100.00 Using index
|
1 PRIMARY t2 index NULL a 5 NULL 4 100.00 Using where; Using index
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 5 test.t2.a 1 100.00
|
|
||||||
2 SUBQUERY t1 index NULL a 10 NULL 10004 100.00 Using index
|
2 SUBQUERY t1 index NULL a 10 NULL 10004 100.00 Using index
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t2`.`a` AS `a` from <materialize> (select `test`.`t1`.`a` AS `a` from `test`.`t1`) join `test`.`t2` where (`SUBQUERY#2`.`a` = `test`.`t2`.`a`)
|
Note 1003 select `test`.`t2`.`a` AS `a` from `test`.`t2` where <in_optimizer>(`test`.`t2`.`a`,`test`.`t2`.`a` in ( <materialize> (select `test`.`t1`.`a` AS `a` from `test`.`t1` ), <primary_index_lookup>(`test`.`t2`.`a` in <temporary table> on distinct_key where ((`test`.`t2`.`a` = `SUBQUERY#2`.`a`)))))
|
||||||
select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
|
select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
|
||||||
a
|
a
|
||||||
2
|
2
|
||||||
4
|
4
|
||||||
explain extended select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
|
explain extended select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t2 index a a 5 NULL 4 100.00 Using index
|
1 PRIMARY t2 index NULL a 5 NULL 4 100.00 Using where; Using index
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 5 test.t2.a 1 100.00
|
|
||||||
2 SUBQUERY t1 index NULL a 10 NULL 10004 100.00 Using where; Using index
|
2 SUBQUERY t1 index NULL a 10 NULL 10004 100.00 Using where; Using index
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t2`.`a` AS `a` from <materialize> (select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`b` <> 30)) join `test`.`t2` where (`SUBQUERY#2`.`a` = `test`.`t2`.`a`)
|
Note 1003 select `test`.`t2`.`a` AS `a` from `test`.`t2` where <in_optimizer>(`test`.`t2`.`a`,`test`.`t2`.`a` in ( <materialize> (select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`b` <> 30) ), <primary_index_lookup>(`test`.`t2`.`a` in <temporary table> on distinct_key where ((`test`.`t2`.`a` = `SUBQUERY#2`.`a`)))))
|
||||||
select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
|
select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
|
||||||
a
|
a
|
||||||
2
|
2
|
||||||
3
|
3
|
||||||
explain extended select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
|
explain extended select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t2 index a a 5 NULL 4 100.00 Using index
|
1 PRIMARY t2 index NULL a 5 NULL 4 100.00 Using where; Using index
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 5 test.t2.a 1 100.00
|
|
||||||
2 SUBQUERY t3 index a a 5 NULL 3 100.00 Using index
|
2 SUBQUERY t3 index a a 5 NULL 3 100.00 Using index
|
||||||
2 SUBQUERY t1 index NULL a 10 NULL 10004 100.00 Using where; Using index; Using join buffer
|
2 SUBQUERY t1 index NULL a 10 NULL 10004 100.00 Using where; Using index; Using join buffer
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t2`.`a` AS `a` from <materialize> (select `test`.`t1`.`a` AS `a` from `test`.`t1` join `test`.`t3` where (`test`.`t1`.`b` = `test`.`t3`.`a`)) join `test`.`t2` where (`SUBQUERY#2`.`a` = `test`.`t2`.`a`)
|
Note 1003 select `test`.`t2`.`a` AS `a` from `test`.`t2` where <in_optimizer>(`test`.`t2`.`a`,`test`.`t2`.`a` in ( <materialize> (select `test`.`t1`.`a` AS `a` from `test`.`t1` join `test`.`t3` where (`test`.`t1`.`b` = `test`.`t3`.`a`) ), <primary_index_lookup>(`test`.`t2`.`a` in <temporary table> on distinct_key where ((`test`.`t2`.`a` = `SUBQUERY#2`.`a`)))))
|
||||||
insert into t1 values (3,31);
|
insert into t1 values (3,31);
|
||||||
select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
|
select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
|
||||||
a
|
a
|
||||||
@@ -1385,11 +1379,10 @@ a
|
|||||||
4
|
4
|
||||||
explain extended select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
|
explain extended select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t2 index a a 5 NULL 4 100.00 Using index
|
1 PRIMARY t2 index NULL a 5 NULL 4 100.00 Using where; Using index
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 5 test.t2.a 1 100.00
|
|
||||||
2 SUBQUERY t1 index NULL a 10 NULL 10005 100.00 Using where; Using index
|
2 SUBQUERY t1 index NULL a 10 NULL 10005 100.00 Using where; Using index
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t2`.`a` AS `a` from <materialize> (select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`b` <> 30)) join `test`.`t2` where (`SUBQUERY#2`.`a` = `test`.`t2`.`a`)
|
Note 1003 select `test`.`t2`.`a` AS `a` from `test`.`t2` where <in_optimizer>(`test`.`t2`.`a`,`test`.`t2`.`a` in ( <materialize> (select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`b` <> 30) ), <primary_index_lookup>(`test`.`t2`.`a` in <temporary table> on distinct_key where ((`test`.`t2`.`a` = `SUBQUERY#2`.`a`)))))
|
||||||
drop table t0, t1, t2, t3;
|
drop table t0, t1, t2, t3;
|
||||||
create table t1 (a int, b int);
|
create table t1 (a int, b int);
|
||||||
create table t2 (a int, b int);
|
create table t2 (a int, b int);
|
||||||
@@ -2840,11 +2833,10 @@ Warnings:
|
|||||||
Note 1003 select `test`.`t1`.`one` AS `one`,`test`.`t1`.`two` AS `two`,<in_optimizer>((`test`.`t1`.`one`,`test`.`t1`.`two`),<exists>(select `test`.`t2`.`one` AS `one`,`test`.`t2`.`two` AS `two` from `test`.`t2` where ((`test`.`t2`.`flag` = '0') and trigcond(((<cache>(`test`.`t1`.`one`) = `test`.`t2`.`one`) or isnull(`test`.`t2`.`one`))) and trigcond(((<cache>(`test`.`t1`.`two`) = `test`.`t2`.`two`) or isnull(`test`.`t2`.`two`)))) having (trigcond(<is_not_null_test>(`test`.`t2`.`one`)) and trigcond(<is_not_null_test>(`test`.`t2`.`two`))))) AS `test` from `test`.`t1`
|
Note 1003 select `test`.`t1`.`one` AS `one`,`test`.`t1`.`two` AS `two`,<in_optimizer>((`test`.`t1`.`one`,`test`.`t1`.`two`),<exists>(select `test`.`t2`.`one` AS `one`,`test`.`t2`.`two` AS `two` from `test`.`t2` where ((`test`.`t2`.`flag` = '0') and trigcond(((<cache>(`test`.`t1`.`one`) = `test`.`t2`.`one`) or isnull(`test`.`t2`.`one`))) and trigcond(((<cache>(`test`.`t1`.`two`) = `test`.`t2`.`two`) or isnull(`test`.`t2`.`two`)))) having (trigcond(<is_not_null_test>(`test`.`t2`.`one`)) and trigcond(<is_not_null_test>(`test`.`t2`.`two`))))) AS `test` from `test`.`t1`
|
||||||
explain extended SELECT one,two from t1 where ROW(one,two) IN (SELECT one,two FROM t2 WHERE flag = 'N');
|
explain extended SELECT one,two from t1 where ROW(one,two) IN (SELECT one,two FROM t2 WHERE flag = 'N');
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 8 100.00
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 8 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 10 test.t1.one,test.t1.two 1 100.00
|
|
||||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 9 100.00 Using where
|
2 SUBQUERY t2 ALL NULL NULL NULL NULL 9 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`one` AS `one`,`test`.`t1`.`two` AS `two` from <materialize> (select `test`.`t2`.`one` AS `one`,`test`.`t2`.`two` AS `two` from `test`.`t2` where (`test`.`t2`.`flag` = 'N')) join `test`.`t1` where ((`SUBQUERY#2`.`two` = `test`.`t1`.`two`) and (`SUBQUERY#2`.`one` = `test`.`t1`.`one`))
|
Note 1003 select `test`.`t1`.`one` AS `one`,`test`.`t1`.`two` AS `two` from `test`.`t1` where <in_optimizer>((`test`.`t1`.`one`,`test`.`t1`.`two`),(`test`.`t1`.`one`,`test`.`t1`.`two`) in ( <materialize> (select `test`.`t2`.`one` AS `one`,`test`.`t2`.`two` AS `two` from `test`.`t2` where (`test`.`t2`.`flag` = 'N') ), <primary_index_lookup>(`test`.`t1`.`one` in <temporary table> on distinct_key where ((`test`.`t1`.`one` = `SUBQUERY#2`.`one`) and (`test`.`t1`.`two` = `SUBQUERY#2`.`two`)))))
|
||||||
explain extended SELECT one,two,ROW(one,two) IN (SELECT one,two FROM t2 WHERE flag = '0' group by one,two) as 'test' from t1;
|
explain extended SELECT one,two,ROW(one,two) IN (SELECT one,two FROM t2 WHERE flag = '0' group by one,two) as 'test' from t1;
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 8 100.00
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 8 100.00
|
||||||
@@ -3429,8 +3421,7 @@ AAA 8
|
|||||||
EXPLAIN
|
EXPLAIN
|
||||||
SELECT * FROM t1 WHERE (a,b) = ANY (SELECT a, max(b) FROM t1 GROUP BY a);
|
SELECT * FROM t1 WHERE (a,b) = ANY (SELECT a, max(b) FROM t1 GROUP BY 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
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 9
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 9 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 23 test.t1.a,test.t1.b 1
|
|
||||||
2 SUBQUERY t1 ALL NULL NULL NULL NULL 9 Using temporary; Using filesort
|
2 SUBQUERY t1 ALL NULL NULL NULL NULL 9 Using temporary; Using filesort
|
||||||
ALTER TABLE t1 ADD INDEX(a);
|
ALTER TABLE t1 ADD INDEX(a);
|
||||||
SELECT * FROM t1 WHERE (a,b) = ANY (SELECT a, max(b) FROM t1 GROUP BY a);
|
SELECT * FROM t1 WHERE (a,b) = ANY (SELECT a, max(b) FROM t1 GROUP BY a);
|
||||||
@@ -3441,8 +3432,7 @@ AAA 8
|
|||||||
EXPLAIN
|
EXPLAIN
|
||||||
SELECT * FROM t1 WHERE (a,b) = ANY (SELECT a, max(b) FROM t1 GROUP BY a);
|
SELECT * FROM t1 WHERE (a,b) = ANY (SELECT a, max(b) FROM t1 GROUP BY 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
|
||||||
1 PRIMARY t1 ALL a NULL NULL NULL 9
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 9 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 23 test.t1.a,test.t1.b 1
|
|
||||||
2 SUBQUERY t1 ALL NULL NULL NULL NULL 9 Using temporary; Using filesort
|
2 SUBQUERY t1 ALL NULL NULL NULL NULL 9 Using temporary; Using filesort
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
create table t1( f1 int,f2 int);
|
create table t1( f1 int,f2 int);
|
||||||
@@ -4216,8 +4206,7 @@ CREATE INDEX I1 ON t1 (a);
|
|||||||
CREATE INDEX I2 ON t1 (b);
|
CREATE INDEX I2 ON t1 (b);
|
||||||
EXPLAIN SELECT a,b FROM t1 WHERE b IN (SELECT a FROM t1);
|
EXPLAIN SELECT a,b FROM t1 WHERE b IN (SELECT a FROM t1);
|
||||||
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
|
||||||
1 PRIMARY t1 ALL I2 NULL NULL NULL 2
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 2 test.t1.b 1 Using where
|
|
||||||
2 SUBQUERY t1 index NULL I1 2 NULL 2 Using index
|
2 SUBQUERY t1 index NULL I1 2 NULL 2 Using index
|
||||||
SELECT a,b FROM t1 WHERE b IN (SELECT a FROM t1);
|
SELECT a,b FROM t1 WHERE b IN (SELECT a FROM t1);
|
||||||
a b
|
a b
|
||||||
@@ -4227,16 +4216,14 @@ CREATE INDEX I1 ON t2 (a);
|
|||||||
CREATE INDEX I2 ON t2 (b);
|
CREATE INDEX I2 ON t2 (b);
|
||||||
EXPLAIN SELECT a,b FROM t2 WHERE b IN (SELECT a FROM t2);
|
EXPLAIN SELECT a,b FROM t2 WHERE b IN (SELECT a FROM t2);
|
||||||
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
|
||||||
1 PRIMARY t2 ALL I2 NULL NULL NULL 2
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 2 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 5 test.t2.b 1 Using where
|
|
||||||
2 SUBQUERY t2 index NULL I1 4 NULL 2 Using index
|
2 SUBQUERY t2 index NULL I1 4 NULL 2 Using index
|
||||||
SELECT a,b FROM t2 WHERE b IN (SELECT a FROM t2);
|
SELECT a,b FROM t2 WHERE b IN (SELECT a FROM t2);
|
||||||
a b
|
a b
|
||||||
EXPLAIN
|
EXPLAIN
|
||||||
SELECT a,b FROM t1 WHERE b IN (SELECT a FROM t1 WHERE LENGTH(a)<500);
|
SELECT a,b FROM t1 WHERE b IN (SELECT a FROM t1 WHERE LENGTH(a)<500);
|
||||||
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
|
||||||
1 PRIMARY t1 ALL I2 NULL NULL NULL 2
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
1 PRIMARY SUBQUERY#2 eq_ref distinct_key distinct_key 2 test.t1.b 1 Using where
|
|
||||||
2 SUBQUERY t1 index NULL I1 2 NULL 2 Using where; Using index
|
2 SUBQUERY t1 index NULL I1 2 NULL 2 Using where; Using index
|
||||||
SELECT a,b FROM t1 WHERE b IN (SELECT a FROM t1 WHERE LENGTH(a)<500);
|
SELECT a,b FROM t1 WHERE b IN (SELECT a FROM t1 WHERE LENGTH(a)<500);
|
||||||
a b
|
a b
|
||||||
@@ -4339,18 +4326,16 @@ CREATE TABLE t1 (a INT);
|
|||||||
INSERT INTO t1 VALUES (1),(2);
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
EXPLAIN EXTENDED SELECT 1 FROM t1 WHERE 1 IN (SELECT 1 FROM t1 GROUP BY a);
|
EXPLAIN EXTENDED SELECT 1 FROM t1 WHERE 1 IN (SELECT 1 FROM t1 GROUP BY a);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 2 100.00
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 const distinct_key distinct_key 4 const 1 100.00
|
|
||||||
2 SUBQUERY t1 ALL NULL NULL NULL NULL 2 100.00 Using temporary; Using filesort
|
2 SUBQUERY t1 ALL NULL NULL NULL NULL 2 100.00 Using temporary; Using filesort
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select 1 AS `1` from <materialize> (select 1 AS `1` from `test`.`t1` group by `test`.`t1`.`a`) join `test`.`t1` where (`SUBQUERY#2`.`1` = 1)
|
Note 1003 select 1 AS `1` from `test`.`t1` where <in_optimizer>(1,1 in ( <materialize> (select 1 AS `1` from `test`.`t1` group by `test`.`t1`.`a` ), <primary_index_lookup>(1 in <temporary table> on distinct_key where ((1 = `SUBQUERY#2`.`1`)))))
|
||||||
EXPLAIN EXTENDED SELECT 1 FROM t1 WHERE 1 IN (SELECT 1 FROM t1 WHERE a > 3 GROUP BY a);
|
EXPLAIN EXTENDED SELECT 1 FROM t1 WHERE 1 IN (SELECT 1 FROM t1 WHERE a > 3 GROUP BY a);
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 2 100.00
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||||
1 PRIMARY SUBQUERY#2 const distinct_key distinct_key 4 const 1 100.00
|
|
||||||
2 SUBQUERY t1 ALL NULL NULL NULL NULL 2 100.00 Using where; Using temporary; Using filesort
|
2 SUBQUERY t1 ALL NULL NULL NULL NULL 2 100.00 Using where; Using temporary; Using filesort
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select 1 AS `1` from <materialize> (select 1 AS `1` from `test`.`t1` where (`test`.`t1`.`a` > 3) group by `test`.`t1`.`a`) join `test`.`t1` where (`SUBQUERY#2`.`1` = 1)
|
Note 1003 select 1 AS `1` from `test`.`t1` where <in_optimizer>(1,1 in ( <materialize> (select 1 AS `1` from `test`.`t1` where (`test`.`t1`.`a` > 3) group by `test`.`t1`.`a` ), <primary_index_lookup>(1 in <temporary table> on distinct_key where ((1 = `SUBQUERY#2`.`1`)))))
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
#
|
#
|
||||||
# Bug#45061: Incorrectly market field caused wrong result.
|
# Bug#45061: Incorrectly market field caused wrong result.
|
||||||
|
1326
mysql-test/r/subselect_sj_mat.result
Normal file
1326
mysql-test/r/subselect_sj_mat.result
Normal file
File diff suppressed because it is too large
Load Diff
@@ -3,930 +3,10 @@
|
|||||||
# (WL#1110: Subquery optimization: materialization)
|
# (WL#1110: Subquery optimization: materialization)
|
||||||
#
|
#
|
||||||
|
|
||||||
--disable_warnings
|
|
||||||
drop table if exists t1, t2, t3, t1i, t2i, t3i;
|
|
||||||
drop view if exists v1, v2, v1m, v2m;
|
|
||||||
--enable_warnings
|
|
||||||
|
|
||||||
create table t1 (a1 char(8), a2 char(8));
|
|
||||||
create table t2 (b1 char(8), b2 char(8));
|
|
||||||
create table t3 (c1 char(8), c2 char(8));
|
|
||||||
|
|
||||||
insert into t1 values ('1 - 00', '2 - 00');
|
|
||||||
insert into t1 values ('1 - 01', '2 - 01');
|
|
||||||
insert into t1 values ('1 - 02', '2 - 02');
|
|
||||||
|
|
||||||
insert into t2 values ('1 - 01', '2 - 01');
|
|
||||||
insert into t2 values ('1 - 01', '2 - 01');
|
|
||||||
insert into t2 values ('1 - 02', '2 - 02');
|
|
||||||
insert into t2 values ('1 - 02', '2 - 02');
|
|
||||||
insert into t2 values ('1 - 03', '2 - 03');
|
|
||||||
|
|
||||||
insert into t3 values ('1 - 01', '2 - 01');
|
|
||||||
insert into t3 values ('1 - 02', '2 - 02');
|
|
||||||
insert into t3 values ('1 - 03', '2 - 03');
|
|
||||||
insert into t3 values ('1 - 04', '2 - 04');
|
|
||||||
|
|
||||||
# Indexed columns
|
|
||||||
create table t1i (a1 char(8), a2 char(8));
|
|
||||||
create table t2i (b1 char(8), b2 char(8));
|
|
||||||
create table t3i (c1 char(8), c2 char(8));
|
|
||||||
create index it1i1 on t1i (a1);
|
|
||||||
create index it1i2 on t1i (a2);
|
|
||||||
create index it1i3 on t1i (a1, a2);
|
|
||||||
|
|
||||||
create index it2i1 on t2i (b1);
|
|
||||||
create index it2i2 on t2i (b2);
|
|
||||||
create index it2i3 on t2i (b1, b2);
|
|
||||||
|
|
||||||
create index it3i1 on t3i (c1);
|
|
||||||
create index it3i2 on t3i (c2);
|
|
||||||
create index it3i3 on t3i (c1, c2);
|
|
||||||
|
|
||||||
insert into t1i select * from t1;
|
|
||||||
insert into t2i select * from t2;
|
|
||||||
insert into t3i select * from t3;
|
|
||||||
|
|
||||||
# force the use of materialization
|
# force the use of materialization
|
||||||
set @@optimizer_switch='semijoin=off';
|
set @@optimizer_switch='semijoin=off';
|
||||||
|
|
||||||
/******************************************************************************
|
--source t/subselect_sj_mat.test
|
||||||
* Simple tests.
|
|
||||||
******************************************************************************/
|
|
||||||
# non-indexed nullable fields
|
|
||||||
explain extended
|
|
||||||
select * from t1 where a1 in (select b1 from t2 where b1 > '0');
|
|
||||||
select * from t1 where a1 in (select b1 from t2 where b1 > '0');
|
|
||||||
|
|
||||||
explain extended
|
set @@optimizer_switch=default;
|
||||||
select * from t1 where a1 in (select b1 from t2 where b1 > '0' group by b1);
|
|
||||||
select * from t1 where a1 in (select b1 from t2 where b1 > '0' group by b1);
|
|
||||||
|
|
||||||
explain extended
|
|
||||||
select * from t1 where (a1, a2) in (select b1, b2 from t2 where b1 > '0' group by b1, b2);
|
|
||||||
select * from t1 where (a1, a2) in (select b1, b2 from t2 where b1 > '0' group by b1, b2);
|
|
||||||
|
|
||||||
explain extended
|
|
||||||
select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1);
|
|
||||||
select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1);
|
|
||||||
|
|
||||||
# indexed columns
|
|
||||||
explain extended
|
|
||||||
select * from t1i where a1 in (select b1 from t2i where b1 > '0');
|
|
||||||
select * from t1i where a1 in (select b1 from t2i where b1 > '0');
|
|
||||||
|
|
||||||
--replace_column 6 # 8 # 11 #
|
|
||||||
explain extended
|
|
||||||
select * from t1i where a1 in (select b1 from t2i where b1 > '0' group by b1);
|
|
||||||
select * from t1i where a1 in (select b1 from t2i where b1 > '0' group by b1);
|
|
||||||
|
|
||||||
explain extended
|
|
||||||
select * from t1i where (a1, a2) in (select b1, b2 from t2i where b1 > '0');
|
|
||||||
select * from t1i where (a1, a2) in (select b1, b2 from t2i where b1 > '0');
|
|
||||||
|
|
||||||
--replace_column 6 # 7 # 8 # 11 #
|
|
||||||
explain extended
|
|
||||||
select * from t1i where (a1, a2) in (select b1, b2 from t2i where b1 > '0' group by b1, b2);
|
|
||||||
select * from t1i where (a1, a2) in (select b1, b2 from t2i where b1 > '0' group by b1, b2);
|
|
||||||
|
|
||||||
--replace_column 6 # 7 # 8 # 11 #
|
|
||||||
explain extended
|
|
||||||
select * from t1i where (a1, a2) in (select b1, min(b2) from t2i where b1 > '0' group by b1);
|
|
||||||
select * from t1i where (a1, a2) in (select b1, min(b2) from t2i where b1 > '0' group by b1);
|
|
||||||
|
|
||||||
# BUG#31639: Wrong plan for uncorrelated subquery when loose scan is applicable.
|
|
||||||
explain extended
|
|
||||||
select * from t1 where (a1, a2) in (select b1, max(b2) from t2i group by b1);
|
|
||||||
select * from t1 where (a1, a2) in (select b1, max(b2) from t2i group by b1);
|
|
||||||
|
|
||||||
prepare st1 from "explain select * from t1 where (a1, a2) in (select b1, max(b2) from t2i group by b1)";
|
|
||||||
execute st1;
|
|
||||||
execute st1;
|
|
||||||
prepare st2 from "select * from t1 where (a1, a2) in (select b1, max(b2) from t2i group by b1)";
|
|
||||||
execute st2;
|
|
||||||
execute st2;
|
|
||||||
|
|
||||||
explain extended
|
|
||||||
select * from t1 where (a1, a2) in (select b1, min(b2) from t2i where b1 > '0' group by b1);
|
|
||||||
select * from t1 where (a1, a2) in (select b1, min(b2) from t2i where b1 > '0' group by b1);
|
|
||||||
-- error 1235
|
|
||||||
select * from t1 where (a1, a2) in (select b1, min(b2) from t2i limit 1,1);
|
|
||||||
|
|
||||||
# test re-optimization/re-execution with different execution methods
|
|
||||||
# prepare once, exec with different modes
|
|
||||||
set @@optimizer_switch='default,semijoin=off';
|
|
||||||
prepare st1 from
|
|
||||||
"select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1)";
|
|
||||||
set @@optimizer_switch='default,materialization=off';
|
|
||||||
execute st1;
|
|
||||||
set @@optimizer_switch='default,semijoin=off';
|
|
||||||
execute st1;
|
|
||||||
|
|
||||||
set @@optimizer_switch='default,materialization=off';
|
|
||||||
prepare st1 from
|
|
||||||
"select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1)";
|
|
||||||
set @@optimizer_switch='default,semijoin=off';
|
|
||||||
execute st1;
|
|
||||||
set @@optimizer_switch='default,materialization=off';
|
|
||||||
execute st1;
|
|
||||||
set @@optimizer_switch='default,semijoin=off';
|
|
||||||
|
|
||||||
# materialize the result of ORDER BY
|
|
||||||
# non-indexed fields
|
|
||||||
explain extended
|
|
||||||
select * from t1 where (a1, a2) in (select b1, b2 from t2 order by b1, b2);
|
|
||||||
select * from t1 where (a1, a2) in (select b1, b2 from t2 order by b1, b2);
|
|
||||||
# indexed fields
|
|
||||||
explain extended
|
|
||||||
select * from t1i where (a1, a2) in (select b1, b2 from t2i order by b1, b2);
|
|
||||||
select * from t1i where (a1, a2) in (select b1, b2 from t2i order by b1, b2);
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* Views, UNIONs, several levels of nesting.
|
|
||||||
******************************************************************************/
|
|
||||||
# materialize the result of subquery over temp-table view
|
|
||||||
|
|
||||||
create algorithm=merge view v1 as
|
|
||||||
select b1, c2 from t2, t3 where b2 > c2;
|
|
||||||
|
|
||||||
create algorithm=merge view v2 as
|
|
||||||
select b1, c2 from t2, t3 group by b2, c2;
|
|
||||||
|
|
||||||
create algorithm=temptable view v1m as
|
|
||||||
select b1, c2 from t2, t3 where b2 > c2;
|
|
||||||
|
|
||||||
create algorithm=temptable view v2m as
|
|
||||||
select b1, c2 from t2, t3 group by b2, c2;
|
|
||||||
|
|
||||||
select * from v1 where (c2, b1) in (select c2, b1 from v2 where b1 is not null);
|
|
||||||
select * from v1 where (c2, b1) in (select distinct c2, b1 from v2 where b1 is not null);
|
|
||||||
|
|
||||||
select * from v1m where (c2, b1) in (select c2, b1 from v2m where b1 is not null);
|
|
||||||
select * from v1m where (c2, b1) in (select distinct c2, b1 from v2m where b1 is not null);
|
|
||||||
|
|
||||||
drop view v1, v2, v1m, v2m;
|
|
||||||
|
|
||||||
# nested subqueries, views
|
|
||||||
explain extended
|
|
||||||
select * from t1
|
|
||||||
where (a1, a2) in (select b1, b2 from t2 where b1 > '0') and
|
|
||||||
(a1, a2) in (select c1, c2 from t3
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
|
||||||
select * from t1
|
|
||||||
where (a1, a2) in (select b1, b2 from t2 where b1 > '0') and
|
|
||||||
(a1, a2) in (select c1, c2 from t3
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
|
||||||
|
|
||||||
--replace_column 6 # 7 # 8 # 11 #
|
|
||||||
explain extended
|
|
||||||
select * from t1i
|
|
||||||
where (a1, a2) in (select b1, b2 from t2i where b1 > '0') and
|
|
||||||
(a1, a2) in (select c1, c2 from t3i
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
|
||||||
select * from t1i
|
|
||||||
where (a1, a2) in (select b1, b2 from t2i where b1 > '0') and
|
|
||||||
(a1, a2) in (select c1, c2 from t3i
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
|
||||||
|
|
||||||
explain extended
|
|
||||||
select * from t1
|
|
||||||
where (a1, a2) in (select b1, b2 from t2
|
|
||||||
where b2 in (select c2 from t3 where c2 LIKE '%02') or
|
|
||||||
b2 in (select c2 from t3 where c2 LIKE '%03')) and
|
|
||||||
(a1, a2) in (select c1, c2 from t3
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
|
||||||
select * from t1
|
|
||||||
where (a1, a2) in (select b1, b2 from t2
|
|
||||||
where b2 in (select c2 from t3 where c2 LIKE '%02') or
|
|
||||||
b2 in (select c2 from t3 where c2 LIKE '%03')) and
|
|
||||||
(a1, a2) in (select c1, c2 from t3
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
|
||||||
|
|
||||||
# as above with correlated innermost subquery
|
|
||||||
explain extended
|
|
||||||
select * from t1
|
|
||||||
where (a1, a2) in (select b1, b2 from t2
|
|
||||||
where b2 in (select c2 from t3 t3a where c1 = a1) or
|
|
||||||
b2 in (select c2 from t3 t3b where c2 LIKE '%03')) and
|
|
||||||
(a1, a2) in (select c1, c2 from t3 t3c
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
|
||||||
select * from t1
|
|
||||||
where (a1, a2) in (select b1, b2 from t2
|
|
||||||
where b2 in (select c2 from t3 t3a where c1 = a1) or
|
|
||||||
b2 in (select c2 from t3 t3b where c2 LIKE '%03')) and
|
|
||||||
(a1, a2) in (select c1, c2 from t3 t3c
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
|
||||||
|
|
||||||
|
|
||||||
# multiple levels of nesting subqueries, unions
|
|
||||||
--replace_column 6 # 7 # 8 # 11 #
|
|
||||||
explain extended
|
|
||||||
(select * from t1
|
|
||||||
where (a1, a2) in (select b1, b2 from t2
|
|
||||||
where b2 in (select c2 from t3 where c2 LIKE '%02') or
|
|
||||||
b2 in (select c2 from t3 where c2 LIKE '%03')
|
|
||||||
group by b1, b2) and
|
|
||||||
(a1, a2) in (select c1, c2 from t3
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0')))
|
|
||||||
UNION
|
|
||||||
(select * from t1i
|
|
||||||
where (a1, a2) in (select b1, b2 from t2i where b1 > '0') and
|
|
||||||
(a1, a2) in (select c1, c2 from t3i
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0')));
|
|
||||||
|
|
||||||
(select * from t1
|
|
||||||
where (a1, a2) in (select b1, b2 from t2
|
|
||||||
where b2 in (select c2 from t3 where c2 LIKE '%02') or
|
|
||||||
b2 in (select c2 from t3 where c2 LIKE '%03')
|
|
||||||
group by b1, b2) and
|
|
||||||
(a1, a2) in (select c1, c2 from t3
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0')))
|
|
||||||
UNION
|
|
||||||
(select * from t1i
|
|
||||||
where (a1, a2) in (select b1, b2 from t2i where b1 > '0') and
|
|
||||||
(a1, a2) in (select c1, c2 from t3i
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0')));
|
|
||||||
|
|
||||||
|
|
||||||
# UNION of subqueries as a subquery (thus it is not computed via materialization)
|
|
||||||
explain extended
|
|
||||||
select * from t1
|
|
||||||
where (a1, a2) in (select * from t1 where a1 > '0' UNION select * from t2 where b1 < '9') and
|
|
||||||
(a1, a2) in (select c1, c2 from t3
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
|
||||||
select * from t1
|
|
||||||
where (a1, a2) in (select * from t1 where a1 > '0' UNION select * from t2 where b1 < '9') and
|
|
||||||
(a1, a2) in (select c1, c2 from t3
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
|
||||||
# as above, with a join conditon between the outer references
|
|
||||||
explain extended
|
|
||||||
select * from t1, t3
|
|
||||||
where (a1, a2) in (select * from t1 where a1 > '0' UNION select * from t2 where b1 < '9') and
|
|
||||||
(c1, c2) in (select c1, c2 from t3
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0')) and
|
|
||||||
a1 = c1;
|
|
||||||
select * from t1, t3
|
|
||||||
where (a1, a2) in (select * from t1 where a1 > '0' UNION select * from t2 where b1 < '9') and
|
|
||||||
(c1, c2) in (select c1, c2 from t3
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0')) and
|
|
||||||
a1 = c1;
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* Negative tests, where materialization should not be applied.
|
|
||||||
******************************************************************************/
|
|
||||||
# UNION in a subquery
|
|
||||||
explain extended
|
|
||||||
select * from t3
|
|
||||||
where c1 in (select a1 from t1 where a1 > '0' UNION select b1 from t2 where b1 < '9');
|
|
||||||
select * from t3
|
|
||||||
where c1 in (select a1 from t1 where a1 > '0' UNION select b1 from t2 where b1 < '9');
|
|
||||||
|
|
||||||
# correlation
|
|
||||||
explain extended
|
|
||||||
select * from t1
|
|
||||||
where (a1, a2) in (select b1, b2 from t2
|
|
||||||
where b2 in (select c2 from t3 t3a where c1 = a1) or
|
|
||||||
b2 in (select c2 from t3 t3b where c2 LIKE '%03')) and
|
|
||||||
(a1, a2) in (select c1, c2 from t3 t3c
|
|
||||||
where (c1, c2) in (select b1, b2 from t2i where b2 > '0' or b2 = a2));
|
|
||||||
|
|
||||||
# subquery has no tables
|
|
||||||
explain extended
|
|
||||||
select * from t1 where (a1, a2) in (select '1 - 01', '2 - 01');
|
|
||||||
select * from t1 where (a1, a2) in (select '1 - 01', '2 - 01');
|
|
||||||
explain extended
|
|
||||||
select * from t1 where (a1, a2) in (select '1 - 01', '2 - 01' from dual);
|
|
||||||
select * from t1 where (a1, a2) in (select '1 - 01', '2 - 01' from dual);
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* Subqueries in other uncovered clauses.
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
/* SELECT clause */
|
|
||||||
select ((a1,a2) IN (select * from t2 where b2 > '0')) IS NULL from t1;
|
|
||||||
|
|
||||||
/* GROUP BY clause */
|
|
||||||
create table columns (col int key);
|
|
||||||
insert into columns values (1), (2);
|
|
||||||
|
|
||||||
explain extended
|
|
||||||
select * from t1 group by (select col from columns limit 1);
|
|
||||||
select * from t1 group by (select col from columns limit 1);
|
|
||||||
|
|
||||||
explain extended
|
|
||||||
select * from t1 group by (a1 in (select col from columns));
|
|
||||||
select * from t1 group by (a1 in (select col from columns));
|
|
||||||
|
|
||||||
/* ORDER BY clause */
|
|
||||||
explain extended
|
|
||||||
select * from t1 order by (select col from columns limit 1);
|
|
||||||
select * from t1 order by (select col from columns limit 1);
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* Column types/sizes that affect materialization.
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Test that BLOBs are not materialized (except when arguments of some functions).
|
|
||||||
*/
|
|
||||||
# force materialization to be always considered
|
|
||||||
set @@optimizer_switch='semijoin=off';
|
|
||||||
set @prefix_len = 6;
|
|
||||||
|
|
||||||
# BLOB == 16 (small blobs that could be stored in HEAP tables)
|
|
||||||
set @blob_len = 16;
|
|
||||||
set @suffix_len = @blob_len - @prefix_len;
|
|
||||||
|
|
||||||
create table t1_16 (a1 blob(16), a2 blob(16));
|
|
||||||
create table t2_16 (b1 blob(16), b2 blob(16));
|
|
||||||
create table t3_16 (c1 blob(16), c2 blob(16));
|
|
||||||
|
|
||||||
insert into t1_16 values
|
|
||||||
(concat('1 - 00', repeat('x', @suffix_len)), concat('2 - 00', repeat('x', @suffix_len)));
|
|
||||||
insert into t1_16 values
|
|
||||||
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
|
||||||
insert into t1_16 values
|
|
||||||
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
|
||||||
|
|
||||||
insert into t2_16 values
|
|
||||||
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
|
||||||
insert into t2_16 values
|
|
||||||
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
|
||||||
insert into t2_16 values
|
|
||||||
(concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
|
|
||||||
|
|
||||||
insert into t3_16 values
|
|
||||||
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
|
||||||
insert into t3_16 values
|
|
||||||
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
|
||||||
insert into t3_16 values
|
|
||||||
(concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
|
|
||||||
insert into t3_16 values
|
|
||||||
(concat('1 - 04', repeat('x', @suffix_len)), concat('2 - 04', repeat('x', @suffix_len)));
|
|
||||||
|
|
||||||
# single value transformer
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_16
|
|
||||||
where a1 in (select b1 from t2_16 where b1 > '0');
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_16
|
|
||||||
where a1 in (select b1 from t2_16 where b1 > '0');
|
|
||||||
|
|
||||||
# row value transformer
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_16
|
|
||||||
where (a1,a2) in (select b1, b2 from t2_16 where b1 > '0');
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_16
|
|
||||||
where (a1,a2) in (select b1, b2 from t2_16 where b1 > '0');
|
|
||||||
|
|
||||||
# string function with a blob argument, the return type may be != blob
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_16
|
|
||||||
where a1 in (select substring(b1,1,16) from t2_16 where b1 > '0');
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_16
|
|
||||||
where a1 in (select substring(b1,1,16) from t2_16 where b1 > '0');
|
|
||||||
|
|
||||||
# group_concat with a blob argument - depends on
|
|
||||||
# the variable group_concat_max_len, and
|
|
||||||
# convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_16
|
|
||||||
where a1 in (select group_concat(b1) from t2_16 group by b2);
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_16
|
|
||||||
where a1 in (select group_concat(b1) from t2_16 group by b2);
|
|
||||||
|
|
||||||
set @@group_concat_max_len = 256; # anything < (CONVERT_IF_BIGGER_TO_BLOB = 512)
|
|
||||||
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_16
|
|
||||||
where a1 in (select group_concat(b1) from t2_16 group by b2);
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_16
|
|
||||||
where a1 in (select group_concat(b1) from t2_16 group by b2);
|
|
||||||
|
|
||||||
# BLOB column at the second (intermediate) level of nesting
|
|
||||||
explain extended
|
|
||||||
select * from t1
|
|
||||||
where concat(a1,'x') IN
|
|
||||||
(select left(a1,8) from t1_16
|
|
||||||
where (a1, a2) IN
|
|
||||||
(select t2_16.b1, t2_16.b2 from t2_16, t2
|
|
||||||
where t2.b2 = substring(t2_16.b2,1,6) and
|
|
||||||
t2.b1 IN (select c1 from t3 where c2 > '0')));
|
|
||||||
|
|
||||||
|
|
||||||
drop table t1_16, t2_16, t3_16;
|
|
||||||
|
|
||||||
|
|
||||||
# BLOB == 512 (CONVERT_IF_BIGGER_TO_BLOB == 512)
|
|
||||||
set @blob_len = 512;
|
|
||||||
set @suffix_len = @blob_len - @prefix_len;
|
|
||||||
|
|
||||||
create table t1_512 (a1 blob(512), a2 blob(512));
|
|
||||||
create table t2_512 (b1 blob(512), b2 blob(512));
|
|
||||||
create table t3_512 (c1 blob(512), c2 blob(512));
|
|
||||||
|
|
||||||
insert into t1_512 values
|
|
||||||
(concat('1 - 00', repeat('x', @suffix_len)), concat('2 - 00', repeat('x', @suffix_len)));
|
|
||||||
insert into t1_512 values
|
|
||||||
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
|
||||||
insert into t1_512 values
|
|
||||||
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
|
||||||
|
|
||||||
insert into t2_512 values
|
|
||||||
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
|
||||||
insert into t2_512 values
|
|
||||||
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
|
||||||
insert into t2_512 values
|
|
||||||
(concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
|
|
||||||
|
|
||||||
insert into t3_512 values
|
|
||||||
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
|
||||||
insert into t3_512 values
|
|
||||||
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
|
||||||
insert into t3_512 values
|
|
||||||
(concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
|
|
||||||
insert into t3_512 values
|
|
||||||
(concat('1 - 04', repeat('x', @suffix_len)), concat('2 - 04', repeat('x', @suffix_len)));
|
|
||||||
|
|
||||||
# single value transformer
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_512
|
|
||||||
where a1 in (select b1 from t2_512 where b1 > '0');
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_512
|
|
||||||
where a1 in (select b1 from t2_512 where b1 > '0');
|
|
||||||
|
|
||||||
# row value transformer
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_512
|
|
||||||
where (a1,a2) in (select b1, b2 from t2_512 where b1 > '0');
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_512
|
|
||||||
where (a1,a2) in (select b1, b2 from t2_512 where b1 > '0');
|
|
||||||
|
|
||||||
# string function with a blob argument, the return type may be != blob
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_512
|
|
||||||
where a1 in (select substring(b1,1,512) from t2_512 where b1 > '0');
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_512
|
|
||||||
where a1 in (select substring(b1,1,512) from t2_512 where b1 > '0');
|
|
||||||
|
|
||||||
# group_concat with a blob argument - depends on
|
|
||||||
# the variable group_concat_max_len, and
|
|
||||||
# convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_512
|
|
||||||
where a1 in (select group_concat(b1) from t2_512 group by b2);
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_512
|
|
||||||
where a1 in (select group_concat(b1) from t2_512 group by b2);
|
|
||||||
|
|
||||||
set @@group_concat_max_len = 256; # anything < (CONVERT_IF_BIGGER_TO_BLOB = 512)
|
|
||||||
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_512
|
|
||||||
where a1 in (select group_concat(b1) from t2_512 group by b2);
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_512
|
|
||||||
where a1 in (select group_concat(b1) from t2_512 group by b2);
|
|
||||||
|
|
||||||
drop table t1_512, t2_512, t3_512;
|
|
||||||
|
|
||||||
|
|
||||||
# BLOB == 1024 (group_concat_max_len == 1024)
|
|
||||||
set @blob_len = 1024;
|
|
||||||
set @suffix_len = @blob_len - @prefix_len;
|
|
||||||
|
|
||||||
create table t1_1024 (a1 blob(1024), a2 blob(1024));
|
|
||||||
create table t2_1024 (b1 blob(1024), b2 blob(1024));
|
|
||||||
create table t3_1024 (c1 blob(1024), c2 blob(1024));
|
|
||||||
|
|
||||||
insert into t1_1024 values
|
|
||||||
(concat('1 - 00', repeat('x', @suffix_len)), concat('2 - 00', repeat('x', @suffix_len)));
|
|
||||||
insert into t1_1024 values
|
|
||||||
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
|
||||||
insert into t1_1024 values
|
|
||||||
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
|
||||||
|
|
||||||
insert into t2_1024 values
|
|
||||||
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
|
||||||
insert into t2_1024 values
|
|
||||||
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
|
||||||
insert into t2_1024 values
|
|
||||||
(concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
|
|
||||||
|
|
||||||
insert into t3_1024 values
|
|
||||||
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
|
||||||
insert into t3_1024 values
|
|
||||||
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
|
||||||
insert into t3_1024 values
|
|
||||||
(concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
|
|
||||||
insert into t3_1024 values
|
|
||||||
(concat('1 - 04', repeat('x', @suffix_len)), concat('2 - 04', repeat('x', @suffix_len)));
|
|
||||||
|
|
||||||
# single value transformer
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_1024
|
|
||||||
where a1 in (select b1 from t2_1024 where b1 > '0');
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_1024
|
|
||||||
where a1 in (select b1 from t2_1024 where b1 > '0');
|
|
||||||
|
|
||||||
# row value transformer
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_1024
|
|
||||||
where (a1,a2) in (select b1, b2 from t2_1024 where b1 > '0');
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_1024
|
|
||||||
where (a1,a2) in (select b1, b2 from t2_1024 where b1 > '0');
|
|
||||||
|
|
||||||
# string function with a blob argument, the return type may be != blob
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_1024
|
|
||||||
where a1 in (select substring(b1,1,1024) from t2_1024 where b1 > '0');
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_1024
|
|
||||||
where a1 in (select substring(b1,1,1024) from t2_1024 where b1 > '0');
|
|
||||||
|
|
||||||
# group_concat with a blob argument - depends on
|
|
||||||
# the variable group_concat_max_len, and
|
|
||||||
# convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_1024
|
|
||||||
where a1 in (select group_concat(b1) from t2_1024 group by b2);
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_1024
|
|
||||||
where a1 in (select group_concat(b1) from t2_1024 group by b2);
|
|
||||||
|
|
||||||
set @@group_concat_max_len = 256; # anything < (CONVERT_IF_BIGGER_TO_BLOB = 1024)
|
|
||||||
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_1024
|
|
||||||
where a1 in (select group_concat(b1) from t2_1024 group by b2);
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_1024
|
|
||||||
where a1 in (select group_concat(b1) from t2_1024 group by b2);
|
|
||||||
|
|
||||||
drop table t1_1024, t2_1024, t3_1024;
|
|
||||||
|
|
||||||
|
|
||||||
# BLOB == 1025
|
|
||||||
set @blob_len = 1025;
|
|
||||||
set @suffix_len = @blob_len - @prefix_len;
|
|
||||||
|
|
||||||
create table t1_1025 (a1 blob(1025), a2 blob(1025));
|
|
||||||
create table t2_1025 (b1 blob(1025), b2 blob(1025));
|
|
||||||
create table t3_1025 (c1 blob(1025), c2 blob(1025));
|
|
||||||
|
|
||||||
insert into t1_1025 values
|
|
||||||
(concat('1 - 00', repeat('x', @suffix_len)), concat('2 - 00', repeat('x', @suffix_len)));
|
|
||||||
insert into t1_1025 values
|
|
||||||
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
|
||||||
insert into t1_1025 values
|
|
||||||
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
|
||||||
|
|
||||||
insert into t2_1025 values
|
|
||||||
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
|
||||||
insert into t2_1025 values
|
|
||||||
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
|
||||||
insert into t2_1025 values
|
|
||||||
(concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
|
|
||||||
|
|
||||||
insert into t3_1025 values
|
|
||||||
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
|
||||||
insert into t3_1025 values
|
|
||||||
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
|
||||||
insert into t3_1025 values
|
|
||||||
(concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
|
|
||||||
insert into t3_1025 values
|
|
||||||
(concat('1 - 04', repeat('x', @suffix_len)), concat('2 - 04', repeat('x', @suffix_len)));
|
|
||||||
|
|
||||||
# single value transformer
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_1025
|
|
||||||
where a1 in (select b1 from t2_1025 where b1 > '0');
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_1025
|
|
||||||
where a1 in (select b1 from t2_1025 where b1 > '0');
|
|
||||||
|
|
||||||
# row value transformer
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_1025
|
|
||||||
where (a1,a2) in (select b1, b2 from t2_1025 where b1 > '0');
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_1025
|
|
||||||
where (a1,a2) in (select b1, b2 from t2_1025 where b1 > '0');
|
|
||||||
|
|
||||||
# string function with a blob argument, the return type may be != blob
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_1025
|
|
||||||
where a1 in (select substring(b1,1,1025) from t2_1025 where b1 > '0');
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_1025
|
|
||||||
where a1 in (select substring(b1,1,1025) from t2_1025 where b1 > '0');
|
|
||||||
|
|
||||||
# group_concat with a blob argument - depends on
|
|
||||||
# the variable group_concat_max_len, and
|
|
||||||
# convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_1025
|
|
||||||
where a1 in (select group_concat(b1) from t2_1025 group by b2);
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_1025
|
|
||||||
where a1 in (select group_concat(b1) from t2_1025 group by b2);
|
|
||||||
|
|
||||||
set @@group_concat_max_len = 256; # anything < (CONVERT_IF_BIGGER_TO_BLOB = 1025)
|
|
||||||
|
|
||||||
explain extended select left(a1,7), left(a2,7)
|
|
||||||
from t1_1025
|
|
||||||
where a1 in (select group_concat(b1) from t2_1025 group by b2);
|
|
||||||
|
|
||||||
select left(a1,7), left(a2,7)
|
|
||||||
from t1_1025
|
|
||||||
where a1 in (select group_concat(b1) from t2_1025 group by b2);
|
|
||||||
|
|
||||||
drop table t1_1025, t2_1025, t3_1025;
|
|
||||||
|
|
||||||
# test for BIT fields
|
|
||||||
create table t1bit (a1 bit(3), a2 bit(3));
|
|
||||||
create table t2bit (b1 bit(3), b2 bit(3));
|
|
||||||
|
|
||||||
insert into t1bit values (b'000', b'100');
|
|
||||||
insert into t1bit values (b'001', b'101');
|
|
||||||
insert into t1bit values (b'010', b'110');
|
|
||||||
|
|
||||||
insert into t2bit values (b'001', b'101');
|
|
||||||
insert into t2bit values (b'010', b'110');
|
|
||||||
insert into t2bit values (b'110', b'111');
|
|
||||||
|
|
||||||
set @@optimizer_switch='semijoin=off';
|
|
||||||
|
|
||||||
explain extended select bin(a1), bin(a2)
|
|
||||||
from t1bit
|
|
||||||
where (a1, a2) in (select b1, b2 from t2bit);
|
|
||||||
|
|
||||||
select bin(a1), bin(a2)
|
|
||||||
from t1bit
|
|
||||||
where (a1, a2) in (select b1, b2 from t2bit);
|
|
||||||
|
|
||||||
drop table t1bit, t2bit;
|
|
||||||
|
|
||||||
# test mixture of BIT and BLOB
|
|
||||||
create table t1bb (a1 bit(3), a2 blob(3));
|
|
||||||
create table t2bb (b1 bit(3), b2 blob(3));
|
|
||||||
|
|
||||||
insert into t1bb values (b'000', '100');
|
|
||||||
insert into t1bb values (b'001', '101');
|
|
||||||
insert into t1bb values (b'010', '110');
|
|
||||||
|
|
||||||
insert into t2bb values (b'001', '101');
|
|
||||||
insert into t2bb values (b'010', '110');
|
|
||||||
insert into t2bb values (b'110', '111');
|
|
||||||
|
|
||||||
explain extended select bin(a1), a2
|
|
||||||
from t1bb
|
|
||||||
where (a1, a2) in (select b1, b2 from t2bb);
|
|
||||||
|
|
||||||
select bin(a1), a2
|
|
||||||
from t1bb
|
|
||||||
where (a1, a2) in (select b1, b2 from t2bb);
|
|
||||||
|
|
||||||
drop table t1bb, t2bb;
|
|
||||||
drop table t1, t2, t3, t1i, t2i, t3i, columns;
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* Test the cache of the left operand of IN.
|
|
||||||
******************************************************************************/
|
|
||||||
set @@optimizer_switch='semijoin=off';
|
|
||||||
|
|
||||||
# Test that default values of Cached_item are not used for comparison
|
|
||||||
create table t1 (s1 int);
|
|
||||||
create table t2 (s2 int);
|
|
||||||
insert into t1 values (5),(1),(0);
|
|
||||||
insert into t2 values (0), (1);
|
|
||||||
select s2 from t2 where s2 in (select s1 from t1);
|
|
||||||
drop table t1, t2;
|
|
||||||
|
|
||||||
create table t1 (a int not null, b int not null);
|
|
||||||
create table t2 (c int not null, d int not null);
|
|
||||||
create table t3 (e int not null);
|
|
||||||
|
|
||||||
# the first outer row has no matching inner row
|
|
||||||
insert into t1 values (1,10);
|
|
||||||
insert into t1 values (1,20);
|
|
||||||
insert into t1 values (2,10);
|
|
||||||
insert into t1 values (2,20);
|
|
||||||
insert into t1 values (2,30);
|
|
||||||
insert into t1 values (3,20);
|
|
||||||
insert into t1 values (4,40);
|
|
||||||
|
|
||||||
insert into t2 values (2,10);
|
|
||||||
insert into t2 values (2,20);
|
|
||||||
insert into t2 values (2,40);
|
|
||||||
insert into t2 values (3,20);
|
|
||||||
insert into t2 values (4,10);
|
|
||||||
insert into t2 values (5,10);
|
|
||||||
|
|
||||||
insert into t3 values (10);
|
|
||||||
insert into t3 values (10);
|
|
||||||
insert into t3 values (20);
|
|
||||||
insert into t3 values (30);
|
|
||||||
|
|
||||||
explain extended
|
|
||||||
select a from t1 where a in (select c from t2 where d >= 20);
|
|
||||||
select a from t1 where a in (select c from t2 where d >= 20);
|
|
||||||
|
|
||||||
create index it1a on t1(a);
|
|
||||||
|
|
||||||
explain extended
|
|
||||||
select a from t1 where a in (select c from t2 where d >= 20);
|
|
||||||
select a from t1 where a in (select c from t2 where d >= 20);
|
|
||||||
|
|
||||||
# the first outer row has a matching inner row
|
|
||||||
insert into t2 values (1,10);
|
|
||||||
|
|
||||||
explain extended
|
|
||||||
select a from t1 where a in (select c from t2 where d >= 20);
|
|
||||||
select a from t1 where a in (select c from t2 where d >= 20);
|
|
||||||
|
|
||||||
# cacheing for IN predicates inside a having clause - here the cached
|
|
||||||
# items are changed to point to temporary tables.
|
|
||||||
explain extended
|
|
||||||
select a from t1 group by a having a in (select c from t2 where d >= 20);
|
|
||||||
select a from t1 group by a having a in (select c from t2 where d >= 20);
|
|
||||||
|
|
||||||
# create an index that can be used for the outer query GROUP BY
|
|
||||||
create index iab on t1(a, b);
|
|
||||||
explain extended
|
|
||||||
select a from t1 group by a having a in (select c from t2 where d >= 20);
|
|
||||||
select a from t1 group by a having a in (select c from t2 where d >= 20);
|
|
||||||
|
|
||||||
explain extended
|
|
||||||
select a from t1 group by a
|
|
||||||
having a in (select c from t2 where d >= some(select e from t3 where max(b)=e));
|
|
||||||
select a from t1 group by a
|
|
||||||
having a in (select c from t2 where d >= some(select e from t3 where max(b)=e));
|
|
||||||
explain extended
|
|
||||||
select a from t1
|
|
||||||
where a in (select c from t2 where d >= some(select e from t3 where b=e));
|
|
||||||
select a from t1
|
|
||||||
where a in (select c from t2 where d >= some(select e from t3 where b=e));
|
|
||||||
|
|
||||||
drop table t1, t2, t3;
|
|
||||||
|
|
||||||
#
|
|
||||||
# BUG#36133 "Assertion `exec_method != MATERIALIZATION || (exec_method == MATERIALIZATION &&"
|
|
||||||
#
|
|
||||||
create table t2 (a int, b int, key(a), key(b));
|
|
||||||
insert into t2 values (3,3),(3,3),(3,3);
|
|
||||||
select 1 from t2 where
|
|
||||||
t2.a > 1
|
|
||||||
or
|
|
||||||
t2.a = 3 and not t2.a not in (select t2.b from t2);
|
|
||||||
drop table t2;
|
|
||||||
|
|
||||||
#
|
|
||||||
# BUG#37896 Assertion on entry of Item_in_subselect::exec on subquery with AND NOT
|
|
||||||
#
|
|
||||||
create table t1 (a1 int key);
|
|
||||||
create table t2 (b1 int);
|
|
||||||
insert into t1 values (5);
|
|
||||||
|
|
||||||
# Query with group by, executed via materialization
|
|
||||||
explain select min(a1) from t1 where 7 in (select b1 from t2 group by b1);
|
|
||||||
select min(a1) from t1 where 7 in (select b1 from t2 group by b1);
|
|
||||||
# Query with group by, executed via IN=>EXISTS
|
|
||||||
set @@optimizer_switch='default,materialization=off';
|
|
||||||
explain select min(a1) from t1 where 7 in (select b1 from t2 group by b1);
|
|
||||||
select min(a1) from t1 where 7 in (select b1 from t2 group by b1);
|
|
||||||
|
|
||||||
# Executed with materialization
|
|
||||||
set @@optimizer_switch='default,semijoin=off';
|
|
||||||
explain select min(a1) from t1 where 7 in (select b1 from t2);
|
|
||||||
select min(a1) from t1 where 7 in (select b1 from t2);
|
|
||||||
# Executed with semi-join. Notice, this time we get a different result (NULL).
|
|
||||||
# This is the only correct result of all four queries. This difference is
|
|
||||||
# filed as BUG#40037.
|
|
||||||
set @@optimizer_switch='default,materialization=off';
|
|
||||||
-- echo # with MariaDB and MWL#90, this particular case is solved:
|
|
||||||
explain select min(a1) from t1 where 7 in (select b1 from t2);
|
|
||||||
select min(a1) from t1 where 7 in (select b1 from t2);
|
|
||||||
-- echo # but when we go around MWL#90 code, the problem still shows up:
|
|
||||||
explain select min(a1) from t1 where 7 in (select b1 from t2) or 2> 4;
|
|
||||||
select min(a1) from t1 where 7 in (select b1 from t2) or 2> 4;
|
|
||||||
drop table t1,t2;
|
|
||||||
|
|
||||||
#
|
|
||||||
# BUG#36752 "subquery materialization produces wrong results when comparing different types"
|
|
||||||
#
|
|
||||||
create table t1 (a char(2), b varchar(10));
|
|
||||||
insert into t1 values ('a', 'aaa');
|
|
||||||
insert into t1 values ('aa', 'aaaa');
|
|
||||||
|
|
||||||
set @@optimizer_switch='default,semijoin=off';
|
|
||||||
explain select a,b from t1 where b in (select a from t1);
|
|
||||||
select a,b from t1 where b in (select a from t1);
|
|
||||||
prepare st1 from "select a,b from t1 where b in (select a from t1)";
|
|
||||||
execute st1;
|
|
||||||
execute st1;
|
|
||||||
drop table t1;
|
|
||||||
|
|
||||||
#
|
|
||||||
# Bug #44303 Assertion failures in Field_new_decimal::store_decimal
|
|
||||||
# when executing materialized InsideOut semijoin
|
|
||||||
#
|
|
||||||
CREATE TABLE t1 (f1 INT, f2 DECIMAL(5,3)) ENGINE=MyISAM;
|
|
||||||
INSERT INTO t1 (f1, f2) VALUES (1, 1.789);
|
|
||||||
INSERT INTO t1 (f1, f2) VALUES (13, 1.454);
|
|
||||||
INSERT INTO t1 (f1, f2) VALUES (10, 1.668);
|
|
||||||
|
|
||||||
CREATE TABLE t2 LIKE t1;
|
|
||||||
INSERT INTO t2 VALUES (1, 1.789);
|
|
||||||
INSERT INTO t2 VALUES (13, 1.454);
|
|
||||||
|
|
||||||
SET @@optimizer_switch='default,semijoin=on,materialization=on';
|
|
||||||
EXPLAIN SELECT COUNT(*) FROM t1 WHERE (f1,f2) IN (SELECT f1,f2 FROM t2);
|
|
||||||
SELECT COUNT(*) FROM t1 WHERE (f1,f2) IN (SELECT f1,f2 FROM t2);
|
|
||||||
|
|
||||||
DROP TABLE t1, t2;
|
|
||||||
|
|
||||||
#
|
|
||||||
# BUG#46548 IN-subqueries return 0 rows with materialization=on
|
|
||||||
#
|
|
||||||
CREATE TABLE t1 (
|
|
||||||
pk int,
|
|
||||||
a varchar(1),
|
|
||||||
b varchar(4),
|
|
||||||
c varchar(4),
|
|
||||||
d varchar(4),
|
|
||||||
PRIMARY KEY (pk)
|
|
||||||
);
|
|
||||||
INSERT INTO t1 VALUES (1,'o','ffff','ffff','ffoo'),(2,'f','ffff','ffff','ffff');
|
|
||||||
|
|
||||||
CREATE TABLE t2 LIKE t1;
|
|
||||||
INSERT INTO t2 VALUES (1,'i','iiii','iiii','iiii'),(2,'f','ffff','ffff','ffff');
|
|
||||||
|
|
||||||
SET @@optimizer_switch='default,semijoin=on,materialization=on';
|
|
||||||
EXPLAIN SELECT pk FROM t1 WHERE (a) IN (SELECT a FROM t2 WHERE pk > 0);
|
|
||||||
SELECT pk FROM t1 WHERE (a) IN (SELECT a FROM t2 WHERE pk > 0);
|
|
||||||
SELECT pk FROM t1 WHERE (b,c,d) IN (SELECT b,c,d FROM t2 WHERE pk > 0);
|
|
||||||
DROP TABLE t1, t2;
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # BUG#50019: Wrong result for IN-subquery with materialization
|
|
||||||
--echo #
|
|
||||||
create table t1(i int);
|
|
||||||
insert into t1 values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
|
|
||||||
create table t2(i int);
|
|
||||||
insert into t2 values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
|
|
||||||
create table t3(i int);
|
|
||||||
insert into t3 values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
|
|
||||||
select * from t1 where t1.i in (select t2.i from t2 join t3 where t2.i + t3.i = 5);
|
|
||||||
set @save_optimizer_switch=@@optimizer_switch;
|
|
||||||
set session optimizer_switch='materialization=off';
|
|
||||||
select * from t1 where t1.i in (select t2.i from t2 join t3 where t2.i + t3.i = 5);
|
|
||||||
set session optimizer_switch=@save_optimizer_switch;
|
|
||||||
drop table t1, t2, t3;
|
|
||||||
|
|
||||||
#
|
|
||||||
# Test that the contentes of the temp table of a materialized subquery is
|
|
||||||
# cleanup up between PS reexecutions.
|
|
||||||
#
|
|
||||||
|
|
||||||
create table t0 (a int);
|
|
||||||
insert into t0 values (0),(1),(2);
|
|
||||||
create table t1 (a int);
|
|
||||||
insert into t1 values (0),(1),(2);
|
|
||||||
explain select a, a in (select a from t1) from t0;
|
|
||||||
select a, a in (select a from t1) from t0;
|
|
||||||
prepare s from 'select a, a in (select a from t1) from t0';
|
|
||||||
execute s;
|
|
||||||
update t1 set a=123;
|
|
||||||
execute s;
|
|
||||||
drop table t0, t1;
|
|
||||||
|
934
mysql-test/t/subselect_sj_mat.test
Normal file
934
mysql-test/t/subselect_sj_mat.test
Normal file
@@ -0,0 +1,934 @@
|
|||||||
|
#
|
||||||
|
# Hash semi-join regression tests
|
||||||
|
# (WL#1110: Subquery optimization: materialization)
|
||||||
|
#
|
||||||
|
|
||||||
|
set optimizer_switch='firstmatch=off';
|
||||||
|
--disable_warnings
|
||||||
|
drop table if exists t1, t2, t3, t1i, t2i, t3i;
|
||||||
|
drop view if exists v1, v2, v1m, v2m;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
create table t1 (a1 char(8), a2 char(8));
|
||||||
|
create table t2 (b1 char(8), b2 char(8));
|
||||||
|
create table t3 (c1 char(8), c2 char(8));
|
||||||
|
|
||||||
|
insert into t1 values ('1 - 00', '2 - 00');
|
||||||
|
insert into t1 values ('1 - 01', '2 - 01');
|
||||||
|
insert into t1 values ('1 - 02', '2 - 02');
|
||||||
|
|
||||||
|
insert into t2 values ('1 - 01', '2 - 01');
|
||||||
|
insert into t2 values ('1 - 01', '2 - 01');
|
||||||
|
insert into t2 values ('1 - 02', '2 - 02');
|
||||||
|
insert into t2 values ('1 - 02', '2 - 02');
|
||||||
|
insert into t2 values ('1 - 03', '2 - 03');
|
||||||
|
|
||||||
|
insert into t3 values ('1 - 01', '2 - 01');
|
||||||
|
insert into t3 values ('1 - 02', '2 - 02');
|
||||||
|
insert into t3 values ('1 - 03', '2 - 03');
|
||||||
|
insert into t3 values ('1 - 04', '2 - 04');
|
||||||
|
|
||||||
|
# Indexed columns
|
||||||
|
create table t1i (a1 char(8), a2 char(8));
|
||||||
|
create table t2i (b1 char(8), b2 char(8));
|
||||||
|
create table t3i (c1 char(8), c2 char(8));
|
||||||
|
create index it1i1 on t1i (a1);
|
||||||
|
create index it1i2 on t1i (a2);
|
||||||
|
create index it1i3 on t1i (a1, a2);
|
||||||
|
|
||||||
|
create index it2i1 on t2i (b1);
|
||||||
|
create index it2i2 on t2i (b2);
|
||||||
|
create index it2i3 on t2i (b1, b2);
|
||||||
|
|
||||||
|
create index it3i1 on t3i (c1);
|
||||||
|
create index it3i2 on t3i (c2);
|
||||||
|
create index it3i3 on t3i (c1, c2);
|
||||||
|
|
||||||
|
insert into t1i select * from t1;
|
||||||
|
insert into t2i select * from t2;
|
||||||
|
insert into t3i select * from t3;
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Simple tests.
|
||||||
|
******************************************************************************/
|
||||||
|
# non-indexed nullable fields
|
||||||
|
explain extended
|
||||||
|
select * from t1 where a1 in (select b1 from t2 where b1 > '0');
|
||||||
|
select * from t1 where a1 in (select b1 from t2 where b1 > '0');
|
||||||
|
|
||||||
|
explain extended
|
||||||
|
select * from t1 where a1 in (select b1 from t2 where b1 > '0' group by b1);
|
||||||
|
select * from t1 where a1 in (select b1 from t2 where b1 > '0' group by b1);
|
||||||
|
|
||||||
|
explain extended
|
||||||
|
select * from t1 where (a1, a2) in (select b1, b2 from t2 where b1 > '0' group by b1, b2);
|
||||||
|
select * from t1 where (a1, a2) in (select b1, b2 from t2 where b1 > '0' group by b1, b2);
|
||||||
|
|
||||||
|
explain extended
|
||||||
|
select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1);
|
||||||
|
select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1);
|
||||||
|
|
||||||
|
# indexed columns
|
||||||
|
explain extended
|
||||||
|
select * from t1i where a1 in (select b1 from t2i where b1 > '0');
|
||||||
|
select * from t1i where a1 in (select b1 from t2i where b1 > '0');
|
||||||
|
|
||||||
|
--replace_column 6 # 8 # 11 #
|
||||||
|
explain extended
|
||||||
|
select * from t1i where a1 in (select b1 from t2i where b1 > '0' group by b1);
|
||||||
|
select * from t1i where a1 in (select b1 from t2i where b1 > '0' group by b1);
|
||||||
|
|
||||||
|
explain extended
|
||||||
|
select * from t1i where (a1, a2) in (select b1, b2 from t2i where b1 > '0');
|
||||||
|
select * from t1i where (a1, a2) in (select b1, b2 from t2i where b1 > '0');
|
||||||
|
|
||||||
|
--replace_column 6 # 7 # 8 # 11 #
|
||||||
|
explain extended
|
||||||
|
select * from t1i where (a1, a2) in (select b1, b2 from t2i where b1 > '0' group by b1, b2);
|
||||||
|
select * from t1i where (a1, a2) in (select b1, b2 from t2i where b1 > '0' group by b1, b2);
|
||||||
|
|
||||||
|
--replace_column 6 # 7 # 8 # 11 #
|
||||||
|
explain extended
|
||||||
|
select * from t1i where (a1, a2) in (select b1, min(b2) from t2i where b1 > '0' group by b1);
|
||||||
|
select * from t1i where (a1, a2) in (select b1, min(b2) from t2i where b1 > '0' group by b1);
|
||||||
|
|
||||||
|
# BUG#31639: Wrong plan for uncorrelated subquery when loose scan is applicable.
|
||||||
|
explain extended
|
||||||
|
select * from t1 where (a1, a2) in (select b1, max(b2) from t2i group by b1);
|
||||||
|
select * from t1 where (a1, a2) in (select b1, max(b2) from t2i group by b1);
|
||||||
|
|
||||||
|
prepare st1 from "explain select * from t1 where (a1, a2) in (select b1, max(b2) from t2i group by b1)";
|
||||||
|
execute st1;
|
||||||
|
execute st1;
|
||||||
|
prepare st2 from "select * from t1 where (a1, a2) in (select b1, max(b2) from t2i group by b1)";
|
||||||
|
execute st2;
|
||||||
|
execute st2;
|
||||||
|
|
||||||
|
explain extended
|
||||||
|
select * from t1 where (a1, a2) in (select b1, min(b2) from t2i where b1 > '0' group by b1);
|
||||||
|
select * from t1 where (a1, a2) in (select b1, min(b2) from t2i where b1 > '0' group by b1);
|
||||||
|
-- error 1235
|
||||||
|
select * from t1 where (a1, a2) in (select b1, min(b2) from t2i limit 1,1);
|
||||||
|
|
||||||
|
# test re-optimization/re-execution with different execution methods
|
||||||
|
# prepare once, exec with different modes
|
||||||
|
set @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
set @@optimizer_switch='default,semijoin=off';
|
||||||
|
prepare st1 from
|
||||||
|
"select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1)";
|
||||||
|
set @@optimizer_switch='default,materialization=off';
|
||||||
|
execute st1;
|
||||||
|
set @@optimizer_switch='default,semijoin=off';
|
||||||
|
execute st1;
|
||||||
|
|
||||||
|
set @@optimizer_switch='default,materialization=off';
|
||||||
|
prepare st1 from
|
||||||
|
"select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1)";
|
||||||
|
set @@optimizer_switch='default,semijoin=off';
|
||||||
|
execute st1;
|
||||||
|
set @@optimizer_switch='default,materialization=off';
|
||||||
|
execute st1;
|
||||||
|
set @@optimizer_switch=@save_optimizer_switch;
|
||||||
|
|
||||||
|
# materialize the result of ORDER BY
|
||||||
|
# non-indexed fields
|
||||||
|
explain extended
|
||||||
|
select * from t1 where (a1, a2) in (select b1, b2 from t2 order by b1, b2);
|
||||||
|
select * from t1 where (a1, a2) in (select b1, b2 from t2 order by b1, b2);
|
||||||
|
# indexed fields
|
||||||
|
explain extended
|
||||||
|
select * from t1i where (a1, a2) in (select b1, b2 from t2i order by b1, b2);
|
||||||
|
select * from t1i where (a1, a2) in (select b1, b2 from t2i order by b1, b2);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Views, UNIONs, several levels of nesting.
|
||||||
|
******************************************************************************/
|
||||||
|
# materialize the result of subquery over temp-table view
|
||||||
|
|
||||||
|
create algorithm=merge view v1 as
|
||||||
|
select b1, c2 from t2, t3 where b2 > c2;
|
||||||
|
|
||||||
|
create algorithm=merge view v2 as
|
||||||
|
select b1, c2 from t2, t3 group by b2, c2;
|
||||||
|
|
||||||
|
create algorithm=temptable view v1m as
|
||||||
|
select b1, c2 from t2, t3 where b2 > c2;
|
||||||
|
|
||||||
|
create algorithm=temptable view v2m as
|
||||||
|
select b1, c2 from t2, t3 group by b2, c2;
|
||||||
|
|
||||||
|
select * from v1 where (c2, b1) in (select c2, b1 from v2 where b1 is not null);
|
||||||
|
select * from v1 where (c2, b1) in (select distinct c2, b1 from v2 where b1 is not null);
|
||||||
|
|
||||||
|
select * from v1m where (c2, b1) in (select c2, b1 from v2m where b1 is not null);
|
||||||
|
select * from v1m where (c2, b1) in (select distinct c2, b1 from v2m where b1 is not null);
|
||||||
|
|
||||||
|
drop view v1, v2, v1m, v2m;
|
||||||
|
|
||||||
|
# nested subqueries, views
|
||||||
|
explain extended
|
||||||
|
select * from t1
|
||||||
|
where (a1, a2) in (select b1, b2 from t2 where b1 > '0') and
|
||||||
|
(a1, a2) in (select c1, c2 from t3
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
||||||
|
select * from t1
|
||||||
|
where (a1, a2) in (select b1, b2 from t2 where b1 > '0') and
|
||||||
|
(a1, a2) in (select c1, c2 from t3
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
||||||
|
|
||||||
|
--replace_column 6 # 7 # 8 # 11 #
|
||||||
|
explain extended
|
||||||
|
select * from t1i
|
||||||
|
where (a1, a2) in (select b1, b2 from t2i where b1 > '0') and
|
||||||
|
(a1, a2) in (select c1, c2 from t3i
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
||||||
|
select * from t1i
|
||||||
|
where (a1, a2) in (select b1, b2 from t2i where b1 > '0') and
|
||||||
|
(a1, a2) in (select c1, c2 from t3i
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
||||||
|
|
||||||
|
explain extended
|
||||||
|
select * from t1
|
||||||
|
where (a1, a2) in (select b1, b2 from t2
|
||||||
|
where b2 in (select c2 from t3 where c2 LIKE '%02') or
|
||||||
|
b2 in (select c2 from t3 where c2 LIKE '%03')) and
|
||||||
|
(a1, a2) in (select c1, c2 from t3
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
||||||
|
select * from t1
|
||||||
|
where (a1, a2) in (select b1, b2 from t2
|
||||||
|
where b2 in (select c2 from t3 where c2 LIKE '%02') or
|
||||||
|
b2 in (select c2 from t3 where c2 LIKE '%03')) and
|
||||||
|
(a1, a2) in (select c1, c2 from t3
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
||||||
|
|
||||||
|
# as above with correlated innermost subquery
|
||||||
|
explain extended
|
||||||
|
select * from t1
|
||||||
|
where (a1, a2) in (select b1, b2 from t2
|
||||||
|
where b2 in (select c2 from t3 t3a where c1 = a1) or
|
||||||
|
b2 in (select c2 from t3 t3b where c2 LIKE '%03')) and
|
||||||
|
(a1, a2) in (select c1, c2 from t3 t3c
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
||||||
|
select * from t1
|
||||||
|
where (a1, a2) in (select b1, b2 from t2
|
||||||
|
where b2 in (select c2 from t3 t3a where c1 = a1) or
|
||||||
|
b2 in (select c2 from t3 t3b where c2 LIKE '%03')) and
|
||||||
|
(a1, a2) in (select c1, c2 from t3 t3c
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
||||||
|
|
||||||
|
|
||||||
|
# multiple levels of nesting subqueries, unions
|
||||||
|
--replace_column 6 # 7 # 8 # 11 #
|
||||||
|
explain extended
|
||||||
|
(select * from t1
|
||||||
|
where (a1, a2) in (select b1, b2 from t2
|
||||||
|
where b2 in (select c2 from t3 where c2 LIKE '%02') or
|
||||||
|
b2 in (select c2 from t3 where c2 LIKE '%03')
|
||||||
|
group by b1, b2) and
|
||||||
|
(a1, a2) in (select c1, c2 from t3
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0')))
|
||||||
|
UNION
|
||||||
|
(select * from t1i
|
||||||
|
where (a1, a2) in (select b1, b2 from t2i where b1 > '0') and
|
||||||
|
(a1, a2) in (select c1, c2 from t3i
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0')));
|
||||||
|
|
||||||
|
(select * from t1
|
||||||
|
where (a1, a2) in (select b1, b2 from t2
|
||||||
|
where b2 in (select c2 from t3 where c2 LIKE '%02') or
|
||||||
|
b2 in (select c2 from t3 where c2 LIKE '%03')
|
||||||
|
group by b1, b2) and
|
||||||
|
(a1, a2) in (select c1, c2 from t3
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0')))
|
||||||
|
UNION
|
||||||
|
(select * from t1i
|
||||||
|
where (a1, a2) in (select b1, b2 from t2i where b1 > '0') and
|
||||||
|
(a1, a2) in (select c1, c2 from t3i
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0')));
|
||||||
|
|
||||||
|
|
||||||
|
# UNION of subqueries as a subquery (thus it is not computed via materialization)
|
||||||
|
explain extended
|
||||||
|
select * from t1
|
||||||
|
where (a1, a2) in (select * from t1 where a1 > '0' UNION select * from t2 where b1 < '9') and
|
||||||
|
(a1, a2) in (select c1, c2 from t3
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
||||||
|
select * from t1
|
||||||
|
where (a1, a2) in (select * from t1 where a1 > '0' UNION select * from t2 where b1 < '9') and
|
||||||
|
(a1, a2) in (select c1, c2 from t3
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0'));
|
||||||
|
# as above, with a join conditon between the outer references
|
||||||
|
explain extended
|
||||||
|
select * from t1, t3
|
||||||
|
where (a1, a2) in (select * from t1 where a1 > '0' UNION select * from t2 where b1 < '9') and
|
||||||
|
(c1, c2) in (select c1, c2 from t3
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0')) and
|
||||||
|
a1 = c1;
|
||||||
|
select * from t1, t3
|
||||||
|
where (a1, a2) in (select * from t1 where a1 > '0' UNION select * from t2 where b1 < '9') and
|
||||||
|
(c1, c2) in (select c1, c2 from t3
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0')) and
|
||||||
|
a1 = c1;
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Negative tests, where materialization should not be applied.
|
||||||
|
******************************************************************************/
|
||||||
|
# UNION in a subquery
|
||||||
|
explain extended
|
||||||
|
select * from t3
|
||||||
|
where c1 in (select a1 from t1 where a1 > '0' UNION select b1 from t2 where b1 < '9');
|
||||||
|
select * from t3
|
||||||
|
where c1 in (select a1 from t1 where a1 > '0' UNION select b1 from t2 where b1 < '9');
|
||||||
|
|
||||||
|
# correlation
|
||||||
|
explain extended
|
||||||
|
select * from t1
|
||||||
|
where (a1, a2) in (select b1, b2 from t2
|
||||||
|
where b2 in (select c2 from t3 t3a where c1 = a1) or
|
||||||
|
b2 in (select c2 from t3 t3b where c2 LIKE '%03')) and
|
||||||
|
(a1, a2) in (select c1, c2 from t3 t3c
|
||||||
|
where (c1, c2) in (select b1, b2 from t2i where b2 > '0' or b2 = a2));
|
||||||
|
|
||||||
|
# subquery has no tables
|
||||||
|
explain extended
|
||||||
|
select * from t1 where (a1, a2) in (select '1 - 01', '2 - 01');
|
||||||
|
select * from t1 where (a1, a2) in (select '1 - 01', '2 - 01');
|
||||||
|
explain extended
|
||||||
|
select * from t1 where (a1, a2) in (select '1 - 01', '2 - 01' from dual);
|
||||||
|
select * from t1 where (a1, a2) in (select '1 - 01', '2 - 01' from dual);
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Subqueries in other uncovered clauses.
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* SELECT clause */
|
||||||
|
select ((a1,a2) IN (select * from t2 where b2 > '0')) IS NULL from t1;
|
||||||
|
|
||||||
|
/* GROUP BY clause */
|
||||||
|
create table columns (col int key);
|
||||||
|
insert into columns values (1), (2);
|
||||||
|
|
||||||
|
explain extended
|
||||||
|
select * from t1 group by (select col from columns limit 1);
|
||||||
|
select * from t1 group by (select col from columns limit 1);
|
||||||
|
|
||||||
|
explain extended
|
||||||
|
select * from t1 group by (a1 in (select col from columns));
|
||||||
|
select * from t1 group by (a1 in (select col from columns));
|
||||||
|
|
||||||
|
/* ORDER BY clause */
|
||||||
|
explain extended
|
||||||
|
select * from t1 order by (select col from columns limit 1);
|
||||||
|
select * from t1 order by (select col from columns limit 1);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Column types/sizes that affect materialization.
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Test that BLOBs are not materialized (except when arguments of some functions).
|
||||||
|
*/
|
||||||
|
# force materialization to be always considered
|
||||||
|
set @prefix_len = 6;
|
||||||
|
|
||||||
|
# BLOB == 16 (small blobs that could be stored in HEAP tables)
|
||||||
|
set @blob_len = 16;
|
||||||
|
set @suffix_len = @blob_len - @prefix_len;
|
||||||
|
|
||||||
|
create table t1_16 (a1 blob(16), a2 blob(16));
|
||||||
|
create table t2_16 (b1 blob(16), b2 blob(16));
|
||||||
|
create table t3_16 (c1 blob(16), c2 blob(16));
|
||||||
|
|
||||||
|
insert into t1_16 values
|
||||||
|
(concat('1 - 00', repeat('x', @suffix_len)), concat('2 - 00', repeat('x', @suffix_len)));
|
||||||
|
insert into t1_16 values
|
||||||
|
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
||||||
|
insert into t1_16 values
|
||||||
|
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
||||||
|
|
||||||
|
insert into t2_16 values
|
||||||
|
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
||||||
|
insert into t2_16 values
|
||||||
|
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
||||||
|
insert into t2_16 values
|
||||||
|
(concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
|
||||||
|
|
||||||
|
insert into t3_16 values
|
||||||
|
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
||||||
|
insert into t3_16 values
|
||||||
|
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
||||||
|
insert into t3_16 values
|
||||||
|
(concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
|
||||||
|
insert into t3_16 values
|
||||||
|
(concat('1 - 04', repeat('x', @suffix_len)), concat('2 - 04', repeat('x', @suffix_len)));
|
||||||
|
|
||||||
|
# single value transformer
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_16
|
||||||
|
where a1 in (select b1 from t2_16 where b1 > '0');
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_16
|
||||||
|
where a1 in (select b1 from t2_16 where b1 > '0');
|
||||||
|
|
||||||
|
# row value transformer
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_16
|
||||||
|
where (a1,a2) in (select b1, b2 from t2_16 where b1 > '0');
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_16
|
||||||
|
where (a1,a2) in (select b1, b2 from t2_16 where b1 > '0');
|
||||||
|
|
||||||
|
# string function with a blob argument, the return type may be != blob
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_16
|
||||||
|
where a1 in (select substring(b1,1,16) from t2_16 where b1 > '0');
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_16
|
||||||
|
where a1 in (select substring(b1,1,16) from t2_16 where b1 > '0');
|
||||||
|
|
||||||
|
# group_concat with a blob argument - depends on
|
||||||
|
# the variable group_concat_max_len, and
|
||||||
|
# convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_16
|
||||||
|
where a1 in (select group_concat(b1) from t2_16 group by b2);
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_16
|
||||||
|
where a1 in (select group_concat(b1) from t2_16 group by b2);
|
||||||
|
|
||||||
|
set @@group_concat_max_len = 256; # anything < (CONVERT_IF_BIGGER_TO_BLOB = 512)
|
||||||
|
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_16
|
||||||
|
where a1 in (select group_concat(b1) from t2_16 group by b2);
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_16
|
||||||
|
where a1 in (select group_concat(b1) from t2_16 group by b2);
|
||||||
|
|
||||||
|
# BLOB column at the second (intermediate) level of nesting
|
||||||
|
explain extended
|
||||||
|
select * from t1
|
||||||
|
where concat(a1,'x') IN
|
||||||
|
(select left(a1,8) from t1_16
|
||||||
|
where (a1, a2) IN
|
||||||
|
(select t2_16.b1, t2_16.b2 from t2_16, t2
|
||||||
|
where t2.b2 = substring(t2_16.b2,1,6) and
|
||||||
|
t2.b1 IN (select c1 from t3 where c2 > '0')));
|
||||||
|
|
||||||
|
|
||||||
|
drop table t1_16, t2_16, t3_16;
|
||||||
|
|
||||||
|
|
||||||
|
# BLOB == 512 (CONVERT_IF_BIGGER_TO_BLOB == 512)
|
||||||
|
set @blob_len = 512;
|
||||||
|
set @suffix_len = @blob_len - @prefix_len;
|
||||||
|
|
||||||
|
create table t1_512 (a1 blob(512), a2 blob(512));
|
||||||
|
create table t2_512 (b1 blob(512), b2 blob(512));
|
||||||
|
create table t3_512 (c1 blob(512), c2 blob(512));
|
||||||
|
|
||||||
|
insert into t1_512 values
|
||||||
|
(concat('1 - 00', repeat('x', @suffix_len)), concat('2 - 00', repeat('x', @suffix_len)));
|
||||||
|
insert into t1_512 values
|
||||||
|
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
||||||
|
insert into t1_512 values
|
||||||
|
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
||||||
|
|
||||||
|
insert into t2_512 values
|
||||||
|
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
||||||
|
insert into t2_512 values
|
||||||
|
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
||||||
|
insert into t2_512 values
|
||||||
|
(concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
|
||||||
|
|
||||||
|
insert into t3_512 values
|
||||||
|
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
||||||
|
insert into t3_512 values
|
||||||
|
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
||||||
|
insert into t3_512 values
|
||||||
|
(concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
|
||||||
|
insert into t3_512 values
|
||||||
|
(concat('1 - 04', repeat('x', @suffix_len)), concat('2 - 04', repeat('x', @suffix_len)));
|
||||||
|
|
||||||
|
# single value transformer
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_512
|
||||||
|
where a1 in (select b1 from t2_512 where b1 > '0');
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_512
|
||||||
|
where a1 in (select b1 from t2_512 where b1 > '0');
|
||||||
|
|
||||||
|
# row value transformer
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_512
|
||||||
|
where (a1,a2) in (select b1, b2 from t2_512 where b1 > '0');
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_512
|
||||||
|
where (a1,a2) in (select b1, b2 from t2_512 where b1 > '0');
|
||||||
|
|
||||||
|
# string function with a blob argument, the return type may be != blob
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_512
|
||||||
|
where a1 in (select substring(b1,1,512) from t2_512 where b1 > '0');
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_512
|
||||||
|
where a1 in (select substring(b1,1,512) from t2_512 where b1 > '0');
|
||||||
|
|
||||||
|
# group_concat with a blob argument - depends on
|
||||||
|
# the variable group_concat_max_len, and
|
||||||
|
# convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_512
|
||||||
|
where a1 in (select group_concat(b1) from t2_512 group by b2);
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_512
|
||||||
|
where a1 in (select group_concat(b1) from t2_512 group by b2);
|
||||||
|
|
||||||
|
set @@group_concat_max_len = 256; # anything < (CONVERT_IF_BIGGER_TO_BLOB = 512)
|
||||||
|
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_512
|
||||||
|
where a1 in (select group_concat(b1) from t2_512 group by b2);
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_512
|
||||||
|
where a1 in (select group_concat(b1) from t2_512 group by b2);
|
||||||
|
|
||||||
|
drop table t1_512, t2_512, t3_512;
|
||||||
|
|
||||||
|
|
||||||
|
# BLOB == 1024 (group_concat_max_len == 1024)
|
||||||
|
set @blob_len = 1024;
|
||||||
|
set @suffix_len = @blob_len - @prefix_len;
|
||||||
|
|
||||||
|
create table t1_1024 (a1 blob(1024), a2 blob(1024));
|
||||||
|
create table t2_1024 (b1 blob(1024), b2 blob(1024));
|
||||||
|
create table t3_1024 (c1 blob(1024), c2 blob(1024));
|
||||||
|
|
||||||
|
insert into t1_1024 values
|
||||||
|
(concat('1 - 00', repeat('x', @suffix_len)), concat('2 - 00', repeat('x', @suffix_len)));
|
||||||
|
insert into t1_1024 values
|
||||||
|
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
||||||
|
insert into t1_1024 values
|
||||||
|
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
||||||
|
|
||||||
|
insert into t2_1024 values
|
||||||
|
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
||||||
|
insert into t2_1024 values
|
||||||
|
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
||||||
|
insert into t2_1024 values
|
||||||
|
(concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
|
||||||
|
|
||||||
|
insert into t3_1024 values
|
||||||
|
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
||||||
|
insert into t3_1024 values
|
||||||
|
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
||||||
|
insert into t3_1024 values
|
||||||
|
(concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
|
||||||
|
insert into t3_1024 values
|
||||||
|
(concat('1 - 04', repeat('x', @suffix_len)), concat('2 - 04', repeat('x', @suffix_len)));
|
||||||
|
|
||||||
|
# single value transformer
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_1024
|
||||||
|
where a1 in (select b1 from t2_1024 where b1 > '0');
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_1024
|
||||||
|
where a1 in (select b1 from t2_1024 where b1 > '0');
|
||||||
|
|
||||||
|
# row value transformer
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_1024
|
||||||
|
where (a1,a2) in (select b1, b2 from t2_1024 where b1 > '0');
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_1024
|
||||||
|
where (a1,a2) in (select b1, b2 from t2_1024 where b1 > '0');
|
||||||
|
|
||||||
|
# string function with a blob argument, the return type may be != blob
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_1024
|
||||||
|
where a1 in (select substring(b1,1,1024) from t2_1024 where b1 > '0');
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_1024
|
||||||
|
where a1 in (select substring(b1,1,1024) from t2_1024 where b1 > '0');
|
||||||
|
|
||||||
|
# group_concat with a blob argument - depends on
|
||||||
|
# the variable group_concat_max_len, and
|
||||||
|
# convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_1024
|
||||||
|
where a1 in (select group_concat(b1) from t2_1024 group by b2);
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_1024
|
||||||
|
where a1 in (select group_concat(b1) from t2_1024 group by b2);
|
||||||
|
|
||||||
|
set @@group_concat_max_len = 256; # anything < (CONVERT_IF_BIGGER_TO_BLOB = 1024)
|
||||||
|
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_1024
|
||||||
|
where a1 in (select group_concat(b1) from t2_1024 group by b2);
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_1024
|
||||||
|
where a1 in (select group_concat(b1) from t2_1024 group by b2);
|
||||||
|
|
||||||
|
drop table t1_1024, t2_1024, t3_1024;
|
||||||
|
|
||||||
|
|
||||||
|
# BLOB == 1025
|
||||||
|
set @blob_len = 1025;
|
||||||
|
set @suffix_len = @blob_len - @prefix_len;
|
||||||
|
|
||||||
|
create table t1_1025 (a1 blob(1025), a2 blob(1025));
|
||||||
|
create table t2_1025 (b1 blob(1025), b2 blob(1025));
|
||||||
|
create table t3_1025 (c1 blob(1025), c2 blob(1025));
|
||||||
|
|
||||||
|
insert into t1_1025 values
|
||||||
|
(concat('1 - 00', repeat('x', @suffix_len)), concat('2 - 00', repeat('x', @suffix_len)));
|
||||||
|
insert into t1_1025 values
|
||||||
|
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
||||||
|
insert into t1_1025 values
|
||||||
|
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
||||||
|
|
||||||
|
insert into t2_1025 values
|
||||||
|
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
||||||
|
insert into t2_1025 values
|
||||||
|
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
||||||
|
insert into t2_1025 values
|
||||||
|
(concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
|
||||||
|
|
||||||
|
insert into t3_1025 values
|
||||||
|
(concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
|
||||||
|
insert into t3_1025 values
|
||||||
|
(concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
|
||||||
|
insert into t3_1025 values
|
||||||
|
(concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
|
||||||
|
insert into t3_1025 values
|
||||||
|
(concat('1 - 04', repeat('x', @suffix_len)), concat('2 - 04', repeat('x', @suffix_len)));
|
||||||
|
|
||||||
|
# single value transformer
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_1025
|
||||||
|
where a1 in (select b1 from t2_1025 where b1 > '0');
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_1025
|
||||||
|
where a1 in (select b1 from t2_1025 where b1 > '0');
|
||||||
|
|
||||||
|
# row value transformer
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_1025
|
||||||
|
where (a1,a2) in (select b1, b2 from t2_1025 where b1 > '0');
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_1025
|
||||||
|
where (a1,a2) in (select b1, b2 from t2_1025 where b1 > '0');
|
||||||
|
|
||||||
|
# string function with a blob argument, the return type may be != blob
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_1025
|
||||||
|
where a1 in (select substring(b1,1,1025) from t2_1025 where b1 > '0');
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_1025
|
||||||
|
where a1 in (select substring(b1,1,1025) from t2_1025 where b1 > '0');
|
||||||
|
|
||||||
|
# group_concat with a blob argument - depends on
|
||||||
|
# the variable group_concat_max_len, and
|
||||||
|
# convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_1025
|
||||||
|
where a1 in (select group_concat(b1) from t2_1025 group by b2);
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_1025
|
||||||
|
where a1 in (select group_concat(b1) from t2_1025 group by b2);
|
||||||
|
|
||||||
|
set @@group_concat_max_len = 256; # anything < (CONVERT_IF_BIGGER_TO_BLOB = 1025)
|
||||||
|
|
||||||
|
explain extended select left(a1,7), left(a2,7)
|
||||||
|
from t1_1025
|
||||||
|
where a1 in (select group_concat(b1) from t2_1025 group by b2);
|
||||||
|
|
||||||
|
select left(a1,7), left(a2,7)
|
||||||
|
from t1_1025
|
||||||
|
where a1 in (select group_concat(b1) from t2_1025 group by b2);
|
||||||
|
|
||||||
|
drop table t1_1025, t2_1025, t3_1025;
|
||||||
|
|
||||||
|
# test for BIT fields
|
||||||
|
create table t1bit (a1 bit(3), a2 bit(3));
|
||||||
|
create table t2bit (b1 bit(3), b2 bit(3));
|
||||||
|
|
||||||
|
insert into t1bit values (b'000', b'100');
|
||||||
|
insert into t1bit values (b'001', b'101');
|
||||||
|
insert into t1bit values (b'010', b'110');
|
||||||
|
|
||||||
|
insert into t2bit values (b'001', b'101');
|
||||||
|
insert into t2bit values (b'010', b'110');
|
||||||
|
insert into t2bit values (b'110', b'111');
|
||||||
|
|
||||||
|
explain extended select bin(a1), bin(a2)
|
||||||
|
from t1bit
|
||||||
|
where (a1, a2) in (select b1, b2 from t2bit);
|
||||||
|
|
||||||
|
select bin(a1), bin(a2)
|
||||||
|
from t1bit
|
||||||
|
where (a1, a2) in (select b1, b2 from t2bit);
|
||||||
|
|
||||||
|
drop table t1bit, t2bit;
|
||||||
|
|
||||||
|
# test mixture of BIT and BLOB
|
||||||
|
create table t1bb (a1 bit(3), a2 blob(3));
|
||||||
|
create table t2bb (b1 bit(3), b2 blob(3));
|
||||||
|
|
||||||
|
insert into t1bb values (b'000', '100');
|
||||||
|
insert into t1bb values (b'001', '101');
|
||||||
|
insert into t1bb values (b'010', '110');
|
||||||
|
|
||||||
|
insert into t2bb values (b'001', '101');
|
||||||
|
insert into t2bb values (b'010', '110');
|
||||||
|
insert into t2bb values (b'110', '111');
|
||||||
|
|
||||||
|
explain extended select bin(a1), a2
|
||||||
|
from t1bb
|
||||||
|
where (a1, a2) in (select b1, b2 from t2bb);
|
||||||
|
|
||||||
|
select bin(a1), a2
|
||||||
|
from t1bb
|
||||||
|
where (a1, a2) in (select b1, b2 from t2bb);
|
||||||
|
|
||||||
|
drop table t1bb, t2bb;
|
||||||
|
drop table t1, t2, t3, t1i, t2i, t3i, columns;
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Test the cache of the left operand of IN.
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
# Test that default values of Cached_item are not used for comparison
|
||||||
|
create table t1 (s1 int);
|
||||||
|
create table t2 (s2 int);
|
||||||
|
insert into t1 values (5),(1),(0);
|
||||||
|
insert into t2 values (0), (1);
|
||||||
|
select s2 from t2 where s2 in (select s1 from t1);
|
||||||
|
drop table t1, t2;
|
||||||
|
|
||||||
|
create table t1 (a int not null, b int not null);
|
||||||
|
create table t2 (c int not null, d int not null);
|
||||||
|
create table t3 (e int not null);
|
||||||
|
|
||||||
|
# the first outer row has no matching inner row
|
||||||
|
insert into t1 values (1,10);
|
||||||
|
insert into t1 values (1,20);
|
||||||
|
insert into t1 values (2,10);
|
||||||
|
insert into t1 values (2,20);
|
||||||
|
insert into t1 values (2,30);
|
||||||
|
insert into t1 values (3,20);
|
||||||
|
insert into t1 values (4,40);
|
||||||
|
|
||||||
|
insert into t2 values (2,10);
|
||||||
|
insert into t2 values (2,20);
|
||||||
|
insert into t2 values (2,40);
|
||||||
|
insert into t2 values (3,20);
|
||||||
|
insert into t2 values (4,10);
|
||||||
|
insert into t2 values (5,10);
|
||||||
|
|
||||||
|
insert into t3 values (10);
|
||||||
|
insert into t3 values (10);
|
||||||
|
insert into t3 values (20);
|
||||||
|
insert into t3 values (30);
|
||||||
|
|
||||||
|
explain extended
|
||||||
|
select a from t1 where a in (select c from t2 where d >= 20);
|
||||||
|
select a from t1 where a in (select c from t2 where d >= 20);
|
||||||
|
|
||||||
|
create index it1a on t1(a);
|
||||||
|
|
||||||
|
explain extended
|
||||||
|
select a from t1 where a in (select c from t2 where d >= 20);
|
||||||
|
select a from t1 where a in (select c from t2 where d >= 20);
|
||||||
|
|
||||||
|
# the first outer row has a matching inner row
|
||||||
|
insert into t2 values (1,10);
|
||||||
|
|
||||||
|
explain extended
|
||||||
|
select a from t1 where a in (select c from t2 where d >= 20);
|
||||||
|
select a from t1 where a in (select c from t2 where d >= 20);
|
||||||
|
|
||||||
|
# cacheing for IN predicates inside a having clause - here the cached
|
||||||
|
# items are changed to point to temporary tables.
|
||||||
|
explain extended
|
||||||
|
select a from t1 group by a having a in (select c from t2 where d >= 20);
|
||||||
|
select a from t1 group by a having a in (select c from t2 where d >= 20);
|
||||||
|
|
||||||
|
# create an index that can be used for the outer query GROUP BY
|
||||||
|
create index iab on t1(a, b);
|
||||||
|
explain extended
|
||||||
|
select a from t1 group by a having a in (select c from t2 where d >= 20);
|
||||||
|
select a from t1 group by a having a in (select c from t2 where d >= 20);
|
||||||
|
|
||||||
|
explain extended
|
||||||
|
select a from t1 group by a
|
||||||
|
having a in (select c from t2 where d >= some(select e from t3 where max(b)=e));
|
||||||
|
select a from t1 group by a
|
||||||
|
having a in (select c from t2 where d >= some(select e from t3 where max(b)=e));
|
||||||
|
explain extended
|
||||||
|
select a from t1
|
||||||
|
where a in (select c from t2 where d >= some(select e from t3 where b=e));
|
||||||
|
select a from t1
|
||||||
|
where a in (select c from t2 where d >= some(select e from t3 where b=e));
|
||||||
|
|
||||||
|
drop table t1, t2, t3;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#36133 "Assertion `exec_method != MATERIALIZATION || (exec_method == MATERIALIZATION &&"
|
||||||
|
#
|
||||||
|
create table t2 (a int, b int, key(a), key(b));
|
||||||
|
insert into t2 values (3,3),(3,3),(3,3);
|
||||||
|
select 1 from t2 where
|
||||||
|
t2.a > 1
|
||||||
|
or
|
||||||
|
t2.a = 3 and not t2.a not in (select t2.b from t2);
|
||||||
|
drop table t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#37896 Assertion on entry of Item_in_subselect::exec on subquery with AND NOT
|
||||||
|
#
|
||||||
|
create table t1 (a1 int key);
|
||||||
|
create table t2 (b1 int);
|
||||||
|
insert into t1 values (5);
|
||||||
|
|
||||||
|
# Query with group by, executed via materialization
|
||||||
|
explain select min(a1) from t1 where 7 in (select b1 from t2 group by b1);
|
||||||
|
select min(a1) from t1 where 7 in (select b1 from t2 group by b1);
|
||||||
|
# Query with group by, executed via IN=>EXISTS
|
||||||
|
set @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
set @@optimizer_switch='default,materialization=off';
|
||||||
|
explain select min(a1) from t1 where 7 in (select b1 from t2 group by b1);
|
||||||
|
select min(a1) from t1 where 7 in (select b1 from t2 group by b1);
|
||||||
|
|
||||||
|
# Executed with materialization
|
||||||
|
set @@optimizer_switch='default,semijoin=off';
|
||||||
|
explain select min(a1) from t1 where 7 in (select b1 from t2);
|
||||||
|
select min(a1) from t1 where 7 in (select b1 from t2);
|
||||||
|
# Executed with semi-join. Notice, this time we get a different result (NULL).
|
||||||
|
# This is the only correct result of all four queries. This difference is
|
||||||
|
# filed as BUG#40037.
|
||||||
|
set @@optimizer_switch='default,materialization=off';
|
||||||
|
-- echo # with MariaDB and MWL#90, this particular case is solved:
|
||||||
|
explain select min(a1) from t1 where 7 in (select b1 from t2);
|
||||||
|
select min(a1) from t1 where 7 in (select b1 from t2);
|
||||||
|
-- echo # but when we go around MWL#90 code, the problem still shows up:
|
||||||
|
explain select min(a1) from t1 where 7 in (select b1 from t2) or 2> 4;
|
||||||
|
select min(a1) from t1 where 7 in (select b1 from t2) or 2> 4;
|
||||||
|
set @@optimizer_switch= @save_optimizer_switch;
|
||||||
|
drop table t1,t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#36752 "subquery materialization produces wrong results when comparing different types"
|
||||||
|
#
|
||||||
|
create table t1 (a char(2), b varchar(10));
|
||||||
|
insert into t1 values ('a', 'aaa');
|
||||||
|
insert into t1 values ('aa', 'aaaa');
|
||||||
|
|
||||||
|
explain select a,b from t1 where b in (select a from t1);
|
||||||
|
select a,b from t1 where b in (select a from t1);
|
||||||
|
prepare st1 from "select a,b from t1 where b in (select a from t1)";
|
||||||
|
execute st1;
|
||||||
|
execute st1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #44303 Assertion failures in Field_new_decimal::store_decimal
|
||||||
|
# when executing materialized InsideOut semijoin
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (f1 INT, f2 DECIMAL(5,3)) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t1 (f1, f2) VALUES (1, 1.789);
|
||||||
|
INSERT INTO t1 (f1, f2) VALUES (13, 1.454);
|
||||||
|
INSERT INTO t1 (f1, f2) VALUES (10, 1.668);
|
||||||
|
|
||||||
|
CREATE TABLE t2 LIKE t1;
|
||||||
|
INSERT INTO t2 VALUES (1, 1.789);
|
||||||
|
INSERT INTO t2 VALUES (13, 1.454);
|
||||||
|
|
||||||
|
set @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET @@optimizer_switch='default,semijoin=on,materialization=on';
|
||||||
|
EXPLAIN SELECT COUNT(*) FROM t1 WHERE (f1,f2) IN (SELECT f1,f2 FROM t2);
|
||||||
|
SELECT COUNT(*) FROM t1 WHERE (f1,f2) IN (SELECT f1,f2 FROM t2);
|
||||||
|
set @@optimizer_switch= @save_optimizer_switch;
|
||||||
|
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#46548 IN-subqueries return 0 rows with materialization=on
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
pk int,
|
||||||
|
a varchar(1),
|
||||||
|
b varchar(4),
|
||||||
|
c varchar(4),
|
||||||
|
d varchar(4),
|
||||||
|
PRIMARY KEY (pk)
|
||||||
|
);
|
||||||
|
INSERT INTO t1 VALUES (1,'o','ffff','ffff','ffoo'),(2,'f','ffff','ffff','ffff');
|
||||||
|
|
||||||
|
CREATE TABLE t2 LIKE t1;
|
||||||
|
INSERT INTO t2 VALUES (1,'i','iiii','iiii','iiii'),(2,'f','ffff','ffff','ffff');
|
||||||
|
|
||||||
|
set @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET @@optimizer_switch='default,semijoin=on,materialization=on';
|
||||||
|
EXPLAIN SELECT pk FROM t1 WHERE (a) IN (SELECT a FROM t2 WHERE pk > 0);
|
||||||
|
SELECT pk FROM t1 WHERE (a) IN (SELECT a FROM t2 WHERE pk > 0);
|
||||||
|
SELECT pk FROM t1 WHERE (b,c,d) IN (SELECT b,c,d FROM t2 WHERE pk > 0);
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
set optimizer_switch=@save_optimizer_switch;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # BUG#50019: Wrong result for IN-subquery with materialization
|
||||||
|
--echo #
|
||||||
|
create table t1(i int);
|
||||||
|
insert into t1 values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
|
||||||
|
create table t2(i int);
|
||||||
|
insert into t2 values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
|
||||||
|
create table t3(i int);
|
||||||
|
insert into t3 values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
|
||||||
|
select * from t1 where t1.i in (select t2.i from t2 join t3 where t2.i + t3.i = 5);
|
||||||
|
set @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
set session optimizer_switch='materialization=off';
|
||||||
|
select * from t1 where t1.i in (select t2.i from t2 join t3 where t2.i + t3.i = 5);
|
||||||
|
set session optimizer_switch=@save_optimizer_switch;
|
||||||
|
drop table t1, t2, t3;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test that the contentes of the temp table of a materialized subquery is
|
||||||
|
# cleanup up between PS reexecutions.
|
||||||
|
#
|
||||||
|
|
||||||
|
create table t0 (a int);
|
||||||
|
insert into t0 values (0),(1),(2);
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 values (0),(1),(2);
|
||||||
|
explain select a, a in (select a from t1) from t0;
|
||||||
|
select a, a in (select a from t1) from t0;
|
||||||
|
prepare s from 'select a, a in (select a from t1) from t0';
|
||||||
|
execute s;
|
||||||
|
update t1 set a=123;
|
||||||
|
execute s;
|
||||||
|
drop table t0, t1;
|
||||||
|
set optimizer_switch='firstmatch=on';
|
@@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
#!@PERL@
|
#!@PERL@
|
||||||
# Test of table elimination feature
|
# Test of table elimination feature
|
||||||
|
|
||||||
|
@@ -5761,32 +5761,27 @@ Item_field* Item_equal::get_first(Item_field *field)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
/*
|
/*
|
||||||
The field is not in SJ-Materialization nest. We must return the first
|
The field is not in SJ-Materialization nest. We must return the first
|
||||||
field that's not embedded in a SJ-Materialization nest.
|
field in the join order. The field may be inside a semi-join nest, i.e
|
||||||
Example: suppose we have a join order:
|
a join order may look like this:
|
||||||
|
|
||||||
SJ-Mat(it1 it2) ot1 ot2
|
SJ-Mat(it1 it2) ot1 ot2
|
||||||
|
|
||||||
and equality ot2.col = ot1.col = it2.col
|
where we're looking what to substitute ot2.col for. In this case we must
|
||||||
If we're looking for best substitute for 'ot2.col', we should pick ot1.col
|
still return it1.col, here's a proof why:
|
||||||
and not it2.col, because when we run a join between ot1 and ot2
|
|
||||||
execution of SJ-Mat(...) has already finished and we can't rely on the
|
First let's note that either it1.col or it2.col participates in
|
||||||
value of it*.*.
|
subquery's IN-equality. It can't be otherwise, because materialization is
|
||||||
psergey-fix-fix: ^^ THAT IS INCORRECT ^^. Pick the first, whatever that
|
only applicable to uncorrelated subqueries, so the only way we could
|
||||||
is.
|
infer "it1.col=ot1.col" is from IN-equality. Ok, so IN-eqality has
|
||||||
|
it1.col or it2.col on its inner side. it1.col is first such item in the
|
||||||
|
join order, so it's not possible for SJ-Mat to be
|
||||||
|
SJ-Materialization-lookup, it is SJ-Materialization-Scan. The scan part
|
||||||
|
of this strategy will unpack value of it1.col=it2.col into it1.col
|
||||||
|
(that's the first equal item inside the subquery), and we'll be able to
|
||||||
|
get it from there. qed.
|
||||||
*/
|
*/
|
||||||
while ((item= it++))
|
|
||||||
{
|
|
||||||
TABLE_LIST *emb_nest= item->field->table->pos_in_table_list->embedding;
|
|
||||||
if (!emb_nest || !emb_nest->sj_mat_info ||
|
|
||||||
!emb_nest->sj_mat_info->is_used)
|
|
||||||
{
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return fields.head();
|
return fields.head();
|
||||||
}
|
}
|
||||||
// Shouldn't get here.
|
// Shouldn't get here.
|
||||||
|
@@ -237,7 +237,8 @@ int check_and_do_in_subquery_rewrites(JOIN *join)
|
|||||||
with jtbm strategy
|
with jtbm strategy
|
||||||
*/
|
*/
|
||||||
if (in_subs->exec_method == Item_in_subselect::MATERIALIZATION &&
|
if (in_subs->exec_method == Item_in_subselect::MATERIALIZATION &&
|
||||||
thd->thd_marker.emb_on_expr_nest == (TABLE_LIST*)0x1)
|
thd->thd_marker.emb_on_expr_nest == (TABLE_LIST*)0x1 &&
|
||||||
|
optimizer_flag(thd, OPTIMIZER_SWITCH_SEMIJOIN))
|
||||||
{
|
{
|
||||||
in_subs->emb_on_expr_nest= thd->thd_marker.emb_on_expr_nest;
|
in_subs->emb_on_expr_nest= thd->thd_marker.emb_on_expr_nest;
|
||||||
in_subs->is_flattenable_semijoin= FALSE;
|
in_subs->is_flattenable_semijoin= FALSE;
|
||||||
|
@@ -4287,7 +4287,6 @@ best_access_path(JOIN *join,
|
|||||||
double tmp;
|
double tmp;
|
||||||
ha_rows rec;
|
ha_rows rec;
|
||||||
bool best_uses_jbuf= FALSE;
|
bool best_uses_jbuf= FALSE;
|
||||||
Item_in_subselect* jtbm_subselect= s->table->pos_in_table_list->jtbm_subselect;
|
|
||||||
|
|
||||||
Loose_scan_opt loose_scan_opt;
|
Loose_scan_opt loose_scan_opt;
|
||||||
DBUG_ENTER("best_access_path");
|
DBUG_ENTER("best_access_path");
|
||||||
@@ -4696,7 +4695,7 @@ best_access_path(JOIN *join,
|
|||||||
!((s->table->file->ha_table_flags() & HA_TABLE_SCAN_ON_INDEX) && // (3)
|
!((s->table->file->ha_table_flags() & HA_TABLE_SCAN_ON_INDEX) && // (3)
|
||||||
! s->table->covering_keys.is_clear_all() && best_key && !s->quick) &&// (3)
|
! s->table->covering_keys.is_clear_all() && best_key && !s->quick) &&// (3)
|
||||||
!(s->table->force_index && best_key && !s->quick) && // (4)
|
!(s->table->force_index && best_key && !s->quick) && // (4)
|
||||||
!(best_key && jtbm_subselect)) // (5)
|
!(best_key && s->table->pos_in_table_list->jtbm_subselect)) // (5)
|
||||||
{ // Check full join
|
{ // Check full join
|
||||||
ha_rows rnd_records= s->found_records;
|
ha_rows rnd_records= s->found_records;
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user