mirror of
https://github.com/MariaDB/server.git
synced 2025-11-24 06:01:25 +03:00
Backport of subquery optimizations to 5.3.
There are still test failures because of: - Wrong query results in outer join + semi join - EXPLAIN output differences
This commit is contained in:
@@ -1419,19 +1419,19 @@ drop table t1;
|
||||
#
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on
|
||||
set optimizer_switch='index_merge=off,index_merge_union=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=off,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on
|
||||
index_merge=off,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on
|
||||
set optimizer_switch='index_merge_union=on';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=off,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on
|
||||
index_merge=off,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on
|
||||
set optimizer_switch='default,index_merge_sort_union=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=off,index_merge_intersection=on,index_condition_pushdown=on
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=off,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on
|
||||
set optimizer_switch=4;
|
||||
ERROR 42000: Variable 'optimizer_switch' can't be set to the value of '4'
|
||||
set optimizer_switch=NULL;
|
||||
@@ -1458,21 +1458,21 @@ set optimizer_switch=default;
|
||||
set optimizer_switch='index_merge=off,index_merge_union=off,default';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=off,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on
|
||||
index_merge=off,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on
|
||||
set optimizer_switch=default;
|
||||
select @@global.optimizer_switch;
|
||||
@@global.optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on
|
||||
set @@global.optimizer_switch=default;
|
||||
select @@global.optimizer_switch;
|
||||
@@global.optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on
|
||||
#
|
||||
# Check index_merge's @@optimizer_switch flags
|
||||
#
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1 (a int, b int, c int, filler char(100),
|
||||
@@ -1582,5 +1582,5 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
set optimizer_switch=default;
|
||||
show variables like 'optimizer_switch';
|
||||
Variable_name Value
|
||||
optimizer_switch index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on
|
||||
optimizer_switch index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on
|
||||
drop table t0, t1;
|
||||
|
||||
@@ -394,7 +394,7 @@ drop table t0, t1;
|
||||
# - engine_condition_pushdown does not affect ICP
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1 (a int, b int, key(a));
|
||||
|
||||
@@ -1323,6 +1323,10 @@ create table t1 (a int, b int, index a (a,b));
|
||||
create table t2 (a int, index a (a));
|
||||
create table t3 (a int, b int, index a (a));
|
||||
insert into t1 values (1,10), (2,20), (3,30), (4,40);
|
||||
create table t0(a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
insert into t1
|
||||
select rand()*100000+200,rand()*100000 from t0 A, t0 B, t0 C, t0 D;
|
||||
insert into t2 values (2), (3), (4), (5);
|
||||
insert into t3 values (10,3), (20,4), (30,5);
|
||||
select * from t2 where t2.a in (select a from t1);
|
||||
@@ -3554,28 +3558,6 @@ ORDER BY t1.t DESC LIMIT 1);
|
||||
i1 i2 t i1 i2 t
|
||||
24 1 2005-05-27 12:40:30 24 1 2006-06-20 12:29:40
|
||||
DROP TABLE t1, t2;
|
||||
CREATE TABLE t1 (i INT);
|
||||
(SELECT i FROM t1) UNION (SELECT i FROM t1);
|
||||
i
|
||||
SELECT sql_no_cache * FROM t1 WHERE NOT EXISTS
|
||||
(
|
||||
(SELECT i FROM t1) UNION
|
||||
(SELECT i FROM t1)
|
||||
);
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION
|
||||
(SELECT i FROM t1)
|
||||
)' at line 3
|
||||
SELECT * FROM t1
|
||||
WHERE NOT EXISTS (((SELECT i FROM t1) UNION (SELECT i FROM t1)));
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION (SELECT i FROM t1)))' at line 2
|
||||
explain select ((select t11.i from t1 t11) union (select t12.i from t1 t12))
|
||||
from t1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'union (select t12.i from t1 t12))
|
||||
from t1' at line 1
|
||||
explain select * from t1 where not exists
|
||||
((select t11.i from t1 t11) union (select t12.i from t1 t12));
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'union (select t12.i from t1 t12))' at line 2
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a VARCHAR(250), b INT auto_increment, PRIMARY KEY (b));
|
||||
insert into t1 (a) values (FLOOR(rand() * 100));
|
||||
insert into t1 (a) select FLOOR(rand() * 100) from t1;
|
||||
@@ -3666,6 +3648,11 @@ DROP TABLE t1,t2;
|
||||
CREATE TABLE t1 (a int, b int auto_increment, PRIMARY KEY (b));
|
||||
CREATE TABLE t2 (x int auto_increment, y int, z int,
|
||||
PRIMARY KEY (x), FOREIGN KEY (y) REFERENCES t1 (b));
|
||||
create table t3 (a int);
|
||||
insert into t3 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
insert into t1 select RAND()*1000, A.a + 10*(B.a+10*(C.a+10*D.a))
|
||||
from t3 A, t3 B, t3 C, t3 D where D.a<3;
|
||||
insert into t2(y,z) select t1.b, RAND()*1000 from t1, t3;
|
||||
SET SESSION sort_buffer_size = 32 * 1024;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect sort_buffer_size value: '32768'
|
||||
@@ -3680,7 +3667,7 @@ FROM (SELECT a, b, (SELECT x FROM t2 WHERE y=b ORDER BY z DESC LIMIT 1) c
|
||||
FROM t1) t;
|
||||
COUNT(*)
|
||||
3000
|
||||
DROP TABLE t1,t2;
|
||||
DROP TABLE t1,t2,t3;
|
||||
CREATE TABLE t1 (id char(4) PRIMARY KEY, c int);
|
||||
CREATE TABLE t2 (c int);
|
||||
INSERT INTO t1 VALUES ('aa', 1);
|
||||
@@ -4260,37 +4247,20 @@ out_a MIN(b)
|
||||
1 2
|
||||
2 4
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE TABLE t2 (a INT);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
INSERT INTO t2 VALUES (1),(2);
|
||||
SELECT 2 FROM t1 WHERE EXISTS ((SELECT 1 FROM t2 WHERE t1.a=t2.a));
|
||||
2
|
||||
2
|
||||
2
|
||||
EXPLAIN EXTENDED
|
||||
SELECT 2 FROM t1 WHERE EXISTS ((SELECT 1 FROM t2 WHERE t1.a=t2.a));
|
||||
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 Using where
|
||||
2 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||
Warnings:
|
||||
Note 1276 Field or reference 'test.t1.a' of SELECT #2 was resolved in SELECT #1
|
||||
Note 1003 select 2 AS `2` from `test`.`t1` where exists(select 1 AS `1` from `test`.`t2` where (`test`.`t1`.`a` = `test`.`t2`.`a`))
|
||||
EXPLAIN EXTENDED
|
||||
SELECT 2 FROM t1 WHERE EXISTS ((SELECT 1 FROM t2 WHERE t1.a=t2.a) UNION
|
||||
(SELECT 1 FROM t2 WHERE t1.a = t2.a));
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION
|
||||
(SELECT 1 FROM t2 WHERE t1.a = t2.a))' at line 2
|
||||
DROP TABLE t1,t2;
|
||||
create table t0(a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1(f11 int, f12 int);
|
||||
create table t2(f21 int unsigned not null, f22 int, f23 varchar(10));
|
||||
insert into t1 values(1,1),(2,2), (3, 3);
|
||||
insert into t2
|
||||
select -1 , (@a:=(A.a + 10 * (B.a + 10 * (C.a+10*D.a))))/5000 + 1, @a
|
||||
from t0 A, t0 B, t0 C, t0 D;
|
||||
set session sort_buffer_size= 33*1024;
|
||||
select count(*) from t1 where f12 =
|
||||
(select f22 from t2 where f22 = f12 order by f21 desc, f22, f23 limit 1);
|
||||
count(*)
|
||||
3
|
||||
drop table t1,t2;
|
||||
drop table t0,t1,t2;
|
||||
CREATE TABLE t4 (
|
||||
f7 varchar(32) collate utf8_bin NOT NULL default '',
|
||||
f10 varchar(32) collate utf8_bin default NULL,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
drop table if exists t0, t1, t2, t3, t4, t5;
|
||||
drop table if exists t0, t1, t2, t3, t4, t5, t11, t12, t21, t22;
|
||||
create table t1 (oref int, grp int, ie int) ;
|
||||
insert into t1 (oref, grp, ie) values
|
||||
(1, 1, 1),
|
||||
@@ -779,6 +779,15 @@ SELECT 1 FROM t1 WHERE t1.a NOT IN (SELECT 1 FROM t1, t2 WHERE 0);
|
||||
1
|
||||
1
|
||||
DROP TABLE t1, t2;
|
||||
create table t1 (a int, b decimal(13, 3));
|
||||
insert into t1 values (1, 0.123);
|
||||
select a, (select max(b) from t1) into outfile "subselect.out.file.1" from t1;
|
||||
delete from t1;
|
||||
load data infile "subselect.out.file.1" into table t1;
|
||||
select * from t1;
|
||||
a b
|
||||
1 0.123
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (
|
||||
pk INT PRIMARY KEY,
|
||||
int_key INT,
|
||||
@@ -864,11 +873,18 @@ Level Code Message
|
||||
Note 1276 Field or reference 'test.t1.a' of SELECT #3 was resolved in SELECT #2
|
||||
Note 1276 Field or reference 'test.t1.c' of SELECT #3 was resolved in SELECT #2
|
||||
Error 1054 Unknown column 'c' in 'field list'
|
||||
Note 1003 select `c` AS `c` from (select (select count(`test`.`t1`.`a`) AS `COUNT(a)` from (select count(`test`.`t1`.`b`) AS `COUNT(b)` from `test`.`t1`) `x` group by `t1`.`c`) AS `(SELECT COUNT(a) FROM
|
||||
Note 1003 select `c` AS `c` from (select (select count(`test`.`t1`.`a`) AS `COUNT(a)` from dual group by `c`) AS `(SELECT COUNT(a) FROM
|
||||
(SELECT COUNT(b) FROM t1) AS x GROUP BY c
|
||||
)` from `test`.`t1` group by `test`.`t1`.`b`) `y`
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests
|
||||
#
|
||||
# BUG#36896: Server crash on SELECT FROM DUAL
|
||||
#
|
||||
create table t1 (a int);
|
||||
select 1 as res from dual where (1) in (select * from t1);
|
||||
res
|
||||
drop table t1;
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1 (
|
||||
@@ -895,3 +911,497 @@ t1.a < (select t4.a+10
|
||||
from t4, t5 limit 2));
|
||||
ERROR 21000: Subquery returns more than 1 row
|
||||
drop table t0, t1, t2, t3, t4, t5;
|
||||
#
|
||||
# BUG#48177 - SELECTs with NOT IN subqueries containing NULL
|
||||
# values return too many records
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
i1 int DEFAULT NULL,
|
||||
i2 int DEFAULT NULL
|
||||
) ;
|
||||
INSERT INTO t1 VALUES (1, NULL);
|
||||
INSERT INTO t1 VALUES (2, 3);
|
||||
INSERT INTO t1 VALUES (4, NULL);
|
||||
INSERT INTO t1 VALUES (4, 0);
|
||||
INSERT INTO t1 VALUES (NULL, NULL);
|
||||
CREATE TABLE t2 (
|
||||
i1 int DEFAULT NULL,
|
||||
i2 int DEFAULT NULL
|
||||
) ;
|
||||
INSERT INTO t2 VALUES (4, NULL);
|
||||
INSERT INTO t2 VALUES (5, 0);
|
||||
|
||||
Data in t1
|
||||
SELECT i1, i2 FROM t1;
|
||||
i1 i2
|
||||
1 NULL
|
||||
2 3
|
||||
4 NULL
|
||||
4 0
|
||||
NULL NULL
|
||||
|
||||
Data in subquery (should be filtered out)
|
||||
SELECT i1, i2 FROM t2 ORDER BY i1;
|
||||
i1 i2
|
||||
4 NULL
|
||||
5 0
|
||||
FLUSH STATUS;
|
||||
|
||||
SELECT i1, i2
|
||||
FROM t1
|
||||
WHERE (i1, i2)
|
||||
NOT IN (SELECT i1, i2 FROM t2);
|
||||
i1 i2
|
||||
1 NULL
|
||||
2 3
|
||||
|
||||
# Check that the subquery only has to be evaluated once
|
||||
# for all-NULL values even though there are two (NULL,NULL) records
|
||||
# Baseline:
|
||||
SHOW STATUS LIKE '%Handler_read_rnd_next';
|
||||
Variable_name Value
|
||||
Handler_read_rnd_next 17
|
||||
|
||||
INSERT INTO t1 VALUES (NULL, NULL);
|
||||
FLUSH STATUS;
|
||||
|
||||
SELECT i1, i2
|
||||
FROM t1
|
||||
WHERE (i1, i2)
|
||||
NOT IN (SELECT i1, i2 FROM t2);
|
||||
i1 i2
|
||||
1 NULL
|
||||
2 3
|
||||
|
||||
# Handler_read_rnd_next should be one more than baseline
|
||||
# (read record from t1, but do not read from t2)
|
||||
SHOW STATUS LIKE '%Handler_read_rnd_next';
|
||||
Variable_name Value
|
||||
Handler_read_rnd_next 18
|
||||
DROP TABLE t1,t2;
|
||||
End of 5.1 tests
|
||||
CREATE TABLE t1 (
|
||||
a int(11) NOT NULL,
|
||||
b int(11) NOT NULL,
|
||||
c datetime default NULL,
|
||||
PRIMARY KEY (a),
|
||||
KEY idx_bc (b,c)
|
||||
);
|
||||
INSERT INTO t1 VALUES
|
||||
(406989,67,'2006-02-23 17:08:46'), (150078,67,'2005-10-26 11:17:45'),
|
||||
(406993,67,'2006-02-27 11:20:57'), (245655,67,'2005-12-08 15:59:08'),
|
||||
(406994,67,'2006-02-27 11:26:46'), (256,67,NULL),
|
||||
(398341,67,'2006-02-20 04:48:44'), (254,67,NULL),(1120,67,NULL),
|
||||
(406988,67,'2006-02-23 17:07:22'), (255,67,NULL),
|
||||
(398340,67,'2006-02-20 04:38:53'),(406631,67,'2006-02-23 10:49:42'),
|
||||
(245653,67,'2005-12-08 15:59:07'),(406992,67,'2006-02-24 16:47:18'),
|
||||
(245654,67,'2005-12-08 15:59:08'),(406995,67,'2006-02-28 11:55:00'),
|
||||
(127261,67,'2005-10-13 12:17:58'),(406991,67,'2006-02-24 16:42:32'),
|
||||
(245652,67,'2005-12-08 15:58:27'),(398545,67,'2006-02-20 04:53:13'),
|
||||
(154504,67,'2005-10-28 11:53:01'),(9199,67,NULL),(1,67,'2006-02-23 15:01:35'),
|
||||
(223456,67,NULL),(4101,67,NULL),(1133,67,NULL),
|
||||
(406990,67,'2006-02-23 18:01:45'),(148815,67,'2005-10-25 15:34:17'),
|
||||
(148812,67,'2005-10-25 15:30:01'),(245651,67,'2005-12-08 15:58:27'),
|
||||
(154503,67,'2005-10-28 11:52:38');
|
||||
create table t11 select * from t1 where b = 67 AND (c IS NULL OR c > NOW()) order by 3 asc;
|
||||
create table t12 select * from t1 where b = 67 AND (c IS NULL OR c > NOW()) order by 3 desc;
|
||||
create table t21 select * from t1 where b = 67 AND (c IS NULL OR c > '2005-12-08') order by 3 asc;
|
||||
create table t22 select * from t1 where b = 67 AND (c IS NULL OR c > '2005-12-08') order by 3 desc;
|
||||
update t22 set c = '2005-12-08 15:58:27' where a = 255;
|
||||
explain select t21.* from t21,t22 where t21.a = t22.a and
|
||||
t22.a in (select t12.a from t11, t12 where t11.a in(255,256) and t11.a = t12.a and t11.c is null) and t22.c is null order by t21.a;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t11 ALL NULL NULL NULL NULL 8 Using where; Using temporary; Using filesort; Start materialize; Scan
|
||||
1 PRIMARY t12 ALL NULL NULL NULL NULL 8 Using where; End materialize; Using join buffer
|
||||
1 PRIMARY t21 ALL NULL NULL NULL NULL 26 Using where; Using join buffer
|
||||
1 PRIMARY t22 ALL NULL NULL NULL NULL 26 Using where; Using join buffer
|
||||
select t21.* from t21,t22 where t21.a = t22.a and
|
||||
t22.a in (select t12.a from t11, t12 where t11.a in(255,256) and t11.a = t12.a and t11.c is null) and t22.c is null order by t21.a;
|
||||
a b c
|
||||
256 67 NULL
|
||||
drop table t1, t11, t12, t21, t22;
|
||||
create table t1(a int);
|
||||
insert into t1 values (0),(1);
|
||||
set @@optimizer_switch='firstmatch=off';
|
||||
explain
|
||||
select (select max(Y.a) from t1 Y where a in (select a from t1 Z) and a < X.a) as subq from t1 X;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY X ALL NULL NULL NULL NULL 2
|
||||
2 DEPENDENT SUBQUERY Y ALL NULL NULL NULL NULL 2 Using where
|
||||
2 DEPENDENT SUBQUERY Z ALL NULL NULL NULL NULL 2 Materialize
|
||||
select (select max(Y.a) from t1 Y where a in (select a from t1 Z) and a < X.a) as subq from t1 X;
|
||||
subq
|
||||
NULL
|
||||
0
|
||||
set @@optimizer_switch=default;
|
||||
drop table t1;
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1 as select * from t0;
|
||||
insert into t1 select a+10 from t0;
|
||||
set @@optimizer_switch='firstmatch=off,materialization=off';
|
||||
insert into t0 values(2);
|
||||
explain select * from t1 where 2 in (select a from t0);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t0 ALL NULL NULL NULL NULL 11 Using where; Start temporary; End temporary
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 20 Using join buffer
|
||||
select * from t1 where 2 in (select a from t0);
|
||||
a
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
10
|
||||
11
|
||||
12
|
||||
13
|
||||
14
|
||||
15
|
||||
16
|
||||
17
|
||||
18
|
||||
19
|
||||
set @@optimizer_switch='default,materialization=off';
|
||||
explain select * from t1 where 2 in (select a from t0);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t0 ALL NULL NULL NULL NULL 11 Using where; FirstMatch
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 20 Using join buffer
|
||||
select * from t1 where 2 in (select a from t0);
|
||||
a
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
10
|
||||
11
|
||||
12
|
||||
13
|
||||
14
|
||||
15
|
||||
16
|
||||
17
|
||||
18
|
||||
19
|
||||
set @@optimizer_switch=default;
|
||||
explain select * from (select a from t0) X where a in (select a from t1);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 11
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 20 Using where; FirstMatch(<derived2>)
|
||||
2 DERIVED t0 ALL NULL NULL NULL NULL 11
|
||||
drop table t0, t1;
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1 (kp1 int, kp2 int, c int, filler char(100), key(kp1, kp2));
|
||||
insert into t1 select A.a+10*(B.a+10*C.a), 0, 0, 'filler' from t0 A, t0 B, t0 C;
|
||||
insert into t1 select * from t1 where kp1 < 20;
|
||||
create table t3 (a int);
|
||||
insert into t3 select A.a + 10*B.a from t0 A, t0 B;
|
||||
explain select * from t3 where a in (select kp1 from t1 where kp1<20);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 range kp1 kp1 5 NULL 48 Using where; Using index; LooseScan
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 100 Using where; Using join buffer
|
||||
create table t4 (pk int primary key);
|
||||
insert into t4 select a from t3;
|
||||
explain select * from t3 where a in (select t1.kp1 from t1,t4 where kp1<20
|
||||
and t4.pk=t1.c);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 range kp1 kp1 5 NULL 48 Using index condition; Using where; Using MRR; LooseScan
|
||||
1 PRIMARY t4 eq_ref PRIMARY PRIMARY 4 test.t1.c 1 Using index; FirstMatch(t1)
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 100 Using where; Using join buffer
|
||||
drop table t1, t3, t4;
|
||||
create table t1 (a int) as select * from t0 where a < 5;
|
||||
set @save_max_heap_table_size=@@max_heap_table_size;
|
||||
set @@optimizer_switch='firstmatch=off,materialization=off';
|
||||
set @@max_heap_table_size= 16384;
|
||||
explain select count(*) from t0 A, t0 B, t0 C, t0 D where D.a in (select a from t1 E);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY E ALL NULL NULL NULL NULL 5 Start temporary
|
||||
1 PRIMARY A ALL NULL NULL NULL NULL 10 Using join buffer
|
||||
1 PRIMARY B ALL NULL NULL NULL NULL 10 Using join buffer
|
||||
1 PRIMARY C ALL NULL NULL NULL NULL 10 Using join buffer
|
||||
1 PRIMARY D ALL NULL NULL NULL NULL 10 Using where; End temporary; Using join buffer
|
||||
flush status;
|
||||
select count(*) from t0 A, t0 B, t0 C, t0 D where D.a in (select a from t1 E);
|
||||
count(*)
|
||||
5000
|
||||
show status like 'Created_tmp_disk_tables';
|
||||
Variable_name Value
|
||||
Created_tmp_disk_tables 1
|
||||
set @save_max_heap_table_size=@@max_heap_table_size;
|
||||
set @@optimizer_switch=default;
|
||||
drop table t0, t1;
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t2(a int);
|
||||
insert into t2 values (1),(2);
|
||||
create table t3 ( a int , filler char(100), key(a));
|
||||
insert into t3 select A.a + 10*B.a, 'filler' from t0 A, t0 B;
|
||||
explain select * from t3 where a in (select a from t2) and (a > 5 or a < 10);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 2 Using where; Materialize; Scan
|
||||
1 PRIMARY t3 ref a a 5 test.t2.a 1
|
||||
select * from t3 where a in (select a from t2);
|
||||
a filler
|
||||
1 filler
|
||||
2 filler
|
||||
drop table t0, t2, t3;
|
||||
set @@optimizer_switch='firstmatch=off,materialization=off';
|
||||
create table t1 (a date);
|
||||
insert into t1 values ('2008-01-01'),('2008-01-01'),('2008-02-01'),('2008-02-01');
|
||||
create table t2 (a int);
|
||||
insert into t2 values (1),(2);
|
||||
create table t3 (a char(10));
|
||||
insert into t3 select * from t1;
|
||||
insert into t3 values (1),(2);
|
||||
explain select * from t2 where a in (select a from t1);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 2 Start temporary
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using where; End temporary; Using join buffer
|
||||
explain select * from t2 where a in (select a from t2);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 2 Start temporary
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 2 Using where; End temporary; Using join buffer
|
||||
explain select * from t2 where a in (select a from t3);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 2 Start temporary
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 6 Using where; End temporary; Using join buffer
|
||||
explain select * from t1 where a in (select a from t3);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Start temporary
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 6 Using where; End temporary; Using join buffer
|
||||
drop table t1, t2, t3;
|
||||
create table t1 (a decimal);
|
||||
insert into t1 values (1),(2);
|
||||
explain select * from t1 where a in (select a from t1);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 2 Start temporary
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 2 Using where; End temporary; Using join buffer
|
||||
drop table t1;
|
||||
set @@optimizer_switch=default;
|
||||
create table t1 (a int);
|
||||
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t2 as select * from t1;
|
||||
create table t3 (a int, b int, filler char(100), key(a));
|
||||
insert into t3 select A.a + 10*B.a, A.a + 10*B.a, 'filler' from t1 A, t1 B, t1 C;
|
||||
explain select * from t1, t3 where t3.a in (select a from t2) and (t3.a < 10 or t3.a >30) and t1.a =3;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 10 Using where
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 10 Using where; Materialize; Scan
|
||||
1 PRIMARY t3 ref a a 5 test.t2.a 10
|
||||
explain select straight_join * from t1 A, t1 B where A.a in (select a from t2);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY A ALL NULL NULL NULL NULL 10 Using where
|
||||
1 PRIMARY B ALL NULL NULL NULL NULL 10 Using join buffer
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 10
|
||||
explain select * from t2 where a in (select straight_join A.a from t1 A, t1 B);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 10 Using where
|
||||
2 SUBQUERY A ALL NULL NULL NULL NULL 10
|
||||
2 SUBQUERY B ALL NULL NULL NULL NULL 10 Using join buffer
|
||||
explain select * from t2 where a in (select straight_join A.a from t1 A, t1 B);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 10 Using where
|
||||
2 SUBQUERY A ALL NULL NULL NULL NULL 10
|
||||
2 SUBQUERY B ALL NULL NULL NULL NULL 10 Using join buffer
|
||||
explain select straight_join * from t2 X, t2 Y
|
||||
where X.a in (select straight_join A.a from t1 A, t1 B);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY X ALL NULL NULL NULL NULL 10 Using where
|
||||
1 PRIMARY Y ALL NULL NULL NULL NULL 10 Using join buffer
|
||||
2 SUBQUERY A ALL NULL NULL NULL NULL 10
|
||||
2 SUBQUERY B ALL NULL NULL NULL NULL 10 Using join buffer
|
||||
create table t0 (a int, b int);
|
||||
insert into t0 values(1,1);
|
||||
explain select * from t0, t3 where t3.a in (select a from t2) and (t3.a < 10 or t3.a >30);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t0 system NULL NULL NULL NULL 1
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 10 Using where; Materialize; Scan
|
||||
1 PRIMARY t3 ref a a 5 test.t2.a 10
|
||||
create table t4 as select a as x, a as y from t1;
|
||||
explain select * from t0, t3 where (t3.a, t3.b) in (select x,y from t4) and (t3.a < 10 or t3.a >30);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t0 system NULL NULL NULL NULL 1
|
||||
1 PRIMARY t4 ALL NULL NULL NULL NULL 10 Using where; Materialize; Scan
|
||||
1 PRIMARY t3 ref a a 5 test.t4.x 10 Using where
|
||||
drop table t0,t1,t2,t3,t4;
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1 (a int, b int, filler char(100), key(a,b));
|
||||
insert into t1 select A.a, B.a, 'filler' from t0 A, t0 B;
|
||||
create table t2 as select * from t1;
|
||||
explain select * from t2 where a in (select b from t1 where a=3);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 range a a 5 NULL 8 Using where; Using index; LooseScan
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 100 Using where; Using join buffer
|
||||
explain select * from t2 where (b,a) in (select a,b from t1 where a=3);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 range a a 5 NULL 8 Using where; Using index; LooseScan
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 100 Using where; Using join buffer
|
||||
drop table t1,t2;
|
||||
create table t1 (a int, b int);
|
||||
insert into t1 select a,a from t0;
|
||||
create table t2 (a int, b int);
|
||||
insert into t2 select A.a + 10*B.a, A.a + 10*B.a from t0 A, t0 B;
|
||||
set @@optimizer_switch='firstmatch=off';
|
||||
explain select * from t1 where (a,b) in (select a,b from t2);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 10
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 100 Materialize
|
||||
set @save_optimizer_search_depth=@@optimizer_search_depth;
|
||||
set @@optimizer_search_depth=63;
|
||||
explain select * from t1 where (a,b) in (select a,b from t2);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 10
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 100 Materialize
|
||||
set @@optimizer_search_depth=@save_optimizer_search_depth;
|
||||
set @@optimizer_switch=default;
|
||||
drop table t0, t1, t2;
|
||||
create table t0 (a decimal(4,2));
|
||||
insert into t0 values (10.24), (22.11);
|
||||
create table t1 as select * from t0;
|
||||
insert into t1 select * from t0;
|
||||
explain select * from t0 where a in (select a from t1);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t0 ALL NULL NULL NULL NULL 2
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using where; FirstMatch(t0)
|
||||
select * from t0 where a in (select a from t1);
|
||||
a
|
||||
10.24
|
||||
22.11
|
||||
drop table t0, t1;
|
||||
create table t0(a date);
|
||||
insert into t0 values ('2008-01-01'),('2008-02-02');
|
||||
create table t1 as select * from t0;
|
||||
insert into t1 select * from t0;
|
||||
explain select * from t0 where a in (select a from t1);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t0 ALL NULL NULL NULL NULL 2
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using where; FirstMatch(t0)
|
||||
select * from t0 where a in (select a from t1);
|
||||
a
|
||||
2008-01-01
|
||||
2008-02-02
|
||||
drop table t0, t1;
|
||||
create table t0(a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1 as select a as a, a as b, a as c from t0 where a < 3;
|
||||
create table t2 as select a as a, a as b from t0 where a < 3;
|
||||
insert into t2 select * from t2;
|
||||
explain select * from t1 where (a,b,c) in (select X.a, Y.a, Z.a from t2 X, t2 Y, t2 Z where X.b=33);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3
|
||||
1 PRIMARY X ALL NULL NULL NULL NULL 6 Using where; Start materialize
|
||||
1 PRIMARY Y ALL NULL NULL NULL NULL 6 Using join buffer
|
||||
1 PRIMARY Z ALL NULL NULL NULL NULL 6 End materialize; Using join buffer
|
||||
drop table t0,t1,t2;
|
||||
|
||||
BUG#37842: Assertion in DsMrr_impl::dsmrr_init, at handler.cc:4307
|
||||
|
||||
CREATE TABLE t1 (
|
||||
`pk` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`int_key` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`pk`),
|
||||
KEY `int_key` (`int_key`)
|
||||
) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (1,9),(2,3),(3,8),(4,6),(5,9),(6,5),(7,5),(8,9),(9,1),(10,10);
|
||||
SELECT `pk` FROM t1 AS OUTR WHERE `int_key` = ALL (
|
||||
SELECT `int_key` FROM t1 AS INNR WHERE INNR . `pk` >= 9
|
||||
);
|
||||
pk
|
||||
DROP TABLE t1;
|
||||
|
||||
BUG#40118 Crash when running Batched Key Access and requiring one match for each key
|
||||
|
||||
create table t0(a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1 (a int, key(a));
|
||||
insert into t1 select * from t0;
|
||||
alter table t1 add b int not null, add filler char(200);
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
set @save_join_cache_level=@@join_cache_level;
|
||||
set join_cache_level=6;
|
||||
select * from t0 where t0.a in (select t1.a from t1 where t1.b=0);
|
||||
a
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
set join_cache_level=@save_join_cache_level;
|
||||
drop table t0, t1;
|
||||
#
|
||||
# BUG#32665 Query with dependent subquery is too slow
|
||||
#
|
||||
create table t1 (
|
||||
idIndividual int primary key
|
||||
);
|
||||
insert into t1 values (1),(2);
|
||||
create table t2 (
|
||||
idContact int primary key,
|
||||
contactType int,
|
||||
idObj int
|
||||
);
|
||||
insert into t2 values (1,1,1),(2,2,2),(3,3,3);
|
||||
create table t3 (
|
||||
idAddress int primary key,
|
||||
idContact int,
|
||||
postalStripped varchar(100)
|
||||
);
|
||||
insert into t3 values (1,1, 'foo'), (2,2,'bar');
|
||||
The following must be converted to a semi-join:
|
||||
explain extended SELECT a.idIndividual FROM t1 a
|
||||
WHERE a.idIndividual IN
|
||||
( SELECT c.idObj FROM t3 cona
|
||||
INNER JOIN t2 c ON c.idContact=cona.idContact
|
||||
WHERE cona.postalStripped='T2H3B2'
|
||||
);
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY cona ALL NULL NULL NULL NULL 2 100.00 Using where; Start materialize; Scan
|
||||
1 PRIMARY c eq_ref PRIMARY PRIMARY 4 test.cona.idContact 1 100.00 End materialize
|
||||
1 PRIMARY a index PRIMARY PRIMARY 4 NULL 2 100.00 Using where; Using index; Using join buffer
|
||||
Warnings:
|
||||
Note 1003 select `test`.`a`.`idIndividual` AS `idIndividual` from `test`.`t1` `a` semi join (`test`.`t3` `cona` join `test`.`t2` `c`) where ((`test`.`c`.`idContact` = `test`.`cona`.`idContact`) and (`test`.`a`.`idIndividual` = `test`.`c`.`idObj`) and (`test`.`cona`.`postalStripped` = 'T2H3B2'))
|
||||
drop table t1,t2,t3;
|
||||
#
|
||||
# BUG#47367 Crash in Name_resolution_context::process_error
|
||||
#
|
||||
SET SESSION optimizer_switch = 'default,semijoin=off';
|
||||
CREATE TABLE t1 (f1 INTEGER);
|
||||
CREATE TABLE t2 LIKE t1;
|
||||
CREATE PROCEDURE p1 () BEGIN SELECT f1 FROM t1 WHERE f1 IN (SELECT f1 FROM t2); END|
|
||||
CALL p1;
|
||||
f1
|
||||
ALTER TABLE t2 CHANGE COLUMN f1 my_column INT;
|
||||
CALL p1;
|
||||
f1
|
||||
DROP PROCEDURE p1;
|
||||
# Restore the original column list of table t2:
|
||||
ALTER TABLE t2 CHANGE COLUMN my_column f1 INT;
|
||||
SET SESSION optimizer_switch = 'semijoin=on';
|
||||
# Recreate procedure so that we eliminate any caching effects
|
||||
CREATE PROCEDURE p1 () BEGIN SELECT f1 FROM t1 WHERE f1 IN (SELECT f1 FROM t2); END|
|
||||
CALL p1;
|
||||
f1
|
||||
ALTER TABLE t2 CHANGE COLUMN f1 my_column INT;
|
||||
CALL p1;
|
||||
ERROR 42S22: Unknown column 'f1' in 'where clause'
|
||||
DROP PROCEDURE p1;
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
1416
mysql-test/r/subselect3_jcl6.result
Normal file
1416
mysql-test/r/subselect3_jcl6.result
Normal file
File diff suppressed because it is too large
Load Diff
347
mysql-test/r/subselect4.result
Normal file
347
mysql-test/r/subselect4.result
Normal file
@@ -0,0 +1,347 @@
|
||||
#
|
||||
# Bug #46791: Assertion failed:(table->key_read==0),function unknown
|
||||
# function,file sql_base.cc
|
||||
#
|
||||
CREATE TABLE t1 (a INT, b INT, KEY(a));
|
||||
INSERT INTO t1 VALUES (1,1),(2,2);
|
||||
CREATE TABLE t2 LIKE t1;
|
||||
INSERT INTO t2 VALUES (1,1),(2,2);
|
||||
CREATE TABLE t3 LIKE t1;
|
||||
# should have 1 impossible where and 2 dependent subqueries
|
||||
EXPLAIN
|
||||
SELECT 1 FROM t1
|
||||
WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE 1 = (SELECT MIN(t2.b) FROM t3))
|
||||
ORDER BY count(*);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 index NULL a 5 NULL 2 Using index; Using temporary
|
||||
2 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 2 Using where
|
||||
3 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL no matching row in const table
|
||||
# should not crash the next statement
|
||||
SELECT 1 FROM t1
|
||||
WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE 1 = (SELECT MIN(t2.b) FROM t3))
|
||||
ORDER BY count(*);
|
||||
1
|
||||
1
|
||||
# should not crash: the crash is caused by the previous statement
|
||||
SELECT 1;
|
||||
1
|
||||
1
|
||||
DROP TABLE t1,t2,t3;
|
||||
#
|
||||
# Bug #47106: Crash / segfault on adding EXPLAIN to a non-crashing
|
||||
# query
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
a INT,
|
||||
b INT,
|
||||
PRIMARY KEY (a),
|
||||
KEY b (b)
|
||||
);
|
||||
INSERT INTO t1 VALUES (1, 1), (2, 1);
|
||||
CREATE TABLE t2 LIKE t1;
|
||||
INSERT INTO t2 SELECT * FROM t1;
|
||||
CREATE TABLE t3 LIKE t1;
|
||||
INSERT INTO t3 SELECT * FROM t1;
|
||||
# Should not crash.
|
||||
# Should have 1 impossible where and 2 dependent subqs.
|
||||
EXPLAIN
|
||||
SELECT
|
||||
(SELECT 1 FROM t1,t2 WHERE t2.b > t3.b)
|
||||
FROM t3 WHERE 1 = 0 GROUP BY 1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||
2 DEPENDENT SUBQUERY t1 index NULL PRIMARY 4 NULL 2 Using index
|
||||
2 DEPENDENT SUBQUERY t2 index b b 5 NULL 2 Using where; Using index; Using join buffer
|
||||
# should return 0 rows
|
||||
SELECT
|
||||
(SELECT 1 FROM t1,t2 WHERE t2.b > t3.b)
|
||||
FROM t3 WHERE 1 = 0 GROUP BY 1;
|
||||
(SELECT 1 FROM t1,t2 WHERE t2.b > t3.b)
|
||||
DROP TABLE t1,t2,t3;
|
||||
End of 5.0 tests.
|
||||
#
|
||||
# BUG#46743 "Azalea processing correlated, aggregate SELECT
|
||||
# subqueries incorrectly"
|
||||
#
|
||||
CREATE TABLE t1 (c int);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
CREATE TABLE t2 (d int , KEY (d));
|
||||
INSERT INTO t2 VALUES (NULL),(NULL);
|
||||
0 rows in subquery
|
||||
SELECT 1 AS RESULT FROM t2,t1 WHERE d = c;
|
||||
RESULT
|
||||
base query
|
||||
SELECT (SELECT 1 FROM t2 WHERE d = c) AS RESULT FROM t1 ;
|
||||
RESULT
|
||||
NULL
|
||||
EXPLAIN EXTENDED SELECT (SELECT 1 FROM t2 WHERE d = c) AS RESULT FROM t1 ;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t1 system NULL NULL NULL NULL 1 100.00
|
||||
2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
Warnings:
|
||||
Note 1276 Field or reference 'test.t1.c' of SELECT #2 was resolved in SELECT #1
|
||||
Note 1003 select (select 1 AS `1` from `test`.`t2` where (`test`.`t2`.`d` = '0')) AS `RESULT` from dual
|
||||
first equivalent variant
|
||||
SELECT (SELECT 1 FROM t2 WHERE d = IFNULL(c,NULL)) AS RESULT FROM t1 GROUP BY c ;
|
||||
RESULT
|
||||
NULL
|
||||
EXPLAIN EXTENDED SELECT (SELECT 1 FROM t2 WHERE d = IFNULL(c,NULL)) AS RESULT FROM t1 GROUP BY c;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t1 system NULL NULL NULL NULL 1 100.00
|
||||
2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
Warnings:
|
||||
Note 1276 Field or reference 'test.t1.c' of SELECT #2 was resolved in SELECT #1
|
||||
Note 1003 select (select 1 AS `1` from `test`.`t2` where (`test`.`t2`.`d` = ifnull('0',NULL))) AS `RESULT` from dual group by '0'
|
||||
second equivalent variant
|
||||
SELECT (SELECT 1 FROM t2 WHERE d = c) AS RESULT FROM t1 GROUP BY c ;
|
||||
RESULT
|
||||
NULL
|
||||
EXPLAIN EXTENDED SELECT (SELECT 1 FROM t2 WHERE d = c) AS RESULT FROM t1 GROUP BY c ;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t1 system NULL NULL NULL NULL 1 100.00
|
||||
2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
Warnings:
|
||||
Note 1276 Field or reference 'test.t1.c' of SELECT #2 was resolved in SELECT #1
|
||||
Note 1003 select (select 1 AS `1` from `test`.`t2` where (`test`.`t2`.`d` = '0')) AS `RESULT` from dual group by '0'
|
||||
DROP TABLE t1,t2;
|
||||
#
|
||||
# BUG#45928 "Differing query results depending on MRR and
|
||||
# engine_condition_pushdown settings"
|
||||
#
|
||||
CREATE TABLE `t1` (
|
||||
`pk` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`time_nokey` time NOT NULL,
|
||||
`varchar_key` varchar(1) NOT NULL,
|
||||
`varchar_nokey` varchar(1) NOT NULL,
|
||||
PRIMARY KEY (`pk`),
|
||||
KEY `varchar_key` (`varchar_key`)
|
||||
) AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;
|
||||
INSERT INTO `t1` VALUES (10,'00:00:00','i','i'),(11,'00:00:00','','');
|
||||
set @old_optimizer_switch = @@session.optimizer_switch,
|
||||
@old_optimizer_use_mrr = @@session.optimizer_use_mrr,
|
||||
@old_engine_condition_pushdown = @@session.engine_condition_pushdown;
|
||||
SET SESSION OPTIMIZER_SWITCH = 'materialization=off,semijoin=off,loosescan=off,firstmatch=off';
|
||||
SET SESSION optimizer_use_mrr = 'force';
|
||||
SET SESSION engine_condition_pushdown = 1;
|
||||
SELECT `time_nokey` G1 FROM t1 WHERE ( `varchar_nokey` , `varchar_key` ) IN (
|
||||
SELECT `varchar_nokey` , `varchar_nokey` ) AND `varchar_key` >= 'c' HAVING G1 ORDER
|
||||
BY `pk` ;
|
||||
G1
|
||||
set @@session.optimizer_switch = @old_optimizer_switch,
|
||||
@@session.optimizer_use_mrr = @old_optimizer_use_mrr,
|
||||
@@session.engine_condition_pushdown = @old_engine_condition_pushdown;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# BUG#45863 "Assertion failed: (fixed == 0), function fix_fields(),
|
||||
# file item.cc, line 4448"
|
||||
#
|
||||
DROP TABLE IF EXISTS C, BB;
|
||||
CREATE TABLE C (
|
||||
varchar_nokey varchar(1) NOT NULL
|
||||
);
|
||||
INSERT INTO C VALUES
|
||||
('k'),('a'),(''),('u'),('e'),('v'),('i'),
|
||||
('t'),('u'),('f'),('u'),('m'),('j'),('f'),
|
||||
('v'),('j'),('g'),('e'),('h'),('z');
|
||||
CREATE TABLE BB (
|
||||
varchar_nokey varchar(1) NOT NULL
|
||||
);
|
||||
INSERT INTO BB VALUES ('i'),('t');
|
||||
SELECT varchar_nokey FROM C
|
||||
WHERE (varchar_nokey, OUTR) IN (SELECT varchar_nokey
|
||||
FROM BB);
|
||||
ERROR 21000: Operand should contain 2 column(s)
|
||||
SELECT varchar_nokey FROM C
|
||||
WHERE (varchar_nokey, OUTR) IN (SELECT varchar_nokey, varchar_nokey
|
||||
FROM BB);
|
||||
ERROR 42S22: Unknown column 'OUTR' in 'IN/ALL/ANY subquery'
|
||||
DROP TABLE C,BB;
|
||||
#
|
||||
# During work with BUG#45863 I had problems with a query that was
|
||||
# optimized differently in regular and prepared mode.
|
||||
# Because there was a bug in one of the selected strategies, I became
|
||||
# aware of the problem. Adding an EXPLAIN query to catch this.
|
||||
DROP TABLE IF EXISTS t1, t2, t3;
|
||||
CREATE TABLE t1
|
||||
(EMPNUM CHAR(3) NOT NULL,
|
||||
EMPNAME CHAR(20),
|
||||
GRADE DECIMAL(4),
|
||||
CITY CHAR(15));
|
||||
CREATE TABLE t2
|
||||
(PNUM CHAR(3) NOT NULL,
|
||||
PNAME CHAR(20),
|
||||
PTYPE CHAR(6),
|
||||
BUDGET DECIMAL(9),
|
||||
CITY CHAR(15));
|
||||
CREATE TABLE t3
|
||||
(EMPNUM CHAR(3) NOT NULL,
|
||||
PNUM CHAR(3) NOT NULL,
|
||||
HOURS DECIMAL(5));
|
||||
INSERT INTO t1 VALUES ('E1','Alice',12,'Deale');
|
||||
INSERT INTO t1 VALUES ('E2','Betty',10,'Vienna');
|
||||
INSERT INTO t1 VALUES ('E3','Carmen',13,'Vienna');
|
||||
INSERT INTO t1 VALUES ('E4','Don',12,'Deale');
|
||||
INSERT INTO t1 VALUES ('E5','Ed',13,'Akron');
|
||||
INSERT INTO t2 VALUES ('P1','MXSS','Design',10000,'Deale');
|
||||
INSERT INTO t2 VALUES ('P2','CALM','Code',30000,'Vienna');
|
||||
INSERT INTO t2 VALUES ('P3','SDP','Test',30000,'Tampa');
|
||||
INSERT INTO t2 VALUES ('P4','SDP','Design',20000,'Deale');
|
||||
INSERT INTO t2 VALUES ('P5','IRM','Test',10000,'Vienna');
|
||||
INSERT INTO t2 VALUES ('P6','PAYR','Design',50000,'Deale');
|
||||
INSERT INTO t3 VALUES ('E1','P1',40);
|
||||
INSERT INTO t3 VALUES ('E1','P2',20);
|
||||
INSERT INTO t3 VALUES ('E1','P3',80);
|
||||
INSERT INTO t3 VALUES ('E1','P4',20);
|
||||
INSERT INTO t3 VALUES ('E1','P5',12);
|
||||
INSERT INTO t3 VALUES ('E1','P6',12);
|
||||
INSERT INTO t3 VALUES ('E2','P1',40);
|
||||
INSERT INTO t3 VALUES ('E2','P2',80);
|
||||
INSERT INTO t3 VALUES ('E3','P2',20);
|
||||
INSERT INTO t3 VALUES ('E4','P2',20);
|
||||
INSERT INTO t3 VALUES ('E4','P4',40);
|
||||
INSERT INTO t3 VALUES ('E4','P5',80);
|
||||
SET @old_optimizer_switch = @@session.optimizer_switch;
|
||||
SET @old_join_cache_level = @@session.join_cache_level;
|
||||
SET SESSION optimizer_switch = 'firstmatch=on,loosescan=on,materialization=on,semijoin=on';
|
||||
SET SESSION join_cache_level = 1;
|
||||
CREATE UNIQUE INDEX t1_IDX ON t1(EMPNUM);
|
||||
EXPLAIN SELECT EMPNAME
|
||||
FROM t1
|
||||
WHERE EMPNUM IN
|
||||
(SELECT EMPNUM
|
||||
FROM t3
|
||||
WHERE PNUM IN
|
||||
(SELECT PNUM
|
||||
FROM t2
|
||||
WHERE PTYPE = 'Design'));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL t1_IDX NULL NULL NULL 5
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 6 Using where; Start materialize
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 12 Using where; End materialize; Using join buffer
|
||||
PREPARE stmt FROM "EXPLAIN SELECT EMPNAME
|
||||
FROM t1
|
||||
WHERE EMPNUM IN
|
||||
(SELECT EMPNUM
|
||||
FROM t3
|
||||
WHERE PNUM IN
|
||||
(SELECT PNUM
|
||||
FROM t2
|
||||
WHERE PTYPE = 'Design'))";
|
||||
EXECUTE stmt;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL t1_IDX NULL NULL NULL 5
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 6 Using where; Start materialize
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 12 Using where; End materialize; Using join buffer
|
||||
EXECUTE stmt;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL t1_IDX NULL NULL NULL 5
|
||||
1 SIMPLE t2 ALL NULL NULL NULL NULL 6 Using where; Start materialize
|
||||
1 SIMPLE t3 ALL NULL NULL NULL NULL 12 Using where; End materialize; Using join buffer
|
||||
DEALLOCATE PREPARE stmt;
|
||||
DROP INDEX t1_IDX ON t1;
|
||||
CREATE INDEX t1_IDX ON t1(EMPNUM);
|
||||
EXPLAIN SELECT EMPNAME
|
||||
FROM t1
|
||||
WHERE EMPNUM IN
|
||||
(SELECT EMPNUM
|
||||
FROM t3
|
||||
WHERE PNUM IN
|
||||
(SELECT PNUM
|
||||
FROM t2
|
||||
WHERE PTYPE = 'Design'));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL t1_IDX NULL NULL NULL 5
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 6 Using where; Start materialize
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 12 Using where; End materialize; Using join buffer
|
||||
PREPARE stmt FROM "EXPLAIN SELECT EMPNAME
|
||||
FROM t1
|
||||
WHERE EMPNUM IN
|
||||
(SELECT EMPNUM
|
||||
FROM t3
|
||||
WHERE PNUM IN
|
||||
(SELECT PNUM
|
||||
FROM t2
|
||||
WHERE PTYPE = 'Design'))";
|
||||
EXECUTE stmt;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL t1_IDX NULL NULL NULL 5
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 6 Using where; Start materialize
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 12 Using where; End materialize; Using join buffer
|
||||
EXECUTE stmt;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL t1_IDX NULL NULL NULL 5
|
||||
1 SIMPLE t2 ALL NULL NULL NULL NULL 6 Using where; Start materialize
|
||||
1 SIMPLE t3 ALL NULL NULL NULL NULL 12 Using where; End materialize; Using join buffer
|
||||
DEALLOCATE PREPARE stmt;
|
||||
DROP INDEX t1_IDX ON t1;
|
||||
EXPLAIN SELECT EMPNAME
|
||||
FROM t1
|
||||
WHERE EMPNUM IN
|
||||
(SELECT EMPNUM
|
||||
FROM t3
|
||||
WHERE PNUM IN
|
||||
(SELECT PNUM
|
||||
FROM t2
|
||||
WHERE PTYPE = 'Design'));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 5
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 6 Using where; Start materialize
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 12 Using where; End materialize; Using join buffer
|
||||
PREPARE stmt FROM "EXPLAIN SELECT EMPNAME
|
||||
FROM t1
|
||||
WHERE EMPNUM IN
|
||||
(SELECT EMPNUM
|
||||
FROM t3
|
||||
WHERE PNUM IN
|
||||
(SELECT PNUM
|
||||
FROM t2
|
||||
WHERE PTYPE = 'Design'))";
|
||||
EXECUTE stmt;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 5
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 6 Using where; Start materialize
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 12 Using where; End materialize; Using join buffer
|
||||
EXECUTE stmt;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 5
|
||||
1 SIMPLE t2 ALL NULL NULL NULL NULL 6 Using where; Start materialize
|
||||
1 SIMPLE t3 ALL NULL NULL NULL NULL 12 Using where; End materialize; Using join buffer
|
||||
DEALLOCATE PREPARE stmt;
|
||||
SET SESSION optimizer_switch = @old_optimizer_switch;
|
||||
SET SESSION join_cache_level = @old_join_cache_level;
|
||||
DROP TABLE t1, t2, t3;
|
||||
#
|
||||
# BUG#45221 Query SELECT pk FROM C WHERE pk IN (SELECT int_key) failing
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
i1_key INT,
|
||||
i2 INT,
|
||||
i3 INT,
|
||||
KEY i1_index (i1_key)
|
||||
);
|
||||
INSERT INTO t1 VALUES (9,1,2), (9,2,1);
|
||||
CREATE TABLE t2 (
|
||||
pk INT NOT NULL,
|
||||
i1 INT,
|
||||
PRIMARY KEY (pk)
|
||||
);
|
||||
INSERT INTO t2 VALUES (9,1);
|
||||
# Enable Index condition pushdown
|
||||
SELECT @old_icp:=@@engine_condition_pushdown;
|
||||
@old_icp:=@@engine_condition_pushdown
|
||||
#
|
||||
SET SESSION engine_condition_pushdown = 'ON';
|
||||
|
||||
SELECT pk
|
||||
FROM t2
|
||||
WHERE
|
||||
pk IN (
|
||||
SELECT i1_key
|
||||
FROM t1
|
||||
WHERE t1.i2 < t1.i3 XOR t2.i1 > 1
|
||||
ORDER BY t1.i2 desc);
|
||||
pk
|
||||
9
|
||||
# Restore old value for Index condition pushdown
|
||||
SET SESSION engine_condition_pushdown=@old_icp;
|
||||
DROP TABLE t1,t2;
|
||||
1221
mysql-test/r/subselect_mat.result
Normal file
1221
mysql-test/r/subselect_mat.result
Normal file
File diff suppressed because it is too large
Load Diff
4787
mysql-test/r/subselect_no_mat.result
Normal file
4787
mysql-test/r/subselect_no_mat.result
Normal file
File diff suppressed because it is too large
Load Diff
4787
mysql-test/r/subselect_no_opts.result
Normal file
4787
mysql-test/r/subselect_no_opts.result
Normal file
File diff suppressed because it is too large
Load Diff
4787
mysql-test/r/subselect_no_semijoin.result
Normal file
4787
mysql-test/r/subselect_no_semijoin.result
Normal file
File diff suppressed because it is too large
Load Diff
114
mysql-test/r/subselect_nulls.result
Normal file
114
mysql-test/r/subselect_nulls.result
Normal file
@@ -0,0 +1,114 @@
|
||||
drop table if exists x1;
|
||||
drop table if exists x2;
|
||||
create table x1(k int primary key, d1 int, d2 int);
|
||||
create table x2(k int primary key, d1 int, d2 int);
|
||||
insert into x1 values
|
||||
(10, 10, 10),
|
||||
(20, 20, 20),
|
||||
(21, 20, null),
|
||||
(30, null, 30),
|
||||
(40, 40, 40);
|
||||
insert into x2 values
|
||||
(10, 10, 10),
|
||||
(20, 20, 20),
|
||||
(21, 20, null),
|
||||
(30, null, 30);
|
||||
select *
|
||||
from x1
|
||||
where (d1, d2) in (select d1, d2
|
||||
from x2);
|
||||
k d1 d2
|
||||
10 10 10
|
||||
20 20 20
|
||||
select *
|
||||
from x1
|
||||
where (d1, d2) in (select d1, d2
|
||||
from x2) is true;
|
||||
k d1 d2
|
||||
10 10 10
|
||||
20 20 20
|
||||
select *
|
||||
from x1
|
||||
where (d1, d2) in (select d1, d2
|
||||
from x2) is false;
|
||||
k d1 d2
|
||||
40 40 40
|
||||
select *
|
||||
from x1
|
||||
where (d1, d2) in (select d1, d2
|
||||
from x2) is unknown;
|
||||
k d1 d2
|
||||
21 20 NULL
|
||||
30 NULL 30
|
||||
select *
|
||||
from x1
|
||||
where d1 in (select d1
|
||||
from x2
|
||||
where x1.d2=x2.d2);
|
||||
k d1 d2
|
||||
10 10 10
|
||||
20 20 20
|
||||
select *
|
||||
from x1
|
||||
where d1 in (select d1
|
||||
from x2
|
||||
where x1.d2=x2.d2) is true;
|
||||
k d1 d2
|
||||
10 10 10
|
||||
20 20 20
|
||||
select *
|
||||
from x1
|
||||
where d1 in (select d1
|
||||
from x2
|
||||
where x1.d2=x2.d2) is false;
|
||||
k d1 d2
|
||||
21 20 NULL
|
||||
40 40 40
|
||||
select *
|
||||
from x1
|
||||
where d1 in (select d1
|
||||
from x2
|
||||
where x1.d2=x2.d2) is unknown;
|
||||
k d1 d2
|
||||
30 NULL 30
|
||||
select *
|
||||
from x1
|
||||
where 1 in (select 1
|
||||
from x2
|
||||
where x1.d1=x2.d1 and x1.d2=x2.d2);
|
||||
k d1 d2
|
||||
10 10 10
|
||||
20 20 20
|
||||
select *
|
||||
from x1
|
||||
where 1 in (select 1
|
||||
from x2
|
||||
where x1.d1=x2.d1 and x1.d2=x2.d2) is true;
|
||||
k d1 d2
|
||||
10 10 10
|
||||
20 20 20
|
||||
select *
|
||||
from x1
|
||||
where 1 in (select 1
|
||||
from x2
|
||||
where x1.d1=x2.d1 and x1.d2=x2.d2) is false;
|
||||
k d1 d2
|
||||
21 20 NULL
|
||||
30 NULL 30
|
||||
40 40 40
|
||||
select *
|
||||
from x1
|
||||
where 1 in (select 1
|
||||
from x2
|
||||
where x1.d1=x2.d1 and x1.d2=x2.d2) is unknown;
|
||||
k d1 d2
|
||||
select *
|
||||
from x1
|
||||
where exists (select *
|
||||
from x2
|
||||
where x1.d1=x2.d1 and x1.d2=x2.d2);
|
||||
k d1 d2
|
||||
10 10 10
|
||||
20 20 20
|
||||
drop table x1;
|
||||
drop table x2;
|
||||
781
mysql-test/r/subselect_sj.result
Normal file
781
mysql-test/r/subselect_sj.result
Normal file
@@ -0,0 +1,781 @@
|
||||
drop table if exists t0, t1, t2, t10, t11, t12;
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1(a int, b int);
|
||||
insert into t1 values (0,0),(1,1),(2,2);
|
||||
create table t2 as select * from t1;
|
||||
create table t11(a int, b int);
|
||||
create table t10 (pk int, a int, primary key(pk));
|
||||
insert into t10 select a,a from t0;
|
||||
create table t12 like t10;
|
||||
insert into t12 select * from t10;
|
||||
Flattened because of dependency, t10=func(t1)
|
||||
explain select * from t1 where a in (select pk from t10);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where
|
||||
1 PRIMARY t10 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using index
|
||||
select * from t1 where a in (select pk from t10);
|
||||
a b
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
||||
A confluent case of dependency
|
||||
explain select * from t1 where a in (select a from t10 where pk=12);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
select * from t1 where a in (select a from t10 where pk=12);
|
||||
a b
|
||||
explain select * from t1 where a in (select a from t10 where pk=9);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t10 const PRIMARY PRIMARY 4 const 1
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where
|
||||
select * from t1 where a in (select a from t10 where pk=9);
|
||||
a b
|
||||
An empty table inside
|
||||
explain select * from t1 where a in (select a from t11);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
select * from t1 where a in (select a from t11);
|
||||
a b
|
||||
explain select * from t1 where a in (select pk from t10) and b in (select pk from t10);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where
|
||||
1 PRIMARY t10 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using index
|
||||
1 PRIMARY t10 eq_ref PRIMARY PRIMARY 4 test.t1.b 1 Using index
|
||||
select * from t1 where a in (select pk from t10) and b in (select pk from t10);
|
||||
a b
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
||||
flattening a nested subquery
|
||||
explain select * from t1 where a in (select pk from t10 where t10.a in (select pk from t12));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where
|
||||
1 PRIMARY t10 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using where
|
||||
1 PRIMARY t12 eq_ref PRIMARY PRIMARY 4 test.t10.a 1 Using index
|
||||
select * from t1 where a in (select pk from t10 where t10.a in (select pk from t12));
|
||||
a b
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
||||
flattening subquery w/ several tables
|
||||
explain extended select * from t1 where a in (select t10.pk from t10, t12 where t12.pk=t10.a);
|
||||
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 t10 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 100.00 Using where
|
||||
1 PRIMARY t12 eq_ref PRIMARY PRIMARY 4 test.t10.a 1 100.00 Using index
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t10` join `test`.`t12` join `test`.`t1` where ((`test`.`t10`.`pk` = `test`.`t1`.`a`) and (`test`.`t12`.`pk` = `test`.`t10`.`a`))
|
||||
subqueries within outer joins go into ON expr.
|
||||
explAin extended
|
||||
select * from t1 left join (t2 A, t2 B) on ( A.A= t1.A And B.A in (select pk from t10));
|
||||
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 A ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
1 PRIMARY B ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 DEPENDENT SUBQUERY t10 unique_suBquery PRIMARY PRIMARY 4 func 1 100.00 Using index
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`A` AS `A`,`test`.`t1`.`B` AS `B`,`test`.`A`.`A` AS `A`,`test`.`A`.`B` AS `B`,`test`.`B`.`A` AS `A`,`test`.`B`.`B` AS `B` from `test`.`t1` left join (`test`.`t2` `A` join `test`.`t2` `B`) on(((`test`.`A`.`A` = `test`.`t1`.`A`) And <in_optimizer>(`test`.`B`.`A`,<exists>(<primAry_index_lookup>(<cAche>(`test`.`B`.`A`) in t10 on PRIMARY))))) where 1
|
||||
t2 should be wrapped into OJ-nest, so we have "t1 LJ (t2 J t10)"
|
||||
explAin extended
|
||||
select * from t1 left join t2 on (t2.A= t1.A And t2.A in (select pk from t10));
|
||||
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 t2 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 DEPENDENT SUBQUERY t10 unique_suBquery PRIMARY PRIMARY 4 func 1 100.00 Using index
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`A` AS `A`,`test`.`t1`.`B` AS `B`,`test`.`t2`.`A` AS `A`,`test`.`t2`.`B` AS `B` from `test`.`t1` left join `test`.`t2` on(((`test`.`t2`.`A` = `test`.`t1`.`A`) And <in_optimizer>(`test`.`t2`.`A`,<exists>(<primAry_index_lookup>(<cAche>(`test`.`t2`.`A`) in t10 on PRIMARY))))) where 1
|
||||
we shouldn't flatten if we're going to get a join of > MAX_TABLES.
|
||||
explain select * from
|
||||
t1 s00, t1 s01, t1 s02, t1 s03, t1 s04,t1 s05,t1 s06,t1 s07,t1 s08,t1 s09,
|
||||
t1 s10, t1 s11, t1 s12, t1 s13, t1 s14,t1 s15,t1 s16,t1 s17,t1 s18,t1 s19,
|
||||
t1 s20, t1 s21, t1 s22, t1 s23, t1 s24,t1 s25,t1 s26,t1 s27,t1 s28,t1 s29,
|
||||
t1 s30, t1 s31, t1 s32, t1 s33, t1 s34,t1 s35,t1 s36,t1 s37,t1 s38,t1 s39,
|
||||
t1 s40, t1 s41, t1 s42, t1 s43, t1 s44,t1 s45,t1 s46,t1 s47,t1 s48,t1 s49
|
||||
where
|
||||
s00.a in (
|
||||
select m00.a from
|
||||
t1 m00, t1 m01, t1 m02, t1 m03, t1 m04,t1 m05,t1 m06,t1 m07,t1 m08,t1 m09,
|
||||
t1 m10, t1 m11, t1 m12, t1 m13, t1 m14,t1 m15,t1 m16,t1 m17,t1 m18,t1 m19
|
||||
);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY s00 ALL NULL NULL NULL NULL 3 Using where
|
||||
1 PRIMARY s01 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s02 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s03 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s04 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s05 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s06 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s07 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s08 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s09 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s10 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s11 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s12 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s13 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s14 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s15 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s16 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s17 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s18 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s19 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s20 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s21 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s22 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s23 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s24 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s25 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s26 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s27 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s28 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s29 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s30 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s31 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s32 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s33 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s34 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s35 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s36 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s37 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s38 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s39 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s40 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s41 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s42 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s43 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s44 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s45 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s46 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s47 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s48 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s49 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m00 ALL NULL NULL NULL NULL 3 Using where
|
||||
2 DEPENDENT SUBQUERY m01 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m02 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m03 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m04 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m05 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m06 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m07 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m08 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m09 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m10 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m11 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m12 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m13 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m14 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m15 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m16 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m17 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m18 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m19 ALL NULL NULL NULL NULL 3 Using where; Using join buffer
|
||||
select * from
|
||||
t1 left join t2 on (t2.a= t1.a and t2.a in (select pk from t10))
|
||||
where t1.a < 5;
|
||||
a b a b
|
||||
0 0 0 0
|
||||
1 1 1 1
|
||||
2 2 2 2
|
||||
prepare s1 from
|
||||
' select * from
|
||||
t1 left join t2 on (t2.a= t1.a and t2.a in (select pk from t10))
|
||||
where t1.a < 5';
|
||||
execute s1;
|
||||
a b a b
|
||||
0 0 0 0
|
||||
1 1 1 1
|
||||
2 2 2 2
|
||||
execute s1;
|
||||
a b a b
|
||||
0 0 0 0
|
||||
1 1 1 1
|
||||
2 2 2 2
|
||||
insert into t1 select (A.a + 10 * B.a),1 from t0 A, t0 B;
|
||||
explain extended select * from t1 where a in (select pk from t10 where pk<3);
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t10 range PRIMARY PRIMARY 4 NULL 4 100.00 Using where; Using index
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 103 100.00 Using where; Using join buffer
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t10` join `test`.`t1` where ((`test`.`t1`.`a` = `test`.`t10`.`pk`) and (`test`.`t10`.`pk` < 3))
|
||||
|
||||
BUG#37120 optimizer_switch allowable values not according to specification
|
||||
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on,table_elimination=on
|
||||
set optimizer_switch='default,materialization=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=on,table_elimination=on
|
||||
set optimizer_switch='default,semijoin=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=off,table_elimination=on
|
||||
set optimizer_switch='default,loosescan=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=on,semijoin=on,table_elimination=on
|
||||
set optimizer_switch='default,semijoin=off,materialization=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=off,table_elimination=on
|
||||
set optimizer_switch='default,materialization=off,semijoin=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=off,table_elimination=on
|
||||
set optimizer_switch='default,semijoin=off,materialization=off,loosescan=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=off,semijoin=off,table_elimination=on
|
||||
set optimizer_switch='default,semijoin=off,loosescan=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=on,semijoin=off,table_elimination=on
|
||||
set optimizer_switch='default,materialization=off,loosescan=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=off,semijoin=on,table_elimination=on
|
||||
set optimizer_switch=default;
|
||||
drop table t0, t1, t2;
|
||||
drop table t10, t11, t12;
|
||||
|
||||
Bug#37899: Wrongly checked optimization prerequisite caused failed
|
||||
assertion.
|
||||
|
||||
CREATE TABLE t1 (
|
||||
`pk` int(11),
|
||||
`varchar_nokey` varchar(5)
|
||||
);
|
||||
INSERT INTO t1 VALUES
|
||||
(1,'qk'),(2,'j'),(3,'aew');
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE varchar_nokey IN (
|
||||
SELECT
|
||||
varchar_nokey
|
||||
FROM
|
||||
t1
|
||||
) XOR pk = 30;
|
||||
pk varchar_nokey
|
||||
1 qk
|
||||
2 j
|
||||
3 aew
|
||||
drop table t1;
|
||||
#
|
||||
# BUG#41842: Semi-join materialization strategy crashes when the upper query has HAVING
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
pk int(11) NOT NULL AUTO_INCREMENT,
|
||||
int_nokey int(11) NOT NULL,
|
||||
time_key time NOT NULL,
|
||||
datetime_key datetime NOT NULL,
|
||||
datetime_nokey datetime NOT NULL,
|
||||
varchar_key varchar(1) NOT NULL,
|
||||
varchar_nokey varchar(1) NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY time_key (time_key),
|
||||
KEY datetime_key (datetime_key),
|
||||
KEY varchar_key (varchar_key)
|
||||
);
|
||||
INSERT INTO t1 VALUES
|
||||
(1,0, '00:16:10','2008-09-03 14:25:40','2008-09-03 14:25:40','h','h'),
|
||||
(2,7, '00:00:00','2001-01-13 00:00:00','2001-01-13 00:00:00','',''),
|
||||
(3,0, '00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','x','x'),
|
||||
(4,2, '16:29:24','2000-10-16 01:39:08','2000-10-16 01:39:08','w','w'),
|
||||
(5,1, '09:23:32','0000-00-00 00:00:00','0000-00-00 00:00:00','p','p'),
|
||||
(6,3, '00:00:00','2007-12-02 00:00:00','2007-12-02 00:00:00','o','o'),
|
||||
(7,3, '00:00:00','2008-09-11 00:00:00','2008-09-11 00:00:00','',''),
|
||||
(8,0, '13:59:04','0000-00-00 00:00:00','0000-00-00 00:00:00','s','s'),
|
||||
(9,7, '09:01:06','0000-00-00 00:00:00','0000-00-00 00:00:00','d','d'),
|
||||
(10,5,'00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','n','n'),
|
||||
(11,0,'21:06:46','0000-00-00 00:00:00','0000-00-00 00:00:00','o','o'),
|
||||
(12,2,'00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','',''),
|
||||
(13,6,'14:45:34','2003-07-28 02:34:08','2003-07-28 02:34:08','w','w'),
|
||||
(14,1,'15:04:12','0000-00-00 00:00:00','0000-00-00 00:00:00','o','o'),
|
||||
(15,0,'00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','x','x'),
|
||||
(16,0,'15:55:23','2004-03-17 00:32:27','2004-03-17 00:32:27','p','p'),
|
||||
(17,1,'16:30:00','2004-12-27 19:20:00','2004-12-27 19:20:00','d','d'),
|
||||
(18,0,'00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','h','h'),
|
||||
(19,0,'14:13:26','2008-11-09 05:53:48','2008-11-09 05:53:48','o','o'),
|
||||
(20,0,'00:00:00','2009-10-11 06:58:04','2009-10-11 06:58:04','k','k');
|
||||
CREATE TABLE t2 (
|
||||
pk int(11) NOT NULL AUTO_INCREMENT,
|
||||
int_nokey int(11) NOT NULL,
|
||||
time_key time NOT NULL,
|
||||
datetime_key datetime NOT NULL,
|
||||
datetime_nokey datetime NOT NULL,
|
||||
varchar_key varchar(1) NOT NULL,
|
||||
varchar_nokey varchar(1) NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY time_key (time_key),
|
||||
KEY datetime_key (datetime_key),
|
||||
KEY varchar_key (varchar_key)
|
||||
);
|
||||
INSERT INTO t2 VALUES
|
||||
(10,0,'19:39:13','0000-00-00 00:00:00','0000-00-00 00:00:00','g','g'),
|
||||
(11,8,'03:43:53','0000-00-00 00:00:00','0000-00-00 00:00:00','b','b');
|
||||
SELECT OUTR.datetime_nokey AS X FROM t1 AS OUTR
|
||||
WHERE
|
||||
OUTR.varchar_nokey IN (SELECT
|
||||
INNR . varchar_nokey AS Y
|
||||
FROM t2 AS INNR
|
||||
WHERE
|
||||
INNR . datetime_key >= INNR . time_key OR
|
||||
INNR . pk = INNR . int_nokey
|
||||
)
|
||||
AND OUTR . varchar_nokey <= 'w'
|
||||
HAVING X > '2012-12-12';
|
||||
X
|
||||
drop table t1, t2;
|
||||
#
|
||||
# Bug#45191: Incorrectly initialized semi-join led to a wrong result.
|
||||
#
|
||||
CREATE TABLE STAFF (EMPNUM CHAR(3) NOT NULL,
|
||||
EMPNAME CHAR(20), GRADE DECIMAL(4), CITY CHAR(15));
|
||||
CREATE TABLE PROJ (PNUM CHAR(3) NOT NULL,
|
||||
PNAME CHAR(20), PTYPE CHAR(6),
|
||||
BUDGET DECIMAL(9),
|
||||
CITY CHAR(15));
|
||||
CREATE TABLE WORKS (EMPNUM CHAR(3) NOT NULL,
|
||||
PNUM CHAR(3) NOT NULL, HOURS DECIMAL(5));
|
||||
INSERT INTO STAFF VALUES ('E1','Alice',12,'Deale');
|
||||
INSERT INTO STAFF VALUES ('E2','Betty',10,'Vienna');
|
||||
INSERT INTO STAFF VALUES ('E3','Carmen',13,'Vienna');
|
||||
INSERT INTO STAFF VALUES ('E4','Don',12,'Deale');
|
||||
INSERT INTO STAFF VALUES ('E5','Ed',13,'Akron');
|
||||
INSERT INTO PROJ VALUES ('P1','MXSS','Design',10000,'Deale');
|
||||
INSERT INTO PROJ VALUES ('P2','CALM','Code',30000,'Vienna');
|
||||
INSERT INTO PROJ VALUES ('P3','SDP','Test',30000,'Tampa');
|
||||
INSERT INTO PROJ VALUES ('P4','SDP','Design',20000,'Deale');
|
||||
INSERT INTO PROJ VALUES ('P5','IRM','Test',10000,'Vienna');
|
||||
INSERT INTO PROJ VALUES ('P6','PAYR','Design',50000,'Deale');
|
||||
INSERT INTO WORKS VALUES ('E1','P1',40);
|
||||
INSERT INTO WORKS VALUES ('E1','P2',20);
|
||||
INSERT INTO WORKS VALUES ('E1','P3',80);
|
||||
INSERT INTO WORKS VALUES ('E1','P4',20);
|
||||
INSERT INTO WORKS VALUES ('E1','P5',12);
|
||||
INSERT INTO WORKS VALUES ('E1','P6',12);
|
||||
INSERT INTO WORKS VALUES ('E2','P1',40);
|
||||
INSERT INTO WORKS VALUES ('E2','P2',80);
|
||||
INSERT INTO WORKS VALUES ('E3','P2',20);
|
||||
INSERT INTO WORKS VALUES ('E4','P2',20);
|
||||
INSERT INTO WORKS VALUES ('E4','P4',40);
|
||||
INSERT INTO WORKS VALUES ('E4','P5',80);
|
||||
set optimizer_switch='default,materialization=off';
|
||||
explain SELECT EMPNUM, EMPNAME
|
||||
FROM STAFF
|
||||
WHERE EMPNUM IN
|
||||
(SELECT EMPNUM FROM WORKS
|
||||
WHERE PNUM IN
|
||||
(SELECT PNUM FROM PROJ));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY STAFF ALL NULL NULL NULL NULL 5
|
||||
1 PRIMARY PROJ ALL NULL NULL NULL NULL 6
|
||||
1 PRIMARY WORKS ALL NULL NULL NULL NULL 12 Using where; FirstMatch(STAFF)
|
||||
SELECT EMPNUM, EMPNAME
|
||||
FROM STAFF
|
||||
WHERE EMPNUM IN
|
||||
(SELECT EMPNUM FROM WORKS
|
||||
WHERE PNUM IN
|
||||
(SELECT PNUM FROM PROJ));
|
||||
EMPNUM EMPNAME
|
||||
E1 Alice
|
||||
E2 Betty
|
||||
E3 Carmen
|
||||
E4 Don
|
||||
set optimizer_switch='default';
|
||||
drop table STAFF,WORKS,PROJ;
|
||||
# End of bug#45191
|
||||
#
|
||||
# Bug#46550 Azalea returning duplicate results for some IN subqueries
|
||||
# w/ semijoin=on
|
||||
#
|
||||
DROP TABLE IF EXISTS t0, t1, t2;
|
||||
CREATE TABLE t0 (
|
||||
int_key int(11) DEFAULT NULL,
|
||||
varchar_key varchar(1) DEFAULT NULL,
|
||||
varchar_nokey varchar(1) DEFAULT NULL,
|
||||
KEY int_key (int_key),
|
||||
KEY varchar_key (varchar_key,int_key)
|
||||
);
|
||||
INSERT INTO t0 VALUES
|
||||
(1,'m','m'),
|
||||
(40,'h','h'),
|
||||
(1,'r','r'),
|
||||
(1,'h','h'),
|
||||
(9,'x','x'),
|
||||
(NULL,'q','q'),
|
||||
(NULL,'k','k'),
|
||||
(7,'l','l'),
|
||||
(182,'k','k'),
|
||||
(202,'a','a'),
|
||||
(7,'x','x'),
|
||||
(6,'j','j'),
|
||||
(119,'z','z'),
|
||||
(4,'d','d'),
|
||||
(5,'h','h'),
|
||||
(1,'u','u'),
|
||||
(3,'q','q'),
|
||||
(7,'a','a'),
|
||||
(3,'e','e'),
|
||||
(6,'l','l');
|
||||
CREATE TABLE t1 (
|
||||
int_key int(11) DEFAULT NULL,
|
||||
varchar_key varchar(1) DEFAULT NULL,
|
||||
varchar_nokey varchar(1) DEFAULT NULL,
|
||||
KEY int_key (int_key),
|
||||
KEY varchar_key (varchar_key,int_key)
|
||||
);
|
||||
INSERT INTO t1 VALUES (7,NULL,NULL),(4,'x','x');
|
||||
CREATE TABLE t2 (
|
||||
int_key int(11) DEFAULT NULL,
|
||||
varchar_key varchar(1) DEFAULT NULL,
|
||||
varchar_nokey varchar(1) DEFAULT NULL,
|
||||
KEY int_key (int_key),
|
||||
KEY varchar_key (varchar_key,int_key)
|
||||
);
|
||||
INSERT INTO t2 VALUES (123,NULL,NULL);
|
||||
SELECT int_key
|
||||
FROM t0
|
||||
WHERE varchar_nokey IN (
|
||||
SELECT t1 .varchar_key from t1
|
||||
);
|
||||
int_key
|
||||
9
|
||||
7
|
||||
SELECT t0.int_key
|
||||
FROM t0
|
||||
WHERE t0.varchar_nokey IN (
|
||||
SELECT t1_1 .varchar_key
|
||||
FROM t1 AS t1_1 JOIN t1 AS t1_2 ON t1_1 .int_key
|
||||
);
|
||||
int_key
|
||||
9
|
||||
7
|
||||
SELECT t0.int_key
|
||||
FROM t0, t2
|
||||
WHERE t0.varchar_nokey IN (
|
||||
SELECT t1_1 .varchar_key
|
||||
FROM t1 AS t1_1 JOIN t1 AS t1_2 ON t1_1 .int_key
|
||||
);
|
||||
int_key
|
||||
9
|
||||
7
|
||||
DROP TABLE t0, t1, t2;
|
||||
# End of bug#46550
|
||||
#
|
||||
# Bug #46744 Crash in optimize_semijoin_nests on empty view
|
||||
# with limit and procedure.
|
||||
#
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
DROP VIEW IF EXISTS v1;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
CREATE TABLE t1 ( f1 int );
|
||||
CREATE TABLE t2 ( f1 int );
|
||||
insert into t2 values (5), (7);
|
||||
CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1 LIMIT 2;
|
||||
create procedure p1()
|
||||
select COUNT(*)
|
||||
FROM v1 WHERE f1 IN
|
||||
(SELECT f1 FROM t2 WHERE f1 = ANY (SELECT f1 FROM v1));
|
||||
SET SESSION optimizer_switch = 'semijoin=on';
|
||||
CALL p1();
|
||||
COUNT(*)
|
||||
0
|
||||
SET SESSION optimizer_switch = 'semijoin=off';
|
||||
CALL p1();
|
||||
COUNT(*)
|
||||
0
|
||||
drop table t1, t2;
|
||||
drop view v1;
|
||||
drop procedure p1;
|
||||
set SESSION optimizer_switch='default';
|
||||
# End of bug#46744
|
||||
|
||||
Bug#46797 "Crash in fix_semijoin_strategies_for_picked_join_order
|
||||
with semijoin=on"
|
||||
|
||||
CREATE TABLE t1 (
|
||||
varchar_key varchar(1) DEFAULT NULL,
|
||||
KEY varchar_key (varchar_key)
|
||||
);
|
||||
CREATE TABLE t2 (
|
||||
varchar_key varchar(1) DEFAULT NULL,
|
||||
KEY varchar_key (varchar_key)
|
||||
);
|
||||
INSERT INTO t2 VALUES
|
||||
(NULL),(NULL),(NULL),(NULL),('a'),('a'),('a'),('b'),('b'),('b'),('b'),('c'),
|
||||
('c'),('c'),('c'),('c'),('c'),('c'),('d'),('d'),('d'),('d'),('d'),('d'),('e'),
|
||||
('e'),('e'),('e'),('e'),('e'),('f'),('f'),('f'),('g'),('g'),('h'),('h'),('h'),
|
||||
('h'),('i'),('j'),('j'),('j'),('k'),('k'),('l'),('l'),('m'),('m'),('m'),('m'),
|
||||
('n'),('n'),('n'),('o'),('o'),('o'),('p'),('p'),('p'),('q'),('q'),('q'),('r'),
|
||||
('r'),('r'),('r'),('s'),('s'),('s'),('s'),('t'),('t'),('t'),('t'),('u'),('u'),
|
||||
('u'),('u'),('v'),('v'),('v'),('v'),('w'),('w'),('w'),('w'),('w'),('w'),('x'),
|
||||
('x'),('x'),('y'),('y'),('y'),('y'),('z'),('z'),('z'),('z');
|
||||
CREATE TABLE t3 (
|
||||
varchar_key varchar(1) DEFAULT NULL,
|
||||
KEY varchar_key (varchar_key)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t3 VALUES
|
||||
(NULL),('c'),('d'),('e'),('f'),('h'),('j'),('k'),('k'),('m'),('m'),('m'),
|
||||
('n'),('o'),('r'),('t'),('t'),('u'),('w'),('y');
|
||||
SELECT varchar_key FROM t3
|
||||
WHERE (SELECT varchar_key FROM t3
|
||||
WHERE (varchar_key,varchar_key)
|
||||
IN (SELECT t1.varchar_key, t2 .varchar_key
|
||||
FROM t1 RIGHT JOIN t2 ON t1.varchar_key
|
||||
)
|
||||
);
|
||||
varchar_key
|
||||
DROP TABLE t1, t2, t3;
|
||||
#
|
||||
# Bug#46556 Returning incorrect, empty results for some IN subqueries
|
||||
# w/semijoin=on
|
||||
#
|
||||
CREATE TABLE t0 (
|
||||
pk INTEGER,
|
||||
vkey VARCHAR(1),
|
||||
vnokey VARCHAR(1),
|
||||
PRIMARY KEY (pk),
|
||||
KEY vkey(vkey)
|
||||
);
|
||||
INSERT INTO t0
|
||||
VALUES (1,'g','g'), (2,'v','v'), (3,'t','t'), (4,'u','u'), (5,'n','n');
|
||||
EXPLAIN EXTENDED SELECT vkey FROM t0 WHERE pk IN
|
||||
(SELECT t1.pk FROM t0 t1 JOIN t0 t2 ON t2.vkey = t1.vnokey);
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t0 ALL PRIMARY NULL NULL NULL 5 100.00
|
||||
1 PRIMARY t1 eq_ref PRIMARY PRIMARY 4 test.t0.pk 1 100.00 Using where
|
||||
1 PRIMARY t2 ref vkey vkey 4 test.t1.vnokey 2 100.00 Using index; FirstMatch(t1)
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t0`.`vkey` AS `vkey` from `test`.`t0` `t1` semi join (`test`.`t0` `t2`) join `test`.`t0` where ((`test`.`t2`.`vkey` = `test`.`t1`.`vnokey`) and (`test`.`t1`.`pk` = `test`.`t0`.`pk`))
|
||||
SELECT vkey FROM t0 WHERE pk IN
|
||||
(SELECT t1.pk FROM t0 t1 JOIN t0 t2 ON t2.vkey = t1.vnokey);
|
||||
vkey
|
||||
g
|
||||
v
|
||||
t
|
||||
u
|
||||
n
|
||||
DROP TABLE t0;
|
||||
# End of bug#46556
|
||||
|
||||
Bug #48073 Subquery on char columns from view crashes Mysql
|
||||
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
DROP VIEW IF EXISTS v1;
|
||||
CREATE TABLE t1 (
|
||||
city VARCHAR(50) NOT NULL,
|
||||
country_id SMALLINT UNSIGNED NOT NULL
|
||||
);
|
||||
INSERT INTO t1 VALUES
|
||||
('Batna',2),
|
||||
('Bchar',2),
|
||||
('Skikda',2),
|
||||
('Tafuna',3),
|
||||
('Algeria',2) ;
|
||||
CREATE TABLE t2 (
|
||||
country_id SMALLINT UNSIGNED NOT NULL,
|
||||
country VARCHAR(50) NOT NULL
|
||||
);
|
||||
INSERT INTO t2 VALUES
|
||||
(2,'Algeria'),
|
||||
(3,'American Samoa') ;
|
||||
CREATE VIEW v1 AS
|
||||
SELECT country_id, country
|
||||
FROM t2
|
||||
WHERE LEFT(country,1) = "A"
|
||||
;
|
||||
SELECT city, country_id
|
||||
FROM t1
|
||||
WHERE city IN (
|
||||
SELECT country
|
||||
FROM t2
|
||||
WHERE LEFT(country, 1) = "A"
|
||||
);
|
||||
city country_id
|
||||
Algeria 2
|
||||
SELECT city, country_id
|
||||
FROM t1
|
||||
WHERE city IN (
|
||||
SELECT country
|
||||
FROM v1
|
||||
);
|
||||
city country_id
|
||||
Algeria 2
|
||||
drop table t1, t2;
|
||||
drop view v1;
|
||||
# End of bug#48073
|
||||
|
||||
Bug#48834: Procedure with view + subquery + semijoin=on
|
||||
crashes on second call.
|
||||
|
||||
SET SESSION optimizer_switch ='semijoin=on';
|
||||
CREATE TABLE t1 ( t1field integer, primary key (t1field));
|
||||
CREATE TABLE t2 ( t2field integer, primary key (t2field));
|
||||
CREATE VIEW v1 AS
|
||||
SELECT t1field as v1field
|
||||
FROM t1 A
|
||||
WHERE A.t1field IN (SELECT t1field FROM t2 );
|
||||
CREATE VIEW v2 AS
|
||||
SELECT t2field as v2field
|
||||
FROM t2 A
|
||||
WHERE A.t2field IN (SELECT t2field FROM t2 );
|
||||
CREATE PROCEDURE p1 ()
|
||||
BEGIN
|
||||
SELECT v1field
|
||||
FROM v1
|
||||
WHERE v1field IN ( SELECT v2field as vf_inner FROM v2 );
|
||||
END|
|
||||
INSERT INTO t1 VALUES (1),(2),(3);
|
||||
INSERT INTO t2 VALUES (2),(3),(4);
|
||||
CALL p1;
|
||||
v1field
|
||||
2
|
||||
3
|
||||
CALL p1;
|
||||
v1field
|
||||
2
|
||||
3
|
||||
DROP TABLE t1,t2;
|
||||
DROP VIEW v1,v2;
|
||||
DROP PROCEDURE p1;
|
||||
set SESSION optimizer_switch='default';
|
||||
# End of BUG#48834
|
||||
|
||||
Bug#49097 subquery with view generates wrong result with
|
||||
non-prepared statement
|
||||
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
DROP VIEW IF EXISTS v1;
|
||||
CREATE TABLE t1 (
|
||||
city VARCHAR(50) NOT NULL,
|
||||
country_id SMALLINT UNSIGNED NOT NULL
|
||||
);
|
||||
INSERT INTO t1 VALUES
|
||||
('Batna',2),
|
||||
('Bchar',2),
|
||||
('Skikda',2),
|
||||
('Tafuna',3),
|
||||
('Algeria',2) ;
|
||||
CREATE TABLE t2 (
|
||||
country_id SMALLINT UNSIGNED NOT NULL,
|
||||
country VARCHAR(50) NOT NULL
|
||||
);
|
||||
INSERT INTO t2 VALUES
|
||||
(2,'Algeria'),
|
||||
(3,'XAmerican Samoa') ;
|
||||
CREATE VIEW v1 AS
|
||||
SELECT country_id, country
|
||||
FROM t2
|
||||
WHERE LEFT(country,1) = "A"
|
||||
;
|
||||
SELECT city, country_id
|
||||
FROM t1
|
||||
WHERE country_id IN (
|
||||
SELECT country_id
|
||||
FROM t2
|
||||
WHERE LEFT(country,1) = "A"
|
||||
);
|
||||
city country_id
|
||||
Batna 2
|
||||
Bchar 2
|
||||
Skikda 2
|
||||
Algeria 2
|
||||
SELECT city, country_id
|
||||
FROM t1
|
||||
WHERE country_id IN (
|
||||
SELECT country_id
|
||||
FROM v1
|
||||
);
|
||||
city country_id
|
||||
Batna 2
|
||||
Bchar 2
|
||||
Skikda 2
|
||||
Algeria 2
|
||||
PREPARE stmt FROM
|
||||
"
|
||||
SELECT city, country_id
|
||||
FROM t1
|
||||
WHERE country_id IN (
|
||||
SELECT country_id
|
||||
FROM v1
|
||||
);
|
||||
";
|
||||
execute stmt;
|
||||
city country_id
|
||||
Batna 2
|
||||
Bchar 2
|
||||
Skikda 2
|
||||
Algeria 2
|
||||
deallocate prepare stmt;
|
||||
drop table t1, t2;
|
||||
drop view v1;
|
||||
# End of Bug#49097
|
||||
#
|
||||
# BUG#38075: Wrong result: rows matching a subquery with outer join not returned
|
||||
#
|
||||
DROP TABLE IF EXISTS ot1, it1, it2;
|
||||
CREATE TABLE it2 (
|
||||
int_key int(11) NOT NULL,
|
||||
datetime_key datetime NOT NULL,
|
||||
KEY int_key (int_key),
|
||||
KEY datetime_key (datetime_key)
|
||||
);
|
||||
INSERT INTO it2 VALUES
|
||||
(5,'2002-04-10 14:25:30'), (0,'0000-00-00 00:00:00'),
|
||||
(0,'2006-09-14 04:01:02'), (4,'0000-00-00 00:00:00'),
|
||||
(8,'0000-00-00 00:00:00'), (5,'0000-00-00 00:00:00'),
|
||||
(9,'0000-00-00 00:00:00'), (8,'2007-04-01 11:04:17'),
|
||||
(1,'0000-00-00 00:00:00'), (7,'2009-01-12 00:00:00'),
|
||||
(0,'2009-06-05 00:00:00'), (3,'2006-02-14 18:06:35'),
|
||||
(5,'2006-02-21 07:08:16'), (0,'0000-00-00 00:00:00'),
|
||||
(7,'0000-00-00 00:00:00'), (0,'0000-00-00 00:00:00'),
|
||||
(0,'2007-02-13 00:00:00'), (1,'0000-00-00 00:00:00'),
|
||||
(0,'0000-00-00 00:00:00'), (1,'2003-08-11 00:00:00');
|
||||
CREATE TABLE ot1 (
|
||||
int_nokey int(11) NOT NULL,
|
||||
int_key int(11) NOT NULL,
|
||||
KEY int_key (int_key)
|
||||
);
|
||||
INSERT INTO ot1 VALUES
|
||||
(5,0), (3,0), (0,2), (3,0), (1,3), (0,0), (1,7), (7,0), (1,7), (0,7),
|
||||
(0,9), (8,2), (4,4), (9,3), (0,9), (2,5), (0,5), (8,0), (5,8), (1,5);
|
||||
CREATE TABLE it1 (
|
||||
int_nokey int(11) NOT NULL,
|
||||
int_key int(11) NOT NULL,
|
||||
KEY int_key (int_key)
|
||||
);
|
||||
INSERT INTO it1 VALUES
|
||||
(9,5), (0,4);
|
||||
SELECT int_key FROM ot1
|
||||
WHERE int_nokey IN (SELECT it2.int_key
|
||||
FROM it1 LEFT JOIN it2 ON it2.datetime_key);
|
||||
int_key
|
||||
0
|
||||
0
|
||||
2
|
||||
0
|
||||
3
|
||||
0
|
||||
7
|
||||
0
|
||||
7
|
||||
7
|
||||
9
|
||||
2
|
||||
9
|
||||
5
|
||||
0
|
||||
8
|
||||
5
|
||||
EXPLAIN
|
||||
SELECT int_key FROM ot1
|
||||
WHERE int_nokey IN (SELECT it2.int_key
|
||||
FROM it1 LEFT JOIN it2 ON it2.datetime_key);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY it1 index NULL int_key 4 NULL 2 Using index; Start temporary
|
||||
1 PRIMARY ot1 ALL NULL NULL NULL NULL 20 Using join buffer
|
||||
1 PRIMARY it2 ALL NULL NULL NULL NULL 20 Using where; End temporary
|
||||
DROP TABLE ot1, it1, it2;
|
||||
# End of BUG#38075
|
||||
716
mysql-test/r/subselect_sj2.result
Normal file
716
mysql-test/r/subselect_sj2.result
Normal file
@@ -0,0 +1,716 @@
|
||||
drop table if exists t0, t1, t2, t3;
|
||||
drop view if exists v1;
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1 (
|
||||
a int,
|
||||
b int
|
||||
);
|
||||
insert into t1 values (1,1),(1,1),(2,2);
|
||||
create table t2 (
|
||||
a int,
|
||||
b int,
|
||||
key(b)
|
||||
);
|
||||
insert into t2 select a, a/2 from t0;
|
||||
select * from t1;
|
||||
a b
|
||||
1 1
|
||||
1 1
|
||||
2 2
|
||||
select * from t2;
|
||||
a b
|
||||
0 0
|
||||
1 1
|
||||
2 1
|
||||
3 2
|
||||
4 2
|
||||
5 3
|
||||
6 3
|
||||
7 4
|
||||
8 4
|
||||
9 5
|
||||
explain select * from t2 where b in (select a from t1);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where; Materialize; Scan
|
||||
1 PRIMARY t2 ref b b 5 test.t1.a 2
|
||||
select * from t2 where b in (select a from t1);
|
||||
a b
|
||||
1 1
|
||||
2 1
|
||||
3 2
|
||||
4 2
|
||||
create table t3 (
|
||||
a int,
|
||||
b int,
|
||||
key(b),
|
||||
pk1 char(200), pk2 char(200), pk3 char(200),
|
||||
primary key(pk1, pk2, pk3)
|
||||
) engine=innodb;
|
||||
insert into t3 select a,a, a,a,a from t0;
|
||||
explain select * from t3 where b in (select a from t1);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t3 ALL b NULL NULL NULL 10
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where; FirstMatch(t3)
|
||||
select * from t3 where b in (select a from t1);
|
||||
a b pk1 pk2 pk3
|
||||
1 1 1 1 1
|
||||
2 2 2 2 2
|
||||
set @save_max_heap_table_size= @@max_heap_table_size;
|
||||
set max_heap_table_size=16384;
|
||||
set @save_join_buffer_size = @@join_buffer_size;
|
||||
set join_buffer_size= 8000;
|
||||
drop table t3;
|
||||
create table t3 (
|
||||
a int,
|
||||
b int,
|
||||
key(b),
|
||||
pk1 char(200), pk2 char(200),
|
||||
primary key(pk1, pk2)
|
||||
) engine=innodb;
|
||||
insert into t3 select
|
||||
A.a + 10*B.a, A.a + 10*B.a, A.a + 10*B.a, A.a + 10*B.a
|
||||
from t0 A, t0 B where B.a <5;
|
||||
explain select * from t3 where b in (select a from t0);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t0 ALL NULL NULL NULL NULL 10 Using where; Materialize; Scan
|
||||
1 PRIMARY t3 ref b b 5 test.t0.a 1
|
||||
set @save_ecp= @@engine_condition_pushdown;
|
||||
set engine_condition_pushdown=0;
|
||||
select * from t3 where b in (select A.a+B.a from t0 A, t0 B where B.a<5);
|
||||
a b pk1 pk2
|
||||
0 0 0 0
|
||||
1 1 1 1
|
||||
2 2 2 2
|
||||
3 3 3 3
|
||||
4 4 4 4
|
||||
5 5 5 5
|
||||
6 6 6 6
|
||||
7 7 7 7
|
||||
8 8 8 8
|
||||
9 9 9 9
|
||||
10 10 10 10
|
||||
11 11 11 11
|
||||
12 12 12 12
|
||||
13 13 13 13
|
||||
set engine_condition_pushdown=@save_ecp;
|
||||
set join_buffer_size= @save_join_buffer_size;
|
||||
set max_heap_table_size= @save_max_heap_table_size;
|
||||
explain select * from t1 where a in (select b from t2);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3
|
||||
1 PRIMARY t2 index b b 5 NULL 10 Using index; Materialize
|
||||
select * from t1;
|
||||
a b
|
||||
1 1
|
||||
1 1
|
||||
2 2
|
||||
select * from t1 where a in (select b from t2);
|
||||
a b
|
||||
1 1
|
||||
1 1
|
||||
2 2
|
||||
drop table t1, t2, t3;
|
||||
set @save_join_buffer_size = @@join_buffer_size;
|
||||
set join_buffer_size= 8000;
|
||||
create table t1 (a int, filler1 binary(200), filler2 binary(200));
|
||||
insert into t1 select a, 'filler123456', 'filler123456' from t0;
|
||||
insert into t1 select a+10, 'filler123456', 'filler123456' from t0;
|
||||
create table t2 as select * from t1;
|
||||
insert into t1 select a+20, 'filler123456', 'filler123456' from t0;
|
||||
insert into t1 values (2, 'duplicate ok', 'duplicate ok');
|
||||
insert into t1 values (18, 'duplicate ok', 'duplicate ok');
|
||||
insert into t2 values (3, 'duplicate ok', 'duplicate ok');
|
||||
insert into t2 values (19, 'duplicate ok', 'duplicate ok');
|
||||
explain select
|
||||
a, mid(filler1, 1,10), length(filler1)=length(filler2) as Z
|
||||
from t1 ot where a in (select a from t2 it);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY it ALL NULL NULL NULL NULL 22 Materialize; Scan
|
||||
1 PRIMARY ot ALL NULL NULL NULL NULL 32 Using where; Using join buffer
|
||||
select
|
||||
a, mid(filler1, 1,10), length(filler1)=length(filler2) as Z
|
||||
from t1 ot where a in (select a from t2 it);
|
||||
a mid(filler1, 1,10) Z
|
||||
0 filler1234 1
|
||||
1 filler1234 1
|
||||
2 filler1234 1
|
||||
3 filler1234 1
|
||||
4 filler1234 1
|
||||
5 filler1234 1
|
||||
6 filler1234 1
|
||||
7 filler1234 1
|
||||
8 filler1234 1
|
||||
9 filler1234 1
|
||||
10 filler1234 1
|
||||
11 filler1234 1
|
||||
12 filler1234 1
|
||||
13 filler1234 1
|
||||
14 filler1234 1
|
||||
15 filler1234 1
|
||||
16 filler1234 1
|
||||
17 filler1234 1
|
||||
18 filler1234 1
|
||||
19 filler1234 1
|
||||
2 duplicate 1
|
||||
18 duplicate 1
|
||||
explain select
|
||||
a, mid(filler1, 1,10), length(filler1)=length(filler2)
|
||||
from t2 ot where a in (select a from t1 it);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY ot ALL NULL NULL NULL NULL 22
|
||||
1 PRIMARY it ALL NULL NULL NULL NULL 32 Materialize
|
||||
select
|
||||
a, mid(filler1, 1,10), length(filler1)=length(filler2)
|
||||
from t2 ot where a in (select a from t1 it);
|
||||
a mid(filler1, 1,10) length(filler1)=length(filler2)
|
||||
0 filler1234 1
|
||||
1 filler1234 1
|
||||
2 filler1234 1
|
||||
3 filler1234 1
|
||||
4 filler1234 1
|
||||
5 filler1234 1
|
||||
6 filler1234 1
|
||||
7 filler1234 1
|
||||
8 filler1234 1
|
||||
9 filler1234 1
|
||||
10 filler1234 1
|
||||
11 filler1234 1
|
||||
12 filler1234 1
|
||||
13 filler1234 1
|
||||
14 filler1234 1
|
||||
15 filler1234 1
|
||||
16 filler1234 1
|
||||
17 filler1234 1
|
||||
18 filler1234 1
|
||||
19 filler1234 1
|
||||
3 duplicate 1
|
||||
19 duplicate 1
|
||||
insert into t1 select a+20, 'filler123456', 'filler123456' from t0;
|
||||
insert into t1 select a+20, 'filler123456', 'filler123456' from t0;
|
||||
explain select
|
||||
a, mid(filler1, 1,10), length(filler1)=length(filler2) as Z
|
||||
from t1 ot where a in (select a from t2 it);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY it ALL NULL NULL NULL NULL 22 Materialize; Scan
|
||||
1 PRIMARY ot ALL NULL NULL NULL NULL 52 Using where; Using join buffer
|
||||
select
|
||||
a, mid(filler1, 1,10), length(filler1)=length(filler2) as Z
|
||||
from t1 ot where a in (select a from t2 it);
|
||||
a mid(filler1, 1,10) Z
|
||||
0 filler1234 1
|
||||
1 filler1234 1
|
||||
2 filler1234 1
|
||||
3 filler1234 1
|
||||
4 filler1234 1
|
||||
5 filler1234 1
|
||||
6 filler1234 1
|
||||
7 filler1234 1
|
||||
8 filler1234 1
|
||||
9 filler1234 1
|
||||
10 filler1234 1
|
||||
11 filler1234 1
|
||||
12 filler1234 1
|
||||
13 filler1234 1
|
||||
14 filler1234 1
|
||||
15 filler1234 1
|
||||
16 filler1234 1
|
||||
17 filler1234 1
|
||||
18 filler1234 1
|
||||
19 filler1234 1
|
||||
2 duplicate 1
|
||||
18 duplicate 1
|
||||
explain select
|
||||
a, mid(filler1, 1,10), length(filler1)=length(filler2)
|
||||
from t2 ot where a in (select a from t1 it);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY ot ALL NULL NULL NULL NULL 22
|
||||
1 PRIMARY it ALL NULL NULL NULL NULL 52 Materialize
|
||||
select
|
||||
a, mid(filler1, 1,10), length(filler1)=length(filler2)
|
||||
from t2 ot where a in (select a from t1 it);
|
||||
a mid(filler1, 1,10) length(filler1)=length(filler2)
|
||||
0 filler1234 1
|
||||
1 filler1234 1
|
||||
2 filler1234 1
|
||||
3 filler1234 1
|
||||
4 filler1234 1
|
||||
5 filler1234 1
|
||||
6 filler1234 1
|
||||
7 filler1234 1
|
||||
8 filler1234 1
|
||||
9 filler1234 1
|
||||
10 filler1234 1
|
||||
11 filler1234 1
|
||||
12 filler1234 1
|
||||
13 filler1234 1
|
||||
14 filler1234 1
|
||||
15 filler1234 1
|
||||
16 filler1234 1
|
||||
17 filler1234 1
|
||||
18 filler1234 1
|
||||
19 filler1234 1
|
||||
3 duplicate 1
|
||||
19 duplicate 1
|
||||
drop table t1, t2;
|
||||
create table t1 (a int, b int, key(a));
|
||||
create table t2 (a int, b int, key(a));
|
||||
create table t3 (a int, b int, key(a));
|
||||
insert into t1 select a,a from t0;
|
||||
insert into t2 select a,a from t0;
|
||||
insert into t3 select a,a from t0;
|
||||
t2 and t3 must be use 'ref', not 'ALL':
|
||||
explain select *
|
||||
from t0 where a in
|
||||
(select t2.a+t3.a from t1 left join (t2 join t3) on t2.a=t1.a and t3.a=t1.a);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t0 ALL NULL NULL NULL NULL 10
|
||||
1 PRIMARY t1 index NULL a 5 NULL 10 Using index; Start temporary; Using join buffer
|
||||
1 PRIMARY t2 ref a a 5 test.t1.a 1 Using index
|
||||
1 PRIMARY t3 ref a a 5 test.t1.a 1 Using where; Using index; End temporary
|
||||
drop table t0, t1,t2,t3;
|
||||
CREATE TABLE t1 (
|
||||
ID int(11) NOT NULL auto_increment,
|
||||
Name char(35) NOT NULL default '',
|
||||
Country char(3) NOT NULL default '',
|
||||
Population int(11) NOT NULL default '0',
|
||||
PRIMARY KEY (ID),
|
||||
INDEX (Population),
|
||||
INDEX (Country)
|
||||
);
|
||||
CREATE TABLE t2 (
|
||||
Code char(3) NOT NULL default '',
|
||||
Name char(52) NOT NULL default '',
|
||||
SurfaceArea float(10,2) NOT NULL default '0.00',
|
||||
Population int(11) NOT NULL default '0',
|
||||
Capital int(11) default NULL,
|
||||
PRIMARY KEY (Code),
|
||||
UNIQUE INDEX (Name),
|
||||
INDEX (Population)
|
||||
);
|
||||
CREATE TABLE t3 (
|
||||
Country char(3) NOT NULL default '',
|
||||
Language char(30) NOT NULL default '',
|
||||
Percentage float(3,1) NOT NULL default '0.0',
|
||||
PRIMARY KEY (Country, Language),
|
||||
INDEX (Percentage)
|
||||
);
|
||||
EXPLAIN
|
||||
SELECT Name FROM t2
|
||||
WHERE t2.Code IN (SELECT Country FROM t1 WHERE Population > 5000000)
|
||||
AND
|
||||
t2.Code IN (SELECT Country FROM t3
|
||||
WHERE Language='English' AND Percentage > 10 AND
|
||||
t2.Population > 100000);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 range Population,Country Population 4 NULL 1 Using index condition; Using MRR
|
||||
1 PRIMARY t3 eq_ref PRIMARY,Percentage PRIMARY 33 test.t1.Country,const 1 Using index condition; Using where
|
||||
1 PRIMARY t2 eq_ref PRIMARY,Population PRIMARY 3 test.t3.Country 1 Using index condition; Using where
|
||||
DROP TABLE t1,t2,t3;
|
||||
CREATE TABLE t1 (
|
||||
Code char(3) NOT NULL DEFAULT '',
|
||||
Name char(52) NOT NULL DEFAULT '',
|
||||
Continent enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') NOT NULL DEFAULT 'Asia',
|
||||
Region char(26) NOT NULL DEFAULT '',
|
||||
SurfaceArea float(10,2) NOT NULL DEFAULT '0.00',
|
||||
IndepYear smallint(6) DEFAULT NULL,
|
||||
Population int(11) NOT NULL DEFAULT '0',
|
||||
LifeExpectancy float(3,1) DEFAULT NULL,
|
||||
GNP float(10,2) DEFAULT NULL,
|
||||
GNPOld float(10,2) DEFAULT NULL,
|
||||
LocalName char(45) NOT NULL DEFAULT '',
|
||||
GovernmentForm char(45) NOT NULL DEFAULT '',
|
||||
HeadOfState char(60) DEFAULT NULL,
|
||||
Capital int(11) DEFAULT NULL,
|
||||
Code2 char(2) NOT NULL DEFAULT '',
|
||||
PRIMARY KEY (Code)
|
||||
);
|
||||
CREATE TABLE t2 (
|
||||
ID int(11) NOT NULL AUTO_INCREMENT,
|
||||
Name char(35) NOT NULL DEFAULT '',
|
||||
CountryCode char(3) NOT NULL DEFAULT '',
|
||||
District char(20) NOT NULL DEFAULT '',
|
||||
Population int(11) NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (ID),
|
||||
KEY CountryCode (CountryCode)
|
||||
);
|
||||
Fill the table with test data
|
||||
This must not use LooseScan:
|
||||
EXPLAIN SELECT Name FROM t1
|
||||
WHERE t1.Code IN (
|
||||
SELECT t2.CountryCode FROM t2 WHERE Population > 5000000);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL PRIMARY NULL NULL NULL 31
|
||||
1 PRIMARY t2 ALL CountryCode NULL NULL NULL 545 Using where; Materialize
|
||||
SELECT Name FROM t1
|
||||
WHERE t1.Code IN (
|
||||
SELECT t2.CountryCode FROM t2 WHERE Population > 5000000);
|
||||
Name
|
||||
Austria
|
||||
Canada
|
||||
China
|
||||
Czech Republic
|
||||
drop table t1, t2;
|
||||
CREATE TABLE t1(a INT);
|
||||
CREATE TABLE t2(c INT);
|
||||
CREATE PROCEDURE p1(v1 int)
|
||||
BEGIN
|
||||
SELECT 1 FROM t1 WHERE a = v1 AND a IN (SELECT c FROM t2);
|
||||
END
|
||||
//
|
||||
CREATE PROCEDURE p2(v1 int)
|
||||
BEGIN
|
||||
SELECT 1 FROM t1 WHERE a IN (SELECT c FROM t2);
|
||||
END
|
||||
//
|
||||
CREATE PROCEDURE p3(v1 int)
|
||||
BEGIN
|
||||
SELECT 1
|
||||
FROM
|
||||
t1 t01,t1 t02,t1 t03,t1 t04,t1 t05,t1 t06,t1 t07,t1 t08,
|
||||
t1 t09,t1 t10,t1 t11,t1 t12,t1 t13,t1 t14,t1 t15,t1 t16,
|
||||
t1 t17,t1 t18,t1 t19,t1 t20,t1 t21,t1 t22,t1 t23,t1 t24,
|
||||
t1 t25,t1 t26,t1 t27,t1 t28,t1 t29,t1 t30,t1 t31,t1 t32,
|
||||
t1 t33,t1 t34,t1 t35,t1 t36,t1 t37,t1 t38,t1 t39,t1 t40,
|
||||
t1 t41,t1 t42,t1 t43,t1 t44,t1 t45,t1 t46,t1 t47,t1 t48,
|
||||
t1 t49,t1 t50,t1 t51,t1 t52,t1 t53,t1 t54,t1 t55,t1 t56,
|
||||
t1 t57,t1 t58,t1 t59,t1 t60
|
||||
WHERE t01.a IN (SELECT c FROM t2);
|
||||
END
|
||||
//
|
||||
CREATE PROCEDURE p4(v1 int)
|
||||
BEGIN
|
||||
SELECT 1
|
||||
FROM
|
||||
t1 t01,t1 t02,t1 t03,t1 t04,t1 t05,t1 t06,t1 t07,t1 t08,
|
||||
t1 t09,t1 t10,t1 t11,t1 t12,t1 t13,t1 t14,t1 t15,t1 t16,
|
||||
t1 t17,t1 t18,t1 t19,t1 t20,t1 t21,t1 t22,t1 t23,t1 t24,
|
||||
t1 t25,t1 t26,t1 t27,t1 t28,t1 t29,t1 t30,t1 t31,t1 t32,
|
||||
t1 t33,t1 t34,t1 t35,t1 t36,t1 t37,t1 t38,t1 t39,t1 t40,
|
||||
t1 t41,t1 t42,t1 t43,t1 t44,t1 t45,t1 t46,t1 t47,t1 t48,
|
||||
t1 t49,t1 t50,t1 t51,t1 t52,t1 t53,t1 t54,t1 t55,t1 t56,
|
||||
t1 t57,t1 t58,t1 t59,t1 t60
|
||||
WHERE t01.a = v1 AND t01.a IN (SELECT c FROM t2);
|
||||
END
|
||||
//
|
||||
CALL p1(1);
|
||||
1
|
||||
CALL p2(1);
|
||||
1
|
||||
CALL p3(1);
|
||||
1
|
||||
CALL p4(1);
|
||||
1
|
||||
DROP TABLE t1, t2;
|
||||
DROP PROCEDURE p1;
|
||||
DROP PROCEDURE p2;
|
||||
DROP PROCEDURE p3;
|
||||
DROP PROCEDURE p4;
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4);
|
||||
create table t1 (a int, b int, key(a));
|
||||
insert into t1 select a,a from t0;
|
||||
create table t2 (a int, b int, primary key(a));
|
||||
insert into t2 select * from t1;
|
||||
Table t2, unlike table t1, should be displayed as pulled out
|
||||
explain extended select * from t0
|
||||
where t0.a in ( select t1.a from t1,t2 where t2.a=t0.a and
|
||||
t1.b=t2.b);
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t0 ALL NULL NULL NULL NULL 5 100.00 Using where
|
||||
1 PRIMARY t1 ref a a 5 test.t0.a 1 100.00 Start temporary
|
||||
1 PRIMARY t2 eq_ref PRIMARY PRIMARY 4 test.t0.a 1 100.00 Using where; End temporary
|
||||
Warnings:
|
||||
Note 1276 Field or reference 'test.t0.a' of SELECT #2 was resolved in SELECT #1
|
||||
Note 1003 select `test`.`t0`.`a` AS `a` from `test`.`t2` semi join (`test`.`t1`) join `test`.`t0` where ((`test`.`t2`.`b` = `test`.`t1`.`b`) and (`test`.`t1`.`a` = `test`.`t0`.`a`) and (`test`.`t2`.`a` = `test`.`t0`.`a`))
|
||||
update t1 set a=3, b=11 where a=4;
|
||||
update t2 set b=11 where a=3;
|
||||
select * from t0 where t0.a in
|
||||
(select t1.a from t1, t2 where t2.a=t0.a and t1.b=t2.b);
|
||||
a
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
drop table t0, t1, t2;
|
||||
CREATE TABLE t1 (
|
||||
id int(11) NOT NULL,
|
||||
PRIMARY KEY (id));
|
||||
CREATE TABLE t2 (
|
||||
id int(11) NOT NULL,
|
||||
fid int(11) NOT NULL,
|
||||
PRIMARY KEY (id));
|
||||
insert into t1 values(1);
|
||||
insert into t2 values(1,7503),(2,1);
|
||||
explain select count(*)
|
||||
from t1
|
||||
where fid IN (select fid from t2 where (id between 7502 and 8420) order by fid );
|
||||
ERROR 42S22: Unknown column 'fid' in 'IN/ALL/ANY subquery'
|
||||
drop table t1, t2;
|
||||
create table t1 (a int, b int, key (a), key (b));
|
||||
insert into t1 values (2,4),(2,4),(2,4);
|
||||
select t1.a from t1
|
||||
where
|
||||
t1.a in (select 1 from t1 where t1.a in (select 1 from t1) group by t1.a);
|
||||
a
|
||||
drop table t1;
|
||||
create table t1(a int,b int,key(a),key(b));
|
||||
insert into t1 values (1,1),(2,2),(3,3);
|
||||
select 1 from t1
|
||||
where t1.a not in (select 1 from t1
|
||||
where t1.a in (select 1 from t1)
|
||||
group by t1.b);
|
||||
1
|
||||
1
|
||||
1
|
||||
drop table t1;
|
||||
CREATE TABLE t1
|
||||
(EMPNUM CHAR(3) NOT NULL,
|
||||
EMPNAME CHAR(20),
|
||||
GRADE DECIMAL(4),
|
||||
CITY CHAR(15));
|
||||
CREATE TABLE t2
|
||||
(PNUM CHAR(3) NOT NULL,
|
||||
PNAME CHAR(20),
|
||||
PTYPE CHAR(6),
|
||||
BUDGET DECIMAL(9),
|
||||
CITY CHAR(15));
|
||||
CREATE TABLE t3
|
||||
(EMPNUM CHAR(3) NOT NULL,
|
||||
PNUM CHAR(3) NOT NULL,
|
||||
HOURS DECIMAL(5));
|
||||
INSERT INTO t1 VALUES ('E1','Alice',12,'Deale');
|
||||
INSERT INTO t1 VALUES ('E2','Betty',10,'Vienna');
|
||||
INSERT INTO t1 VALUES ('E3','Carmen',13,'Vienna');
|
||||
INSERT INTO t1 VALUES ('E4','Don',12,'Deale');
|
||||
INSERT INTO t1 VALUES ('E5','Ed',13,'Akron');
|
||||
INSERT INTO t2 VALUES ('P1','MXSS','Design',10000,'Deale');
|
||||
INSERT INTO t2 VALUES ('P2','CALM','Code',30000,'Vienna');
|
||||
INSERT INTO t2 VALUES ('P3','SDP','Test',30000,'Tampa');
|
||||
INSERT INTO t2 VALUES ('P4','SDP','Design',20000,'Deale');
|
||||
INSERT INTO t2 VALUES ('P5','IRM','Test',10000,'Vienna');
|
||||
INSERT INTO t2 VALUES ('P6','PAYR','Design',50000,'Deale');
|
||||
INSERT INTO t3 VALUES ('E1','P1',40);
|
||||
INSERT INTO t3 VALUES ('E1','P2',20);
|
||||
INSERT INTO t3 VALUES ('E1','P3',80);
|
||||
INSERT INTO t3 VALUES ('E1','P4',20);
|
||||
INSERT INTO t3 VALUES ('E1','P5',12);
|
||||
INSERT INTO t3 VALUES ('E1','P6',12);
|
||||
INSERT INTO t3 VALUES ('E2','P1',40);
|
||||
INSERT INTO t3 VALUES ('E2','P2',80);
|
||||
INSERT INTO t3 VALUES ('E3','P2',20);
|
||||
INSERT INTO t3 VALUES ('E4','P2',20);
|
||||
INSERT INTO t3 VALUES ('E4','P4',40);
|
||||
INSERT INTO t3 VALUES ('E4','P5',80);
|
||||
SELECT * FROM t1;
|
||||
EMPNUM EMPNAME GRADE CITY
|
||||
E1 Alice 12 Deale
|
||||
E2 Betty 10 Vienna
|
||||
E3 Carmen 13 Vienna
|
||||
E4 Don 12 Deale
|
||||
E5 Ed 13 Akron
|
||||
CREATE UNIQUE INDEX t1_IDX ON t1(EMPNUM);
|
||||
SELECT EMPNAME
|
||||
FROM t1
|
||||
WHERE EMPNUM IN
|
||||
(SELECT EMPNUM
|
||||
FROM t3
|
||||
WHERE PNUM IN
|
||||
(SELECT PNUM
|
||||
FROM t2
|
||||
WHERE PTYPE = 'Design'));
|
||||
EMPNAME
|
||||
Alice
|
||||
Betty
|
||||
Don
|
||||
DROP INDEX t1_IDX ON t1;
|
||||
CREATE INDEX t1_IDX ON t1(EMPNUM);
|
||||
SELECT EMPNAME
|
||||
FROM t1
|
||||
WHERE EMPNUM IN
|
||||
(SELECT EMPNUM
|
||||
FROM t3
|
||||
WHERE PNUM IN
|
||||
(SELECT PNUM
|
||||
FROM t2
|
||||
WHERE PTYPE = 'Design'));
|
||||
EMPNAME
|
||||
Alice
|
||||
Betty
|
||||
Don
|
||||
DROP INDEX t1_IDX ON t1;
|
||||
SELECT EMPNAME
|
||||
FROM t1
|
||||
WHERE EMPNUM IN
|
||||
(SELECT EMPNUM
|
||||
FROM t3
|
||||
WHERE PNUM IN
|
||||
(SELECT PNUM
|
||||
FROM t2
|
||||
WHERE PTYPE = 'Design'));
|
||||
EMPNAME
|
||||
Alice
|
||||
Betty
|
||||
Don
|
||||
DROP TABLE t1, t2, t3;
|
||||
CREATE TABLE t1 (f1 INT NOT NULL);
|
||||
CREATE VIEW v1 (a) AS SELECT f1 IN (SELECT f1 FROM t1) FROM t1;
|
||||
SELECT * FROM v1;
|
||||
a
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1(a int, b int);
|
||||
insert into t1 values (0,0),(1,1),(2,2);
|
||||
create table t2 as select * from t1;
|
||||
create table t3 (pk int, a int, primary key(pk));
|
||||
insert into t3 select a,a from t0;
|
||||
explain
|
||||
select * from t1 left join t2 on (t2.a= t1.a and t2.a in (select pk from t3));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 3 Using where
|
||||
2 DEPENDENT SUBQUERY t3 unique_subquery PRIMARY PRIMARY 4 func 1 Using index
|
||||
drop table t0, t1, t2, t3;
|
||||
create table t1 (a int);
|
||||
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t2 (a char(200), b char(200), c char(200), primary key (a,b,c)) engine=innodb;
|
||||
insert into t2 select concat(a, repeat('X',198)),repeat('B',200),repeat('B',200) from t1;
|
||||
insert into t2 select concat(a, repeat('Y',198)),repeat('B',200),repeat('B',200) from t1;
|
||||
alter table t2 add filler1 int;
|
||||
insert into t1 select A.a + 10*(B.a + 10*C.a) from t1 A, t1 B, t1 C;
|
||||
set @save_join_buffer_size=@@join_buffer_size;
|
||||
set join_buffer_size=1;
|
||||
select * from t2 where filler1 in ( select a from t1);
|
||||
a b c filler1
|
||||
set join_buffer_size=default;
|
||||
drop table t1, t2;
|
||||
create table t1 (a int not null);
|
||||
drop procedure if exists p1;
|
||||
CREATE PROCEDURE p1()
|
||||
BEGIN
|
||||
DECLARE EXIT HANDLER FOR SQLEXCEPTION select a from t1;
|
||||
prepare s1 from '
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in ( select a from t1)
|
||||
)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))';
|
||||
execute s1;
|
||||
END;
|
||||
|
|
||||
call p1();
|
||||
a
|
||||
drop procedure p1;
|
||||
drop table t1;
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1 (a int) as select A.a + 10 *(B.a + 10*C.a) as a from t0 A, t0 B, t0 C;
|
||||
create table t2 (id int, a int, primary key(id), key(a)) as select a as id, a as a from t1;
|
||||
show create table t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`id` int(11) NOT NULL DEFAULT '0',
|
||||
`a` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `a` (`a`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
set @a=0;
|
||||
create table t3 as select * from t2 limit 0;
|
||||
insert into t3 select @a:=@a+1, t2.a from t2, t0;
|
||||
insert into t3 select @a:=@a+1, t2.a from t2, t0;
|
||||
insert into t3 select @a:=@a+1, t2.a from t2, t0;
|
||||
alter table t3 add primary key(id), add key(a);
|
||||
The following must use loose index scan over t3, key a:
|
||||
explain select count(a) from t2 where a in ( SELECT a FROM t3);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t2 index a a 5 NULL 1000 Using index
|
||||
1 PRIMARY t3 index a a 5 NULL 30000 Using index; Materialize
|
||||
select count(a) from t2 where a in ( SELECT a FROM t3);
|
||||
count(a)
|
||||
1000
|
||||
drop table t0,t1,t2,t3;
|
||||
|
||||
BUG#42740: crash in optimize_semijoin_nests
|
||||
|
||||
create table t1 (c6 timestamp,key (c6)) engine=innodb;
|
||||
create table t2 (c2 double) engine=innodb;
|
||||
explain select 1 from t2 where c2 = any (select log10(null) from t1 where c6 <null) ;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
drop table t1, t2;
|
||||
#
|
||||
# BUG#42742: crash in setup_sj_materialization, Copy_field::set
|
||||
#
|
||||
create table t3 ( c1 year) engine=innodb;
|
||||
insert into t3 values (2135),(2142);
|
||||
create table t2 (c1 tinytext,c2 text,c6 timestamp) engine=innodb;
|
||||
# The following must not crash, EXPLAIN should show one SJ strategy, not a mix:
|
||||
explain select 1 from t2 where
|
||||
c2 in (select 1 from t3, t2) and
|
||||
c1 in (select convert(c6,char(1)) from t2);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 1 Using where
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 1
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 1 Using where
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 2 FirstMatch(t2)
|
||||
drop table t2, t3;
|
||||
723
mysql-test/r/subselect_sj2_jcl6.result
Normal file
723
mysql-test/r/subselect_sj2_jcl6.result
Normal file
@@ -0,0 +1,723 @@
|
||||
set join_cache_level=6;
|
||||
show variables like 'join_cache_level';
|
||||
Variable_name Value
|
||||
join_cache_level 6
|
||||
drop table if exists t0, t1, t2, t3;
|
||||
drop view if exists v1;
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1 (
|
||||
a int,
|
||||
b int
|
||||
);
|
||||
insert into t1 values (1,1),(1,1),(2,2);
|
||||
create table t2 (
|
||||
a int,
|
||||
b int,
|
||||
key(b)
|
||||
);
|
||||
insert into t2 select a, a/2 from t0;
|
||||
select * from t1;
|
||||
a b
|
||||
1 1
|
||||
1 1
|
||||
2 2
|
||||
select * from t2;
|
||||
a b
|
||||
0 0
|
||||
1 1
|
||||
2 1
|
||||
3 2
|
||||
4 2
|
||||
5 3
|
||||
6 3
|
||||
7 4
|
||||
8 4
|
||||
9 5
|
||||
explain select * from t2 where b in (select a from t1);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where; Materialize; Scan
|
||||
1 PRIMARY t2 ref b b 5 test.t1.a 2 Using join buffer
|
||||
select * from t2 where b in (select a from t1);
|
||||
a b
|
||||
1 1
|
||||
2 1
|
||||
3 2
|
||||
4 2
|
||||
create table t3 (
|
||||
a int,
|
||||
b int,
|
||||
key(b),
|
||||
pk1 char(200), pk2 char(200), pk3 char(200),
|
||||
primary key(pk1, pk2, pk3)
|
||||
) engine=innodb;
|
||||
insert into t3 select a,a, a,a,a from t0;
|
||||
explain select * from t3 where b in (select a from t1);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t3 ALL b NULL NULL NULL 10
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where; FirstMatch(t3); Using join buffer
|
||||
select * from t3 where b in (select a from t1);
|
||||
a b pk1 pk2 pk3
|
||||
1 1 1 1 1
|
||||
2 2 2 2 2
|
||||
set @save_max_heap_table_size= @@max_heap_table_size;
|
||||
set max_heap_table_size=16384;
|
||||
set @save_join_buffer_size = @@join_buffer_size;
|
||||
set join_buffer_size= 8000;
|
||||
drop table t3;
|
||||
create table t3 (
|
||||
a int,
|
||||
b int,
|
||||
key(b),
|
||||
pk1 char(200), pk2 char(200),
|
||||
primary key(pk1, pk2)
|
||||
) engine=innodb;
|
||||
insert into t3 select
|
||||
A.a + 10*B.a, A.a + 10*B.a, A.a + 10*B.a, A.a + 10*B.a
|
||||
from t0 A, t0 B where B.a <5;
|
||||
explain select * from t3 where b in (select a from t0);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t0 ALL NULL NULL NULL NULL 10 Using where; Materialize; Scan
|
||||
1 PRIMARY t3 ref b b 5 test.t0.a 1
|
||||
set @save_ecp= @@engine_condition_pushdown;
|
||||
set engine_condition_pushdown=0;
|
||||
select * from t3 where b in (select A.a+B.a from t0 A, t0 B where B.a<5);
|
||||
a b pk1 pk2
|
||||
0 0 0 0
|
||||
1 1 1 1
|
||||
2 2 2 2
|
||||
3 3 3 3
|
||||
4 4 4 4
|
||||
5 5 5 5
|
||||
6 6 6 6
|
||||
7 7 7 7
|
||||
8 8 8 8
|
||||
9 9 9 9
|
||||
10 10 10 10
|
||||
11 11 11 11
|
||||
12 12 12 12
|
||||
13 13 13 13
|
||||
set engine_condition_pushdown=@save_ecp;
|
||||
set join_buffer_size= @save_join_buffer_size;
|
||||
set max_heap_table_size= @save_max_heap_table_size;
|
||||
explain select * from t1 where a in (select b from t2);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3
|
||||
1 PRIMARY t2 index b b 5 NULL 10 Using index; Materialize
|
||||
select * from t1;
|
||||
a b
|
||||
1 1
|
||||
1 1
|
||||
2 2
|
||||
select * from t1 where a in (select b from t2);
|
||||
a b
|
||||
1 1
|
||||
1 1
|
||||
2 2
|
||||
drop table t1, t2, t3;
|
||||
set @save_join_buffer_size = @@join_buffer_size;
|
||||
set join_buffer_size= 8000;
|
||||
create table t1 (a int, filler1 binary(200), filler2 binary(200));
|
||||
insert into t1 select a, 'filler123456', 'filler123456' from t0;
|
||||
insert into t1 select a+10, 'filler123456', 'filler123456' from t0;
|
||||
create table t2 as select * from t1;
|
||||
insert into t1 select a+20, 'filler123456', 'filler123456' from t0;
|
||||
insert into t1 values (2, 'duplicate ok', 'duplicate ok');
|
||||
insert into t1 values (18, 'duplicate ok', 'duplicate ok');
|
||||
insert into t2 values (3, 'duplicate ok', 'duplicate ok');
|
||||
insert into t2 values (19, 'duplicate ok', 'duplicate ok');
|
||||
explain select
|
||||
a, mid(filler1, 1,10), length(filler1)=length(filler2) as Z
|
||||
from t1 ot where a in (select a from t2 it);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY it ALL NULL NULL NULL NULL 22 Materialize; Scan
|
||||
1 PRIMARY ot ALL NULL NULL NULL NULL 32 Using where; Using join buffer
|
||||
select
|
||||
a, mid(filler1, 1,10), length(filler1)=length(filler2) as Z
|
||||
from t1 ot where a in (select a from t2 it);
|
||||
a mid(filler1, 1,10) Z
|
||||
0 filler1234 1
|
||||
1 filler1234 1
|
||||
2 filler1234 1
|
||||
3 filler1234 1
|
||||
4 filler1234 1
|
||||
5 filler1234 1
|
||||
6 filler1234 1
|
||||
7 filler1234 1
|
||||
8 filler1234 1
|
||||
9 filler1234 1
|
||||
10 filler1234 1
|
||||
11 filler1234 1
|
||||
12 filler1234 1
|
||||
13 filler1234 1
|
||||
14 filler1234 1
|
||||
15 filler1234 1
|
||||
16 filler1234 1
|
||||
17 filler1234 1
|
||||
18 filler1234 1
|
||||
19 filler1234 1
|
||||
2 duplicate 1
|
||||
18 duplicate 1
|
||||
explain select
|
||||
a, mid(filler1, 1,10), length(filler1)=length(filler2)
|
||||
from t2 ot where a in (select a from t1 it);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY ot ALL NULL NULL NULL NULL 22
|
||||
1 PRIMARY it ALL NULL NULL NULL NULL 32 Materialize
|
||||
select
|
||||
a, mid(filler1, 1,10), length(filler1)=length(filler2)
|
||||
from t2 ot where a in (select a from t1 it);
|
||||
a mid(filler1, 1,10) length(filler1)=length(filler2)
|
||||
0 filler1234 1
|
||||
1 filler1234 1
|
||||
2 filler1234 1
|
||||
3 filler1234 1
|
||||
4 filler1234 1
|
||||
5 filler1234 1
|
||||
6 filler1234 1
|
||||
7 filler1234 1
|
||||
8 filler1234 1
|
||||
9 filler1234 1
|
||||
10 filler1234 1
|
||||
11 filler1234 1
|
||||
12 filler1234 1
|
||||
13 filler1234 1
|
||||
14 filler1234 1
|
||||
15 filler1234 1
|
||||
16 filler1234 1
|
||||
17 filler1234 1
|
||||
18 filler1234 1
|
||||
19 filler1234 1
|
||||
3 duplicate 1
|
||||
19 duplicate 1
|
||||
insert into t1 select a+20, 'filler123456', 'filler123456' from t0;
|
||||
insert into t1 select a+20, 'filler123456', 'filler123456' from t0;
|
||||
explain select
|
||||
a, mid(filler1, 1,10), length(filler1)=length(filler2) as Z
|
||||
from t1 ot where a in (select a from t2 it);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY it ALL NULL NULL NULL NULL 22 Materialize; Scan
|
||||
1 PRIMARY ot ALL NULL NULL NULL NULL 52 Using where; Using join buffer
|
||||
select
|
||||
a, mid(filler1, 1,10), length(filler1)=length(filler2) as Z
|
||||
from t1 ot where a in (select a from t2 it);
|
||||
a mid(filler1, 1,10) Z
|
||||
0 filler1234 1
|
||||
1 filler1234 1
|
||||
2 filler1234 1
|
||||
3 filler1234 1
|
||||
4 filler1234 1
|
||||
5 filler1234 1
|
||||
6 filler1234 1
|
||||
7 filler1234 1
|
||||
8 filler1234 1
|
||||
9 filler1234 1
|
||||
10 filler1234 1
|
||||
11 filler1234 1
|
||||
12 filler1234 1
|
||||
13 filler1234 1
|
||||
14 filler1234 1
|
||||
15 filler1234 1
|
||||
16 filler1234 1
|
||||
17 filler1234 1
|
||||
18 filler1234 1
|
||||
19 filler1234 1
|
||||
2 duplicate 1
|
||||
18 duplicate 1
|
||||
explain select
|
||||
a, mid(filler1, 1,10), length(filler1)=length(filler2)
|
||||
from t2 ot where a in (select a from t1 it);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY ot ALL NULL NULL NULL NULL 22
|
||||
1 PRIMARY it ALL NULL NULL NULL NULL 52 Materialize
|
||||
select
|
||||
a, mid(filler1, 1,10), length(filler1)=length(filler2)
|
||||
from t2 ot where a in (select a from t1 it);
|
||||
a mid(filler1, 1,10) length(filler1)=length(filler2)
|
||||
0 filler1234 1
|
||||
1 filler1234 1
|
||||
2 filler1234 1
|
||||
3 filler1234 1
|
||||
4 filler1234 1
|
||||
5 filler1234 1
|
||||
6 filler1234 1
|
||||
7 filler1234 1
|
||||
8 filler1234 1
|
||||
9 filler1234 1
|
||||
10 filler1234 1
|
||||
11 filler1234 1
|
||||
12 filler1234 1
|
||||
13 filler1234 1
|
||||
14 filler1234 1
|
||||
15 filler1234 1
|
||||
16 filler1234 1
|
||||
17 filler1234 1
|
||||
18 filler1234 1
|
||||
19 filler1234 1
|
||||
3 duplicate 1
|
||||
19 duplicate 1
|
||||
drop table t1, t2;
|
||||
create table t1 (a int, b int, key(a));
|
||||
create table t2 (a int, b int, key(a));
|
||||
create table t3 (a int, b int, key(a));
|
||||
insert into t1 select a,a from t0;
|
||||
insert into t2 select a,a from t0;
|
||||
insert into t3 select a,a from t0;
|
||||
t2 and t3 must be use 'ref', not 'ALL':
|
||||
explain select *
|
||||
from t0 where a in
|
||||
(select t2.a+t3.a from t1 left join (t2 join t3) on t2.a=t1.a and t3.a=t1.a);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t0 ALL NULL NULL NULL NULL 10
|
||||
1 PRIMARY t1 index NULL a 5 NULL 10 Using index; Start temporary; Using join buffer
|
||||
1 PRIMARY t2 ref a a 5 test.t1.a 1 Using index
|
||||
1 PRIMARY t3 ref a a 5 test.t1.a 1 Using where; Using index; End temporary
|
||||
drop table t0, t1,t2,t3;
|
||||
CREATE TABLE t1 (
|
||||
ID int(11) NOT NULL auto_increment,
|
||||
Name char(35) NOT NULL default '',
|
||||
Country char(3) NOT NULL default '',
|
||||
Population int(11) NOT NULL default '0',
|
||||
PRIMARY KEY (ID),
|
||||
INDEX (Population),
|
||||
INDEX (Country)
|
||||
);
|
||||
CREATE TABLE t2 (
|
||||
Code char(3) NOT NULL default '',
|
||||
Name char(52) NOT NULL default '',
|
||||
SurfaceArea float(10,2) NOT NULL default '0.00',
|
||||
Population int(11) NOT NULL default '0',
|
||||
Capital int(11) default NULL,
|
||||
PRIMARY KEY (Code),
|
||||
UNIQUE INDEX (Name),
|
||||
INDEX (Population)
|
||||
);
|
||||
CREATE TABLE t3 (
|
||||
Country char(3) NOT NULL default '',
|
||||
Language char(30) NOT NULL default '',
|
||||
Percentage float(3,1) NOT NULL default '0.0',
|
||||
PRIMARY KEY (Country, Language),
|
||||
INDEX (Percentage)
|
||||
);
|
||||
EXPLAIN
|
||||
SELECT Name FROM t2
|
||||
WHERE t2.Code IN (SELECT Country FROM t1 WHERE Population > 5000000)
|
||||
AND
|
||||
t2.Code IN (SELECT Country FROM t3
|
||||
WHERE Language='English' AND Percentage > 10 AND
|
||||
t2.Population > 100000);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 range Population,Country Population 4 NULL 1 Using index condition; Using MRR
|
||||
1 PRIMARY t3 eq_ref PRIMARY,Percentage PRIMARY 33 test.t1.Country,const 1 Using index condition; Using where; Using join buffer
|
||||
1 PRIMARY t2 eq_ref PRIMARY,Population PRIMARY 3 test.t3.Country 1 Using index condition(BKA); Using where; Using join buffer
|
||||
DROP TABLE t1,t2,t3;
|
||||
CREATE TABLE t1 (
|
||||
Code char(3) NOT NULL DEFAULT '',
|
||||
Name char(52) NOT NULL DEFAULT '',
|
||||
Continent enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') NOT NULL DEFAULT 'Asia',
|
||||
Region char(26) NOT NULL DEFAULT '',
|
||||
SurfaceArea float(10,2) NOT NULL DEFAULT '0.00',
|
||||
IndepYear smallint(6) DEFAULT NULL,
|
||||
Population int(11) NOT NULL DEFAULT '0',
|
||||
LifeExpectancy float(3,1) DEFAULT NULL,
|
||||
GNP float(10,2) DEFAULT NULL,
|
||||
GNPOld float(10,2) DEFAULT NULL,
|
||||
LocalName char(45) NOT NULL DEFAULT '',
|
||||
GovernmentForm char(45) NOT NULL DEFAULT '',
|
||||
HeadOfState char(60) DEFAULT NULL,
|
||||
Capital int(11) DEFAULT NULL,
|
||||
Code2 char(2) NOT NULL DEFAULT '',
|
||||
PRIMARY KEY (Code)
|
||||
);
|
||||
CREATE TABLE t2 (
|
||||
ID int(11) NOT NULL AUTO_INCREMENT,
|
||||
Name char(35) NOT NULL DEFAULT '',
|
||||
CountryCode char(3) NOT NULL DEFAULT '',
|
||||
District char(20) NOT NULL DEFAULT '',
|
||||
Population int(11) NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (ID),
|
||||
KEY CountryCode (CountryCode)
|
||||
);
|
||||
Fill the table with test data
|
||||
This must not use LooseScan:
|
||||
EXPLAIN SELECT Name FROM t1
|
||||
WHERE t1.Code IN (
|
||||
SELECT t2.CountryCode FROM t2 WHERE Population > 5000000);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL PRIMARY NULL NULL NULL 31
|
||||
1 PRIMARY t2 ALL CountryCode NULL NULL NULL 545 Using where; Materialize
|
||||
SELECT Name FROM t1
|
||||
WHERE t1.Code IN (
|
||||
SELECT t2.CountryCode FROM t2 WHERE Population > 5000000);
|
||||
Name
|
||||
Austria
|
||||
Canada
|
||||
China
|
||||
Czech Republic
|
||||
drop table t1, t2;
|
||||
CREATE TABLE t1(a INT);
|
||||
CREATE TABLE t2(c INT);
|
||||
CREATE PROCEDURE p1(v1 int)
|
||||
BEGIN
|
||||
SELECT 1 FROM t1 WHERE a = v1 AND a IN (SELECT c FROM t2);
|
||||
END
|
||||
//
|
||||
CREATE PROCEDURE p2(v1 int)
|
||||
BEGIN
|
||||
SELECT 1 FROM t1 WHERE a IN (SELECT c FROM t2);
|
||||
END
|
||||
//
|
||||
CREATE PROCEDURE p3(v1 int)
|
||||
BEGIN
|
||||
SELECT 1
|
||||
FROM
|
||||
t1 t01,t1 t02,t1 t03,t1 t04,t1 t05,t1 t06,t1 t07,t1 t08,
|
||||
t1 t09,t1 t10,t1 t11,t1 t12,t1 t13,t1 t14,t1 t15,t1 t16,
|
||||
t1 t17,t1 t18,t1 t19,t1 t20,t1 t21,t1 t22,t1 t23,t1 t24,
|
||||
t1 t25,t1 t26,t1 t27,t1 t28,t1 t29,t1 t30,t1 t31,t1 t32,
|
||||
t1 t33,t1 t34,t1 t35,t1 t36,t1 t37,t1 t38,t1 t39,t1 t40,
|
||||
t1 t41,t1 t42,t1 t43,t1 t44,t1 t45,t1 t46,t1 t47,t1 t48,
|
||||
t1 t49,t1 t50,t1 t51,t1 t52,t1 t53,t1 t54,t1 t55,t1 t56,
|
||||
t1 t57,t1 t58,t1 t59,t1 t60
|
||||
WHERE t01.a IN (SELECT c FROM t2);
|
||||
END
|
||||
//
|
||||
CREATE PROCEDURE p4(v1 int)
|
||||
BEGIN
|
||||
SELECT 1
|
||||
FROM
|
||||
t1 t01,t1 t02,t1 t03,t1 t04,t1 t05,t1 t06,t1 t07,t1 t08,
|
||||
t1 t09,t1 t10,t1 t11,t1 t12,t1 t13,t1 t14,t1 t15,t1 t16,
|
||||
t1 t17,t1 t18,t1 t19,t1 t20,t1 t21,t1 t22,t1 t23,t1 t24,
|
||||
t1 t25,t1 t26,t1 t27,t1 t28,t1 t29,t1 t30,t1 t31,t1 t32,
|
||||
t1 t33,t1 t34,t1 t35,t1 t36,t1 t37,t1 t38,t1 t39,t1 t40,
|
||||
t1 t41,t1 t42,t1 t43,t1 t44,t1 t45,t1 t46,t1 t47,t1 t48,
|
||||
t1 t49,t1 t50,t1 t51,t1 t52,t1 t53,t1 t54,t1 t55,t1 t56,
|
||||
t1 t57,t1 t58,t1 t59,t1 t60
|
||||
WHERE t01.a = v1 AND t01.a IN (SELECT c FROM t2);
|
||||
END
|
||||
//
|
||||
CALL p1(1);
|
||||
1
|
||||
CALL p2(1);
|
||||
1
|
||||
CALL p3(1);
|
||||
1
|
||||
CALL p4(1);
|
||||
1
|
||||
DROP TABLE t1, t2;
|
||||
DROP PROCEDURE p1;
|
||||
DROP PROCEDURE p2;
|
||||
DROP PROCEDURE p3;
|
||||
DROP PROCEDURE p4;
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4);
|
||||
create table t1 (a int, b int, key(a));
|
||||
insert into t1 select a,a from t0;
|
||||
create table t2 (a int, b int, primary key(a));
|
||||
insert into t2 select * from t1;
|
||||
Table t2, unlike table t1, should be displayed as pulled out
|
||||
explain extended select * from t0
|
||||
where t0.a in ( select t1.a from t1,t2 where t2.a=t0.a and
|
||||
t1.b=t2.b);
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t0 ALL NULL NULL NULL NULL 5 100.00 Using where
|
||||
1 PRIMARY t1 ref a a 5 test.t0.a 1 100.00 Start temporary; Using join buffer
|
||||
1 PRIMARY t2 eq_ref PRIMARY PRIMARY 4 test.t0.a 1 100.00 Using where; End temporary; Using join buffer
|
||||
Warnings:
|
||||
Note 1276 Field or reference 'test.t0.a' of SELECT #2 was resolved in SELECT #1
|
||||
Note 1003 select `test`.`t0`.`a` AS `a` from `test`.`t2` semi join (`test`.`t1`) join `test`.`t0` where ((`test`.`t2`.`b` = `test`.`t1`.`b`) and (`test`.`t1`.`a` = `test`.`t0`.`a`) and (`test`.`t2`.`a` = `test`.`t0`.`a`))
|
||||
update t1 set a=3, b=11 where a=4;
|
||||
update t2 set b=11 where a=3;
|
||||
|
||||
# The following query gives wrong result due to Bug#49129
|
||||
select * from t0 where t0.a in
|
||||
(select t1.a from t1, t2 where t2.a=t0.a and t1.b=t2.b);
|
||||
a
|
||||
0
|
||||
drop table t0, t1, t2;
|
||||
CREATE TABLE t1 (
|
||||
id int(11) NOT NULL,
|
||||
PRIMARY KEY (id));
|
||||
CREATE TABLE t2 (
|
||||
id int(11) NOT NULL,
|
||||
fid int(11) NOT NULL,
|
||||
PRIMARY KEY (id));
|
||||
insert into t1 values(1);
|
||||
insert into t2 values(1,7503),(2,1);
|
||||
explain select count(*)
|
||||
from t1
|
||||
where fid IN (select fid from t2 where (id between 7502 and 8420) order by fid );
|
||||
ERROR 42S22: Unknown column 'fid' in 'IN/ALL/ANY subquery'
|
||||
drop table t1, t2;
|
||||
create table t1 (a int, b int, key (a), key (b));
|
||||
insert into t1 values (2,4),(2,4),(2,4);
|
||||
select t1.a from t1
|
||||
where
|
||||
t1.a in (select 1 from t1 where t1.a in (select 1 from t1) group by t1.a);
|
||||
a
|
||||
drop table t1;
|
||||
create table t1(a int,b int,key(a),key(b));
|
||||
insert into t1 values (1,1),(2,2),(3,3);
|
||||
select 1 from t1
|
||||
where t1.a not in (select 1 from t1
|
||||
where t1.a in (select 1 from t1)
|
||||
group by t1.b);
|
||||
1
|
||||
1
|
||||
1
|
||||
drop table t1;
|
||||
CREATE TABLE t1
|
||||
(EMPNUM CHAR(3) NOT NULL,
|
||||
EMPNAME CHAR(20),
|
||||
GRADE DECIMAL(4),
|
||||
CITY CHAR(15));
|
||||
CREATE TABLE t2
|
||||
(PNUM CHAR(3) NOT NULL,
|
||||
PNAME CHAR(20),
|
||||
PTYPE CHAR(6),
|
||||
BUDGET DECIMAL(9),
|
||||
CITY CHAR(15));
|
||||
CREATE TABLE t3
|
||||
(EMPNUM CHAR(3) NOT NULL,
|
||||
PNUM CHAR(3) NOT NULL,
|
||||
HOURS DECIMAL(5));
|
||||
INSERT INTO t1 VALUES ('E1','Alice',12,'Deale');
|
||||
INSERT INTO t1 VALUES ('E2','Betty',10,'Vienna');
|
||||
INSERT INTO t1 VALUES ('E3','Carmen',13,'Vienna');
|
||||
INSERT INTO t1 VALUES ('E4','Don',12,'Deale');
|
||||
INSERT INTO t1 VALUES ('E5','Ed',13,'Akron');
|
||||
INSERT INTO t2 VALUES ('P1','MXSS','Design',10000,'Deale');
|
||||
INSERT INTO t2 VALUES ('P2','CALM','Code',30000,'Vienna');
|
||||
INSERT INTO t2 VALUES ('P3','SDP','Test',30000,'Tampa');
|
||||
INSERT INTO t2 VALUES ('P4','SDP','Design',20000,'Deale');
|
||||
INSERT INTO t2 VALUES ('P5','IRM','Test',10000,'Vienna');
|
||||
INSERT INTO t2 VALUES ('P6','PAYR','Design',50000,'Deale');
|
||||
INSERT INTO t3 VALUES ('E1','P1',40);
|
||||
INSERT INTO t3 VALUES ('E1','P2',20);
|
||||
INSERT INTO t3 VALUES ('E1','P3',80);
|
||||
INSERT INTO t3 VALUES ('E1','P4',20);
|
||||
INSERT INTO t3 VALUES ('E1','P5',12);
|
||||
INSERT INTO t3 VALUES ('E1','P6',12);
|
||||
INSERT INTO t3 VALUES ('E2','P1',40);
|
||||
INSERT INTO t3 VALUES ('E2','P2',80);
|
||||
INSERT INTO t3 VALUES ('E3','P2',20);
|
||||
INSERT INTO t3 VALUES ('E4','P2',20);
|
||||
INSERT INTO t3 VALUES ('E4','P4',40);
|
||||
INSERT INTO t3 VALUES ('E4','P5',80);
|
||||
SELECT * FROM t1;
|
||||
EMPNUM EMPNAME GRADE CITY
|
||||
E1 Alice 12 Deale
|
||||
E2 Betty 10 Vienna
|
||||
E3 Carmen 13 Vienna
|
||||
E4 Don 12 Deale
|
||||
E5 Ed 13 Akron
|
||||
CREATE UNIQUE INDEX t1_IDX ON t1(EMPNUM);
|
||||
SELECT EMPNAME
|
||||
FROM t1
|
||||
WHERE EMPNUM IN
|
||||
(SELECT EMPNUM
|
||||
FROM t3
|
||||
WHERE PNUM IN
|
||||
(SELECT PNUM
|
||||
FROM t2
|
||||
WHERE PTYPE = 'Design'));
|
||||
EMPNAME
|
||||
Alice
|
||||
Betty
|
||||
Don
|
||||
DROP INDEX t1_IDX ON t1;
|
||||
CREATE INDEX t1_IDX ON t1(EMPNUM);
|
||||
SELECT EMPNAME
|
||||
FROM t1
|
||||
WHERE EMPNUM IN
|
||||
(SELECT EMPNUM
|
||||
FROM t3
|
||||
WHERE PNUM IN
|
||||
(SELECT PNUM
|
||||
FROM t2
|
||||
WHERE PTYPE = 'Design'));
|
||||
EMPNAME
|
||||
Alice
|
||||
Betty
|
||||
Don
|
||||
DROP INDEX t1_IDX ON t1;
|
||||
SELECT EMPNAME
|
||||
FROM t1
|
||||
WHERE EMPNUM IN
|
||||
(SELECT EMPNUM
|
||||
FROM t3
|
||||
WHERE PNUM IN
|
||||
(SELECT PNUM
|
||||
FROM t2
|
||||
WHERE PTYPE = 'Design'));
|
||||
EMPNAME
|
||||
Alice
|
||||
Betty
|
||||
Don
|
||||
DROP TABLE t1, t2, t3;
|
||||
CREATE TABLE t1 (f1 INT NOT NULL);
|
||||
CREATE VIEW v1 (a) AS SELECT f1 IN (SELECT f1 FROM t1) FROM t1;
|
||||
SELECT * FROM v1;
|
||||
a
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1(a int, b int);
|
||||
insert into t1 values (0,0),(1,1),(2,2);
|
||||
create table t2 as select * from t1;
|
||||
create table t3 (pk int, a int, primary key(pk));
|
||||
insert into t3 select a,a from t0;
|
||||
explain
|
||||
select * from t1 left join t2 on (t2.a= t1.a and t2.a in (select pk from t3));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 3 Using where; Using join buffer
|
||||
2 DEPENDENT SUBQUERY t3 unique_subquery PRIMARY PRIMARY 4 func 1 Using index
|
||||
drop table t0, t1, t2, t3;
|
||||
create table t1 (a int);
|
||||
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t2 (a char(200), b char(200), c char(200), primary key (a,b,c)) engine=innodb;
|
||||
insert into t2 select concat(a, repeat('X',198)),repeat('B',200),repeat('B',200) from t1;
|
||||
insert into t2 select concat(a, repeat('Y',198)),repeat('B',200),repeat('B',200) from t1;
|
||||
alter table t2 add filler1 int;
|
||||
insert into t1 select A.a + 10*(B.a + 10*C.a) from t1 A, t1 B, t1 C;
|
||||
set @save_join_buffer_size=@@join_buffer_size;
|
||||
set join_buffer_size=1;
|
||||
select * from t2 where filler1 in ( select a from t1);
|
||||
a b c filler1
|
||||
set join_buffer_size=default;
|
||||
drop table t1, t2;
|
||||
create table t1 (a int not null);
|
||||
drop procedure if exists p1;
|
||||
CREATE PROCEDURE p1()
|
||||
BEGIN
|
||||
DECLARE EXIT HANDLER FOR SQLEXCEPTION select a from t1;
|
||||
prepare s1 from '
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in (
|
||||
select a from t1 where a in ( select a from t1)
|
||||
)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))';
|
||||
execute s1;
|
||||
END;
|
||||
|
|
||||
call p1();
|
||||
a
|
||||
drop procedure p1;
|
||||
drop table t1;
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1 (a int) as select A.a + 10 *(B.a + 10*C.a) as a from t0 A, t0 B, t0 C;
|
||||
create table t2 (id int, a int, primary key(id), key(a)) as select a as id, a as a from t1;
|
||||
show create table t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`id` int(11) NOT NULL DEFAULT '0',
|
||||
`a` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `a` (`a`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
set @a=0;
|
||||
create table t3 as select * from t2 limit 0;
|
||||
insert into t3 select @a:=@a+1, t2.a from t2, t0;
|
||||
insert into t3 select @a:=@a+1, t2.a from t2, t0;
|
||||
insert into t3 select @a:=@a+1, t2.a from t2, t0;
|
||||
alter table t3 add primary key(id), add key(a);
|
||||
The following must use loose index scan over t3, key a:
|
||||
explain select count(a) from t2 where a in ( SELECT a FROM t3);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t2 index a a 5 NULL 1000 Using index
|
||||
1 PRIMARY t3 index a a 5 NULL 30000 Using index; Materialize
|
||||
select count(a) from t2 where a in ( SELECT a FROM t3);
|
||||
count(a)
|
||||
1000
|
||||
drop table t0,t1,t2,t3;
|
||||
|
||||
BUG#42740: crash in optimize_semijoin_nests
|
||||
|
||||
create table t1 (c6 timestamp,key (c6)) engine=innodb;
|
||||
create table t2 (c2 double) engine=innodb;
|
||||
explain select 1 from t2 where c2 = any (select log10(null) from t1 where c6 <null) ;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
drop table t1, t2;
|
||||
#
|
||||
# BUG#42742: crash in setup_sj_materialization, Copy_field::set
|
||||
#
|
||||
create table t3 ( c1 year) engine=innodb;
|
||||
insert into t3 values (2135),(2142);
|
||||
create table t2 (c1 tinytext,c2 text,c6 timestamp) engine=innodb;
|
||||
# The following must not crash, EXPLAIN should show one SJ strategy, not a mix:
|
||||
explain select 1 from t2 where
|
||||
c2 in (select 1 from t3, t2) and
|
||||
c1 in (select convert(c6,char(1)) from t2);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 1 Using where
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 1
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 1 Using where
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 2 FirstMatch(t2)
|
||||
drop table t2, t3;
|
||||
set join_cache_level=default;
|
||||
show variables like 'join_cache_level';
|
||||
Variable_name Value
|
||||
join_cache_level 1
|
||||
789
mysql-test/r/subselect_sj_jcl6.result
Normal file
789
mysql-test/r/subselect_sj_jcl6.result
Normal file
@@ -0,0 +1,789 @@
|
||||
set join_cache_level=6;
|
||||
show variables like 'join_cache_level';
|
||||
Variable_name Value
|
||||
join_cache_level 6
|
||||
drop table if exists t0, t1, t2, t10, t11, t12;
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1(a int, b int);
|
||||
insert into t1 values (0,0),(1,1),(2,2);
|
||||
create table t2 as select * from t1;
|
||||
create table t11(a int, b int);
|
||||
create table t10 (pk int, a int, primary key(pk));
|
||||
insert into t10 select a,a from t0;
|
||||
create table t12 like t10;
|
||||
insert into t12 select * from t10;
|
||||
Flattened because of dependency, t10=func(t1)
|
||||
explain select * from t1 where a in (select pk from t10);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where
|
||||
1 PRIMARY t10 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using index
|
||||
select * from t1 where a in (select pk from t10);
|
||||
a b
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
||||
A confluent case of dependency
|
||||
explain select * from t1 where a in (select a from t10 where pk=12);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
select * from t1 where a in (select a from t10 where pk=12);
|
||||
a b
|
||||
explain select * from t1 where a in (select a from t10 where pk=9);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t10 const PRIMARY PRIMARY 4 const 1
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where
|
||||
select * from t1 where a in (select a from t10 where pk=9);
|
||||
a b
|
||||
An empty table inside
|
||||
explain select * from t1 where a in (select a from t11);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
select * from t1 where a in (select a from t11);
|
||||
a b
|
||||
explain select * from t1 where a in (select pk from t10) and b in (select pk from t10);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where
|
||||
1 PRIMARY t10 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using index
|
||||
1 PRIMARY t10 eq_ref PRIMARY PRIMARY 4 test.t1.b 1 Using index
|
||||
select * from t1 where a in (select pk from t10) and b in (select pk from t10);
|
||||
a b
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
||||
flattening a nested subquery
|
||||
explain select * from t1 where a in (select pk from t10 where t10.a in (select pk from t12));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where
|
||||
1 PRIMARY t10 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using where; Using join buffer
|
||||
1 PRIMARY t12 eq_ref PRIMARY PRIMARY 4 test.t10.a 1 Using index
|
||||
select * from t1 where a in (select pk from t10 where t10.a in (select pk from t12));
|
||||
a b
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
||||
flattening subquery w/ several tables
|
||||
explain extended select * from t1 where a in (select t10.pk from t10, t12 where t12.pk=t10.a);
|
||||
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 t10 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 100.00 Using where; Using join buffer
|
||||
1 PRIMARY t12 eq_ref PRIMARY PRIMARY 4 test.t10.a 1 100.00 Using index
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t10` join `test`.`t12` join `test`.`t1` where ((`test`.`t10`.`pk` = `test`.`t1`.`a`) and (`test`.`t12`.`pk` = `test`.`t10`.`a`))
|
||||
subqueries within outer joins go into ON expr.
|
||||
explAin extended
|
||||
select * from t1 left join (t2 A, t2 B) on ( A.A= t1.A And B.A in (select pk from t10));
|
||||
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 A ALL NULL NULL NULL NULL 3 100.00 Using where; Using join Buffer
|
||||
1 PRIMARY B ALL NULL NULL NULL NULL 3 100.00 Using where; Using join Buffer
|
||||
2 DEPENDENT SUBQUERY t10 unique_suBquery PRIMARY PRIMARY 4 func 1 100.00 Using index
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`A` AS `A`,`test`.`t1`.`B` AS `B`,`test`.`A`.`A` AS `A`,`test`.`A`.`B` AS `B`,`test`.`B`.`A` AS `A`,`test`.`B`.`B` AS `B` from `test`.`t1` left join (`test`.`t2` `A` join `test`.`t2` `B`) on(((`test`.`A`.`A` = `test`.`t1`.`A`) And <in_optimizer>(`test`.`B`.`A`,<exists>(<primAry_index_lookup>(<cAche>(`test`.`B`.`A`) in t10 on PRIMARY))))) where 1
|
||||
t2 should be wrapped into OJ-nest, so we have "t1 LJ (t2 J t10)"
|
||||
explAin extended
|
||||
select * from t1 left join t2 on (t2.A= t1.A And t2.A in (select pk from t10));
|
||||
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 t2 ALL NULL NULL NULL NULL 3 100.00 Using where; Using join Buffer
|
||||
2 DEPENDENT SUBQUERY t10 unique_suBquery PRIMARY PRIMARY 4 func 1 100.00 Using index
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`A` AS `A`,`test`.`t1`.`B` AS `B`,`test`.`t2`.`A` AS `A`,`test`.`t2`.`B` AS `B` from `test`.`t1` left join `test`.`t2` on(((`test`.`t2`.`A` = `test`.`t1`.`A`) And <in_optimizer>(`test`.`t2`.`A`,<exists>(<primAry_index_lookup>(<cAche>(`test`.`t2`.`A`) in t10 on PRIMARY))))) where 1
|
||||
we shouldn't flatten if we're going to get a join of > MAX_TABLES.
|
||||
explain select * from
|
||||
t1 s00, t1 s01, t1 s02, t1 s03, t1 s04,t1 s05,t1 s06,t1 s07,t1 s08,t1 s09,
|
||||
t1 s10, t1 s11, t1 s12, t1 s13, t1 s14,t1 s15,t1 s16,t1 s17,t1 s18,t1 s19,
|
||||
t1 s20, t1 s21, t1 s22, t1 s23, t1 s24,t1 s25,t1 s26,t1 s27,t1 s28,t1 s29,
|
||||
t1 s30, t1 s31, t1 s32, t1 s33, t1 s34,t1 s35,t1 s36,t1 s37,t1 s38,t1 s39,
|
||||
t1 s40, t1 s41, t1 s42, t1 s43, t1 s44,t1 s45,t1 s46,t1 s47,t1 s48,t1 s49
|
||||
where
|
||||
s00.a in (
|
||||
select m00.a from
|
||||
t1 m00, t1 m01, t1 m02, t1 m03, t1 m04,t1 m05,t1 m06,t1 m07,t1 m08,t1 m09,
|
||||
t1 m10, t1 m11, t1 m12, t1 m13, t1 m14,t1 m15,t1 m16,t1 m17,t1 m18,t1 m19
|
||||
);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY s00 ALL NULL NULL NULL NULL 3 Using where
|
||||
1 PRIMARY s01 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s02 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s03 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s04 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s05 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s06 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s07 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s08 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s09 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s10 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s11 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s12 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s13 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s14 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s15 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s16 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s17 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s18 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s19 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s20 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s21 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s22 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s23 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s24 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s25 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s26 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s27 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s28 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s29 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s30 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s31 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s32 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s33 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s34 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s35 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s36 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s37 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s38 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s39 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s40 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s41 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s42 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s43 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s44 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s45 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s46 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s47 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s48 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
1 PRIMARY s49 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m00 ALL NULL NULL NULL NULL 3 Using where
|
||||
2 DEPENDENT SUBQUERY m01 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m02 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m03 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m04 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m05 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m06 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m07 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m08 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m09 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m10 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m11 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m12 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m13 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m14 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m15 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m16 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m17 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m18 ALL NULL NULL NULL NULL 3 Using join buffer
|
||||
2 DEPENDENT SUBQUERY m19 ALL NULL NULL NULL NULL 3 Using where; Using join buffer
|
||||
select * from
|
||||
t1 left join t2 on (t2.a= t1.a and t2.a in (select pk from t10))
|
||||
where t1.a < 5;
|
||||
a b a b
|
||||
0 0 0 0
|
||||
1 1 1 1
|
||||
2 2 2 2
|
||||
prepare s1 from
|
||||
' select * from
|
||||
t1 left join t2 on (t2.a= t1.a and t2.a in (select pk from t10))
|
||||
where t1.a < 5';
|
||||
execute s1;
|
||||
a b a b
|
||||
0 0 0 0
|
||||
1 1 1 1
|
||||
2 2 2 2
|
||||
execute s1;
|
||||
a b a b
|
||||
0 0 0 0
|
||||
1 1 1 1
|
||||
2 2 2 2
|
||||
insert into t1 select (A.a + 10 * B.a),1 from t0 A, t0 B;
|
||||
explain extended select * from t1 where a in (select pk from t10 where pk<3);
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t10 range PRIMARY PRIMARY 4 NULL 4 100.00 Using where; Using index
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 103 100.00 Using where; Using join buffer
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t10` join `test`.`t1` where ((`test`.`t1`.`a` = `test`.`t10`.`pk`) and (`test`.`t10`.`pk` < 3))
|
||||
|
||||
BUG#37120 optimizer_switch allowable values not according to specification
|
||||
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on,table_elimination=on
|
||||
set optimizer_switch='default,materialization=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=on,table_elimination=on
|
||||
set optimizer_switch='default,semijoin=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=off,table_elimination=on
|
||||
set optimizer_switch='default,loosescan=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=on,semijoin=on,table_elimination=on
|
||||
set optimizer_switch='default,semijoin=off,materialization=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=off,table_elimination=on
|
||||
set optimizer_switch='default,materialization=off,semijoin=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=off,table_elimination=on
|
||||
set optimizer_switch='default,semijoin=off,materialization=off,loosescan=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=off,semijoin=off,table_elimination=on
|
||||
set optimizer_switch='default,semijoin=off,loosescan=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=on,semijoin=off,table_elimination=on
|
||||
set optimizer_switch='default,materialization=off,loosescan=off';
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=off,semijoin=on,table_elimination=on
|
||||
set optimizer_switch=default;
|
||||
drop table t0, t1, t2;
|
||||
drop table t10, t11, t12;
|
||||
|
||||
Bug#37899: Wrongly checked optimization prerequisite caused failed
|
||||
assertion.
|
||||
|
||||
CREATE TABLE t1 (
|
||||
`pk` int(11),
|
||||
`varchar_nokey` varchar(5)
|
||||
);
|
||||
INSERT INTO t1 VALUES
|
||||
(1,'qk'),(2,'j'),(3,'aew');
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE varchar_nokey IN (
|
||||
SELECT
|
||||
varchar_nokey
|
||||
FROM
|
||||
t1
|
||||
) XOR pk = 30;
|
||||
pk varchar_nokey
|
||||
1 qk
|
||||
2 j
|
||||
3 aew
|
||||
drop table t1;
|
||||
#
|
||||
# BUG#41842: Semi-join materialization strategy crashes when the upper query has HAVING
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
pk int(11) NOT NULL AUTO_INCREMENT,
|
||||
int_nokey int(11) NOT NULL,
|
||||
time_key time NOT NULL,
|
||||
datetime_key datetime NOT NULL,
|
||||
datetime_nokey datetime NOT NULL,
|
||||
varchar_key varchar(1) NOT NULL,
|
||||
varchar_nokey varchar(1) NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY time_key (time_key),
|
||||
KEY datetime_key (datetime_key),
|
||||
KEY varchar_key (varchar_key)
|
||||
);
|
||||
INSERT INTO t1 VALUES
|
||||
(1,0, '00:16:10','2008-09-03 14:25:40','2008-09-03 14:25:40','h','h'),
|
||||
(2,7, '00:00:00','2001-01-13 00:00:00','2001-01-13 00:00:00','',''),
|
||||
(3,0, '00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','x','x'),
|
||||
(4,2, '16:29:24','2000-10-16 01:39:08','2000-10-16 01:39:08','w','w'),
|
||||
(5,1, '09:23:32','0000-00-00 00:00:00','0000-00-00 00:00:00','p','p'),
|
||||
(6,3, '00:00:00','2007-12-02 00:00:00','2007-12-02 00:00:00','o','o'),
|
||||
(7,3, '00:00:00','2008-09-11 00:00:00','2008-09-11 00:00:00','',''),
|
||||
(8,0, '13:59:04','0000-00-00 00:00:00','0000-00-00 00:00:00','s','s'),
|
||||
(9,7, '09:01:06','0000-00-00 00:00:00','0000-00-00 00:00:00','d','d'),
|
||||
(10,5,'00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','n','n'),
|
||||
(11,0,'21:06:46','0000-00-00 00:00:00','0000-00-00 00:00:00','o','o'),
|
||||
(12,2,'00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','',''),
|
||||
(13,6,'14:45:34','2003-07-28 02:34:08','2003-07-28 02:34:08','w','w'),
|
||||
(14,1,'15:04:12','0000-00-00 00:00:00','0000-00-00 00:00:00','o','o'),
|
||||
(15,0,'00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','x','x'),
|
||||
(16,0,'15:55:23','2004-03-17 00:32:27','2004-03-17 00:32:27','p','p'),
|
||||
(17,1,'16:30:00','2004-12-27 19:20:00','2004-12-27 19:20:00','d','d'),
|
||||
(18,0,'00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','h','h'),
|
||||
(19,0,'14:13:26','2008-11-09 05:53:48','2008-11-09 05:53:48','o','o'),
|
||||
(20,0,'00:00:00','2009-10-11 06:58:04','2009-10-11 06:58:04','k','k');
|
||||
CREATE TABLE t2 (
|
||||
pk int(11) NOT NULL AUTO_INCREMENT,
|
||||
int_nokey int(11) NOT NULL,
|
||||
time_key time NOT NULL,
|
||||
datetime_key datetime NOT NULL,
|
||||
datetime_nokey datetime NOT NULL,
|
||||
varchar_key varchar(1) NOT NULL,
|
||||
varchar_nokey varchar(1) NOT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY time_key (time_key),
|
||||
KEY datetime_key (datetime_key),
|
||||
KEY varchar_key (varchar_key)
|
||||
);
|
||||
INSERT INTO t2 VALUES
|
||||
(10,0,'19:39:13','0000-00-00 00:00:00','0000-00-00 00:00:00','g','g'),
|
||||
(11,8,'03:43:53','0000-00-00 00:00:00','0000-00-00 00:00:00','b','b');
|
||||
SELECT OUTR.datetime_nokey AS X FROM t1 AS OUTR
|
||||
WHERE
|
||||
OUTR.varchar_nokey IN (SELECT
|
||||
INNR . varchar_nokey AS Y
|
||||
FROM t2 AS INNR
|
||||
WHERE
|
||||
INNR . datetime_key >= INNR . time_key OR
|
||||
INNR . pk = INNR . int_nokey
|
||||
)
|
||||
AND OUTR . varchar_nokey <= 'w'
|
||||
HAVING X > '2012-12-12';
|
||||
X
|
||||
drop table t1, t2;
|
||||
#
|
||||
# Bug#45191: Incorrectly initialized semi-join led to a wrong result.
|
||||
#
|
||||
CREATE TABLE STAFF (EMPNUM CHAR(3) NOT NULL,
|
||||
EMPNAME CHAR(20), GRADE DECIMAL(4), CITY CHAR(15));
|
||||
CREATE TABLE PROJ (PNUM CHAR(3) NOT NULL,
|
||||
PNAME CHAR(20), PTYPE CHAR(6),
|
||||
BUDGET DECIMAL(9),
|
||||
CITY CHAR(15));
|
||||
CREATE TABLE WORKS (EMPNUM CHAR(3) NOT NULL,
|
||||
PNUM CHAR(3) NOT NULL, HOURS DECIMAL(5));
|
||||
INSERT INTO STAFF VALUES ('E1','Alice',12,'Deale');
|
||||
INSERT INTO STAFF VALUES ('E2','Betty',10,'Vienna');
|
||||
INSERT INTO STAFF VALUES ('E3','Carmen',13,'Vienna');
|
||||
INSERT INTO STAFF VALUES ('E4','Don',12,'Deale');
|
||||
INSERT INTO STAFF VALUES ('E5','Ed',13,'Akron');
|
||||
INSERT INTO PROJ VALUES ('P1','MXSS','Design',10000,'Deale');
|
||||
INSERT INTO PROJ VALUES ('P2','CALM','Code',30000,'Vienna');
|
||||
INSERT INTO PROJ VALUES ('P3','SDP','Test',30000,'Tampa');
|
||||
INSERT INTO PROJ VALUES ('P4','SDP','Design',20000,'Deale');
|
||||
INSERT INTO PROJ VALUES ('P5','IRM','Test',10000,'Vienna');
|
||||
INSERT INTO PROJ VALUES ('P6','PAYR','Design',50000,'Deale');
|
||||
INSERT INTO WORKS VALUES ('E1','P1',40);
|
||||
INSERT INTO WORKS VALUES ('E1','P2',20);
|
||||
INSERT INTO WORKS VALUES ('E1','P3',80);
|
||||
INSERT INTO WORKS VALUES ('E1','P4',20);
|
||||
INSERT INTO WORKS VALUES ('E1','P5',12);
|
||||
INSERT INTO WORKS VALUES ('E1','P6',12);
|
||||
INSERT INTO WORKS VALUES ('E2','P1',40);
|
||||
INSERT INTO WORKS VALUES ('E2','P2',80);
|
||||
INSERT INTO WORKS VALUES ('E3','P2',20);
|
||||
INSERT INTO WORKS VALUES ('E4','P2',20);
|
||||
INSERT INTO WORKS VALUES ('E4','P4',40);
|
||||
INSERT INTO WORKS VALUES ('E4','P5',80);
|
||||
set optimizer_switch='default,materialization=off';
|
||||
explain SELECT EMPNUM, EMPNAME
|
||||
FROM STAFF
|
||||
WHERE EMPNUM IN
|
||||
(SELECT EMPNUM FROM WORKS
|
||||
WHERE PNUM IN
|
||||
(SELECT PNUM FROM PROJ));
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY STAFF ALL NULL NULL NULL NULL 5
|
||||
1 PRIMARY PROJ ALL NULL NULL NULL NULL 6
|
||||
1 PRIMARY WORKS ALL NULL NULL NULL NULL 12 Using where; FirstMatch(STAFF)
|
||||
SELECT EMPNUM, EMPNAME
|
||||
FROM STAFF
|
||||
WHERE EMPNUM IN
|
||||
(SELECT EMPNUM FROM WORKS
|
||||
WHERE PNUM IN
|
||||
(SELECT PNUM FROM PROJ));
|
||||
EMPNUM EMPNAME
|
||||
E1 Alice
|
||||
E2 Betty
|
||||
E3 Carmen
|
||||
E4 Don
|
||||
set optimizer_switch='default';
|
||||
drop table STAFF,WORKS,PROJ;
|
||||
# End of bug#45191
|
||||
#
|
||||
# Bug#46550 Azalea returning duplicate results for some IN subqueries
|
||||
# w/ semijoin=on
|
||||
#
|
||||
DROP TABLE IF EXISTS t0, t1, t2;
|
||||
CREATE TABLE t0 (
|
||||
int_key int(11) DEFAULT NULL,
|
||||
varchar_key varchar(1) DEFAULT NULL,
|
||||
varchar_nokey varchar(1) DEFAULT NULL,
|
||||
KEY int_key (int_key),
|
||||
KEY varchar_key (varchar_key,int_key)
|
||||
);
|
||||
INSERT INTO t0 VALUES
|
||||
(1,'m','m'),
|
||||
(40,'h','h'),
|
||||
(1,'r','r'),
|
||||
(1,'h','h'),
|
||||
(9,'x','x'),
|
||||
(NULL,'q','q'),
|
||||
(NULL,'k','k'),
|
||||
(7,'l','l'),
|
||||
(182,'k','k'),
|
||||
(202,'a','a'),
|
||||
(7,'x','x'),
|
||||
(6,'j','j'),
|
||||
(119,'z','z'),
|
||||
(4,'d','d'),
|
||||
(5,'h','h'),
|
||||
(1,'u','u'),
|
||||
(3,'q','q'),
|
||||
(7,'a','a'),
|
||||
(3,'e','e'),
|
||||
(6,'l','l');
|
||||
CREATE TABLE t1 (
|
||||
int_key int(11) DEFAULT NULL,
|
||||
varchar_key varchar(1) DEFAULT NULL,
|
||||
varchar_nokey varchar(1) DEFAULT NULL,
|
||||
KEY int_key (int_key),
|
||||
KEY varchar_key (varchar_key,int_key)
|
||||
);
|
||||
INSERT INTO t1 VALUES (7,NULL,NULL),(4,'x','x');
|
||||
CREATE TABLE t2 (
|
||||
int_key int(11) DEFAULT NULL,
|
||||
varchar_key varchar(1) DEFAULT NULL,
|
||||
varchar_nokey varchar(1) DEFAULT NULL,
|
||||
KEY int_key (int_key),
|
||||
KEY varchar_key (varchar_key,int_key)
|
||||
);
|
||||
INSERT INTO t2 VALUES (123,NULL,NULL);
|
||||
SELECT int_key
|
||||
FROM t0
|
||||
WHERE varchar_nokey IN (
|
||||
SELECT t1 .varchar_key from t1
|
||||
);
|
||||
int_key
|
||||
9
|
||||
7
|
||||
SELECT t0.int_key
|
||||
FROM t0
|
||||
WHERE t0.varchar_nokey IN (
|
||||
SELECT t1_1 .varchar_key
|
||||
FROM t1 AS t1_1 JOIN t1 AS t1_2 ON t1_1 .int_key
|
||||
);
|
||||
int_key
|
||||
9
|
||||
7
|
||||
SELECT t0.int_key
|
||||
FROM t0, t2
|
||||
WHERE t0.varchar_nokey IN (
|
||||
SELECT t1_1 .varchar_key
|
||||
FROM t1 AS t1_1 JOIN t1 AS t1_2 ON t1_1 .int_key
|
||||
);
|
||||
int_key
|
||||
9
|
||||
7
|
||||
DROP TABLE t0, t1, t2;
|
||||
# End of bug#46550
|
||||
#
|
||||
# Bug #46744 Crash in optimize_semijoin_nests on empty view
|
||||
# with limit and procedure.
|
||||
#
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
DROP VIEW IF EXISTS v1;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
CREATE TABLE t1 ( f1 int );
|
||||
CREATE TABLE t2 ( f1 int );
|
||||
insert into t2 values (5), (7);
|
||||
CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1 LIMIT 2;
|
||||
create procedure p1()
|
||||
select COUNT(*)
|
||||
FROM v1 WHERE f1 IN
|
||||
(SELECT f1 FROM t2 WHERE f1 = ANY (SELECT f1 FROM v1));
|
||||
SET SESSION optimizer_switch = 'semijoin=on';
|
||||
CALL p1();
|
||||
COUNT(*)
|
||||
0
|
||||
SET SESSION optimizer_switch = 'semijoin=off';
|
||||
CALL p1();
|
||||
COUNT(*)
|
||||
0
|
||||
drop table t1, t2;
|
||||
drop view v1;
|
||||
drop procedure p1;
|
||||
set SESSION optimizer_switch='default';
|
||||
# End of bug#46744
|
||||
|
||||
Bug#46797 "Crash in fix_semijoin_strategies_for_picked_join_order
|
||||
with semijoin=on"
|
||||
|
||||
CREATE TABLE t1 (
|
||||
varchar_key varchar(1) DEFAULT NULL,
|
||||
KEY varchar_key (varchar_key)
|
||||
);
|
||||
CREATE TABLE t2 (
|
||||
varchar_key varchar(1) DEFAULT NULL,
|
||||
KEY varchar_key (varchar_key)
|
||||
);
|
||||
INSERT INTO t2 VALUES
|
||||
(NULL),(NULL),(NULL),(NULL),('a'),('a'),('a'),('b'),('b'),('b'),('b'),('c'),
|
||||
('c'),('c'),('c'),('c'),('c'),('c'),('d'),('d'),('d'),('d'),('d'),('d'),('e'),
|
||||
('e'),('e'),('e'),('e'),('e'),('f'),('f'),('f'),('g'),('g'),('h'),('h'),('h'),
|
||||
('h'),('i'),('j'),('j'),('j'),('k'),('k'),('l'),('l'),('m'),('m'),('m'),('m'),
|
||||
('n'),('n'),('n'),('o'),('o'),('o'),('p'),('p'),('p'),('q'),('q'),('q'),('r'),
|
||||
('r'),('r'),('r'),('s'),('s'),('s'),('s'),('t'),('t'),('t'),('t'),('u'),('u'),
|
||||
('u'),('u'),('v'),('v'),('v'),('v'),('w'),('w'),('w'),('w'),('w'),('w'),('x'),
|
||||
('x'),('x'),('y'),('y'),('y'),('y'),('z'),('z'),('z'),('z');
|
||||
CREATE TABLE t3 (
|
||||
varchar_key varchar(1) DEFAULT NULL,
|
||||
KEY varchar_key (varchar_key)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t3 VALUES
|
||||
(NULL),('c'),('d'),('e'),('f'),('h'),('j'),('k'),('k'),('m'),('m'),('m'),
|
||||
('n'),('o'),('r'),('t'),('t'),('u'),('w'),('y');
|
||||
SELECT varchar_key FROM t3
|
||||
WHERE (SELECT varchar_key FROM t3
|
||||
WHERE (varchar_key,varchar_key)
|
||||
IN (SELECT t1.varchar_key, t2 .varchar_key
|
||||
FROM t1 RIGHT JOIN t2 ON t1.varchar_key
|
||||
)
|
||||
);
|
||||
varchar_key
|
||||
DROP TABLE t1, t2, t3;
|
||||
#
|
||||
# Bug#46556 Returning incorrect, empty results for some IN subqueries
|
||||
# w/semijoin=on
|
||||
#
|
||||
CREATE TABLE t0 (
|
||||
pk INTEGER,
|
||||
vkey VARCHAR(1),
|
||||
vnokey VARCHAR(1),
|
||||
PRIMARY KEY (pk),
|
||||
KEY vkey(vkey)
|
||||
);
|
||||
INSERT INTO t0
|
||||
VALUES (1,'g','g'), (2,'v','v'), (3,'t','t'), (4,'u','u'), (5,'n','n');
|
||||
EXPLAIN EXTENDED SELECT vkey FROM t0 WHERE pk IN
|
||||
(SELECT t1.pk FROM t0 t1 JOIN t0 t2 ON t2.vkey = t1.vnokey);
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t0 ALL PRIMARY NULL NULL NULL 5 100.00
|
||||
1 PRIMARY t1 eq_ref PRIMARY PRIMARY 4 test.t0.pk 1 100.00 Using where; Using join buffer
|
||||
1 PRIMARY t2 ref vkey vkey 4 test.t1.vnokey 2 100.00 Using index; FirstMatch(t1)
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t0`.`vkey` AS `vkey` from `test`.`t0` `t1` semi join (`test`.`t0` `t2`) join `test`.`t0` where ((`test`.`t2`.`vkey` = `test`.`t1`.`vnokey`) and (`test`.`t1`.`pk` = `test`.`t0`.`pk`))
|
||||
SELECT vkey FROM t0 WHERE pk IN
|
||||
(SELECT t1.pk FROM t0 t1 JOIN t0 t2 ON t2.vkey = t1.vnokey);
|
||||
vkey
|
||||
g
|
||||
v
|
||||
t
|
||||
u
|
||||
n
|
||||
DROP TABLE t0;
|
||||
# End of bug#46556
|
||||
|
||||
Bug #48073 Subquery on char columns from view crashes Mysql
|
||||
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
DROP VIEW IF EXISTS v1;
|
||||
CREATE TABLE t1 (
|
||||
city VARCHAR(50) NOT NULL,
|
||||
country_id SMALLINT UNSIGNED NOT NULL
|
||||
);
|
||||
INSERT INTO t1 VALUES
|
||||
('Batna',2),
|
||||
('Bchar',2),
|
||||
('Skikda',2),
|
||||
('Tafuna',3),
|
||||
('Algeria',2) ;
|
||||
CREATE TABLE t2 (
|
||||
country_id SMALLINT UNSIGNED NOT NULL,
|
||||
country VARCHAR(50) NOT NULL
|
||||
);
|
||||
INSERT INTO t2 VALUES
|
||||
(2,'Algeria'),
|
||||
(3,'American Samoa') ;
|
||||
CREATE VIEW v1 AS
|
||||
SELECT country_id, country
|
||||
FROM t2
|
||||
WHERE LEFT(country,1) = "A"
|
||||
;
|
||||
SELECT city, country_id
|
||||
FROM t1
|
||||
WHERE city IN (
|
||||
SELECT country
|
||||
FROM t2
|
||||
WHERE LEFT(country, 1) = "A"
|
||||
);
|
||||
city country_id
|
||||
Algeria 2
|
||||
SELECT city, country_id
|
||||
FROM t1
|
||||
WHERE city IN (
|
||||
SELECT country
|
||||
FROM v1
|
||||
);
|
||||
city country_id
|
||||
Algeria 2
|
||||
drop table t1, t2;
|
||||
drop view v1;
|
||||
# End of bug#48073
|
||||
|
||||
Bug#48834: Procedure with view + subquery + semijoin=on
|
||||
crashes on second call.
|
||||
|
||||
SET SESSION optimizer_switch ='semijoin=on';
|
||||
CREATE TABLE t1 ( t1field integer, primary key (t1field));
|
||||
CREATE TABLE t2 ( t2field integer, primary key (t2field));
|
||||
CREATE VIEW v1 AS
|
||||
SELECT t1field as v1field
|
||||
FROM t1 A
|
||||
WHERE A.t1field IN (SELECT t1field FROM t2 );
|
||||
CREATE VIEW v2 AS
|
||||
SELECT t2field as v2field
|
||||
FROM t2 A
|
||||
WHERE A.t2field IN (SELECT t2field FROM t2 );
|
||||
CREATE PROCEDURE p1 ()
|
||||
BEGIN
|
||||
SELECT v1field
|
||||
FROM v1
|
||||
WHERE v1field IN ( SELECT v2field as vf_inner FROM v2 );
|
||||
END|
|
||||
INSERT INTO t1 VALUES (1),(2),(3);
|
||||
INSERT INTO t2 VALUES (2),(3),(4);
|
||||
CALL p1;
|
||||
v1field
|
||||
2
|
||||
3
|
||||
CALL p1;
|
||||
v1field
|
||||
2
|
||||
3
|
||||
DROP TABLE t1,t2;
|
||||
DROP VIEW v1,v2;
|
||||
DROP PROCEDURE p1;
|
||||
set SESSION optimizer_switch='default';
|
||||
# End of BUG#48834
|
||||
|
||||
Bug#49097 subquery with view generates wrong result with
|
||||
non-prepared statement
|
||||
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
DROP VIEW IF EXISTS v1;
|
||||
CREATE TABLE t1 (
|
||||
city VARCHAR(50) NOT NULL,
|
||||
country_id SMALLINT UNSIGNED NOT NULL
|
||||
);
|
||||
INSERT INTO t1 VALUES
|
||||
('Batna',2),
|
||||
('Bchar',2),
|
||||
('Skikda',2),
|
||||
('Tafuna',3),
|
||||
('Algeria',2) ;
|
||||
CREATE TABLE t2 (
|
||||
country_id SMALLINT UNSIGNED NOT NULL,
|
||||
country VARCHAR(50) NOT NULL
|
||||
);
|
||||
INSERT INTO t2 VALUES
|
||||
(2,'Algeria'),
|
||||
(3,'XAmerican Samoa') ;
|
||||
CREATE VIEW v1 AS
|
||||
SELECT country_id, country
|
||||
FROM t2
|
||||
WHERE LEFT(country,1) = "A"
|
||||
;
|
||||
SELECT city, country_id
|
||||
FROM t1
|
||||
WHERE country_id IN (
|
||||
SELECT country_id
|
||||
FROM t2
|
||||
WHERE LEFT(country,1) = "A"
|
||||
);
|
||||
city country_id
|
||||
Batna 2
|
||||
Bchar 2
|
||||
Skikda 2
|
||||
Algeria 2
|
||||
SELECT city, country_id
|
||||
FROM t1
|
||||
WHERE country_id IN (
|
||||
SELECT country_id
|
||||
FROM v1
|
||||
);
|
||||
city country_id
|
||||
Batna 2
|
||||
Bchar 2
|
||||
Skikda 2
|
||||
Algeria 2
|
||||
PREPARE stmt FROM
|
||||
"
|
||||
SELECT city, country_id
|
||||
FROM t1
|
||||
WHERE country_id IN (
|
||||
SELECT country_id
|
||||
FROM v1
|
||||
);
|
||||
";
|
||||
execute stmt;
|
||||
city country_id
|
||||
Batna 2
|
||||
Bchar 2
|
||||
Skikda 2
|
||||
Algeria 2
|
||||
deallocate prepare stmt;
|
||||
drop table t1, t2;
|
||||
drop view v1;
|
||||
# End of Bug#49097
|
||||
#
|
||||
# BUG#38075: Wrong result: rows matching a subquery with outer join not returned
|
||||
#
|
||||
DROP TABLE IF EXISTS ot1, it1, it2;
|
||||
CREATE TABLE it2 (
|
||||
int_key int(11) NOT NULL,
|
||||
datetime_key datetime NOT NULL,
|
||||
KEY int_key (int_key),
|
||||
KEY datetime_key (datetime_key)
|
||||
);
|
||||
INSERT INTO it2 VALUES
|
||||
(5,'2002-04-10 14:25:30'), (0,'0000-00-00 00:00:00'),
|
||||
(0,'2006-09-14 04:01:02'), (4,'0000-00-00 00:00:00'),
|
||||
(8,'0000-00-00 00:00:00'), (5,'0000-00-00 00:00:00'),
|
||||
(9,'0000-00-00 00:00:00'), (8,'2007-04-01 11:04:17'),
|
||||
(1,'0000-00-00 00:00:00'), (7,'2009-01-12 00:00:00'),
|
||||
(0,'2009-06-05 00:00:00'), (3,'2006-02-14 18:06:35'),
|
||||
(5,'2006-02-21 07:08:16'), (0,'0000-00-00 00:00:00'),
|
||||
(7,'0000-00-00 00:00:00'), (0,'0000-00-00 00:00:00'),
|
||||
(0,'2007-02-13 00:00:00'), (1,'0000-00-00 00:00:00'),
|
||||
(0,'0000-00-00 00:00:00'), (1,'2003-08-11 00:00:00');
|
||||
CREATE TABLE ot1 (
|
||||
int_nokey int(11) NOT NULL,
|
||||
int_key int(11) NOT NULL,
|
||||
KEY int_key (int_key)
|
||||
);
|
||||
INSERT INTO ot1 VALUES
|
||||
(5,0), (3,0), (0,2), (3,0), (1,3), (0,0), (1,7), (7,0), (1,7), (0,7),
|
||||
(0,9), (8,2), (4,4), (9,3), (0,9), (2,5), (0,5), (8,0), (5,8), (1,5);
|
||||
CREATE TABLE it1 (
|
||||
int_nokey int(11) NOT NULL,
|
||||
int_key int(11) NOT NULL,
|
||||
KEY int_key (int_key)
|
||||
);
|
||||
INSERT INTO it1 VALUES
|
||||
(9,5), (0,4);
|
||||
SELECT int_key FROM ot1
|
||||
WHERE int_nokey IN (SELECT it2.int_key
|
||||
FROM it1 LEFT JOIN it2 ON it2.datetime_key);
|
||||
int_key
|
||||
0
|
||||
8
|
||||
2
|
||||
0
|
||||
7
|
||||
9
|
||||
9
|
||||
5
|
||||
2
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
3
|
||||
7
|
||||
7
|
||||
5
|
||||
EXPLAIN
|
||||
SELECT int_key FROM ot1
|
||||
WHERE int_nokey IN (SELECT it2.int_key
|
||||
FROM it1 LEFT JOIN it2 ON it2.datetime_key);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY it1 index NULL int_key 4 NULL 2 Using index; Start temporary
|
||||
1 PRIMARY ot1 ALL NULL NULL NULL NULL 20 Using join buffer
|
||||
1 PRIMARY it2 ALL NULL NULL NULL NULL 20 Using where; End temporary; Using join buffer
|
||||
DROP TABLE ot1, it1, it2;
|
||||
# End of BUG#38075
|
||||
set join_cache_level=default;
|
||||
show variables like 'join_cache_level';
|
||||
Variable_name Value
|
||||
join_cache_level 1
|
||||
Reference in New Issue
Block a user