summaryrefslogtreecommitdiff
path: root/mysql-test/t/table_elim.test
blob: 807fd736bf60ef68a061ba4df7396917f62741cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#
# Table elimination (MWL#17) tests
#
--disable_warnings
drop table if exists t0, t1, t2, t3;
drop view if exists v1, v2;
--enable_warnings

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

--echo # This will be  eliminated:
explain select t1.a from t1 left join t2 on t2.a=t1.a;
explain extended select t1.a from t1 left join t2 on t2.a=t1.a;

select t1.a from t1 left join t2 on t2.a=t1.a;

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

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

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

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

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

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

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

--echo # Elimination with aggregate functions
explain select count(*) from t1 left join t2 on t2.a=t1.a;
explain select count(1) from t1 left join t2 on t2.a=t1.a;
explain select count(1) from t1 left join t2 on t2.a=t1.a group by t1.a;

--echo This must not use elimination:
explain select count(1) from t1 left join t2 on t2.a=t1.a group by t2.a;

drop table t0, t1, t2, t3;

# This will stand for elim_facts
create table t0 ( id integer, primary key (id));

# Attribute1, non-versioned
create table t1 (
  id integer,
  attr1 integer,
  primary key (id),
  key (attr1)
);

# Attribute2, time-versioned
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);

--echo This should use one table:
explain select id from v1 where id=2;
--echo This should use one table:
explain extended select id from v1 where id in (1,2,3,4);
--echo This should use facts and A1 tables:
explain extended select id from v1 where attr1 between 12 and 14;
--echo This should use facts, A2 and its subquery:
explain extended select id from v1 where attr2 between 12 and 14;

# Repeat for v2: 

--echo This should use one table:
explain select id from v2 where id=2;
--echo This should use one table:
explain extended select id from v2 where id in (1,2,3,4);
--echo This should use facts and A1 tables:
explain extended select id from v2 where attr1 between 12 and 14;
--echo This should use facts, A2 and its subquery:
explain extended select id from v2 where attr2 between 12 and 14;

drop view v1, v2;
drop table t0, t1, t2;