You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
612 lines
30 KiB
612 lines
30 KiB
|
|
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,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on
|
|
set optimizer_switch='default';
|
|
set optimizer_switch='materialization=off';
|
|
select @@optimizer_switch;
|
|
@@optimizer_switch
|
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=off,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on
|
|
set optimizer_switch='default';
|
|
set optimizer_switch='semijoin=off';
|
|
select @@optimizer_switch;
|
|
@@optimizer_switch
|
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=off,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on
|
|
set optimizer_switch='default';
|
|
set optimizer_switch='loosescan=off';
|
|
select @@optimizer_switch;
|
|
@@optimizer_switch
|
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=off,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on
|
|
set optimizer_switch='default';
|
|
set optimizer_switch='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,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=off,semijoin=off,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on
|
|
set optimizer_switch='default';
|
|
set optimizer_switch='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,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=off,semijoin=off,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on
|
|
set optimizer_switch='default';
|
|
set optimizer_switch='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,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=off,semijoin=off,loosescan=off,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on
|
|
set optimizer_switch='default';
|
|
set optimizer_switch='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,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=off,loosescan=off,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on
|
|
set optimizer_switch='default';
|
|
set optimizer_switch='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,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=off,semijoin=on,loosescan=off,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on,hash_join=on
|
|
set optimizer_switch='default';
|
|
create table t1 (a1 char(8), a2 char(8));
|
|
create table t2 (b1 char(8), b2 char(8));
|
|
insert into t1 values ('1 - 00', '2 - 00');
|
|
insert into t1 values ('1 - 01', '2 - 01');
|
|
insert into t1 values ('1 - 02', '2 - 02');
|
|
insert into t2 values ('1 - 01', '2 - 01');
|
|
insert into t2 values ('1 - 01', '2 - 01');
|
|
insert into t2 values ('1 - 02', '2 - 02');
|
|
insert into t2 values ('1 - 02', '2 - 02');
|
|
insert into t2 values ('1 - 03', '2 - 03');
|
|
set @@optimizer_switch="semijoin=off";
|
|
prepare st1 from
|
|
"select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1)";
|
|
set @@optimizer_switch="semijoin=on,materialization=off";
|
|
execute st1;
|
|
a1 a2
|
|
1 - 01 2 - 01
|
|
1 - 02 2 - 02
|
|
set @@optimizer_switch="semijoin=off,materialization=on";
|
|
execute st1;
|
|
a1 a2
|
|
1 - 01 2 - 01
|
|
1 - 02 2 - 02
|
|
set optimizer_switch='default';
|
|
set @@optimizer_switch="materialization=off";
|
|
prepare st1 from
|
|
"select * from t1 where (a1, a2) in (select b1, min(b2) from t2 where b1 > '0' group by b1)";
|
|
set @@optimizer_switch="semijoin=off,materialization=on";
|
|
execute st1;
|
|
a1 a2
|
|
1 - 01 2 - 01
|
|
1 - 02 2 - 02
|
|
set @@optimizer_switch="semijoin=on,materialization=off";
|
|
execute st1;
|
|
a1 a2
|
|
1 - 01 2 - 01
|
|
1 - 02 2 - 02
|
|
set optimizer_switch='default';
|
|
drop table t1, t2;
|
|
#
|
|
# 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;
|
|
f1
|
|
DROP PROCEDURE p1;
|
|
DROP TABLE t1, t2;
|
|
SET SESSION optimizer_switch = 'default';
|
|
#
|
|
# 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#50489: another segfault in fix_semijoin_strategies...
|
|
#
|
|
CREATE TABLE it (
|
|
id INT NOT NULL,
|
|
expr_key INT NOT NULL,
|
|
expr_nokey INT NOT NULL,
|
|
expr_padder INT DEFAULT NULL,
|
|
KEY expr_key(expr_key)
|
|
);
|
|
INSERT INTO it VALUES (135,218264606,218264606,100);
|
|
INSERT INTO it VALUES (201,810783319,810783319,200);
|
|
CREATE TABLE ot (
|
|
id INT NOT NULL,
|
|
expr_key INT NOT NULL,
|
|
expr_nokey INT NOT NULL,
|
|
KEY expr_key(expr_key)
|
|
);
|
|
CREATE PROCEDURE run_n_times(x int)
|
|
BEGIN
|
|
DECLARE c int;
|
|
WHILE x DO
|
|
SET x = x-1;
|
|
SELECT COUNT(expr_key) INTO c FROM ot
|
|
WHERE expr_key IN (SELECT expr_nokey FROM it)
|
|
AND ot.expr_key<100000000;
|
|
END WHILE;
|
|
END;
|
|
SET optimizer_switch="default";
|
|
call run_n_times(1);
|
|
SET optimizer_switch="firstmatch=off,materialization=off";
|
|
call run_n_times(1);
|
|
SET optimizer_switch="default";
|
|
call run_n_times(1);
|
|
DROP PROCEDURE run_n_times;
|
|
CREATE PROCEDURE run_n_times(x int)
|
|
BEGIN
|
|
DECLARE c int;
|
|
WHILE x DO
|
|
SET x = x-1;
|
|
SELECT COUNT(expr_key) INTO c FROM ot
|
|
WHERE expr_key IN (SELECT expr_nokey FROM it)
|
|
AND ot.expr_key<100000000;
|
|
END WHILE;
|
|
END;
|
|
SET optimizer_switch="firstmatch=off,materialization=off";
|
|
call run_n_times(1);
|
|
SET optimizer_switch="default";
|
|
call run_n_times(1);
|
|
DROP PROCEDURE run_n_times;
|
|
CREATE PROCEDURE run_n_times(x int)
|
|
BEGIN
|
|
DECLARE c int;
|
|
WHILE x DO
|
|
SET x = x-1;
|
|
SELECT COUNT(expr_key) INTO c FROM ot
|
|
WHERE expr_key IN (SELECT expr_nokey FROM it)
|
|
AND ot.expr_key<100000000;
|
|
END WHILE;
|
|
END;
|
|
SET optimizer_switch="semijoin=off,materialization=off";
|
|
call run_n_times(1);
|
|
SET optimizer_switch="default";
|
|
call run_n_times(1);
|
|
DROP PROCEDURE run_n_times;
|
|
DROP TABLE it, ot;
|
|
#
|
|
# BUG#31480: Incorrect result for nested subquery when executed via semijoin
|
|
#
|
|
CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL);
|
|
CREATE TABLE t2 (c INT NOT NULL, d INT NOT NULL);
|
|
CREATE TABLE t3 (e INT NOT NULL);
|
|
CREATE TABLE t4 (f INT NOT NULL, g INT NOT NULL);
|
|
INSERT INTO t1 VALUES (1,10);
|
|
INSERT INTO t1 VALUES (2,10);
|
|
INSERT INTO t1 VALUES (1,20);
|
|
INSERT INTO t1 VALUES (2,20);
|
|
INSERT INTO t1 VALUES (3,20);
|
|
INSERT INTO t1 VALUES (2,30);
|
|
INSERT INTO t1 VALUES (4,40);
|
|
INSERT INTO t2 VALUES (2,10);
|
|
INSERT INTO t2 VALUES (2,20);
|
|
INSERT INTO t2 VALUES (4,10);
|
|
INSERT INTO t2 VALUES (5,10);
|
|
INSERT INTO t2 VALUES (3,20);
|
|
INSERT INTO t2 VALUES (2,40);
|
|
INSERT INTO t3 VALUES (10);
|
|
INSERT INTO t3 VALUES (30);
|
|
INSERT INTO t3 VALUES (10);
|
|
INSERT INTO t3 VALUES (20);
|
|
INSERT INTO t4 VALUES (2,10);
|
|
INSERT INTO t4 VALUES (2,10);
|
|
INSERT INTO t4 VALUES (3,10);
|
|
INSERT INTO t4 VALUES (4,10);
|
|
INSERT INTO t4 VALUES (4,20);
|
|
INSERT INTO t4 VALUES (4,20);
|
|
# Reference to the parent query block (used tables was wrong)
|
|
set @@optimizer_switch='materialization=off,semijoin=off';
|
|
analyze table t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 analyze status OK
|
|
analyze table t2;
|
|
Table Op Msg_type Msg_text
|
|
test.t2 analyze status OK
|
|
analyze table t3;
|
|
Table Op Msg_type Msg_text
|
|
test.t3 analyze status OK
|
|
analyze table t4;
|
|
Table Op Msg_type Msg_text
|
|
test.t4 analyze status OK
|
|
EXPLAIN SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d >= SOME(SELECT e FROM t3 as tc
|
|
WHERE ta.b=tc.e));
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY ta NULL ALL NULL NULL NULL NULL 7 100.00 Using where
|
|
2 DEPENDENT SUBQUERY tb NULL ALL NULL NULL NULL NULL 6 16.67 Using where
|
|
3 DEPENDENT SUBQUERY tc NULL ALL NULL NULL NULL NULL 4 25.00 Using where
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.ta.b' of SELECT #3 was resolved in SELECT #1
|
|
Note 1003 /* select#1 */ select `test`.`ta`.`a` AS `a`,`test`.`ta`.`b` AS `b` from `test`.`t1` `ta` where <in_optimizer>(`test`.`ta`.`a`,<exists>(/* select#2 */ select 1 from `test`.`t2` `tb` where (<nop>(<in_optimizer>(`test`.`tb`.`d`,<exists>(/* select#3 */ select 1 from `test`.`t3` `tc` where ((`test`.`ta`.`b` = `test`.`tc`.`e`) and (<cache>(`test`.`tb`.`d`) >= `test`.`tc`.`e`))))) and (<cache>(`test`.`ta`.`a`) = `test`.`tb`.`c`))))
|
|
SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d >= SOME(SELECT e FROM t3 as tc
|
|
WHERE ta.b=tc.e));
|
|
a b
|
|
2 10
|
|
2 20
|
|
3 20
|
|
2 30
|
|
set @@optimizer_switch='materialization=off,semijoin=on';
|
|
EXPLAIN SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d >= SOME(SELECT e FROM t3 as tc
|
|
WHERE ta.b=tc.e));
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY tb NULL ALL NULL NULL NULL NULL 6 100.00 Start temporary
|
|
1 PRIMARY ta NULL ALL NULL NULL NULL NULL 7 14.29 Using where; End temporary; Using join buffer (Block Nested Loop)
|
|
3 DEPENDENT SUBQUERY tc NULL ALL NULL NULL NULL NULL 4 25.00 Using where
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.ta.b' of SELECT #3 was resolved in SELECT #1
|
|
Note 1003 /* select#1 */ select `test`.`ta`.`a` AS `a`,`test`.`ta`.`b` AS `b` from `test`.`t1` `ta` semi join (`test`.`t2` `tb`) where ((`test`.`ta`.`a` = `test`.`tb`.`c`) and <nop>(<in_optimizer>(`test`.`tb`.`d`,<exists>(/* select#3 */ select 1 from `test`.`t3` `tc` where ((`test`.`ta`.`b` = `test`.`tc`.`e`) and (<cache>(`test`.`tb`.`d`) >= `test`.`tc`.`e`))))))
|
|
SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d >= SOME(SELECT e FROM t3 as tc
|
|
WHERE ta.b=tc.e));
|
|
a b
|
|
2 10
|
|
2 20
|
|
3 20
|
|
2 30
|
|
# Subquery with GROUP BY and HAVING
|
|
set @@optimizer_switch='materialization=off,semijoin=off';
|
|
EXPLAIN SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d >= SOME(SELECT SUM(g) FROM t4 as tc
|
|
GROUP BY f
|
|
HAVING ta.a=tc.f));
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY ta NULL ALL NULL NULL NULL NULL 7 100.00 Using where
|
|
2 DEPENDENT SUBQUERY tb NULL ALL NULL NULL NULL NULL 6 16.67 Using where
|
|
3 DEPENDENT SUBQUERY tc NULL ALL NULL NULL NULL NULL 6 100.00 Using temporary
|
|
Warnings:
|
|
Note 1276 Field or reference 'ta.a' of SELECT #3 was resolved in SELECT #1
|
|
Note 1003 /* select#1 */ select `test`.`ta`.`a` AS `a`,`test`.`ta`.`b` AS `b` from `test`.`t1` `ta` where <in_optimizer>(`test`.`ta`.`a`,<exists>(/* select#2 */ select 1 from `test`.`t2` `tb` where (<nop>(<in_optimizer>(`test`.`tb`.`d`,<exists>(/* select#3 */ select 1 from `test`.`t4` `tc` group by `test`.`tc`.`f` having ((`test`.`ta`.`a` = `test`.`tc`.`f`) and (<cache>(`test`.`tb`.`d`) >= <ref_null_helper>(sum(`test`.`tc`.`g`))))))) and (<cache>(`test`.`ta`.`a`) = `test`.`tb`.`c`))))
|
|
SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d >= SOME(SELECT SUM(g) FROM t4 as tc
|
|
GROUP BY f
|
|
HAVING ta.a=tc.f));
|
|
a b
|
|
2 10
|
|
2 20
|
|
3 20
|
|
2 30
|
|
set @@optimizer_switch='materialization=off,semijoin=on';
|
|
EXPLAIN SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d >= SOME(SELECT SUM(g) FROM t4 as tc
|
|
GROUP BY f
|
|
HAVING ta.a=tc.f));
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY tb NULL ALL NULL NULL NULL NULL 6 100.00 Start temporary
|
|
1 PRIMARY ta NULL ALL NULL NULL NULL NULL 7 14.29 Using where; End temporary; Using join buffer (Block Nested Loop)
|
|
3 DEPENDENT SUBQUERY tc NULL ALL NULL NULL NULL NULL 6 100.00 Using temporary
|
|
Warnings:
|
|
Note 1276 Field or reference 'ta.a' of SELECT #3 was resolved in SELECT #1
|
|
Note 1003 /* select#1 */ select `test`.`ta`.`a` AS `a`,`test`.`ta`.`b` AS `b` from `test`.`t1` `ta` semi join (`test`.`t2` `tb`) where ((`test`.`ta`.`a` = `test`.`tb`.`c`) and <nop>(<in_optimizer>(`test`.`tb`.`d`,<exists>(/* select#3 */ select 1 from `test`.`t4` `tc` group by `test`.`tc`.`f` having ((`test`.`ta`.`a` = `test`.`tc`.`f`) and (<cache>(`test`.`tb`.`d`) >= <ref_null_helper>(sum(`test`.`tc`.`g`))))))))
|
|
SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d >= SOME(SELECT SUM(g) FROM t4 as tc
|
|
GROUP BY f
|
|
HAVING ta.a=tc.f));
|
|
a b
|
|
2 10
|
|
2 20
|
|
3 20
|
|
2 30
|
|
# Subquery with ORDER BY and LIMIT
|
|
set @@optimizer_switch='materialization=off,semijoin=off';
|
|
# NOTE: The ordered subquery should have a LIMIT clause to make sense
|
|
EXPLAIN SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d IN (SELECT g FROM t4 as tc
|
|
WHERE ta.a=tc.f
|
|
ORDER BY tc.f));
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY ta NULL ALL NULL NULL NULL NULL 7 100.00 Using where
|
|
2 DEPENDENT SUBQUERY tb NULL ALL NULL NULL NULL NULL 6 16.67 Using where
|
|
3 DEPENDENT SUBQUERY tc NULL ALL NULL NULL NULL NULL 6 16.67 Using where
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.ta.a' of SELECT #3 was resolved in SELECT #1
|
|
Note 1003 /* select#1 */ select `test`.`ta`.`a` AS `a`,`test`.`ta`.`b` AS `b` from `test`.`t1` `ta` where <in_optimizer>(`test`.`ta`.`a`,<exists>(/* select#2 */ select 1 from `test`.`t2` `tb` where (<in_optimizer>(`test`.`tb`.`d`,<exists>(/* select#3 */ select 1 from `test`.`t4` `tc` where ((`test`.`ta`.`a` = `test`.`tc`.`f`) and (<cache>(`test`.`tb`.`d`) = `test`.`tc`.`g`)))) and (<cache>(`test`.`ta`.`a`) = `test`.`tb`.`c`))))
|
|
SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d IN (SELECT g FROM t4 as tc
|
|
WHERE ta.a=tc.f
|
|
ORDER BY tc.f));
|
|
a b
|
|
2 10
|
|
2 20
|
|
2 30
|
|
4 40
|
|
set @@optimizer_switch='materialization=off,semijoin=on';
|
|
EXPLAIN SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d IN (SELECT g FROM t4 as tc
|
|
WHERE ta.a=tc.f
|
|
ORDER BY tc.f));
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE tb NULL ALL NULL NULL NULL NULL 6 100.00 Start temporary
|
|
1 SIMPLE tc NULL ALL NULL NULL NULL NULL 6 16.67 Using where; Using join buffer (Block Nested Loop)
|
|
1 SIMPLE ta NULL ALL NULL NULL NULL NULL 7 14.29 Using where; End temporary; Using join buffer (Block Nested Loop)
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.ta.a' of SELECT #3 was resolved in SELECT #1
|
|
Note 1003 /* select#1 */ select `test`.`ta`.`a` AS `a`,`test`.`ta`.`b` AS `b` from `test`.`t1` `ta` semi join (`test`.`t2` `tb` join `test`.`t4` `tc`) where ((`test`.`tc`.`f` = `test`.`tb`.`c`) and (`test`.`ta`.`a` = `test`.`tb`.`c`) and (`test`.`tc`.`g` = `test`.`tb`.`d`))
|
|
SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d IN (SELECT g FROM t4 as tc
|
|
WHERE ta.a=tc.f
|
|
ORDER BY tc.f));
|
|
a b
|
|
2 10
|
|
2 20
|
|
2 30
|
|
4 40
|
|
# Reference to the transformed-away query block (dependency was wrong)
|
|
set @@optimizer_switch='materialization=off,semijoin=off';
|
|
EXPLAIN SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d >= SOME(SELECT e FROM t3 as tc
|
|
WHERE tb.d=tc.e));
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY ta NULL ALL NULL NULL NULL NULL 7 100.00 Using where
|
|
2 DEPENDENT SUBQUERY tb NULL ALL NULL NULL NULL NULL 6 16.67 Using where
|
|
3 DEPENDENT SUBQUERY tc NULL ALL NULL NULL NULL NULL 4 25.00 Using where
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.tb.d' of SELECT #3 was resolved in SELECT #2
|
|
Note 1003 /* select#1 */ select `test`.`ta`.`a` AS `a`,`test`.`ta`.`b` AS `b` from `test`.`t1` `ta` where <in_optimizer>(`test`.`ta`.`a`,<exists>(/* select#2 */ select 1 from `test`.`t2` `tb` where (<nop>(<in_optimizer>(`test`.`tb`.`d`,<exists>(/* select#3 */ select 1 from `test`.`t3` `tc` where ((`test`.`tb`.`d` = `test`.`tc`.`e`) and (<cache>(`test`.`tb`.`d`) >= `test`.`tc`.`e`))))) and (<cache>(`test`.`ta`.`a`) = `test`.`tb`.`c`))))
|
|
SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d >= SOME(SELECT e FROM t3 as tc
|
|
WHERE tb.d=tc.e));
|
|
a b
|
|
2 10
|
|
2 20
|
|
2 30
|
|
3 20
|
|
4 40
|
|
set @@optimizer_switch='materialization=off,semijoin=on';
|
|
EXPLAIN SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d >= SOME(SELECT e FROM t3 as tc
|
|
WHERE tb.d=tc.e));
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY tb NULL ALL NULL NULL NULL NULL 6 100.00 Using where; Start temporary
|
|
1 PRIMARY ta NULL ALL NULL NULL NULL NULL 7 14.29 Using where; End temporary; Using join buffer (Block Nested Loop)
|
|
3 DEPENDENT SUBQUERY tc NULL ALL NULL NULL NULL NULL 4 25.00 Using where
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.tb.d' of SELECT #3 was resolved in SELECT #2
|
|
Note 1003 /* select#1 */ select `test`.`ta`.`a` AS `a`,`test`.`ta`.`b` AS `b` from `test`.`t1` `ta` semi join (`test`.`t2` `tb`) where ((`test`.`ta`.`a` = `test`.`tb`.`c`) and <nop>(<in_optimizer>(`test`.`tb`.`d`,<exists>(/* select#3 */ select 1 from `test`.`t3` `tc` where ((`test`.`tb`.`d` = `test`.`tc`.`e`) and (<cache>(`test`.`tb`.`d`) >= `test`.`tc`.`e`))))))
|
|
SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d >= SOME(SELECT e FROM t3 as tc
|
|
WHERE tb.d=tc.e));
|
|
a b
|
|
2 10
|
|
2 20
|
|
2 30
|
|
3 20
|
|
4 40
|
|
# Reference above the parent query block (should not be affected)
|
|
set @@optimizer_switch='materialization=off,semijoin=off';
|
|
EXPLAIN SELECT * FROM t1 AS t
|
|
WHERE t.a NOT IN (SELECT a FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d >= SOME(SELECT e FROM t3 as tc
|
|
WHERE t.b=tc.e)));
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY t NULL ALL NULL NULL NULL NULL 7 100.00 Using where
|
|
2 DEPENDENT SUBQUERY ta NULL ALL NULL NULL NULL NULL 7 14.29 Using where
|
|
3 DEPENDENT SUBQUERY tb NULL ALL NULL NULL NULL NULL 6 16.67 Using where
|
|
4 DEPENDENT SUBQUERY tc NULL ALL NULL NULL NULL NULL 4 25.00 Using where
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.t.b' of SELECT #4 was resolved in SELECT #1
|
|
Note 1003 /* select#1 */ select `test`.`t`.`a` AS `a`,`test`.`t`.`b` AS `b` from `test`.`t1` `t` where <in_optimizer>(`test`.`t`.`a`,<exists>(/* select#2 */ select 1 from `test`.`t1` `ta` where (<in_optimizer>(`test`.`ta`.`a`,<exists>(/* select#3 */ select 1 from `test`.`t2` `tb` where (<nop>(<in_optimizer>(`test`.`tb`.`d`,<exists>(/* select#4 */ select 1 from `test`.`t3` `tc` where ((`test`.`t`.`b` = `test`.`tc`.`e`) and (<cache>(`test`.`tb`.`d`) >= `test`.`tc`.`e`))))) and (<cache>(`test`.`ta`.`a`) = `test`.`tb`.`c`)))) and (<cache>(`test`.`t`.`a`) = `test`.`ta`.`a`))) is false)
|
|
SELECT * FROM t1 AS t
|
|
WHERE t.a NOT IN (SELECT a FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d >= SOME(SELECT e FROM t3 as tc
|
|
WHERE t.b=tc.e)));
|
|
a b
|
|
1 10
|
|
1 20
|
|
4 40
|
|
set @@optimizer_switch='materialization=off,semijoin=on';
|
|
EXPLAIN SELECT * FROM t1 AS t
|
|
WHERE t.a NOT IN (SELECT a FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d >= SOME(SELECT e FROM t3 as tc
|
|
WHERE t.b=tc.e)));
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY t NULL ALL NULL NULL NULL NULL 7 100.00 NULL
|
|
1 PRIMARY tb NULL ALL NULL NULL NULL NULL 6 100.00 Using where; Not exists; Using join buffer (Block Nested Loop)
|
|
1 PRIMARY ta NULL ALL NULL NULL NULL NULL 7 100.00 Using where; Using join buffer (Block Nested Loop)
|
|
4 DEPENDENT SUBQUERY tc NULL ALL NULL NULL NULL NULL 4 25.00 Using where
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.t.b' of SELECT #4 was resolved in SELECT #1
|
|
Note 1003 /* select#1 */ select `test`.`t`.`a` AS `a`,`test`.`t`.`b` AS `b` from `test`.`t1` `t` anti join (`test`.`t1` `ta` join `test`.`t2` `tb`) on(((`test`.`tb`.`c` = `test`.`t`.`a`) and (`test`.`ta`.`a` = `test`.`t`.`a`) and <nop>(<in_optimizer>(`test`.`tb`.`d`,<exists>(/* select#4 */ select 1 from `test`.`t3` `tc` where ((`test`.`t`.`b` = `test`.`tc`.`e`) and (<cache>(`test`.`tb`.`d`) >= `test`.`tc`.`e`))))))) where true
|
|
SELECT * FROM t1 AS t
|
|
WHERE t.a NOT IN (SELECT a FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d >= SOME(SELECT e FROM t3 as tc
|
|
WHERE t.b=tc.e)));
|
|
a b
|
|
1 10
|
|
1 20
|
|
4 40
|
|
# EXISTS with reference to the parent query block
|
|
set @@optimizer_switch='materialization=off,semijoin=off';
|
|
EXPLAIN SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE EXISTS (SELECT * FROM t3 as tc
|
|
WHERE ta.b=tc.e));
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY ta NULL ALL NULL NULL NULL NULL 7 100.00 Using where
|
|
2 DEPENDENT SUBQUERY tb NULL ALL NULL NULL NULL NULL 6 16.67 Using where
|
|
3 DEPENDENT SUBQUERY tc NULL ALL NULL NULL NULL NULL 4 25.00 Using where
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.ta.b' of SELECT #3 was resolved in SELECT #1
|
|
Note 1003 /* select#1 */ select `test`.`ta`.`a` AS `a`,`test`.`ta`.`b` AS `b` from `test`.`t1` `ta` where <in_optimizer>(`test`.`ta`.`a`,<exists>(/* select#2 */ select 1 from `test`.`t2` `tb` where (exists(/* select#3 */ select 1 from `test`.`t3` `tc` where (`test`.`ta`.`b` = `test`.`tc`.`e`)) and (<cache>(`test`.`ta`.`a`) = `test`.`tb`.`c`))))
|
|
SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE EXISTS (SELECT * FROM t3 as tc
|
|
WHERE ta.b=tc.e));
|
|
a b
|
|
2 10
|
|
2 20
|
|
3 20
|
|
2 30
|
|
set @@optimizer_switch='materialization=off,semijoin=on';
|
|
EXPLAIN SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE EXISTS (SELECT * FROM t3 as tc
|
|
WHERE ta.b=tc.e));
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE tc NULL ALL NULL NULL NULL NULL 4 100.00 Start temporary
|
|
1 SIMPLE ta NULL ALL NULL NULL NULL NULL 7 14.29 Using where; Using join buffer (Block Nested Loop)
|
|
1 SIMPLE tb NULL ALL NULL NULL NULL NULL 6 16.67 Using where; End temporary; Using join buffer (Block Nested Loop)
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.ta.b' of SELECT #3 was resolved in SELECT #1
|
|
Note 1003 /* select#1 */ select `test`.`ta`.`a` AS `a`,`test`.`ta`.`b` AS `b` from `test`.`t1` `ta` semi join (`test`.`t2` `tb` join `test`.`t3` `tc`) where ((`test`.`ta`.`b` = `test`.`tc`.`e`) and (`test`.`tb`.`c` = `test`.`ta`.`a`))
|
|
SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE EXISTS (SELECT * FROM t3 as tc
|
|
WHERE ta.b=tc.e));
|
|
a b
|
|
2 10
|
|
2 20
|
|
2 30
|
|
3 20
|
|
# Scalar subquery with reference to the parent query block
|
|
set @@optimizer_switch='materialization=off,semijoin=off';
|
|
EXPLAIN SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d = (SELECT MIN(e) FROM t3 as tc
|
|
WHERE ta.b=tc.e));
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY ta NULL ALL NULL NULL NULL NULL 7 100.00 Using where
|
|
2 DEPENDENT SUBQUERY tb NULL ALL NULL NULL NULL NULL 6 16.67 Using where
|
|
3 DEPENDENT SUBQUERY tc NULL ALL NULL NULL NULL NULL 4 25.00 Using where
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.ta.b' of SELECT #3 was resolved in SELECT #1
|
|
Note 1003 /* select#1 */ select `test`.`ta`.`a` AS `a`,`test`.`ta`.`b` AS `b` from `test`.`t1` `ta` where <in_optimizer>(`test`.`ta`.`a`,<exists>(/* select#2 */ select 1 from `test`.`t2` `tb` where ((`test`.`tb`.`d` = (/* select#3 */ select min(`test`.`tc`.`e`) from `test`.`t3` `tc` where (`test`.`ta`.`b` = `test`.`tc`.`e`))) and (<cache>(`test`.`ta`.`a`) = `test`.`tb`.`c`))))
|
|
SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d = (SELECT MIN(e) FROM t3 as tc
|
|
WHERE ta.b=tc.e));
|
|
a b
|
|
2 10
|
|
2 20
|
|
3 20
|
|
set @@optimizer_switch='materialization=off,semijoin=on';
|
|
EXPLAIN SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d = (SELECT MIN(e) FROM t3 as tc
|
|
WHERE ta.b=tc.e));
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY tb NULL ALL NULL NULL NULL NULL 6 100.00 Start temporary
|
|
1 PRIMARY ta NULL ALL NULL NULL NULL NULL 7 14.29 Using where; End temporary; Using join buffer (Block Nested Loop)
|
|
3 DEPENDENT SUBQUERY tc NULL ALL NULL NULL NULL NULL 4 25.00 Using where
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.ta.b' of SELECT #3 was resolved in SELECT #1
|
|
Note 1003 /* select#1 */ select `test`.`ta`.`a` AS `a`,`test`.`ta`.`b` AS `b` from `test`.`t1` `ta` semi join (`test`.`t2` `tb`) where ((`test`.`ta`.`a` = `test`.`tb`.`c`) and ((/* select#3 */ select min(`test`.`tc`.`e`) from `test`.`t3` `tc` where (`test`.`ta`.`b` = `test`.`tc`.`e`)) = `test`.`tb`.`d`))
|
|
SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE tb.d = (SELECT MIN(e) FROM t3 as tc
|
|
WHERE ta.b=tc.e));
|
|
a b
|
|
2 10
|
|
2 20
|
|
3 20
|
|
# Combine scalar subquery with quantified comparison subquery
|
|
set @@optimizer_switch='materialization=off,semijoin=off';
|
|
EXPLAIN SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE (SELECT MIN(e) FROM t3 as tc
|
|
WHERE tb.d=tc.e) < SOME(SELECT e FROM t3 as tc
|
|
WHERE ta.b=tc.e));
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY ta NULL ALL NULL NULL NULL NULL 7 100.00 Using where
|
|
2 DEPENDENT SUBQUERY tb NULL ALL NULL NULL NULL NULL 6 16.67 Using where
|
|
4 DEPENDENT SUBQUERY tc NULL ALL NULL NULL NULL NULL 4 25.00 Using where
|
|
3 DEPENDENT SUBQUERY tc NULL ALL NULL NULL NULL NULL 4 25.00 Using where
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.ta.b' of SELECT #4 was resolved in SELECT #1
|
|
Note 1276 Field or reference 'test.tb.d' of SELECT #3 was resolved in SELECT #2
|
|
Note 1003 /* select#1 */ select `test`.`ta`.`a` AS `a`,`test`.`ta`.`b` AS `b` from `test`.`t1` `ta` where <in_optimizer>(`test`.`ta`.`a`,<exists>(/* select#2 */ select 1 from `test`.`t2` `tb` where (<nop>(<in_optimizer>((/* select#3 */ select min(`test`.`tc`.`e`) from `test`.`t3` `tc` where (`test`.`tb`.`d` = `test`.`tc`.`e`)),<exists>(/* select#4 */ select 1 from `test`.`t3` `tc` where ((`test`.`ta`.`b` = `test`.`tc`.`e`) and <if>(outer_field_is_not_null, (<cache>((/* select#3 */ select min(`test`.`tc`.`e`) from `test`.`t3` `tc` where (`test`.`tb`.`d` = `test`.`tc`.`e`))) < `test`.`tc`.`e`), true))))) and (<cache>(`test`.`ta`.`a`) = `test`.`tb`.`c`))))
|
|
SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE (SELECT MIN(e) FROM t3 as tc
|
|
WHERE tb.d=tc.e) < SOME(SELECT e FROM t3 as tc
|
|
WHERE ta.b=tc.e));
|
|
a b
|
|
2 20
|
|
2 30
|
|
set @@optimizer_switch='materialization=off,semijoin=on';
|
|
EXPLAIN SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE (SELECT MIN(e) FROM t3 as tc
|
|
WHERE tb.d=tc.e) < SOME(SELECT e FROM t3 as tc
|
|
WHERE ta.b=tc.e));
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY tb NULL ALL NULL NULL NULL NULL 6 100.00 Start temporary
|
|
1 PRIMARY ta NULL ALL NULL NULL NULL NULL 7 14.29 Using where; End temporary; Using join buffer (Block Nested Loop)
|
|
4 DEPENDENT SUBQUERY tc NULL ALL NULL NULL NULL NULL 4 25.00 Using where
|
|
3 DEPENDENT SUBQUERY tc NULL ALL NULL NULL NULL NULL 4 25.00 Using where
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.ta.b' of SELECT #4 was resolved in SELECT #1
|
|
Note 1276 Field or reference 'test.tb.d' of SELECT #3 was resolved in SELECT #2
|
|
Note 1003 /* select#1 */ select `test`.`ta`.`a` AS `a`,`test`.`ta`.`b` AS `b` from `test`.`t1` `ta` semi join (`test`.`t2` `tb`) where ((`test`.`ta`.`a` = `test`.`tb`.`c`) and <nop>(<in_optimizer>((/* select#3 */ select min(`test`.`tc`.`e`) from `test`.`t3` `tc` where (`test`.`tb`.`d` = `test`.`tc`.`e`)),<exists>(/* select#4 */ select 1 from `test`.`t3` `tc` where ((`test`.`ta`.`b` = `test`.`tc`.`e`) and <if>(outer_field_is_not_null, (<cache>((/* select#3 */ select min(`test`.`tc`.`e`) from `test`.`t3` `tc` where (`test`.`tb`.`d` = `test`.`tc`.`e`))) < `test`.`tc`.`e`), true))))))
|
|
SELECT * FROM t1 AS ta
|
|
WHERE ta.a IN (SELECT c FROM t2 AS tb
|
|
WHERE (SELECT MIN(e) FROM t3 as tc
|
|
WHERE tb.d=tc.e) < SOME(SELECT e FROM t3 as tc
|
|
WHERE ta.b=tc.e));
|
|
a b
|
|
2 20
|
|
2 30
|
|
DROP TABLE t1, t2, t3, t4;
|
|
set @@optimizer_switch='default';
|
|
# End of BUG#31480
|
|
|