mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 04:22:27 +01:00
21b1b5f040
Applied the fix for bug #47217 from the mysql-6.0 codebase. The patch adds not null predicates generated for the left parts of the equality predicates used for ref accesses. This is done for such predicates both in where conditions and on conditions. For the where conditions the not null predicates were generated but in 5.0/5.1 they actually never were used due to some lame merge from 4.1 to 5.0. The fix for bug #47217 made these predicates to be used in the condition pushed to the tables. Yet only this patch generates not null predicates for equality predicated from on conditions of outer joins. This patch introduces a performance regression that can be observed on a test case from null_key.test. The regression will disappear after the fix for bug #57024 from mariadb-5.1 is pulled into mariadb-5.3. The patch contains many changes in the outputs of the EXPLAIN commands since generated not null predicates are considered as parts of the conditions pushed to join tables and may add 'Usingwhere' in some rows of EXPLAINs where there used to be no such comments.
537 lines
22 KiB
Text
537 lines
22 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`.`t0`.`a` = `test`.`t1`.`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 #1
|
|
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 PRIMARY a1 range PRIMARY,attr1 attr1 5 NULL 2 100.00 Using index condition; Using where; Using MRR
|
|
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 #1
|
|
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 PRIMARY a2 range PRIMARY,attr2 attr2 5 NULL 5 100.00 Using index condition; Using where; Using MRR
|
|
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 #1
|
|
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 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 #1
|
|
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 PRIMARY a1 range PRIMARY,attr1 attr1 5 NULL 2 100.00 Using index condition; Using where; Using MRR
|
|
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 #1
|
|
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 PRIMARY a2 range PRIMARY,attr2 attr2 5 NULL 5 100.00 Using index condition; Using where; Using MRR
|
|
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 #1
|
|
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');
|
|
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; Using MRR
|
|
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;
|