mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 04:22:27 +01:00
715dc5f99d
of the 5.3 code line after a merge with 5.2 on 2010-10-28 in order not to allow the cost to access a joined table to be equal to 0 ever. Expanded data sets for many test cases to get the same execution plans as before.
569 lines
23 KiB
Text
569 lines
23 KiB
Text
drop table if exists t0, t1, t2, t3, t4, t5, t6;
|
|
drop view if exists v1, v2;
|
|
create table t1 (a int);
|
|
insert into t1 values (0),(1),(2),(3);
|
|
create table t0 as select * from t1;
|
|
create table t2 (a int primary key, b int)
|
|
as select a, a as b from t1 where a in (1,2);
|
|
create table t3 (a int primary key, b int)
|
|
as select a, a as b from t1 where a in (1,3);
|
|
# This will be eliminated:
|
|
explain select t1.a from t1 left join t2 on t2.a=t1.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
explain extended select t1.a from t1 left join t2 on t2.a=t1.a;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 100.00
|
|
Warnings:
|
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where 1
|
|
select t1.a from t1 left join t2 on t2.a=t1.a;
|
|
a
|
|
0
|
|
1
|
|
2
|
|
3
|
|
# This will not be eliminated as t2.b is in in select list:
|
|
explain select * from t1 left join t2 on t2.a=t1.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using where
|
|
# This will not be eliminated as t2.b is in in order list:
|
|
explain select t1.a from t1 left join t2 on t2.a=t1.a order by t2.b;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using temporary; Using filesort
|
|
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using where
|
|
# This will not be eliminated as t2.b is in group list:
|
|
explain select t1.a from t1 left join t2 on t2.a=t1.a group by t2.b;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using temporary; Using filesort
|
|
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using where
|
|
# This will not be eliminated as t2.b is in the WHERE
|
|
explain select t1.a from t1 left join t2 on t2.a=t1.a where t2.b < 3 or t2.b is null;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using where
|
|
# Elimination of multiple tables:
|
|
explain select t1.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 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
# Elimination of multiple tables (2):
|
|
explain select t1.a from t1 left join (t2 join t3 on t2.b=t3.b) on t2.a=t1.a and t3.a=t1.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
# Elimination when done within an outer join nest:
|
|
explain extended
|
|
select t0.*
|
|
from
|
|
t0 left join (t1 left join (t2 join t3 on t2.b=t3.b) on t2.a=t1.a and
|
|
t3.a=t1.a) on t0.a=t1.a;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t0 ALL NULL NULL NULL NULL 4 100.00
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 100.00 Using where
|
|
Warnings:
|
|
Note 1003 select `test`.`t0`.`a` AS `a` from `test`.`t0` left join (`test`.`t1`) on((`test`.`t1`.`a` = `test`.`t0`.`a`)) where 1
|
|
# Elimination with aggregate functions
|
|
explain select count(*) from t1 left join t2 on t2.a=t1.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
explain select count(1) from t1 left join t2 on t2.a=t1.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
explain select count(1) from t1 left join t2 on t2.a=t1.a group by t1.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using temporary; Using filesort
|
|
This must not use elimination:
|
|
explain select count(1) from t1 left join t2 on t2.a=t1.a group by t2.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using temporary; Using filesort
|
|
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using where; Using index
|
|
drop table t0, t1, t2, t3;
|
|
create table t0 ( id integer, primary key (id));
|
|
create table t1 (
|
|
id integer,
|
|
attr1 integer,
|
|
primary key (id),
|
|
key (attr1)
|
|
);
|
|
create table t2 (
|
|
id integer,
|
|
attr2 integer,
|
|
fromdate date,
|
|
primary key (id, fromdate),
|
|
key (attr2,fromdate)
|
|
);
|
|
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
insert into t0 select A.id + 10*B.id from t0 A, t0 B where B.id > 0;
|
|
insert into t1 select id, id from t0;
|
|
insert into t2 select id, id, date_add('2009-06-22', interval id day) from t0;
|
|
insert into t2 select id, id+1, date_add('2008-06-22', interval id day) from t0;
|
|
create view v1 as
|
|
select
|
|
f.id, a1.attr1, a2.attr2
|
|
from
|
|
t0 f
|
|
left join t1 a1 on a1.id=f.id
|
|
left join t2 a2 on a2.id=f.id and
|
|
a2.fromdate=(select MAX(fromdate) from
|
|
t2 where id=a2.id);
|
|
create view v2 as
|
|
select
|
|
f.id, a1.attr1, a2.attr2
|
|
from
|
|
t0 f
|
|
left join t1 a1 on a1.id=f.id
|
|
left join t2 a2 on a2.id=f.id and
|
|
a2.fromdate=(select MAX(fromdate) from
|
|
t2 where id=f.id);
|
|
This should use one table:
|
|
explain select id from v1 where id=2;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE f const PRIMARY PRIMARY 4 const 1 Using index
|
|
This should use one table:
|
|
explain extended select id from v1 where id in (1,2,3,4);
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE f range PRIMARY PRIMARY 4 NULL 4 100.00 Using where; Using index
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.a2.id' of SELECT #3 was resolved in SELECT #2
|
|
Note 1003 select `f`.`id` AS `id` from `test`.`t0` `f` where (`f`.`id` in (1,2,3,4))
|
|
This should use facts and a1 tables:
|
|
explain extended select id from v1 where attr1 between 12 and 14;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a1 range PRIMARY,attr1 attr1 5 NULL 2 100.00 Using where
|
|
1 SIMPLE f eq_ref PRIMARY PRIMARY 4 test.a1.id 1 100.00 Using index
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.a2.id' of SELECT #3 was resolved in SELECT #2
|
|
Note 1003 select `f`.`id` AS `id` from `test`.`t0` `f` join `test`.`t1` `a1` where ((`f`.`id` = `a1`.`id`) and (`a1`.`attr1` between 12 and 14))
|
|
This should use facts, a2 and its subquery:
|
|
explain extended select id from v1 where attr2 between 12 and 14;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a2 range PRIMARY,attr2 attr2 5 NULL 5 100.00 Using where
|
|
1 SIMPLE f eq_ref PRIMARY PRIMARY 4 test.a2.id 1 100.00 Using index
|
|
3 DEPENDENT SUBQUERY t2 ref PRIMARY PRIMARY 4 test.a2.id 2 100.00 Using index
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.a2.id' of SELECT #3 was resolved in SELECT #2
|
|
Note 1003 select `f`.`id` AS `id` from `test`.`t0` `f` join `test`.`t2` `a2` where ((`f`.`id` = `a2`.`id`) and (`a2`.`attr2` between 12 and 14) and (`a2`.`fromdate` = (select max(`test`.`t2`.`fromdate`) from `test`.`t2` where (`test`.`t2`.`id` = `a2`.`id`))))
|
|
This should use one table:
|
|
explain select id from v2 where id=2;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE f const PRIMARY PRIMARY 4 const 1 Using index
|
|
This should use one table:
|
|
explain extended select id from v2 where id in (1,2,3,4);
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE f range PRIMARY PRIMARY 4 NULL 4 100.00 Using where; Using index
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.f.id' of SELECT #3 was resolved in SELECT #2
|
|
Note 1003 select `f`.`id` AS `id` from `test`.`t0` `f` where (`f`.`id` in (1,2,3,4))
|
|
This should use facts and a1 tables:
|
|
explain extended select id from v2 where attr1 between 12 and 14;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a1 range PRIMARY,attr1 attr1 5 NULL 2 100.00 Using where
|
|
1 SIMPLE f eq_ref PRIMARY PRIMARY 4 test.a1.id 1 100.00 Using index
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.f.id' of SELECT #3 was resolved in SELECT #2
|
|
Note 1003 select `f`.`id` AS `id` from `test`.`t0` `f` join `test`.`t1` `a1` where ((`f`.`id` = `a1`.`id`) and (`a1`.`attr1` between 12 and 14))
|
|
This should use facts, a2 and its subquery:
|
|
explain extended select id from v2 where attr2 between 12 and 14;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE a2 range PRIMARY,attr2 attr2 5 NULL 5 100.00 Using where
|
|
1 SIMPLE f eq_ref PRIMARY PRIMARY 4 test.a2.id 1 100.00 Using where; Using index
|
|
3 DEPENDENT SUBQUERY t2 ref PRIMARY PRIMARY 4 test.f.id 2 100.00 Using index
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.f.id' of SELECT #3 was resolved in SELECT #2
|
|
Note 1003 select `f`.`id` AS `id` from `test`.`t0` `f` join `test`.`t2` `a2` where ((`f`.`id` = `a2`.`id`) and (`a2`.`attr2` between 12 and 14) and (`a2`.`fromdate` = (select max(`test`.`t2`.`fromdate`) from `test`.`t2` where (`test`.`t2`.`id` = `f`.`id`))))
|
|
drop view v1, v2;
|
|
drop table t0, t1, t2;
|
|
create table t1 (a int);
|
|
insert into t1 values (0),(1),(2),(3);
|
|
create table t2 (pk1 int, pk2 int, pk3 int, col int, primary key(pk1, pk2, pk3));
|
|
insert into t2 select a,a,a,a from t1;
|
|
This must use only t1:
|
|
explain select t1.* from t1 left join t2 on t2.pk1=t1.a and
|
|
t2.pk2=t2.pk1+1 and
|
|
t2.pk3=t2.pk2+1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
This must use only t1:
|
|
explain select t1.* from t1 left join t2 on t2.pk1=t1.a and
|
|
t2.pk3=t2.pk1+1 and
|
|
t2.pk2=t2.pk3+1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
This must use both:
|
|
explain select t1.* from t1 left join t2 on t2.pk1=t1.a and
|
|
t2.pk3=t2.pk1+1 and
|
|
t2.pk2=t2.pk3+t2.col;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t2 ref PRIMARY PRIMARY 4 test.t1.a 1 Using where
|
|
This must use only t1:
|
|
explain select t1.* from t1 left join t2 on t2.pk2=t1.a and
|
|
t2.pk1=t2.pk2+1 and
|
|
t2.pk3=t2.pk1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
drop table t1, t2;
|
|
create table t1 (pk int primary key, col int);
|
|
insert into t1 values (1,1),(2,2);
|
|
create table t2 like t1;
|
|
insert into t2 select * from t1;
|
|
create table t3 like t1;
|
|
insert into t3 select * from t1;
|
|
explain
|
|
select t1.* from t1 left join ( t2 left join t3 on t3.pk=t2.col) on t2.col=t1.col;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 2
|
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 2 Using where
|
|
explain
|
|
select t1.*, t2.* from t1 left join (t2 left join t3 on t3.pk=t2.col) on t2.pk=t1.col;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 2
|
|
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.col 1 Using where
|
|
explain select t1.*
|
|
from
|
|
t1 left join ( t2 left join t3 on t3.pk=t2.col or t3.pk=t2.col)
|
|
on t2.col=t1.col or t2.col=t1.col;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 2
|
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 2 Using where
|
|
explain select t1.*, t2.*
|
|
from
|
|
t1 left join
|
|
(t2 left join t3 on t3.pk=t2.col or t3.pk=t2.col)
|
|
on t2.pk=t1.col or t2.pk=t1.col;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 2
|
|
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.col 1 Using where
|
|
drop table t1, t2, t3;
|
|
#
|
|
# Check things that look like functional dependencies but really are not
|
|
#
|
|
create table t1 (a char(10) character set latin1 collate latin1_general_ci primary key);
|
|
insert into t1 values ('foo');
|
|
insert into t1 values ('bar');
|
|
create table t2 (a char(10) character set latin1 collate latin1_general_cs primary key);
|
|
insert into t2 values ('foo');
|
|
insert into t2 values ('FOO');
|
|
this must not use table elimination:
|
|
explain select t1.* from t1 left join t2 on t2.a='foo' collate latin1_general_ci;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL PRIMARY 10 NULL 2 Using index
|
|
1 SIMPLE t2 index PRIMARY PRIMARY 10 NULL 2 Using where; Using index
|
|
this must not use table elimination:
|
|
explain select t1.* from t1 left join t2 on t2.a=t1.a collate latin1_general_ci;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL PRIMARY 10 NULL 2 Using index
|
|
1 SIMPLE t2 ALL PRIMARY NULL NULL NULL 2 Range checked for each record (index map: 0x1)
|
|
drop table t1,t2;
|
|
create table t1 (a int primary key);
|
|
insert into t1 values (1),(2);
|
|
create table t2 (a char(10) primary key);
|
|
insert into t2 values ('1'),('1.0');
|
|
this must not use table elimination:
|
|
explain select t1.* from t1 left join t2 on t2.a=1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL PRIMARY 4 NULL 2 Using index
|
|
1 SIMPLE t2 index PRIMARY PRIMARY 10 NULL 2 Using where; Using index
|
|
this must not use table elimination:
|
|
explain select t1.* from t1 left join t2 on t2.a=t1.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL PRIMARY 4 NULL 2 Using index
|
|
1 SIMPLE t2 ALL PRIMARY NULL NULL NULL 2 Range checked for each record (index map: 0x1)
|
|
drop table t1, t2;
|
|
create table t1 (a char(10) primary key);
|
|
insert into t1 values ('foo'),('bar');
|
|
create table t2 (a char(10), unique key(a(2)));
|
|
insert into t2 values
|
|
('foo'),('bar'),('boo'),('car'),('coo'),('par'),('doo'),('tar');
|
|
explain select t1.* from t1 left join t2 on t2.a=t1.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL PRIMARY 10 NULL 2 Using index
|
|
1 SIMPLE t2 ref a a 3 test.t1.a 2 Using where
|
|
drop table t1, t2;
|
|
#
|
|
# check UPDATE/DELETE that look like they could be eliminated
|
|
#
|
|
create table t1 (a int primary key, b int);
|
|
insert into t1 values (1,1),(2,2),(3,3);
|
|
create table t2 like t1;
|
|
insert into t2 select * from t1;
|
|
update t1 left join t2 using (a) set t2.a=t2.a+100;
|
|
select * from t1;
|
|
a b
|
|
1 1
|
|
2 2
|
|
3 3
|
|
select * from t2;
|
|
a b
|
|
101 1
|
|
102 2
|
|
103 3
|
|
delete from t2;
|
|
insert into t2 select * from t1;
|
|
delete t2 from t1 left join t2 using (a);
|
|
select * from t1;
|
|
a b
|
|
1 1
|
|
2 2
|
|
3 3
|
|
select * from t2;
|
|
a b
|
|
drop table t1, t2;
|
|
#
|
|
# Tests with various edge-case ON expressions
|
|
#
|
|
create table t1 (a int, b int, c int, d int);
|
|
insert into t1 values (0,0,0,0),(1,1,1,1),(2,2,2,2),(3,3,3,3);
|
|
create table t2 (pk int primary key, b int)
|
|
as select a as pk, a as b from t1 where a in (1,2);
|
|
create table t3 (pk1 int, pk2 int, b int, unique(pk1,pk2));
|
|
insert into t3 select a as pk1, a as pk2, a as b from t1 where a in (1,3);
|
|
explain select t1.a from t1 left join t2 on t2.pk=t1.a and t2.b<t1.b;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
explain select t1.a from t1 left join t2 on t2.pk=t1.a or t2.b<t1.b;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t2 ALL PRIMARY NULL NULL NULL 2 Using where
|
|
explain select t1.a from t1 left join t2 on t2.b<t1.b or t2.pk=t1.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t2 ALL PRIMARY NULL NULL NULL 2 Using where
|
|
explain select t1.a from t1 left join t2 on t2.pk between 10 and 20;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t2 index PRIMARY PRIMARY 4 NULL 2 Using where; Using index
|
|
explain select t1.a from t1 left join t2 on t2.pk between 0.5 and 1.5;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t2 index PRIMARY PRIMARY 4 NULL 2 Using where; Using index
|
|
explain select t1.a from t1 left join t2 on t2.pk between 10 and 10;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
explain select t1.a from t1 left join t2 on t2.pk in (10);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
explain select t1.a from t1 left join t2 on t2.pk in (t1.a);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
explain select t1.a from t1 left join t2 on TRUE;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t2 index NULL PRIMARY 4 NULL 2 Using where; Using index
|
|
explain select t1.a from t1 left join t3 on t3.pk1=t1.a and t3.pk2 IS NULL;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
drop table t1,t2,t3;
|
|
#
|
|
# Multi-equality tests
|
|
#
|
|
create table t1 (a int, b int, c int, d int);
|
|
insert into t1 values (0,0,0,0),(1,1,1,1),(2,2,2,2),(3,3,3,3);
|
|
create table t2 (pk int primary key, b int, c int);
|
|
insert into t2 select a,a,a from t1 where a in (1,2);
|
|
explain
|
|
select t1.*
|
|
from t1 left join t2 on t2.pk=t2.c and t2.b=t1.a and t1.a=t1.b and t2.c=t2.b
|
|
where t1.d=1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where
|
|
explain
|
|
select t1.*
|
|
from
|
|
t1
|
|
left join
|
|
t2
|
|
on (t2.pk=t2.c and t2.b=t1.a and t1.a=t1.b and t2.c=t2.b) or
|
|
(t2.pk=t2.c and t2.b=t1.a and t1.a=t1.b and t2.c=t2.b)
|
|
where t1.d=1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where
|
|
#This can't be eliminated:
|
|
explain
|
|
select t1.*
|
|
from
|
|
t1
|
|
left join
|
|
t2
|
|
on (t2.pk=t2.c and t2.b=t1.a and t2.c=t1.b) or
|
|
(t2.pk=t2.c and t1.a=t1.b and t2.c=t1.b)
|
|
where t1.d=1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using where
|
|
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.b 1 Using where
|
|
explain
|
|
select t1.*
|
|
from
|
|
t1
|
|
left join
|
|
t2
|
|
on (t2.pk=t2.c and t2.b=t1.a and t2.c=t1.b) or
|
|
(t2.pk=t2.c and t2.c=t1.b)
|
|
;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
explain
|
|
select t1.*
|
|
from t1 left join t2 on t2.pk=3 or t2.pk= 4;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t2 index PRIMARY PRIMARY 4 NULL 2 Using where; Using index
|
|
explain
|
|
select t1.*
|
|
from t1 left join t2 on t2.pk=3 or t2.pk= 3;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
explain
|
|
select t1.*
|
|
from t1 left join t2 on (t2.pk=3 and t2.b=3) or (t2.pk= 4 and t2.b=3);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t2 range PRIMARY PRIMARY 4 NULL 2 Using where
|
|
drop table t1, t2;
|
|
#
|
|
# LPBUG#523593: Running RQG optimizer_no_subquery crashes MariaDB
|
|
#
|
|
CREATE TABLE t1 (
|
|
`pk` int(11) NOT NULL AUTO_INCREMENT,
|
|
`col_int_nokey` int(11) DEFAULT NULL,
|
|
`col_int_key` int(11) DEFAULT NULL,
|
|
`col_date_key` date DEFAULT NULL,
|
|
`col_date_nokey` date DEFAULT NULL,
|
|
`col_time_key` time DEFAULT NULL,
|
|
`col_time_nokey` time DEFAULT NULL,
|
|
`col_datetime_key` datetime DEFAULT NULL,
|
|
`col_datetime_nokey` datetime DEFAULT NULL,
|
|
`col_varchar_key` varchar(1) DEFAULT NULL,
|
|
`col_varchar_nokey` varchar(1) DEFAULT NULL,
|
|
PRIMARY KEY (`pk`),
|
|
KEY `col_int_key` (`col_int_key`),
|
|
KEY `col_date_key` (`col_date_key`),
|
|
KEY `col_time_key` (`col_time_key`),
|
|
KEY `col_datetime_key` (`col_datetime_key`),
|
|
KEY `col_varchar_key` (`col_varchar_key`,`col_int_key`)
|
|
);
|
|
CREATE TABLE t2 LIKE t1;
|
|
INSERT INTO t1 VALUES
|
|
(10,7,8,NULL,NULL,'01:27:35','01:27:35','2002-02-26 06:14:37','2002-02-26 06:14:37','v','v'),
|
|
(11,1,9,'2006-06-14','2006-06-14','19:48:31','19:48:31','1900-01-01 00:00:00','1900-01-01 00:00:00','r','r');
|
|
INSERT INTO t2 SELECT * FROM t1;
|
|
SELECT table2.col_int_key AS field1
|
|
FROM (
|
|
t2 AS table1
|
|
RIGHT OUTER JOIN
|
|
(
|
|
( t1 AS table2 STRAIGHT_JOIN
|
|
t1 AS table3 ON (
|
|
(table3.col_varchar_nokey = table2.col_varchar_key ) AND
|
|
(table3.pk = table2.col_int_key))
|
|
)
|
|
) ON
|
|
(
|
|
(table3.col_varchar_key = table2.col_varchar_key) OR
|
|
(table3.col_int_key = table2.pk)
|
|
)
|
|
)
|
|
HAVING field1 < 216;
|
|
field1
|
|
DROP TABLE t1, t2;
|
|
#
|
|
# LPBUG#524025 Running RQG outer_join test leads to crash
|
|
#
|
|
CREATE TABLE t0 (
|
|
pk int(11) NOT NULL AUTO_INCREMENT,
|
|
PRIMARY KEY (pk)
|
|
);
|
|
CREATE TABLE t1 (
|
|
col_int int(11) DEFAULT NULL,
|
|
col_int_key int(11) DEFAULT NULL,
|
|
pk int(11) NOT NULL AUTO_INCREMENT,
|
|
col_varchar_10_latin1 varchar(10) DEFAULT NULL,
|
|
PRIMARY KEY (pk)
|
|
);
|
|
INSERT INTO t1 VALUES (5,5,1,'t'), (NULL,NULL,2,'y');
|
|
CREATE TABLE t2 (
|
|
col_int int(11) DEFAULT NULL
|
|
);
|
|
INSERT INTO t2 VALUES (8), (4);
|
|
CREATE TABLE t3 (
|
|
pk int(11) NOT NULL AUTO_INCREMENT,
|
|
PRIMARY KEY (pk)
|
|
);
|
|
INSERT INTO t3 VALUES (1),(8);
|
|
CREATE TABLE t4 (
|
|
pk int(11) NOT NULL AUTO_INCREMENT,
|
|
col_varchar_1024_latin1_key varchar(1024) DEFAULT NULL,
|
|
col_int int(11) DEFAULT NULL,
|
|
PRIMARY KEY (pk)
|
|
);
|
|
INSERT INTO t4 VALUES (1,'o',1), (2,'w',2);
|
|
CREATE TABLE t5 (
|
|
col_varchar_1024_utf8_key varchar(1024) CHARACTER SET utf8 DEFAULT NULL,
|
|
col_varchar_1024_latin1_key varchar(1024) DEFAULT NULL,
|
|
col_varchar_10_utf8_key varchar(1024) CHARACTER SET utf8 DEFAULT NULL,
|
|
pk int(11) NOT NULL AUTO_INCREMENT,
|
|
col_int_key int(11) DEFAULT NULL,
|
|
PRIMARY KEY (pk)
|
|
);
|
|
INSERT INTO t5 VALUES ('k','a','z',1,2),('x','a','w',2,7);
|
|
CREATE TABLE t6 (
|
|
col_int int(11) DEFAULT NULL,
|
|
col_int_key int(11) DEFAULT NULL
|
|
);
|
|
INSERT INTO t6 VALUES (6,1),(8,3);
|
|
SELECT
|
|
table3.col_int AS field1,
|
|
table1.col_int AS field2,
|
|
table1.col_int_key AS field3,
|
|
table1.pk AS field4,
|
|
table1.col_int AS field5,
|
|
table2.col_int AS field6
|
|
FROM
|
|
t1 AS table1
|
|
LEFT OUTER JOIN
|
|
t4 AS table2
|
|
LEFT JOIN t6 AS table3
|
|
RIGHT JOIN t3 AS table4
|
|
LEFT JOIN t5 AS table5 ON table4.pk = table5.pk
|
|
LEFT JOIN t0 AS table6 ON table5.col_int_key = table6.pk
|
|
ON table3.col_int_key = table5.pk
|
|
ON table2.col_varchar_1024_latin1_key = table5.col_varchar_10_utf8_key
|
|
LEFT JOIN t6 AS table7 ON table2.pk = table7.col_int
|
|
ON table1.col_varchar_10_latin1 = table5.col_varchar_1024_latin1_key
|
|
LEFT JOIN t2 AS table8 ON table3.col_int = table8.col_int
|
|
WHERE
|
|
table1.col_int_key < table2.pk
|
|
HAVING
|
|
field4 != 6;
|
|
field1 field2 field3 field4 field5 field6
|
|
drop table t0,t1,t2,t3,t4,t5,t6;
|
|
#
|
|
# BUG#675118: Elimination of a table results in an invalid execution plan
|
|
#
|
|
CREATE TABLE t1 (f1 int(11), PRIMARY KEY (f1)) ;
|
|
CREATE TABLE t2 (f4 varchar(1024), KEY (f4)) ;
|
|
Warnings:
|
|
Warning 1071 Specified key was too long; max key length is 1000 bytes
|
|
INSERT IGNORE INTO t2 VALUES ('xcddwntkbxyorzdv'),
|
|
('cnxxcddwntkbxyor'),('r'),('r'), ('did'),('I'),('when'),
|
|
('hczkfqjeggivdvac'),('e'),('okay'),('up');
|
|
CREATE TABLE t3 (f4 varchar(1024), f1 int(11), f2 int(11)) ;
|
|
INSERT IGNORE INTO t3 VALUES ('f','4','0'),('n','5','-996540416');
|
|
CREATE TABLE t4 (f1 int(11), f3 varchar(10)) ;
|
|
INSERT IGNORE INTO t4 VALUES ('8','n'),('9','nwzcerzsgx'),('10','c');
|
|
CREATE TABLE t5 (f5 int(11), KEY (f5)) ;
|
|
EXPLAIN
|
|
SELECT t3.f2
|
|
FROM t2
|
|
LEFT JOIN t3
|
|
LEFT JOIN t4
|
|
LEFT JOIN t1 ON t4.f1 = t1.f1
|
|
JOIN t5 ON t4.f3 ON t3.f1 = t5.f5 ON t2.f4 = t3.f4
|
|
WHERE t3.f2 ;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t3 ALL NULL NULL NULL NULL 2 Using where
|
|
1 SIMPLE t5 ref f5 f5 5 test.t3.f1 2 Using where; Using index
|
|
1 SIMPLE t4 ALL NULL NULL NULL NULL 3 Using where
|
|
1 SIMPLE t2 ALL f4 NULL NULL NULL 11 Using where; Using join buffer (flat, BNL join)
|
|
# ^^ The above must not produce a QEP of t3,t5,t2,t4
|
|
# as that violates the "no interleaving of outer join nests" rule.
|
|
DROP TABLE t1,t2,t3,t4,t5;
|