~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
# Initialise
2
--disable_warnings
3
drop table if exists t1, t2;
4
--enable_warnings
5
#
6
# test of IN (NULL)
7
#
8
9
select 1 in (1,2,3);
10
select 10 in (1,2,3);
11
select NULL in (1,2,3);
12
select 1 in (1,NULL,3);
13
select 3 in (1,NULL,3);
14
select 10 in (1,NULL,3);
15
select 1.5 in (1.5,2.5,3.5);
16
select 10.5 in (1.5,2.5,3.5);
17
select NULL in (1.5,2.5,3.5);
18
select 1.5 in (1.5,NULL,3.5);
19
select 3.5 in (1.5,NULL,3.5);
20
select 10.5 in (1.5,NULL,3.5);
21
22
CREATE TABLE t1 (a int, b int, c int);
23
insert into t1 values (1,2,3), (1,NULL,3);
24
select 1 in (a,b,c) from t1;
25
select 3 in (a,b,c) from t1;
26
select 10 in (a,b,c) from t1;
27
select NULL in (a,b,c) from t1;
28
drop table t1;
29
CREATE TABLE t1 (a float, b float, c float);
30
insert into t1 values (1.5,2.5,3.5), (1.5,NULL,3.5);
31
select 1.5 in (a,b,c) from t1;
32
select 3.5 in (a,b,c) from t1;
33
select 10.5 in (a,b,c) from t1;
34
drop table t1;
35
CREATE TABLE t1 (a varchar(10), b varchar(10), c varchar(10));
36
insert into t1 values ('A','BC','EFD'), ('A',NULL,'EFD');
37
select 'A' in (a,b,c) from t1;
38
select 'EFD' in (a,b,c) from t1;
39
select 'XSFGGHF' in (a,b,c) from t1;
40
drop table t1;
41
42
CREATE TABLE t1 (field char(1));
43
INSERT INTO t1 VALUES ('A'),(NULL);
44
SELECT * from t1 WHERE field IN (NULL);
45
SELECT * from t1 WHERE field NOT IN (NULL);
46
SELECT * from t1 where field = field;
47
SELECT * from t1 where field <=> field;
48
DELETE FROM t1 WHERE field NOT IN (NULL);
49
SELECT * FROM t1;
50
drop table t1;
51
512 by Brian Aker
Adding back more test cases.
52
create table t1 (id int primary key);
1 by brian
clean slate
53
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9);
54
select * from t1 where id in (2,5,9);
55
drop table t1;
56
57
create table t1 (
512 by Brian Aker
Adding back more test cases.
58
a char(1),
59
b char(1),
60
c char(1)
1 by brian
clean slate
61
);
62
insert into t1 values ('A','B','C');
63
insert into t1 values ('a','c','c');
64
select * from t1 where a in (b);
65
select * from t1 where a in (b,c);
66
select * from t1 where 'a' in (a,b,c);
67
select * from t1 where 'a' in (a);
68
select * from t1 where a in ('a');
512 by Brian Aker
Adding back more test cases.
69
select * from t1 where 'a' collate utf8_general_ci in (a,b,c);
70
select * from t1 where 'a' collate utf8_bin in (a,b,c);
71
select * from t1 where 'a' in (a,b,c collate utf8_bin);
72
explain extended select * from t1 where 'a' in (a,b,c collate utf8_bin);
1 by brian
clean slate
73
drop table t1;
74
75
# Bug#7834 Illegal mix of collations in IN operator
512 by Brian Aker
Adding back more test cases.
76
create table t1 (a char(10) not null);
1 by brian
clean slate
77
insert into t1 values ('a'),('b'),('c');
78
select a from t1 where a IN ('a','b','c') order by a;
79
drop table t1;
80
81
select '1.0' in (1,2);
82
select 1 in ('1.0',2);
83
select 1 in (1,'2.0');
84
select 1 in ('1.0',2.0);
85
select 1 in (1.0,'2.0');
86
select 1 in ('1.1',2);
87
select 1 in ('1.1',2.0);
88
89
# Test case for bug #6365
90
512 by Brian Aker
Adding back more test cases.
91
create table t1 (a char(2));
1 by brian
clean slate
92
insert into t1 values ('aa'), ('bb');
93
select * from t1 where a in (NULL, 'aa');
94
drop table t1;
95
96
# BUG#13419
97
create table t1 (id int, key(id));
98
insert into t1 values (1),(2),(3);
99
select count(*) from t1 where id not in (1);
100
select count(*) from t1 where id not in (1,2);
101
drop table t1;
102
103
104
#
105
# BUG#17047: CHAR() and IN() can return NULL without signaling NULL
106
# result
107
#
108
# The problem was in the IN() function that ignored maybe_null flags
109
# of all arguments except the first (the one _before_ the IN
110
# keyword, '1' in the test case below).
111
#
112
--disable_warnings
113
DROP TABLE IF EXISTS t1;
114
--enable_warnings
115
116
CREATE TABLE t1 SELECT 1 IN (2, NULL);
117
--echo SELECT should return NULL.
118
SELECT * FROM t1;
119
120
DROP TABLE t1;
121
122
123
--echo End of 4.1 tests
124
125
126
#
127
# Bug #11885: WHERE condition with NOT IN (one element)          
128
#             
129
130
CREATE TABLE t1 (a int PRIMARY KEY);
131
INSERT INTO t1 VALUES (44), (45), (46);
132
133
SELECT * FROM t1 WHERE a IN (45);
134
SELECT * FROM t1 WHERE a NOT IN (0, 45);
135
SELECT * FROM t1 WHERE a NOT IN (45);
136
137
DROP TABLE t1;
138
139
# BUG#15872: Excessive memory consumption of range analysis of NOT IN
1063.9.3 by Brian Aker
Partial fix for tests for tmp
140
# I have disabled the EXPLAIN because we must use Innodb with this test.
141
create table t1 (a int);
1 by brian
clean slate
142
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); 
1063.9.51 by Stewart Smith
fix func_in test to include explain for some MRR queries again.
143
create temporary table t2 (a int, filler char(200), key(a)) engine=myisam;
1 by brian
clean slate
144
145
insert into t2 select C.a*2,   'no'  from t1 A, t1 B, t1 C;
146
insert into t2 select C.a*2+1, 'yes' from t1 C;
147
1063.9.51 by Stewart Smith
fix func_in test to include explain for some MRR queries again.
148
explain 
149
select * from t2 where a NOT IN (0, 2,4,6,8,10,12,14,16,18);
1 by brian
clean slate
150
select * from t2 where a NOT IN (0, 2,4,6,8,10,12,14,16,18);
151
1063.9.3 by Brian Aker
Partial fix for tests for tmp
152
# 
1063.9.51 by Stewart Smith
fix func_in test to include explain for some MRR queries again.
153
explain select * from t2 force index(a) where a NOT IN (2,2,2,2,2,2);
154
explain select * from t2 force index(a) where a <> 2;
1 by brian
clean slate
155
156
drop table t2;
157
158
#
159
# Repeat the test for DATETIME
160
#
161
create table t2 (a datetime, filler char(200), key(a));
162
163
insert into t2 select '2006-04-25 10:00:00' + interval C.a minute,
164
               'no'  from t1 A, t1 B, t1 C where C.a % 2 = 0;
165
166
insert into t2 select '2006-04-25 10:00:00' + interval C.a*2+1 minute,
167
               'yes' from t1 C;
168
169
explain 
170
select * from t2 where a NOT IN (
171
  '2006-04-25 10:00:00','2006-04-25 10:02:00','2006-04-25 10:04:00', 
172
  '2006-04-25 10:06:00', '2006-04-25 10:08:00');
173
select * from t2 where a NOT IN (
174
  '2006-04-25 10:00:00','2006-04-25 10:02:00','2006-04-25 10:04:00', 
175
  '2006-04-25 10:06:00', '2006-04-25 10:08:00');
176
drop table t2;
177
178
#
179
# Repeat the test for CHAR(N)
180
#
181
create table t2 (a varchar(10), filler char(200), key(a));
182
183
insert into t2 select 'foo', 'no' from t1 A, t1 B;
184
insert into t2 select 'barbar', 'no' from t1 A, t1 B;
185
insert into t2 select 'bazbazbaz', 'no' from t1 A, t1 B;
186
187
insert into t2 values ('fon', '1'), ('fop','1'), ('barbaq','1'), 
188
  ('barbas','1'), ('bazbazbay', '1'),('zz','1');
189
190
explain select * from t2 where a not in('foo','barbar', 'bazbazbaz');
191
192
drop table t2;
193
194
#
195
# Repeat for DECIMAL
196
#
197
create table t2 (a decimal(10,5), filler char(200), key(a));
198
199
insert into t2 select 345.67890, 'no' from t1 A, t1 B;
200
insert into t2 select 43245.34, 'no' from t1 A, t1 B;
201
insert into t2 select 64224.56344, 'no' from t1 A, t1 B;
202
203
insert into t2 values (0, '1'), (22334.123,'1'), (33333,'1'), 
204
  (55555,'1'), (77777, '1');
205
206
explain
207
select * from t2 where a not in (345.67890, 43245.34, 64224.56344);
208
select * from t2 where a not in (345.67890, 43245.34, 64224.56344);
209
210
drop table t2;
211
212
# Try a very big IN-list
213
create table t2 (a int, key(a), b int);
214
insert into t2 values (1,1),(2,2);
215
216
set @cnt= 1; 
217
set @str="update t2 set b=1 where a not in (";
218
select count(*) from (
219
  select @str:=concat(@str, @cnt:=@cnt+1, ",") 
220
  from t1 A, t1 B, t1 C, t1 D) Z;
221
222
set @str:=concat(@str, "10000)");
223
select substr(@str, 1, 50);
224
set @str=NULL;
225
226
drop table t2;
227
drop table t1;
228
229
# BUG#19618: Crash in range optimizer for 
230
#   "unsigned_keypart NOT IN(negative_number,...)" 
231
#   (introduced in fix BUG#15872) 
232
create table t1 (
512 by Brian Aker
Adding back more test cases.
233
  some_id int,
1 by brian
clean slate
234
  key (some_id)
235
);
236
insert into t1 values (1),(2);
237
select some_id from t1 where some_id not in(2,-1);
238
select some_id from t1 where some_id not in(-4,-1,-4);
239
select some_id from t1 where some_id not in(-4,-1,3423534,2342342);
240
241
#
413.2.2 by Brian Aker
Removed UNSIGNED from parser.
242
# BUG#24261: crash when WHERE contains NOT IN ('<negative value>') for column type
1 by brian
clean slate
243
#
244
245
select some_id from t1 where some_id not in('-1', '0');
246
247
drop table t1;
248
249
#
250
# BUG#20420: optimizer reports wrong keys on left join with IN
251
#
252
CREATE TABLE t1 (a int, b int, PRIMARY KEY (a));
253
INSERT INTO t1 VALUES (1,1),(2,1),(3,1),(4,1),(5,1),(6,1);
254
255
CREATE TABLE t2 (a int, b int, PRIMARY KEY (a));
256
INSERT INTO t2 VALUES (3,2),(4,2),(100,100),(101,201),(102,102);
257
258
CREATE TABLE t3 (a int PRIMARY KEY);
259
INSERT INTO t3 VALUES (1),(2),(3),(4);
260
261
CREATE TABLE t4 (a int PRIMARY KEY,b int);
262
INSERT INTO t4 VALUES (1,1),(2,2),(1000,1000),(1001,1001),(1002,1002),
263
       (1003,1003),(1004,1004);
264
1718.2.1 by Lee Bieber
For the feature request (https://blueprints.launchpad.net/drizzle/+spec/limit-maximum-sort-size)
265
--sorted_result
1 by brian
clean slate
266
EXPLAIN SELECT STRAIGHT_JOIN * FROM t3 
267
  JOIN t1 ON t3.a=t1.a 
268
  JOIN t2 ON t3.a=t2.a
269
  JOIN t4 WHERE t4.a IN (t1.b, t2.b);
270
271
SELECT STRAIGHT_JOIN * FROM t3 
272
  JOIN t1 ON t3.a=t1.a 
273
  JOIN t2 ON t3.a=t2.a
274
  JOIN t4 WHERE t4.a IN (t1.b, t2.b);
275
1718.2.1 by Lee Bieber
For the feature request (https://blueprints.launchpad.net/drizzle/+spec/limit-maximum-sort-size)
276
--sorted_result
1 by brian
clean slate
277
EXPLAIN SELECT STRAIGHT_JOIN 
278
   (SELECT SUM(t4.a) FROM t4 WHERE t4.a IN (t1.b, t2.b)) 
279
  FROM t3, t1, t2
280
  WHERE t3.a=t1.a AND t3.a=t2.a;
281
282
SELECT STRAIGHT_JOIN 
283
   (SELECT SUM(t4.a) FROM t4 WHERE t4.a IN (t1.b, t2.b)) 
284
  FROM t3, t1, t2
285
  WHERE t3.a=t1.a AND t3.a=t2.a;
286
287
DROP TABLE t1,t2,t3,t4;  
288
289
#
413.2.2 by Brian Aker
Removed UNSIGNED from parser.
290
# BUG#19342: IN works incorrectly for BIGINT values
1 by brian
clean slate
291
#
512 by Brian Aker
Adding back more test cases.
292
CREATE TABLE t1(a BIGINT);
293
INSERT INTO t1 VALUES (0x0FFFFFFFFFFFFFFF);
1 by brian
clean slate
294
295
SELECT * FROM t1 WHERE a=-1 OR a=-2 ;
296
SELECT * FROM t1 WHERE a IN (-1, -2);
297
512 by Brian Aker
Adding back more test cases.
298
CREATE TABLE t2 (a BIGINT);
1 by brian
clean slate
299
insert into t2 values(13491727406643098568),
512 by Brian Aker
Adding back more test cases.
300
       (0x0fffffefffffffff),
301
       (0x0ffffffeffffffff),
302
       (0x0fffffffefffffff),
303
       (0x0ffffffffeffffff),
304
       (0x0fffffffffefffff),
305
       (0x0ffffffffffeffff),
306
       (0x0fffffffffffefff),
307
       (0x0ffffffffffffeff),
308
       (0x0fffffffffffffef),
309
       (0x0ffffffffffffffe),
310
       (0x0fffffffffffffff),
311
       (0x2000000000000000),
312
       (0x2000000000000001),
313
       (0x2000000000000002),
314
       (0x2000000000000300),
315
       (0x2000000000000400),
316
       (0x2000000000000401),
317
       (0x2000000000004001),
318
       (0x2000000000040001),
319
       (0x2000000000400001),
320
       (0x2000000004000001),
321
       (0x2000000040000001),
322
       (0x2000000400000001),
323
       (0x2000004000000001),
324
       (0x2000040000000001);
1 by brian
clean slate
325
512 by Brian Aker
Adding back more test cases.
326
SELECT HEX(a) FROM t2 WHERE a IN (0xBB3C3E98175D33C8, 42);
1 by brian
clean slate
327
328
SELECT HEX(a) FROM t2 WHERE a IN
512 by Brian Aker
Adding back more test cases.
329
  (0xBB3C3E98175D33C8,
330
   0x2fffffffffffffff,
331
   0x2000000000000000,
332
   0x2000000000000400,
333
   0x2000000000000401,
1 by brian
clean slate
334
   42);
335
336
SELECT HEX(a) FROM t2 WHERE a IN 
512 by Brian Aker
Adding back more test cases.
337
  (0x7fffffffffffffff, 
338
   0x2000000000000001);
339
SELECT HEX(a) FROM t2 WHERE a IN 
340
  (0x2ffffffffffffffe, 
341
   0x2fffffffffffffff);
342
SELECT HEX(a) FROM t2 WHERE a IN 
343
  (0x2ffffffffffffffe, 
344
   0x2fffffffffffffff,
1 by brian
clean slate
345
   'abc');
346
512 by Brian Aker
Adding back more test cases.
347
CREATE TABLE t3 (a BIGINT);
1 by brian
clean slate
348
INSERT INTO t3 VALUES (9223372036854775551);
349
350
SELECT HEX(a) FROM t3 WHERE a IN (9223372036854775807, 42);
351
352
CREATE TABLE t4 (a DATE);
353
INSERT INTO t4 VALUES ('1972-02-06'), ('1972-07-29');
354
SELECT * FROM t4 WHERE a IN ('1972-02-06','19772-07-29');
355
356
DROP TABLE t1,t2,t3,t4;
357
358
#
359
# BUG#27362: IN with a decimal expression that may return NULL
360
#
361
362
CREATE TABLE t1 (id int not null);
363
INSERT INTO t1 VALUES (1),(2);
364
365
SELECT id FROM t1 WHERE id IN(4564, (SELECT IF(1=0,1,1/0)) );
366
367
DROP TABLE t1;
368
369
--echo End of 5.0 tests
370
371
372
#
373
# Bug#18360: Type aggregation for IN and CASE may lead to a wrong result 
374
#
1063.9.3 by Brian Aker
Partial fix for tests for tmp
375
create TEMPORARY table t1(f1 char(1)) ENGINE=MYISAM;
1 by brian
clean slate
376
insert into t1 values ('a'),('b'),('1');
377
select f1 from t1 where f1 in ('a',1);
378
select f1, case f1 when 'a' then '+' when 1 then '-' end from t1;
379
create index t1f1_idx on t1(f1);
380
select f1 from t1 where f1 in ('a',1);
381
explain select f1 from t1 where f1 in ('a',1);
382
select f1 from t1 where f1 in ('a','b');
383
explain select f1 from t1 where f1 in ('a','b');
384
select f1 from t1 where f1 in (2,1);
385
explain select f1 from t1 where f1 in (2,1);
1063.9.3 by Brian Aker
Partial fix for tests for tmp
386
create TEMPORARY table t2(f2 int, index t2f2(f2)) ENGINE=MYISAM;
1 by brian
clean slate
387
insert into t2 values(0),(1),(2);
388
select f2 from t2 where f2 in ('a',2);
389
explain select f2 from t2 where f2 in ('a',2);
390
select f2 from t2 where f2 in ('a','b');
391
explain select f2 from t2 where f2 in ('a','b');
392
select f2 from t2 where f2 in (1,'b');
393
explain select f2 from t2 where f2 in (1,'b');
394
drop table t1, t2;
395
396
#
397
# Bug #31075: crash in get_func_mm_tree
398
#
399
896.5.1 by Jay Pipes
Removes the TIME column type and related time functions.
400
create table t1 (a datetime, key(a));
1 by brian
clean slate
401
insert into t1 values (),(),(),(),(),(),(),(),(),();
402
select a from t1 where a not in (a,a,a) group by a;
403
drop table t1;
404
405
--echo End of 5.1 tests