~vkolesnikov/pbxt/pbxt-07-diskfull

« back to all changes in this revision

Viewing changes to pbxt/mysql-test-update/mysql-test/t/index_merge.test

  • Committer: paul-mccullagh
  • Date: 2006-10-23 09:14:04 UTC
  • Revision ID: paul-mccullagh-918861e03d351978a9541168a96e58cc826734ee
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#
 
2
# Index merge tests
 
3
#
 
4
--disable_warnings
 
5
drop table if exists t0, t1, t2, t3, t4;
 
6
--enable_warnings
 
7
 
 
8
# Create and fill a table with simple keys
 
9
create table t0
 
10
(
 
11
  key1 int not null, 
 
12
  INDEX i1(key1)
 
13
);
 
14
 
 
15
--disable_query_log
 
16
insert into t0 values (1),(2),(3),(4),(5),(6),(7),(8);
 
17
 
 
18
let $1=7;
 
19
set @d=8;
 
20
while ($1)
 
21
{
 
22
  eval insert into t0 select key1+@d from t0;
 
23
  eval set @d=@d*2;
 
24
  dec $1;
 
25
}
 
26
--enable_query_log
 
27
 
 
28
alter table t0 add key2 int not null, add index i2(key2);
 
29
alter table t0 add key3 int not null, add index i3(key3);
 
30
alter table t0 add key4 int not null, add index i4(key4);
 
31
alter table t0 add key5 int not null, add index i5(key5);
 
32
alter table t0 add key6 int not null, add index i6(key6);
 
33
alter table t0 add key7 int not null, add index i7(key7);
 
34
alter table t0 add key8 int not null, add index i8(key8);
 
35
 
 
36
update t0 set key2=key1,key3=key1,key4=key1,key5=key1,key6=key1,key7=key1,key8=1024-key1;
 
37
analyze table t0;
 
38
 
 
39
# 1. One index 
 
40
explain select * from t0 where key1 < 3 or key1 > 1020;
 
41
 
 
42
# 2. Simple cases
 
43
explain 
 
44
select * from t0 where key1 < 3 or key2 > 1020;
 
45
select * from t0 where key1 < 3 or key2 > 1020;
 
46
 
 
47
explain select * from t0 where key1 < 3 or key2 <4;
 
48
 
 
49
explain
 
50
select * from t0 where (key1 > 30 and key1<35) or (key2 >32 and key2 < 40);
 
51
select * from t0 where (key1 > 30 and key1<35) or (key2 >32 and key2 < 40);
 
52
 
 
53
# 3. Check that index_merge doesn't break "ignore/force/use index"
 
54
explain select * from t0 ignore index (i2) where key1 < 3 or key2 <4;
 
55
explain select * from t0 where (key1 < 3 or key2 <4) and key3 = 50;
 
56
explain select * from t0 use index (i1,i2) where (key1 < 3 or key2 <4) and key3 = 50;
 
57
 
 
58
explain select * from t0 where (key1 > 1 or key2  > 2);
 
59
explain select * from t0 force index (i1,i2) where (key1 > 1 or key2  > 2);
 
60
 
 
61
 
 
62
# 4. Check if conjuncts are grouped by keyuse
 
63
explain 
 
64
  select * from t0 where key1<3 or key2<3 or (key1>5 and key1<8) or 
 
65
  (key1>10 and key1<12) or (key2>100 and key2<110);
 
66
 
 
67
# 5. Check index_merge with conjuncts that are always true/false
 
68
#    verify fallback to "range" if there is only one non-confluent condition
 
69
explain select * from t0 where key2 = 45 or key1 <=> null;
 
70
 
 
71
explain select * from t0 where key2 = 45 or key1 is not null;
 
72
explain select * from t0 where key2 = 45 or key1 is null;
 
73
 
 
74
#   the last conj. is always false and will be discarded
 
75
explain select * from t0 where key2=10 or key3=3 or key4 <=> null;
 
76
 
 
77
#   the last conj. is always true and will cause 'all' scan
 
78
explain select * from t0 where key2=10 or key3=3 or key4 is null;
 
79
 
 
80
#   some more complicated cases
 
81
explain select key1 from t0 where (key1 <=> null) or (key2 < 5) or 
 
82
                                   (key3=10) or (key4 <=> null);
 
83
explain select key1 from t0 where (key1 <=> null) or (key1 < 5) or 
 
84
                                   (key3=10) or (key4 <=> null);
 
85
 
 
86
# 6.Several ways to do index_merge, (ignored) index_merge vs. range
 
87
explain select * from t0 where 
 
88
  (key1 < 3 or key2 < 3) and (key3 < 4 or key4 < 4) and (key5 < 5 or key6 < 5);
 
89
 
 
90
explain
 
91
select * from t0 where (key1 < 3 or key2 < 6) and (key1 < 7 or key3 < 4);
 
92
 
 
93
select * from t0 where (key1 < 3 or key2 < 6) and (key1 < 7 or key3 < 4);
 
94
 
 
95
 
 
96
explain select * from t0 where 
 
97
  (key1 < 3 or key2 < 3) and (key3 < 4 or key4 < 4) and (key5 < 2 or key6 < 2);
 
98
                                                                  
 
99
#   now index_merge is not used at all when "range" is possible
 
100
explain select * from t0 where 
 
101
  (key1 < 3 or key2 < 3) and (key3 < 100);
 
102
 
 
103
#   this even can cause "all" scan:
 
104
explain select * from t0 where
 
105
  (key1 < 3 or key2 < 3) and (key3 < 1000);
 
106
  
 
107
 
 
108
# 7. Complex cases
 
109
#   tree_or(List<SEL_IMERGE>, range SEL_TREE).
 
110
explain select * from t0 where 
 
111
    ((key1 < 4 or key2 < 4) and (key2 <5 or key3 < 4)) 
 
112
  or 
 
113
    key2 > 5;
 
114
 
 
115
explain select * from t0 where
 
116
    ((key1 < 4 or key2 < 4) and (key2 <5 or key3 < 4))
 
117
  or
 
118
    key1 < 7;
 
119
 
 
120
select * from t0 where
 
121
    ((key1 < 4 or key2 < 4) and (key2 <5 or key3 < 4))
 
122
  or
 
123
    key1 < 7;
 
124
        
 
125
#   tree_or(List<SEL_IMERGE>, List<SEL_IMERGE>).   
 
126
explain select * from t0 where 
 
127
    ((key1 < 4 or key2 < 4) and (key3 <5 or key5 < 4)) 
 
128
  or 
 
129
    ((key5 < 5 or key6 < 6) and (key7 <7 or key8 < 4));
 
130
 
 
131
explain select * from t0 where
 
132
    ((key3 <5 or key5 < 4) and (key1 < 4 or key2 < 4))
 
133
  or
 
134
    ((key7 <7 or key8 < 4) and (key5 < 5 or key6 < 6));
 
135
    
 
136
explain select * from t0 where
 
137
    ((key3 <5 or key5 < 4) and (key1 < 4 or key2 < 4))
 
138
  or
 
139
    ((key3 <7 or key5 < 2) and (key5 < 5 or key6 < 6));
 
140
 
 
141
explain select * from t0 where
 
142
    ((key3 <5 or key5 < 4) and (key1 < 4 or key2 < 4))
 
143
  or
 
144
    (((key3 <7 and key7 < 6) or key5 < 2) and (key5 < 5 or key6 < 6));
 
145
 
 
146
explain select * from t0 where
 
147
    ((key3 <5 or key5 < 4) and (key1 < 4 or key2 < 4))
 
148
  or
 
149
    ((key3 >=5 or key5 < 2) and (key5 < 5 or key6 < 6));
 
150
 
 
151
explain select * from t0 force index(i1, i2, i3, i4, i5, i6 ) where
 
152
    ((key3 <5 or key5 < 4) and (key1 < 4 or key2 < 4))
 
153
  or
 
154
    ((key3 >=5 or key5 < 2) and (key5 < 5 or key6 < 6));
 
155
    
 
156
# 8. Verify that "order by" after index merge uses filesort
 
157
select * from t0 where key1 < 5 or key8 < 4 order by key1;
 
158
 
 
159
explain
 
160
select * from t0 where key1 < 5 or key8 < 4 order by key1;
 
161
 
 
162
# 9. Check that index_merge cost is compared to 'index' where possible
 
163
create table t2 like t0;
 
164
insert into t2 select * from t0;
 
165
 
 
166
alter table t2 add index i1_3(key1, key3);
 
167
alter table t2 add index i2_3(key2, key3);
 
168
alter table t2 drop index i1;
 
169
alter table t2 drop index i2;
 
170
alter table t2 add index i321(key3, key2, key1);
 
171
 
 
172
#   index_merge vs 'index', index_merge is better.
 
173
explain select key3 from t2 where key1 = 100 or key2 = 100;
 
174
 
 
175
#   index_merge vs 'index', 'index' is better.
 
176
explain select key3 from t2 where key1 <100 or key2 < 100;
 
177
 
 
178
#   index_merge vs 'all', index_merge is better.
 
179
explain select key7 from t2 where key1 <100 or key2 < 100;
 
180
 
 
181
# 10. Multipart keys.
 
182
create table t4 (
 
183
  key1a int not null,
 
184
  key1b int not null,
 
185
  key2  int not null,
 
186
  key2_1 int not null,
 
187
  key2_2 int not null,
 
188
  key3  int not null,
 
189
  
 
190
  index i1a (key1a, key1b),
 
191
  index i1b (key1b, key1a),
 
192
  
 
193
  index i2_1(key2, key2_1),
 
194
  index i2_2(key2, key2_1)
 
195
);
 
196
 
 
197
insert into t4 select key1,key1,key1 div 10, key1 % 10, key1 % 10, key1 from t0;
 
198
 
 
199
#   the following will be handled by index_merge:
 
200
select * from t4 where key1a = 3 or key1b = 4; 
 
201
explain select * from t4 where key1a = 3 or key1b = 4; 
 
202
 
 
203
#   and the following will not
 
204
explain select * from t4 where key2 = 1 and (key2_1 = 1 or key3 = 5);
 
205
 
 
206
explain select * from t4 where key2 = 1 and (key2_1 = 1 or key2_2 = 5);
 
207
 
 
208
explain select * from t4 where key2_1 = 1 or key2_2 = 5;
 
209
 
 
210
 
 
211
# 11. Multitable selects
 
212
create table t1 like t0;
 
213
insert into t1 select * from t0;
 
214
 
 
215
#  index_merge on first table in join
 
216
explain select * from t0 left join t1 on (t0.key1=t1.key1) 
 
217
  where t0.key1=3 or t0.key2=4; 
 
218
 
 
219
select * from t0 left join t1 on (t0.key1=t1.key1)
 
220
  where t0.key1=3 or t0.key2=4;
 
221
 
 
222
explain 
 
223
select * from t0,t1 where (t0.key1=t1.key1) and ( t0.key1=3 or t0.key2=4);
 
224
 
 
225
#  index_merge vs. ref
 
226
explain 
 
227
select * from t0,t1 where (t0.key1=t1.key1) and 
 
228
  (t0.key1=3 or t0.key2=4) and t1.key1<200;
 
229
 
 
230
#  index_merge vs. ref
 
231
explain 
 
232
select * from t0,t1 where (t0.key1=t1.key1) and 
 
233
  (t0.key1=3 or t0.key2<4) and t1.key1=2;
 
234
 
 
235
#  index_merge on second table in join
 
236
explain select * from t0,t1 where t0.key1 = 5 and 
 
237
  (t1.key1 = t0.key1 or t1.key8 = t0.key1);
 
238
 
 
239
# Fix for bug#1974
 
240
explain select * from t0,t1 where t0.key1 < 3 and
 
241
  (t1.key1 = t0.key1 or t1.key8 = t0.key1);
 
242
 
 
243
#  index_merge inside union
 
244
explain select * from t1 where key1=3 or key2=4 
 
245
  union select * from t1 where key1<4 or key3=5;
 
246
 
 
247
#  index merge in subselect
 
248
explain select * from (select * from t1 where key1 = 3 or key2 =3) as Z where key8 >5;
 
249
 
 
250
# 12. check for long index_merges.
 
251
create table t3 like t0;
 
252
insert into t3 select * from t0;
 
253
alter table t3 add key9 int not null, add index i9(key9);
 
254
alter table t3 add keyA int not null, add index iA(keyA);
 
255
alter table t3 add keyB int not null, add index iB(keyB);
 
256
alter table t3 add keyC int not null, add index iC(keyC);
 
257
update t3 set key9=key1,keyA=key1,keyB=key1,keyC=key1;
 
258
 
 
259
explain select * from t3 where 
 
260
  key1=1 or key2=2 or key3=3 or key4=4 or
 
261
  key5=5 or key6=6 or key7=7 or key8=8 or
 
262
  key9=9 or keyA=10 or keyB=11 or keyC=12;
 
263
 
 
264
select * from t3 where
 
265
  key1=1 or key2=2 or key3=3 or key4=4 or
 
266
  key5=5 or key6=6 or key7=7 or key8=8 or
 
267
  key9=9 or keyA=10 or keyB=11 or keyC=12; 
 
268
 
 
269
# Test for Bug#3183
 
270
explain select * from t0 where key1 < 3 or key2 < 4;
 
271
select * from t0 where key1 < 3 or key2 < 4;
 
272
 
 
273
update t0 set key8=123 where key1 < 3 or key2 < 4;
 
274
select * from t0 where key1 < 3 or key2 < 4;
 
275
 
 
276
delete from t0 where key1 < 3 or key2 < 4;
 
277
select * from t0 where key1 < 3 or key2 < 4;
 
278
analyze table t0; # PBXT: Required to get count right!
 
279
select count(*) from t0;
 
280
 
 
281
# Test for BUG#4177
 
282
drop table t4;
 
283
create table t4 (a int);
 
284
insert into t4 values (1),(4),(3);
 
285
set @save_join_buffer_size=@@join_buffer_size;
 
286
set join_buffer_size= 4000;
 
287
explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) 
 
288
 from t0 as A force index(i1,i2), t0 as B force index (i1,i2) 
 
289
  where (A.key1 < 500000 or A.key2 < 3)
 
290
  and   (B.key1 < 500000 or B.key2 < 3);
 
291
 
 
292
select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) 
 
293
 from t0 as A force index(i1,i2), t0 as B force index (i1,i2) 
 
294
  where (A.key1 < 500000 or A.key2 < 3)
 
295
  and   (B.key1 < 500000 or B.key2 < 3);
 
296
 
 
297
update t0 set key1=1;
 
298
explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) 
 
299
 from t0 as A force index(i1,i2), t0 as B force index (i1,i2) 
 
300
  where (A.key1 = 1 or A.key2 = 1)
 
301
  and   (B.key1 = 1 or B.key2 = 1);
 
302
 
 
303
select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) 
 
304
 from t0 as A force index(i1,i2), t0 as B force index (i1,i2) 
 
305
  where (A.key1 = 1 or A.key2 = 1)
 
306
  and   (B.key1 = 1 or B.key2 = 1);
 
307
 
 
308
alter table t0 add filler1 char(200), add filler2 char(200), add filler3 char(200);
 
309
update t0 set key2=1, key3=1, key4=1, key5=1,key6=1,key7=1 where key7 < 500;
 
310
 
 
311
# The next query will not use index i7 in intersection if the OS doesn't 
 
312
# support file sizes > 2GB. (ha_myisam::ref_length depends on this and index
 
313
# scan cost estimates depend on ha_myisam::ref_length)
 
314
--replace_column 9 #
 
315
--replace_result "4,4,4,4,4,4,4" X "4,4,4,4,4,4" X "i6,i7" "i6,i7?" "i6" "i6,i7?"
 
316
explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) 
 
317
 from t0 as A, t0 as B 
 
318
 where (A.key1 = 1 and A.key2 = 1 and A.key3 = 1 and A.key4=1 and A.key5=1 and A.key6=1 and A.key7 = 1 or A.key8=1)
 
319
  and (B.key1 = 1 and B.key2 = 1 and B.key3 = 1 and B.key4=1 and B.key5=1 and B.key6=1 and B.key7 = 1 or B.key8=1);
 
320
 
 
321
select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) 
 
322
 from t0 as A, t0 as B 
 
323
 where (A.key1 = 1 and A.key2 = 1 and A.key3 = 1 and A.key4=1 and A.key5=1 and A.key6=1 and A.key7 = 1 or A.key8=1)
 
324
  and (B.key1 = 1 and B.key2 = 1 and B.key3 = 1 and B.key4=1 and B.key5=1 and B.key6=1 and B.key7 = 1 or B.key8=1);
 
325
 
 
326
set join_buffer_size= @save_join_buffer_size;
 
327
# Test for BUG#4177 ends 
 
328
 
 
329
drop table t0, t1, t2, t3, t4;
 
330
 
 
331
# BUG#16166
 
332
CREATE TABLE t1 (
 
333
  cola char(3) not null, colb char(3) not null,  filler char(200),
 
334
  key(cola), key(colb)
 
335
);
 
336
INSERT INTO t1 VALUES ('foo','bar', 'ZZ'),('fuz','baz', 'ZZ');
 
337
 
 
338
--disable_query_log
 
339
let $1=9;
 
340
while ($1)
 
341
{
 
342
  eval INSERT INTO t1 SELECT * from t1 WHERE cola = 'foo';
 
343
  dec $1;
 
344
}
 
345
 
 
346
let $1=13;
 
347
while ($1)
 
348
{
 
349
  eval INSERT INTO t1 SELECT * from t1 WHERE cola <> 'foo';
 
350
  dec $1;
 
351
}
 
352
 
 
353
--enable_query_log
 
354
 
 
355
OPTIMIZE TABLE t1;
 
356
select count(*) from t1;
 
357
explain select * from t1 WHERE cola = 'foo' AND colb = 'bar';
 
358
explain select * from t1 force index(cola,colb) WHERE cola = 'foo' AND colb = 'bar';
 
359
drop table t1;
 
360
 
 
361
#
 
362
# BUG#17314: Index_merge/intersection not choosen by the optimizer for MERGE tables
 
363
#
 
364
create table t0 (a int);
 
365
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
 
366
create table t1 (
 
367
  a int, b int, 
 
368
  filler1 char(200), filler2 char(200),
 
369
  key(a),key(b)
 
370
) engine=myisam; # PBXT: required for merge below
 
371
insert into t1 select @v:= A.a, @v, 't1', 'filler2' from t0 A, t0 B, t0 C;
 
372
create table t2 like t1;
 
373
 
 
374
create table t3 (
 
375
  a int, b int, 
 
376
  filler1 char(200), filler2 char(200),
 
377
  key(a),key(b)
 
378
) engine=merge union=(t1,t2);
 
379
 
 
380
--replace_column 9 #
 
381
explain select * from t1 where a=1 and b=1;
 
382
--replace_column 9 #
 
383
explain select * from t3 where a=1 and b=1;
 
384
 
 
385
drop table t3;
 
386
drop table t0, t1, t2;