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	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;