mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
644d9f38b9
For a unique key if all the keyparts are NOT NULL or the predicates involving the keyparts is NULL rejecting, then we can use EQ_REF access instead of ref access with the unique key
706 lines
27 KiB
Text
706 lines
27 KiB
Text
drop table if exists t0, t1, t2, t3, t4, t5, t6;
|
|
drop view if exists v1, v2;
|
|
SET @save_optimizer_switch=@@optimizer_switch;
|
|
SET optimizer_switch='outer_join_with_cache=off';
|
|
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 PRIMARY 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 PRIMARY 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#1 */ 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 PRIMARY a1 range PRIMARY,attr1 attr1 5 NULL 2 100.00 Using index condition
|
|
1 PRIMARY 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#1 */ 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 PRIMARY a2 range PRIMARY,attr2 attr2 5 NULL 5 100.00 Using index condition; Using where
|
|
1 PRIMARY 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#1 */ 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` = <expr_cache><`a2`.`id`>((/* select#3 */ 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 PRIMARY 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 PRIMARY 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#1 */ 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 PRIMARY a1 range PRIMARY,attr1 attr1 5 NULL 2 100.00 Using index condition
|
|
1 PRIMARY 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#1 */ 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 PRIMARY a2 range PRIMARY,attr2 attr2 5 NULL 5 100.00 Using index condition
|
|
1 PRIMARY 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#1 */ 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` = <expr_cache><`f`.`id`>((/* select#3 */ 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 eq_ref a a 3 test.t1.a 1 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;
|
|
#
|
|
# BUG#997747: Assertion `join->best_read < ((double)1.79..5e+308L)'
|
|
# failed in greedy_search with LEFT JOINs and unique keys
|
|
#
|
|
CREATE TABLE t1 (a1 INT);
|
|
CREATE TABLE t2 (b1 INT);
|
|
CREATE TABLE t3 (c1 INT, UNIQUE KEY(c1));
|
|
CREATE TABLE t4 (d1 INT, UNIQUE KEY(d1));
|
|
CREATE TABLE t5 (e1 INT);
|
|
INSERT INTO t1 VALUES (1),(2);
|
|
INSERT INTO t2 VALUES (2),(3);
|
|
INSERT INTO t3 VALUES (3),(4);
|
|
INSERT INTO t4 VALUES (4),(5);
|
|
INSERT INTO t5 VALUES (5),(6);
|
|
SELECT a1 FROM t1 LEFT JOIN t2 LEFT JOIN t3 LEFT JOIN t4
|
|
ON c1 = d1 ON d1 = b1 ON a1 = b1
|
|
LEFT JOIN t5 ON a1 = e1 ;
|
|
a1
|
|
1
|
|
2
|
|
DROP TABLE t1,t2,t3,t4,t5;
|
|
#
|
|
# BUG#884184: Wrong result with RIGHT JOIN + derived_merge
|
|
#
|
|
CREATE TABLE t1 (a int(11), b varchar(1)) ;
|
|
INSERT IGNORE INTO t1 VALUES (0,'g');
|
|
CREATE TABLE t3 ( a varchar(1)) ;
|
|
INSERT IGNORE INTO t3 VALUES ('g');
|
|
CREATE TABLE t2 ( a int(11) NOT NULL, PRIMARY KEY (a));
|
|
INSERT INTO t2 VALUES (9), (10);
|
|
create view v1 as SELECT t1.* FROM t1 LEFT JOIN t2 ON ( t1.a = t2.a ) WHERE t2.a <> 0;
|
|
SELECT alias1.* FROM t3 LEFT JOIN v1 as alias1 ON ( t3.a = alias1.b );
|
|
a b
|
|
NULL NULL
|
|
EXPLAIN SELECT alias1.* FROM t3 LEFT JOIN v1 as alias1 ON ( t3.a = alias1.b );
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t3 system NULL NULL NULL NULL 1
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 1 Using where
|
|
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using index
|
|
drop view v1;
|
|
DROP TABLE t1,t2,t3;
|
|
#
|
|
# MDEV-5344: LEFT OUTER JOIN table data is lost in ON DUPLICATE KEY UPDATE section
|
|
#
|
|
create table t1 (
|
|
id int(10) unsigned NOT NULL DEFAULT '0',
|
|
v int(10) unsigned DEFAULT '0',
|
|
PRIMARY KEY (id)
|
|
);
|
|
create table t2 (
|
|
id int(10) unsigned NOT NULL DEFAULT '0',
|
|
PRIMARY KEY (id)
|
|
) ;
|
|
create table t3 (
|
|
id int(10) unsigned NOT NULL DEFAULT '0',
|
|
v int(10) unsigned DEFAULT '0',
|
|
PRIMARY KEY (id)
|
|
);
|
|
insert into t1 values (1, 10), (2, 10);
|
|
insert into t2 values (1), (2);
|
|
insert into t3 values (1, 20);
|
|
insert into t1
|
|
select t2.id, 5 from t2 LEFT OUTER JOIN t3 ON t2.id = t3.id
|
|
on duplicate key update t1.v = t3.v;
|
|
select * from t1;
|
|
id v
|
|
1 20
|
|
2 NULL
|
|
drop table t1,t2,t3;
|
|
#
|
|
# BUG#919878: Assertion `!eliminated_tables...
|
|
#
|
|
CREATE TABLE t1 ( a INT );
|
|
INSERT INTO t1 VALUES (1);
|
|
CREATE TABLE t2
|
|
( b INT, UNIQUE INDEX(b) );
|
|
INSERT INTO t2 VALUES (1),(2);
|
|
EXPLAIN EXTENDED
|
|
SELECT * FROM t2
|
|
WHERE b IN (
|
|
SELECT SUM(a) FROM t1 LEFT JOIN t2 ON b=a
|
|
);
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY t2 index NULL b 5 NULL 2 100.00 Using where; Using index
|
|
2 DEPENDENT SUBQUERY t1 system NULL NULL NULL NULL 1 100.00
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`b` AS `b` from `test`.`t2` where <expr_cache><`test`.`t2`.`b`>(<in_optimizer>(`test`.`t2`.`b`,<exists>(/* select#2 */ select sum(1) from dual where 1 having <cache>(`test`.`t2`.`b`) = <ref_null_helper>(sum(1)))))
|
|
DROP TABLE t1,t2;
|
|
#
|
|
# MDEV-4840: Wrong result (missing rows) on LEFT JOIN with InnoDB tables
|
|
#
|
|
CREATE TABLE t1 (alpha3 VARCHAR(3));
|
|
INSERT INTO t1 VALUES ('USA'),('CAN');
|
|
CREATE TABLE t2 ( t3_code VARCHAR(3), name VARCHAR(64));
|
|
INSERT INTO t2 VALUES ('USA','Austin'),('USA','Boston');
|
|
CREATE TABLE t3 ( code VARCHAR(3), name VARCHAR(64), PRIMARY KEY (code), UNIQUE KEY (name));
|
|
INSERT INTO t3 VALUES ('CAN','Canada'),('USA','United States');
|
|
SELECT * FROM t1 LEFT JOIN ( t2 LEFT JOIN t3 ON t2.t3_code = t3.code ) ON t1.alpha3 = t3.code;
|
|
alpha3 t3_code name code name
|
|
USA USA Austin USA United States
|
|
USA USA Boston USA United States
|
|
CAN NULL NULL NULL NULL
|
|
SELECT t1.alpha3 FROM t1 LEFT JOIN ( t2 LEFT JOIN t3 ON t2.t3_code = t3.code ) ON t1.alpha3 = t3.code;
|
|
alpha3
|
|
USA
|
|
USA
|
|
CAN
|
|
DROP TABLE t1, t2, t3;
|
|
SET optimizer_switch=@save_optimizer_switch;
|
|
#
|
|
# MDEV-7893: table_elimination works wrong with on computed expression and compound unique key
|
|
# (just a testcase)
|
|
CREATE TABLE t1 (
|
|
PostID int(10) unsigned NOT NULL
|
|
) DEFAULT CHARSET=utf8;
|
|
INSERT INTO t1 (PostID) VALUES (1), (2);
|
|
CREATE TABLE t2 (
|
|
VoteID int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
|
EntityID int(10) unsigned NOT NULL,
|
|
UserID int(10) unsigned NOT NULL,
|
|
UNIQUE KEY EntityID (EntityID,UserID)
|
|
) DEFAULT CHARSET=utf8;
|
|
INSERT INTO t2 (EntityID, UserID) VALUES (1, 30), (2, 30);
|
|
SELECT t1.*, T.Voted as Voted
|
|
FROM
|
|
t1 LEFT JOIN (
|
|
SELECT 1 AS Voted, EntityID
|
|
FROM t2
|
|
WHERE t2.UserID = '20' ) AS T
|
|
ON T.EntityID = t1.PostID
|
|
WHERE t1.PostID='1'
|
|
LIMIT 1;
|
|
PostID Voted
|
|
1 NULL
|
|
DROP TABLE t1,t2;
|