MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
subquery_sj.inc
1 #
2 # Nested Loops semi-join subquery evaluation tests
3 #
4 
5 # This portion of the file vas developed when subquery materialization
6 # was rule-based; to preserve the intended test scenarios, we switch
7 # off cost-based choice for them.
8 set @old_opt_switch=@@optimizer_switch;
9 set optimizer_switch='subquery_materialization_cost_based=off';
10 
11 --disable_warnings
12 drop table if exists t0, t1, t2, t10, t11, t12;
13 --enable_warnings
14 
15 #
16 # IN subquery optimization test
17 #
18 create table t1 (a int not null, b int, primary key (a));
19 create table t2 (a int not null, primary key (a));
20 create table t3 (a int not null, b int, primary key (a));
21 insert into t1 values (1,10), (2,20), (3,30), (4,40);
22 insert into t2 values (2), (3), (4), (5);
23 insert into t3 values (10,3), (20,4), (30,5);
24 select * from t2 where t2.a in (select a from t1);
25 explain extended select * from t2 where t2.a in (select a from t1);
26 select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
27 explain extended select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
28 select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
29 explain extended select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
30 drop table t1, t2, t3;
31 create table t1 (a int, b int, index a (a,b));
32 create table t2 (a int, index a (a));
33 create table t3 (a int, b int, index a (a));
34 insert into t1 values (1,10), (2,20), (3,30), (4,40);
35 # making table large enough
36 create table t0(a int);
37 insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
38 insert into t1
39 select rand()*100000+200,rand()*100000 from t0 A, t0 B, t0 C, t0 D;
40 
41 insert into t2 values (2), (3), (4), (5);
42 insert into t3 values (10,3), (20,4), (30,5);
43 select * from t2 where t2.a in (select a from t1);
44 explain extended select * from t2 where t2.a in (select a from t1);
45 select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
46 explain extended select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
47 select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
48 explain extended select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
49 insert into t1 values (3,31);
50 select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
51 select * from t2 where t2.a in (select a from t1 where t1.b <> 30 and t1.b <> 31);
52 explain extended select * from t2 where t2.a in (select a from t1 where t1.b <> 30);
53 drop table t0, t1, t2, t3;
54 
55 
56 #
57 # 1. Subqueries that are converted into semi-joins
58 #
59 create table t0 (a int);
60 insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
61 
62 create table t1(a int, b int);
63 insert into t1 values (0,0),(1,1),(2,2);
64 create table t2 as select * from t1;
65 
66 create table t11(a int, b int);
67 
68 create table t10 (pk int, a int, primary key(pk));
69 insert into t10 select a,a from t0;
70 create table t12 like t10;
71 insert into t12 select * from t10;
72 
73 
74 --echo Flattened because of dependency, t10=func(t1)
75 explain select * from t1 where a in (select pk from t10);
76 select * from t1 where a in (select pk from t10);
77 
78 --echo A confluent case of dependency
79 explain select * from t1 where a in (select a from t10 where pk=12);
80 select * from t1 where a in (select a from t10 where pk=12);
81 
82 explain select * from t1 where a in (select a from t10 where pk=9);
83 select * from t1 where a in (select a from t10 where pk=9);
84 
85 --echo An empty table inside
86 explain select * from t1 where a in (select a from t11);
87 select * from t1 where a in (select a from t11);
88 
89 explain select * from t1 where a in (select pk from t10) and b in (select pk from t10);
90 select * from t1 where a in (select pk from t10) and b in (select pk from t10);
91 
92 --echo flattening a nested subquery
93 explain select * from t1 where a in (select pk from t10 where t10.a in (select pk from t12));
94 select * from t1 where a in (select pk from t10 where t10.a in (select pk from t12));
95 
96 --echo flattening subquery w/ several tables
97 explain extended select * from t1 where a in (select t10.pk from t10, t12 where t12.pk=t10.a);
98 
99 --echo subqueries within outer joins go into ON expr.
100 # TODO: psergey: check if case conversions like those are ok (it broke on windows)
101 --replace_result a A b B
102 explain extended
103 select * from t1 left join (t2 A, t2 B) on ( A.a= t1.a and B.a in (select pk from t10));
104 
105 # TODO: psergey: check if case conversions like those are ok (it broke on windows)
106 --echo t2 should be wrapped into OJ-nest, so we have "t1 LJ (t2 J t10)"
107 --replace_result a A b B
108 explain extended
109 select * from t1 left join t2 on (t2.a= t1.a and t2.a in (select pk from t10));
110 
111 --echo we shouldn't flatten if we're going to get a join of > MAX_TABLES.
112 explain select * from
113  t1 s00, t1 s01, t1 s02, t1 s03, t1 s04,t1 s05,t1 s06,t1 s07,t1 s08,t1 s09,
114  t1 s10, t1 s11, t1 s12, t1 s13, t1 s14,t1 s15,t1 s16,t1 s17,t1 s18,t1 s19,
115  t1 s20, t1 s21, t1 s22, t1 s23, t1 s24,t1 s25,t1 s26,t1 s27,t1 s28,t1 s29,
116  t1 s30, t1 s31, t1 s32, t1 s33, t1 s34,t1 s35,t1 s36,t1 s37,t1 s38,t1 s39,
117  t1 s40, t1 s41, t1 s42, t1 s43, t1 s44,t1 s45,t1 s46,t1 s47,t1 s48,t1 s49
118 where
119  s00.a in (
120  select m00.a from
121  t1 m00, t1 m01, t1 m02, t1 m03, t1 m04,t1 m05,t1 m06,t1 m07,t1 m08,t1 m09,
122  t1 m10, t1 m11, t1 m12, t1 m13, t1 m14,t1 m15,t1 m16,t1 m17,t1 m18,t1 m19
123  );
124 
125 select * from
126  t1 left join t2 on (t2.a= t1.a and t2.a in (select pk from t10))
127 where t1.a < 5;
128 
129 #
130 # Prepared statements
131 #
132 prepare s1 from
133  ' select * from
134  t1 left join t2 on (t2.a= t1.a and t2.a in (select pk from t10))
135  where t1.a < 5';
136 execute s1;
137 execute s1;
138 
139 # Try I2O orders
140 insert into t1 select (A.a + 10 * B.a),1 from t0 A, t0 B;
141 explain extended select * from t1 where a in (select pk from t10 where pk<3);
142 
143 drop table t0, t1, t2;
144 drop table t10, t11, t12;
145 
146 --echo #
147 --echo # Check that subqueries with outer joins or straight_join work for
148 --echo # different permutations of const and non-const tables. (Ref. Bug#46692)
149 --echo #
150 CREATE TABLE t1 (i INTEGER);
151 CREATE TABLE t2 (i INTEGER);
152 CREATE TABLE t3 (i INTEGER);
153 let $i=3;
154 while ($i)
155 {
156  let $j=3;
157  while ($j)
158  {
159  let $k=3;
160  while ($k)
161  {
162  SELECT (SELECT COUNT(*) from t1) AS c1,
163  (SELECT COUNT(*) from t2) AS c2,
164  (SELECT COUNT(*) from t3) AS c3;
165 
166  let $query=
167  SELECT * FROM t1 WHERE (t1.i) IN
168  (SELECT t3.i FROM t2 INNER JOIN t3 ON t2.i=t3.i);
169  eval EXPLAIN $query;
170  eval $query;
171 
172  eval PREPARE stmt FROM "$query";
173  EXECUTE stmt;
174  EXECUTE stmt;
175  DEALLOCATE PREPARE stmt;
176 
177  let $query=
178  SELECT * FROM t1 WHERE (t1.i) IN
179  (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i);
180  eval EXPLAIN $query;
181  eval $query;
182 
183  eval PREPARE stmt FROM "$query";
184  EXECUTE stmt;
185  EXECUTE stmt;
186  DEALLOCATE PREPARE stmt;
187 
188  let $query=
189  SELECT * FROM t1 WHERE (t1.i) IN
190  (SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
191  eval EXPLAIN $query;
192  eval $query;
193 
194  let $query=
195  SELECT * FROM t1 WHERE (t1.i) IN
196  (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
197  eval EXPLAIN $query;
198  eval $query;
199 
200  let $query=
201  SELECT * FROM t1 WHERE (11) IN
202  (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i);
203  eval EXPLAIN $query;
204  eval $query;
205 
206  let $query=
207  SELECT * FROM t1 WHERE (11) IN
208  (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i);
209  eval EXPLAIN $query;
210  eval $query;
211 
212  let $query=
213  SELECT * FROM t1 WHERE (11) IN
214  (SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
215  eval EXPLAIN $query;
216  eval $query;
217 
218  let $query=
219  SELECT * FROM t1 WHERE (11) IN
220  (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
221  eval EXPLAIN $query;
222  eval $query;
223 
224  dec $k;
225  eval INSERT INTO t3 VALUES ($k);
226  }
227  DELETE FROM t3;
228  dec $j;
229  eval INSERT INTO t2 VALUES ($j);
230  }
231  DELETE FROM t2;
232  dec $i;
233  eval INSERT INTO t1 VALUES ($i);
234 }
235 DROP TABLE t1, t2, t3;
236 
237 # Test various IN and EXISTS queries with NULL values and UNKNOWN
238 
239 create table x1(k int primary key, d1 int, d2 int);
240 create table x2(k int primary key, d1 int, d2 int);
241 
242 insert into x1 values
243  (10, 10, 10),
244  (20, 20, 20),
245  (21, 20, null),
246  (30, null, 30),
247  (40, 40, 40);
248 insert into x2 values
249  (10, 10, 10),
250  (20, 20, 20),
251  (21, 20, null),
252  (30, null, 30);
253 
254 # Q1 T=(10, 20) U=(21,30) F=(40)
255 select *
256 from x1
257 where (d1, d2) in (select d1, d2
258  from x2);
259 select *
260 from x1
261 where (d1, d2) in (select d1, d2
262  from x2) is true;
263 select *
264 from x1
265 where (d1, d2) in (select d1, d2
266  from x2) is false;
267 select *
268 from x1
269 where (d1, d2) in (select d1, d2
270  from x2) is unknown;
271 
272 # Q2 T=(10, 20) U=(30) F=(21, 40)
273 select *
274 from x1
275 where d1 in (select d1
276  from x2
277  where x1.d2=x2.d2);
278 select *
279 from x1
280 where d1 in (select d1
281  from x2
282  where x1.d2=x2.d2) is true;
283 select *
284 from x1
285 where d1 in (select d1
286  from x2
287  where x1.d2=x2.d2) is false;
288 select *
289 from x1
290 where d1 in (select d1
291  from x2
292  where x1.d2=x2.d2) is unknown;
293 
294 # Q3 T=(10, 20) U=() F=(21, 30, 40)
295 select *
296 from x1
297 where 1 in (select 1
298  from x2
299  where x1.d1=x2.d1 and x1.d2=x2.d2);
300 select *
301 from x1
302 where 1 in (select 1
303  from x2
304  where x1.d1=x2.d1 and x1.d2=x2.d2) is true;
305 select *
306 from x1
307 where 1 in (select 1
308  from x2
309  where x1.d1=x2.d1 and x1.d2=x2.d2) is false;
310 select *
311 from x1
312 where 1 in (select 1
313  from x2
314  where x1.d1=x2.d1 and x1.d2=x2.d2) is unknown;
315 
316 # Q4 T=(10, 20) F=(21, 30, 40)
317 select *
318 from x1
319 where exists (select *
320  from x2
321  where x1.d1=x2.d1 and x1.d2=x2.d2);
322 
323 drop table x1;
324 drop table x2;
325 
326 
327 #
328 # Test for the problem with using sj-materialization when subquery's select
329 # list element SCOL is covered by equality propagation and has preceding equal
330 # column PCOL which belongs to a table within the the semi-join nest: SJM-Scan
331 # process should unpack column value not to SCOL but rather to PCOL, as
332 # substitute_best_equal has made all conditions to refer to PCOL.
333 #
334 CREATE TABLE t1 (
335  a int(11) NOT NULL,
336  b int(11) NOT NULL,
337  c datetime default NULL,
338  PRIMARY KEY (a),
339  KEY idx_bc (b,c)
340 );
341 
342 INSERT INTO t1 VALUES
343 (406989,67,'2006-02-23 17:08:46'), (150078,67,'2005-10-26 11:17:45'),
344 (406993,67,'2006-02-27 11:20:57'), (245655,67,'2005-12-08 15:59:08'),
345 (406994,67,'2006-02-27 11:26:46'), (256,67,NULL),
346 (398341,67,'2006-02-20 04:48:44'), (254,67,NULL),(1120,67,NULL),
347 (406988,67,'2006-02-23 17:07:22'), (255,67,NULL),
348 (398340,67,'2006-02-20 04:38:53'),(406631,67,'2006-02-23 10:49:42'),
349 (245653,67,'2005-12-08 15:59:07'),(406992,67,'2006-02-24 16:47:18'),
350 (245654,67,'2005-12-08 15:59:08'),(406995,67,'2006-02-28 11:55:00'),
351 (127261,67,'2005-10-13 12:17:58'),(406991,67,'2006-02-24 16:42:32'),
352 (245652,67,'2005-12-08 15:58:27'),(398545,67,'2006-02-20 04:53:13'),
353 (154504,67,'2005-10-28 11:53:01'),(9199,67,NULL),(1,67,'2006-02-23 15:01:35'),
354 (223456,67,NULL),(4101,67,NULL),(1133,67,NULL),
355 (406990,67,'2006-02-23 18:01:45'),(148815,67,'2005-10-25 15:34:17'),
356 (148812,67,'2005-10-25 15:30:01'),(245651,67,'2005-12-08 15:58:27'),
357 (154503,67,'2005-10-28 11:52:38');
358 
359 create table t11 select * from t1 where b = 67 AND (c IS NULL OR c > NOW()) order by 3 asc;
360 create table t12 select * from t1 where b = 67 AND (c IS NULL OR c > NOW()) order by 3 desc;
361 create table t21 select * from t1 where b = 67 AND (c IS NULL OR c > '2005-12-08') order by 3 asc;
362 create table t22 select * from t1 where b = 67 AND (c IS NULL OR c > '2005-12-08') order by 3 desc;
363 
364 update t22 set c = '2005-12-08 15:58:27' where a = 255;
365 explain select t21.* from t21,t22 where t21.a = t22.a and
366 t22.a in (select t12.a from t11, t12 where t11.a in(255,256) and t11.a = t12.a and t11.c is null) and t22.c is null order by t21.a;
367 explain format=json select * from t1 where a in (select a from t11);
368 select t21.* from t21,t22 where t21.a = t22.a and
369 t22.a in (select t12.a from t11, t12 where t11.a in(255,256) and t11.a = t12.a and t11.c is null) and t22.c is null order by t21.a;
370 
371 drop table t1, t11, t12, t21, t22;
372 
373 #
374 # Test sj-materialization re-execution. The test isn't meaningful (materialized
375 # table stays the same across all executions) because it's hard to create a
376 # dataset that would verify correct re-execution without hitting BUG#31480
377 #
378 create table t1(a int);
379 insert into t1 values (0),(1);
380 
381 explain
382 select (select max(Y.a) from t1 Y where a in (select a from t1 Z) and a < X.a) as subq from t1 X;
383 select (select max(Y.a) from t1 Y where a in (select a from t1 Z) and a < X.a) as subq from t1 X;
384 
385 drop table t1;
386 
387 #
388 # Test confluent duplicate weedout
389 #
390 create table t0 (a int);
391 insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
392 create table t1 as select * from t0;
393 insert into t1 select a+10 from t0;
394 insert into t0 values(2);
395 explain select * from t1 where 2 in (select a from t0);
396 select * from t1 where 2 in (select a from t0);
397 
398 #
399 # FirstMatch referring to a derived table
400 #
401 let $query=select * from (select a from t0) x where a in (select a from t1);
402 --eval explain $query
403 --eval explain format=json $query
404 drop table t0, t1;
405 
406 #
407 # LooseScan: Check if we can pick it together with range access
408 #
409 create table t0 (a int);
410 insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
411 
412 create table t1 (kp1 int, kp2 int, c int, filler char(100), key(kp1, kp2));
413 insert into t1 select A.a+10*(B.a+10*C.a), 0, 0, 'filler' from t0 A, t0 B, t0 C;
414 insert into t1 select * from t1 where kp1 < 20;
415 
416 create table t3 (a int);
417 insert into t3 select A.a + 10*B.a from t0 A, t0 B;
418 
419 explain select * from t3 where a in (select kp1 from t1 where kp1<20);
420 select * from t3 where a in (select kp1 from t1 where kp1<20);
421 
422 explain select * from t3 where a in (select kp1 from t1 where kp1<20) and a<20;
423 select * from t3 where a in (select kp1 from t1 where kp1<20) and a<20;
424 
425 create table t4 (pk int primary key);
426 insert into t4 select a from t3;
427 
428 explain select * from t3 where a in
429  (select t1.kp1 from t1,t4 where kp1<20 and t4.pk=t1.c);
430 select * from t3 where a in
431  (select t1.kp1 from t1,t4 where kp1<20 and t4.pk=t1.c);
432 
433 drop table t1, t3, t4;
434 
435 #
436 # Test if we handle duplicate elimination temptable overflowing to disk
437 #
438 create table t1 (a int);
439 insert into t1 values (0),(0),(0),(1),(1),(1),(2),(2),(2),(3),(3),(3);
440 
441 set @save_max_heap_table_size=@@max_heap_table_size;
442 set @@max_heap_table_size= 16384;
443 
444 --echo # Attempt to make one test that overflows the heap table when a
445 --echo # non-duplicate row is inserted and one test that overflows the
446 --echo # heap table when a duplicate record is inserted. Debugging showed
447 --echo # that these situations occurred with max_heap_table_size=16384
448 --echo # and optimizer_join_cache_level equals 1 and 0, respectively.
449 --echo # Finally execute a test that does not overflow the heap table.
450 explain
451 select count(*) from t0 A, t0 B, t0 C
452 where C.a in (select a from t1 D);
453 flush status;
454 select count(*) from t0 A, t0 B, t0 C
455 where C.a in (select a from t1 D);
456 show status like 'Created_tmp_disk_tables';
457 
458 set @@max_heap_table_size= @save_max_heap_table_size;
459 flush status;
460 select count(*) from t0 A, t0 B, t0 C
461 where C.a in (select a from t1 D);
462 show status like 'Created_tmp_disk_tables';
463 
464 drop table t0, t1;
465 #
466 # Materialize + Scan + ref access to the subsequent table based on scanned
467 # value
468 #
469 create table t0 (a int);
470 insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
471 create table t2(a int);
472 insert into t2 values (1),(2);
473 create table t3 ( a int , filler char(100), key(a));
474 insert into t3 select A.a + 10*B.a, 'filler' from t0 A, t0 B;
475 explain select * from t3 where a in (select a from t2) and (a > 5 or a < 10);
476 select * from t3 where a in (select a from t2);
477 
478 drop table t0, t2, t3;
479 
480 #
481 # DATETIME type checks
482 #
483 create table t1 (a date);
484 insert into t1 values ('2008-01-01'),('2008-01-01'),('2008-02-01'),('2008-02-01');
485 create table t2 (a int);
486 insert into t2 values (1),(2);
487 create table t3 (a char(10));
488 insert into t3 select * from t1;
489 insert into t3 values (1),(2);
490 explain select * from t2 where a in (select a from t1);
491 explain select * from t2 where a in (select a from t2);
492 explain select * from t2 where a in (select a from t3);
493 explain select * from t1 where a in (select a from t3);
494 drop table t1, t2, t3;
495 create table t1 (a decimal);
496 insert into t1 values (1),(2);
497 explain select * from t1 where a in (select a from t1);
498 drop table t1;
499 
500 #
501 # SJ-Materialization-scan for non-first table
502 #
503 create table t1 (a int);
504 insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
505 create table t2 as select * from t1;
506 create table t3 (a int, b int, filler char(100), key(a));
507 insert into t3 select A.a + 10*B.a, A.a + 10*B.a, 'filler' from t1 A, t1 B, t1 C;
508 explain select * from t1, t3 where t3.a in (select a from t2) and (t3.a < 10 or t3.a >30) and t1.a =3;
509 explain format=json select * from t1, t3 where t3.a in (select a from t2) and (t3.a < 10 or t3.a >30) and t1.a =3;
510 
511 #
512 # Verify that straight_join modifier in parent or child prevents flattening
513 #
514 explain select straight_join * from t1 A, t1 B where A.a in (select a from t2);
515 explain select * from t2 where a in (select straight_join A.a from t1 A, t1 B);
516 explain select * from t2 where a in (select straight_join A.a from t1 A, t1 B);
517 explain select straight_join * from t2 X, t2 Y
518 where X.a in (select straight_join A.a from t1 A, t1 B);
519 
520 #
521 # SJ-Materialization scan + first table being system const table
522 #
523 create table t0 (a int, b int);
524 insert into t0 values(1,1);
525 explain select * from t0, t3 where t3.a in (select a from t2) and (t3.a < 10 or t3.a >30);
526 create table t4 as select a as x, a as y from t1;
527 explain select * from t0, t3 where (t3.a, t3.b) in (select x,y from t4) and (t3.a < 10 or t3.a >30);
528 drop table t0,t1,t2,t3,t4;
529 
530 #
531 # LooseScan with ref access
532 #
533 create table t0 (a int);
534 insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
535 create table t1 (a int, b int, filler char(100), key(a,b));
536 insert into t1 select A.a, B.a, 'filler' from t0 A, t0 B;
537 create table t2 as select * from t1;
538 
539 explain select * from t2 where a in (select b from t1 where a=3);
540 explain select * from t2 where (b,a) in (select a,b from t1 where a=3);
541 
542 drop table t1,t2;
543 
544 #
545 # Multi-column sj-materialization with lookups
546 #
547 create table t1 (a int, b int);
548 insert into t1 select a,a from t0;
549 create table t2 (a int, b int);
550 insert into t2 select A.a + 10*B.a, A.a + 10*B.a from t0 A, t0 B;
551 
552 explain select * from t1 where (a,b) in (select a,b from t2);
553 
554 drop table t0, t1, t2;
555 
556 
557 #
558 # Primitive SJ-Materialization tests for DECIMAL and DATE
559 #
560 create table t0 (a decimal(4,2));
561 insert into t0 values (10.24), (22.11);
562 create table t1 as select * from t0;
563 insert into t1 select * from t0;
564 explain select * from t0 where a in (select a from t1);
565 select * from t0 where a in (select a from t1);
566 drop table t0, t1;
567 
568 create table t0(a date);
569 insert into t0 values ('2008-01-01'),('2008-02-02');
570 create table t1 as select * from t0;
571 insert into t1 select * from t0;
572 explain select * from t0 where a in (select a from t1);
573 select * from t0 where a in (select a from t1);
574 drop table t0, t1;
575 
576 #
577 # Fix a trivial crash with SJ-Materialization lookup, multiple tables in the
578 # subquery, and a condition on some of inner tables but not others
579 #
580 create table t0(a int);
581 insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
582 create table t1 as select a as a, a as b, a as c from t0 where a < 3;
583 create table t2 as select a as a, a as b from t0 where a < 3;
584 insert into t2 select * from t2;
585 
586 explain select * from t1 where (a,b,c) in (select X.a, Y.a, Z.a from t2 X, t2 Y, t2 Z where X.b=33);
587 
588 drop table t0,t1,t2;
589 
590 
591 #
592 # Test join buffering
593 #
594 set @save_join_buffer_size = @@join_buffer_size;
595 set join_buffer_size= 8192;
596 
597 create table t0 (a int);
598 insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
599 
600 create table t1 (a int, filler1 binary(200), filler2 binary(200));
601 insert into t1 select a, 'filler123456', 'filler123456' from t0;
602 insert into t1 select a+10, 'filler123456', 'filler123456' from t0;
603 
604 create table t2 as select * from t1;
605 insert into t1 select a+20, 'filler123456', 'filler123456' from t0;
606 
607 insert into t1 values (2, 'duplicate ok', 'duplicate ok');
608 insert into t1 values (18, 'duplicate ok', 'duplicate ok');
609 
610 insert into t2 values (3, 'duplicate ok', 'duplicate ok');
611 insert into t2 values (19, 'duplicate ok', 'duplicate ok');
612 
613 explain select
614  a, mid(filler1, 1,10), length(filler1)=length(filler2) as Z
615 from t1 ot where a in (select a from t2 it);
616 --sorted_result
617 select
618  a, mid(filler1, 1,10), length(filler1)=length(filler2) as Z
619 from t1 ot where a in (select a from t2 it);
620 
621 explain select
622  a, mid(filler1, 1,10), length(filler1)=length(filler2)
623 from t2 ot where a in (select a from t1 it);
624 --sorted_result
625 select
626  a, mid(filler1, 1,10), length(filler1)=length(filler2)
627 from t2 ot where a in (select a from t1 it);
628 
629 # Now let the buffer overfill:
630 insert into t1 select a+20, 'filler123456', 'filler123456' from t0;
631 insert into t1 select a+20, 'filler123456', 'filler123456' from t0;
632 
633 explain select
634  a, mid(filler1, 1,10), length(filler1)=length(filler2) as Z
635 from t1 ot where a in (select a from t2 it);
636 --sorted_result
637 select
638  a, mid(filler1, 1,10), length(filler1)=length(filler2) as Z
639 from t1 ot where a in (select a from t2 it);
640 
641 explain select
642  a, mid(filler1, 1,10), length(filler1)=length(filler2)
643 from t2 ot where a in (select a from t1 it);
644 --sorted_result
645 select
646  a, mid(filler1, 1,10), length(filler1)=length(filler2)
647 from t2 ot where a in (select a from t1 it);
648 
649 set @@join_buffer_size = @save_join_buffer_size;
650 drop table t1, t2;
651 
652 # Check ref access to tables inside the OJ nest inside the SJ nest
653 create table t1 (a int, b int, key(a));
654 create table t2 (a int, b int, key(a));
655 create table t3 (a int, b int, key(a));
656 
657 insert into t1 select a,a from t0;
658 insert into t2 select a,a from t0;
659 insert into t3 select a,a from t0;
660 
661 --echo t2 and t3 must be use 'ref', not 'ALL':
662 explain select *
663 from t0 where a in
664  (select t2.a+t3.a from t1 left join (t2 join t3) on t2.a=t1.a and t3.a=t1.a);
665 
666 drop table t0, t1,t2,t3;
667 
668 
669 --echo
670 --echo Test that neither MaterializeLookup strategy for semijoin,
671 --echo nor subquery materialization is used when BLOBs are involved
672 --echo (except when arguments of some functions).
673 --echo
674 set @prefix_len = 6;
675 
676 # BLOB == 16 (small blobs that could be stored in HEAP tables)
677 set @blob_len = 16;
678 set @suffix_len = @blob_len - @prefix_len;
679 
680 create table t1_16 (a1 blob(16), a2 blob(16));
681 create table t2_16 (b1 blob(16), b2 blob(16));
682 create table t3_16 (c1 blob(16), c2 blob(16));
683 
684 insert into t1_16 values
685  (concat('1 - 00', repeat('x', @suffix_len)), concat('2 - 00', repeat('x', @suffix_len)));
686 insert into t1_16 values
687  (concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
688 insert into t1_16 values
689  (concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
690 
691 insert into t2_16 values
692  (concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
693 insert into t2_16 values
694  (concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
695 insert into t2_16 values
696  (concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
697 
698 insert into t3_16 values
699  (concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
700 insert into t3_16 values
701  (concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
702 insert into t3_16 values
703  (concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
704 insert into t3_16 values
705  (concat('1 - 04', repeat('x', @suffix_len)), concat('2 - 04', repeat('x', @suffix_len)));
706 
707 # single value transformer
708 explain extended select left(a1,7), left(a2,7)
709 from t1_16
710 where a1 in (select b1 from t2_16 where b1 > '0');
711 
712 select left(a1,7), left(a2,7)
713 from t1_16
714 where a1 in (select b1 from t2_16 where b1 > '0');
715 
716 # row value transformer
717 explain extended select left(a1,7), left(a2,7)
718 from t1_16
719 where (a1,a2) in (select b1, b2 from t2_16 where b1 > '0');
720 
721 select left(a1,7), left(a2,7)
722 from t1_16
723 where (a1,a2) in (select b1, b2 from t2_16 where b1 > '0');
724 
725 # string function with a blob argument, the return type may be != blob
726 explain extended select left(a1,7), left(a2,7)
727 from t1_16
728 where a1 in (select substring(b1,1,16) from t2_16 where b1 > '0');
729 
730 select left(a1,7), left(a2,7)
731 from t1_16
732 where a1 in (select substring(b1,1,16) from t2_16 where b1 > '0');
733 
734 # group_concat with a blob argument - depends on
735 # the variable group_concat_max_len, and
736 # convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB
737 explain extended select left(a1,7), left(a2,7)
738 from t1_16
739 where a1 in (select group_concat(b1) from t2_16 group by b2);
740 
741 select left(a1,7), left(a2,7)
742 from t1_16
743 where a1 in (select group_concat(b1) from t2_16 group by b2);
744 
745 set @@group_concat_max_len = 256; # anything < (CONVERT_IF_BIGGER_TO_BLOB = 512)
746 
747 explain extended select left(a1,7), left(a2,7)
748 from t1_16
749 where a1 in (select group_concat(b1) from t2_16 group by b2);
750 
751 select left(a1,7), left(a2,7)
752 from t1_16
753 where a1 in (select group_concat(b1) from t2_16 group by b2);
754 
755 # BLOB column at the second (intermediate) level of nesting
756 create table t1 (a1 char(8), a2 char(8));
757 create table t2 (b1 char(8), b2 char(8));
758 create table t3 (c1 char(8), c2 char(8));
759 insert into t1 values ('1 - 00', '2 - 00');
760 insert into t1 values ('1 - 01', '2 - 01');
761 insert into t1 values ('1 - 02', '2 - 02');
762 insert into t2 values ('1 - 01', '2 - 01');
763 insert into t2 values ('1 - 01', '2 - 01');
764 insert into t2 values ('1 - 02', '2 - 02');
765 insert into t2 values ('1 - 02', '2 - 02');
766 insert into t2 values ('1 - 03', '2 - 03');
767 insert into t3 values ('1 - 01', '2 - 01');
768 insert into t3 values ('1 - 02', '2 - 02');
769 insert into t3 values ('1 - 03', '2 - 03');
770 insert into t3 values ('1 - 04', '2 - 04');
771 
772 explain extended
773 select * from t1
774 where concat(a1,'x') IN
775  (select left(a1,8) from t1_16
776  where (a1, a2) IN
777  (select t2_16.b1, t2_16.b2 from t2_16, t2
778  where t2.b2 = substring(t2_16.b2,1,6) and
779  t2.b1 IN (select c1 from t3 where c2 > '0')));
780 
781 
782 drop table t1_16, t2_16, t3_16, t1, t2, t3;
783 
784 
785 # BLOB == 512 (CONVERT_IF_BIGGER_TO_BLOB == 512)
786 set @blob_len = 512;
787 set @suffix_len = @blob_len - @prefix_len;
788 
789 create table t1_512 (a1 blob(512), a2 blob(512));
790 create table t2_512 (b1 blob(512), b2 blob(512));
791 create table t3_512 (c1 blob(512), c2 blob(512));
792 
793 insert into t1_512 values
794  (concat('1 - 00', repeat('x', @suffix_len)), concat('2 - 00', repeat('x', @suffix_len)));
795 insert into t1_512 values
796  (concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
797 insert into t1_512 values
798  (concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
799 
800 insert into t2_512 values
801  (concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
802 insert into t2_512 values
803  (concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
804 insert into t2_512 values
805  (concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
806 
807 insert into t3_512 values
808  (concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
809 insert into t3_512 values
810  (concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
811 insert into t3_512 values
812  (concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
813 insert into t3_512 values
814  (concat('1 - 04', repeat('x', @suffix_len)), concat('2 - 04', repeat('x', @suffix_len)));
815 
816 # single value transformer
817 explain extended select left(a1,7), left(a2,7)
818 from t1_512
819 where a1 in (select b1 from t2_512 where b1 > '0');
820 
821 select left(a1,7), left(a2,7)
822 from t1_512
823 where a1 in (select b1 from t2_512 where b1 > '0');
824 
825 # row value transformer
826 explain extended select left(a1,7), left(a2,7)
827 from t1_512
828 where (a1,a2) in (select b1, b2 from t2_512 where b1 > '0');
829 
830 select left(a1,7), left(a2,7)
831 from t1_512
832 where (a1,a2) in (select b1, b2 from t2_512 where b1 > '0');
833 
834 # string function with a blob argument, the return type may be != blob
835 explain extended select left(a1,7), left(a2,7)
836 from t1_512
837 where a1 in (select substring(b1,1,512) from t2_512 where b1 > '0');
838 
839 select left(a1,7), left(a2,7)
840 from t1_512
841 where a1 in (select substring(b1,1,512) from t2_512 where b1 > '0');
842 
843 # group_concat with a blob argument - depends on
844 # the variable group_concat_max_len, and
845 # convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB
846 explain extended select left(a1,7), left(a2,7)
847 from t1_512
848 where a1 in (select group_concat(b1) from t2_512 group by b2);
849 
850 select left(a1,7), left(a2,7)
851 from t1_512
852 where a1 in (select group_concat(b1) from t2_512 group by b2);
853 
854 set @@group_concat_max_len = 256; # anything < (CONVERT_IF_BIGGER_TO_BLOB = 512)
855 
856 explain extended select left(a1,7), left(a2,7)
857 from t1_512
858 where a1 in (select group_concat(b1) from t2_512 group by b2);
859 
860 select left(a1,7), left(a2,7)
861 from t1_512
862 where a1 in (select group_concat(b1) from t2_512 group by b2);
863 
864 drop table t1_512, t2_512, t3_512;
865 
866 
867 # BLOB == 513 (CONVERT_IF_BIGGER_TO_BLOB < 513)
868 set @blob_len = 513;
869 set @suffix_len = @blob_len - @prefix_len;
870 
871 create table t1_513 (a1 blob(513), a2 blob(513));
872 create table t2_513 (b1 blob(513), b2 blob(513));
873 create table t3_513 (c1 blob(513), c2 blob(513));
874 
875 insert into t1_513 values
876  (concat('1 - 00', repeat('x', @suffix_len)), concat('2 - 00', repeat('x', @suffix_len)));
877 insert into t1_513 values
878  (concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
879 insert into t1_513 values
880  (concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
881 
882 insert into t2_513 values
883  (concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
884 insert into t2_513 values
885  (concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
886 insert into t2_513 values
887  (concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
888 
889 insert into t3_513 values
890  (concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
891 insert into t3_513 values
892  (concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
893 insert into t3_513 values
894  (concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
895 insert into t3_513 values
896  (concat('1 - 04', repeat('x', @suffix_len)), concat('2 - 04', repeat('x', @suffix_len)));
897 
898 # single value transformer
899 explain extended select left(a1,7), left(a2,7)
900 from t1_513
901 where a1 in (select b1 from t2_513 where b1 > '0');
902 
903 select left(a1,7), left(a2,7)
904 from t1_513
905 where a1 in (select b1 from t2_513 where b1 > '0');
906 
907 # row value transformer
908 explain extended select left(a1,7), left(a2,7)
909 from t1_513
910 where (a1,a2) in (select b1, b2 from t2_513 where b1 > '0');
911 
912 select left(a1,7), left(a2,7)
913 from t1_513
914 where (a1,a2) in (select b1, b2 from t2_513 where b1 > '0');
915 
916 # string function with a blob argument, the return type may be != blob
917 explain extended select left(a1,7), left(a2,7)
918 from t1_513
919 where a1 in (select substring(b1,1,513) from t2_513 where b1 > '0');
920 
921 select left(a1,7), left(a2,7)
922 from t1_513
923 where a1 in (select substring(b1,1,513) from t2_513 where b1 > '0');
924 
925 # group_concat with a blob argument - depends on
926 # the variable group_concat_max_len, and
927 # convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB
928 explain extended select left(a1,7), left(a2,7)
929 from t1_513
930 where a1 in (select group_concat(b1) from t2_513 group by b2);
931 
932 select left(a1,7), left(a2,7)
933 from t1_513
934 where a1 in (select group_concat(b1) from t2_513 group by b2);
935 
936 drop table t1_513, t2_513, t3_513;
937 
938 
939 # BLOB == 1024 (group_concat_max_len == 1024)
940 set @blob_len = 1024;
941 set @suffix_len = @blob_len - @prefix_len;
942 
943 create table t1_1024 (a1 blob(1024), a2 blob(1024));
944 create table t2_1024 (b1 blob(1024), b2 blob(1024));
945 create table t3_1024 (c1 blob(1024), c2 blob(1024));
946 
947 insert into t1_1024 values
948  (concat('1 - 00', repeat('x', @suffix_len)), concat('2 - 00', repeat('x', @suffix_len)));
949 insert into t1_1024 values
950  (concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
951 insert into t1_1024 values
952  (concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
953 
954 insert into t2_1024 values
955  (concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
956 insert into t2_1024 values
957  (concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
958 insert into t2_1024 values
959  (concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
960 
961 insert into t3_1024 values
962  (concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
963 insert into t3_1024 values
964  (concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
965 insert into t3_1024 values
966  (concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
967 insert into t3_1024 values
968  (concat('1 - 04', repeat('x', @suffix_len)), concat('2 - 04', repeat('x', @suffix_len)));
969 
970 # single value transformer
971 explain extended select left(a1,7), left(a2,7)
972 from t1_1024
973 where a1 in (select b1 from t2_1024 where b1 > '0');
974 
975 select left(a1,7), left(a2,7)
976 from t1_1024
977 where a1 in (select b1 from t2_1024 where b1 > '0');
978 
979 # row value transformer
980 explain extended select left(a1,7), left(a2,7)
981 from t1_1024
982 where (a1,a2) in (select b1, b2 from t2_1024 where b1 > '0');
983 
984 select left(a1,7), left(a2,7)
985 from t1_1024
986 where (a1,a2) in (select b1, b2 from t2_1024 where b1 > '0');
987 
988 # string function with a blob argument, the return type may be != blob
989 explain extended select left(a1,7), left(a2,7)
990 from t1_1024
991 where a1 in (select substring(b1,1,1024) from t2_1024 where b1 > '0');
992 
993 select left(a1,7), left(a2,7)
994 from t1_1024
995 where a1 in (select substring(b1,1,1024) from t2_1024 where b1 > '0');
996 
997 # group_concat with a blob argument - depends on
998 # the variable group_concat_max_len, and
999 # convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB
1000 explain extended select left(a1,7), left(a2,7)
1001 from t1_1024
1002 where a1 in (select group_concat(b1) from t2_1024 group by b2);
1003 
1004 select left(a1,7), left(a2,7)
1005 from t1_1024
1006 where a1 in (select group_concat(b1) from t2_1024 group by b2);
1007 
1008 set @@group_concat_max_len = 256; # anything < (CONVERT_IF_BIGGER_TO_BLOB = 1024)
1009 
1010 explain extended select left(a1,7), left(a2,7)
1011 from t1_1024
1012 where a1 in (select group_concat(b1) from t2_1024 group by b2);
1013 
1014 select left(a1,7), left(a2,7)
1015 from t1_1024
1016 where a1 in (select group_concat(b1) from t2_1024 group by b2);
1017 
1018 drop table t1_1024, t2_1024, t3_1024;
1019 
1020 
1021 # BLOB == 1025
1022 set @blob_len = 1025;
1023 set @suffix_len = @blob_len - @prefix_len;
1024 
1025 create table t1_1025 (a1 blob(1025), a2 blob(1025));
1026 create table t2_1025 (b1 blob(1025), b2 blob(1025));
1027 create table t3_1025 (c1 blob(1025), c2 blob(1025));
1028 
1029 insert into t1_1025 values
1030  (concat('1 - 00', repeat('x', @suffix_len)), concat('2 - 00', repeat('x', @suffix_len)));
1031 insert into t1_1025 values
1032  (concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
1033 insert into t1_1025 values
1034  (concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
1035 
1036 insert into t2_1025 values
1037  (concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
1038 insert into t2_1025 values
1039  (concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
1040 insert into t2_1025 values
1041  (concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
1042 
1043 insert into t3_1025 values
1044  (concat('1 - 01', repeat('x', @suffix_len)), concat('2 - 01', repeat('x', @suffix_len)));
1045 insert into t3_1025 values
1046  (concat('1 - 02', repeat('x', @suffix_len)), concat('2 - 02', repeat('x', @suffix_len)));
1047 insert into t3_1025 values
1048  (concat('1 - 03', repeat('x', @suffix_len)), concat('2 - 03', repeat('x', @suffix_len)));
1049 insert into t3_1025 values
1050  (concat('1 - 04', repeat('x', @suffix_len)), concat('2 - 04', repeat('x', @suffix_len)));
1051 
1052 # single value transformer
1053 explain extended select left(a1,7), left(a2,7)
1054 from t1_1025
1055 where a1 in (select b1 from t2_1025 where b1 > '0');
1056 
1057 select left(a1,7), left(a2,7)
1058 from t1_1025
1059 where a1 in (select b1 from t2_1025 where b1 > '0');
1060 
1061 # row value transformer
1062 explain extended select left(a1,7), left(a2,7)
1063 from t1_1025
1064 where (a1,a2) in (select b1, b2 from t2_1025 where b1 > '0');
1065 
1066 select left(a1,7), left(a2,7)
1067 from t1_1025
1068 where (a1,a2) in (select b1, b2 from t2_1025 where b1 > '0');
1069 
1070 # string function with a blob argument, the return type may be != blob
1071 explain extended select left(a1,7), left(a2,7)
1072 from t1_1025
1073 where a1 in (select substring(b1,1,1025) from t2_1025 where b1 > '0');
1074 
1075 select left(a1,7), left(a2,7)
1076 from t1_1025
1077 where a1 in (select substring(b1,1,1025) from t2_1025 where b1 > '0');
1078 
1079 # group_concat with a blob argument - depends on
1080 # the variable group_concat_max_len, and
1081 # convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB
1082 explain extended select left(a1,7), left(a2,7)
1083 from t1_1025
1084 where a1 in (select group_concat(b1) from t2_1025 group by b2);
1085 
1086 select left(a1,7), left(a2,7)
1087 from t1_1025
1088 where a1 in (select group_concat(b1) from t2_1025 group by b2);
1089 
1090 set @@group_concat_max_len = 256; # anything < (CONVERT_IF_BIGGER_TO_BLOB = 1025)
1091 
1092 explain extended select left(a1,7), left(a2,7)
1093 from t1_1025
1094 where a1 in (select group_concat(b1) from t2_1025 group by b2);
1095 
1096 select left(a1,7), left(a2,7)
1097 from t1_1025
1098 where a1 in (select group_concat(b1) from t2_1025 group by b2);
1099 
1100 drop table t1_1025, t2_1025, t3_1025;
1101 
1102 --echo #
1103 --echo # WL#5561: Enable semi join transformation with outer join.
1104 --echo #
1105 
1106 CREATE TABLE ot1(a INT);
1107 CREATE TABLE ot2(a INT);
1108 CREATE TABLE ot3(a INT);
1109 CREATE TABLE it1(a INT);
1110 CREATE TABLE it2(a INT);
1111 CREATE TABLE it3(a INT);
1112 
1113 INSERT INTO ot1 VALUES(0),(1),(2),(3),(4),(5),(6),(7);
1114 INSERT INTO ot2 VALUES(0),(2),(4),(6);
1115 INSERT INTO ot3 VALUES(0),(3),(6);
1116 INSERT INTO it1 VALUES(0),(1),(2),(3),(4),(5),(6),(7);
1117 INSERT INTO it2 VALUES(0),(2),(4),(6);
1118 INSERT INTO it3 VALUES(0),(3),(6);
1119 
1120 --echo # Test cases, Subquery Pattern 1
1121 
1122 --echo # Example SQ1.1:
1123 
1124 let $query=
1125 SELECT *
1126 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a
1127 WHERE ot1.a IN (SELECT a FROM it3);
1128 eval explain $query;
1129 --sorted_result
1130 eval $query;
1131 
1132 --echo # Example SQ1.2:
1133 
1134 let $query=
1135 SELECT *
1136 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a
1137 WHERE COALESCE(ot2.a,0) IN (SELECT a FROM it3);
1138 eval explain $query;
1139 --sorted_result
1140 eval $query;
1141 
1142 --echo # Example SQ1.3:
1143 
1144 let $query=
1145 SELECT *
1146 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a
1147 WHERE (ot1.a,ot2.a) IN (SELECT a, a FROM it3);
1148 eval explain $query;
1149 --sorted_result
1150 eval $query;
1151 
1152 --echo # More test cases
1153 
1154 --sorted_result
1155 SELECT *
1156 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a+0
1157 WHERE ot1.a IN (SELECT a FROM it3);
1158 
1159 --sorted_result
1160 SELECT *
1161 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a+0
1162 WHERE ot1.a IN (SELECT a+0 FROM it3);
1163 
1164 --sorted_result
1165 SELECT *
1166 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a+0
1167 WHERE COALESCE(ot2.a,0) IN (SELECT a FROM it3);
1168 
1169 --sorted_result
1170 SELECT *
1171 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a
1172 WHERE COALESCE(ot2.a,0) IN (SELECT a+0 FROM it3);
1173 
1174 --sorted_result
1175 SELECT *
1176 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a+0
1177 WHERE (ot1.a,ot2.a) IN (SELECT a, a FROM it3);
1178 
1179 --sorted_result
1180 SELECT *
1181 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a
1182  LEFT JOIN ot3 ON ot1.a=ot3.a
1183 WHERE ot1.a IN (SELECT a FROM it3);
1184 
1185 --sorted_result
1186 SELECT *
1187 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a
1188  LEFT JOIN ot3 ON ot1.a=ot3.a
1189 WHERE COALESCE(ot2.a,0) IN (SELECT a FROM it3);
1190 
1191 --sorted_result
1192 SELECT *
1193 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a
1194  LEFT JOIN ot3 ON ot1.a=ot3.a
1195 WHERE COALESCE(ot3.a,0) IN (SELECT a FROM it3);
1196 
1197 --sorted_result
1198 SELECT *
1199 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a
1200  LEFT JOIN ot3 ON ot2.a=ot3.a
1201 WHERE ot1.a IN (SELECT a FROM it3);
1202 
1203 --sorted_result
1204 SELECT *
1205 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a
1206  LEFT JOIN ot3 ON ot2.a=ot3.a
1207 WHERE COALESCE(ot2.a,0) IN (SELECT a FROM it3);
1208 
1209 --sorted_result
1210 SELECT *
1211 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a
1212  LEFT JOIN ot3 ON ot2.a=ot3.a
1213 WHERE COALESCE(ot3.a,0) IN (SELECT a FROM it3);
1214 
1215 --echo # Test cases, Subquery Pattern 2
1216 
1217 --echo # Example SQ2.1:
1218 
1219 let $query=
1220 SELECT *
1221 FROM ot1 JOIN ot2 ON ot1.a=ot2.a AND ot1.a IN (SELECT a FROM it3);
1222 eval explain $query;
1223 --sorted_result
1224 eval $query;
1225 
1226 --echo # Example SQ2.2:
1227 
1228 let $query=
1229 SELECT *
1230 FROM ot1 JOIN ot2 ON ot1.a=ot2.a AND ot1.a IN (SELECT a FROM it2)
1231  AND ot2.a IN (SELECT a FROM it3);
1232 eval explain $query;
1233 --sorted_result
1234 eval $query;
1235 
1236 --echo # More test cases
1237 
1238 --sorted_result
1239 SELECT *
1240 FROM ot1 JOIN ot2 ON ot1.a=ot2.a+0 AND ot1.a IN (SELECT a FROM it3);
1241 
1242 --sorted_result
1243 SELECT *
1244 FROM ot1 JOIN ot2 ON ot1.a=ot2.a AND ot1.a IN (SELECT a+0 FROM it3);
1245 
1246 --sorted_result
1247 SELECT *
1248 FROM ot1 JOIN ot2 ON ot1.a=ot2.a+0 AND ot2.a IN (SELECT a FROM it3);
1249 
1250 --sorted_result
1251 SELECT *
1252 FROM ot1 JOIN ot2 ON ot1.a=ot2.a AND ot2.a IN (SELECT a+0 FROM it3);
1253 
1254 --sorted_result
1255 SELECT *
1256 FROM ot1 JOIN ot2 ON ot1.a=ot2.a AND ot1.a IN (SELECT a+0 FROM it2)
1257  AND ot2.a IN (SELECT a+0 FROM it3);
1258 
1259 --sorted_result
1260 SELECT *
1261 FROM ot1 JOIN ot2 ON ot1.a=ot2.a AND ot1.a IN (SELECT a FROM it3)
1262  JOIN ot3 ON ot2.a=ot3.a AND ot3.a IN (SELECT a FROM it3);
1263 
1264 --echo # Test cases, Subquery Pattern 3
1265 
1266 --echo # Example SQ3.1:
1267 
1268 let $query=
1269 SELECT *
1270 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a AND ot1.a IN (SELECT a FROM it3);
1271 eval explain $query;
1272 --sorted_result
1273 eval $query;
1274 
1275 --echo # Example SQ3.2:
1276 
1277 let $query=
1278 SELECT *
1279 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a AND ot2.a IN (SELECT a FROM it2);
1280 eval explain $query;
1281 --sorted_result
1282 eval $query;
1283 
1284 --echo # Example SQ3.3
1285 
1286 let $query=
1287 SELECT *
1288 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a AND ot1.a IN (SELECT a FROM it1)
1289  AND ot2.a IN (SELECT a FROM it2);
1290 eval explain $query;
1291 --sorted_result
1292 eval $query;
1293 
1294 --echo # Example SQ3.4
1295 
1296 let $query=
1297 SELECT *
1298 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a AND
1299  (ot1.a, ot2.a) IN (SELECT it1.a, it2.a
1300  FROM it1 JOIN it2 ON it1.a=it2.a);
1301 eval explain $query;
1302 --sorted_result
1303 eval $query;
1304 
1305 --echo # More test cases
1306 
1307 --sorted_result
1308 SELECT *
1309 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a+0 AND ot1.a IN (SELECT a FROM it3);
1310 
1311 --sorted_result
1312 SELECT *
1313 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a AND ot1.a IN (SELECT a+0 FROM it3);
1314 
1315 --sorted_result
1316 SELECT *
1317 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a+0 AND ot2.a IN (SELECT a FROM it2);
1318 
1319 --sorted_result
1320 SELECT *
1321 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a AND ot2.a IN (SELECT a+0 FROM it2);
1322 
1323 --sorted_result
1324 SELECT *
1325 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a+0 AND ot1.a IN (SELECT a+0 FROM it1)
1326  AND ot2.a IN (SELECT a+0 FROM it2);
1327 
1328 --sorted_result
1329 SELECT *
1330 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a+0 AND
1331  (ot1.a, ot2.a) IN (SELECT it1.a+0, it2.a+0
1332  FROM it1 JOIN it2 ON it1.a=it2.a);
1333 
1334 --sorted_result
1335 SELECT *
1336 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a AND ot1.a IN (SELECT a FROM it3)
1337  LEFT JOIN ot3 ON ot2.a=ot3.a AND ot3.a IN (SELECT a FROM it3);
1338 
1339 --sorted_result
1340 SELECT *
1341 FROM ot1 LEFT JOIN ot2 ON ot1.a=ot2.a+0 AND ot1.a IN (SELECT a FROM it3)
1342  LEFT JOIN ot3 ON ot2.a=ot3.a+0 AND ot3.a IN (SELECT a FROM it3);
1343 
1344 --echo # Test cases, Subquery Pattern 4
1345 
1346 --echo # Example SQ4.1:
1347 
1348 let $query=
1349 SELECT *
1350 FROM ot1
1351  LEFT JOIN
1352  (ot2 JOIN ot3 ON ot2.a=ot3.a)
1353  ON ot1.a=ot2.a AND ot1.a IN (SELECT a FROM it1);
1354 eval explain $query;
1355 --sorted_result
1356 eval $query;
1357 
1358 --echo # Example SQ4.2:
1359 
1360 let $query=
1361 SELECT *
1362 FROM ot1
1363  JOIN
1364  (ot2 JOIN ot3 ON ot2.a=ot3.a)
1365  ON ot1.a=ot2.a AND ot1.a IN (SELECT a FROM it1);
1366 eval explain $query;
1367 --sorted_result
1368 eval $query;
1369 
1370 --echo # Example SQ4.3:
1371 
1372 let $query=
1373 SELECT *
1374 FROM ot1
1375  JOIN
1376  (ot2 LEFT JOIN ot3 ON ot2.a=ot3.a)
1377  ON ot1.a=ot2.a AND ot1.a IN (SELECT a FROM it1);
1378 eval explain $query;
1379 --sorted_result
1380 eval $query;
1381 
1382 --echo # Example SQ4.4:
1383 
1384 let $query=
1385 SELECT *
1386 FROM ot1
1387  LEFT JOIN
1388  (ot2 LEFT JOIN ot3 ON ot2.a=ot3.a)
1389  ON ot1.a=ot2.a AND ot1.a IN (SELECT a FROM it1);
1390 eval explain $query;
1391 --sorted_result
1392 eval $query;
1393 
1394 --echo # More test cases
1395 
1396 --sorted_result
1397 SELECT *
1398 FROM ot1
1399  LEFT JOIN
1400  (ot2 JOIN ot3 ON ot2.a=ot3.a+0)
1401  ON ot1.a=ot2.a AND ot1.a IN (SELECT a FROM it1);
1402 
1403 --sorted_result
1404 SELECT *
1405 FROM ot1
1406  LEFT JOIN
1407  (ot2 JOIN ot3 ON ot2.a=ot3.a)
1408  ON ot1.a=ot2.a+0 AND ot1.a IN (SELECT a FROM it1);
1409 
1410 --sorted_result
1411 SELECT *
1412 FROM ot1
1413  LEFT JOIN
1414  (ot2 JOIN ot3 ON ot2.a=ot3.a)
1415  ON ot1.a=ot2.a AND ot1.a IN (SELECT a+0 FROM it1);
1416 
1417 --sorted_result
1418 SELECT *
1419 FROM ot1
1420  JOIN
1421  (ot2 JOIN ot3 ON ot2.a=ot3.a+0)
1422  ON ot1.a=ot2.a AND ot1.a IN (SELECT a FROM it1);
1423 
1424 --sorted_result
1425 SELECT *
1426 FROM ot1
1427  JOIN
1428  (ot2 JOIN ot3 ON ot2.a=ot3.a)
1429  ON ot1.a=ot2.a+0 AND ot1.a IN (SELECT a FROM it1);
1430 
1431 --sorted_result
1432 SELECT *
1433 FROM ot1
1434  JOIN
1435  (ot2 JOIN ot3 ON ot2.a=ot3.a)
1436  ON ot1.a=ot2.a AND ot1.a IN (SELECT a+0 FROM it1);
1437 
1438 --sorted_result
1439 SELECT *
1440 FROM ot1
1441  JOIN
1442  (ot2 LEFT JOIN ot3 ON ot2.a=ot3.a+0)
1443  ON ot1.a=ot2.a AND ot1.a IN (SELECT a FROM it1);
1444 
1445 --sorted_result
1446 SELECT *
1447 FROM ot1
1448  JOIN
1449  (ot2 LEFT JOIN ot3 ON ot2.a=ot3.a)
1450  ON ot1.a=ot2.a+0 AND ot1.a IN (SELECT a FROM it1);
1451 
1452 --sorted_result
1453 SELECT *
1454 FROM ot1
1455  JOIN
1456  (ot2 LEFT JOIN ot3 ON ot2.a=ot3.a)
1457  ON ot1.a=ot2.a AND ot1.a IN (SELECT a+0 FROM it1);
1458 
1459 --sorted_result
1460 SELECT *
1461 FROM ot1
1462  LEFT JOIN
1463  (ot2 LEFT JOIN ot3 ON ot2.a=ot3.a+0)
1464  ON ot1.a=ot2.a AND ot1.a IN (SELECT a FROM it1);
1465 
1466 --sorted_result
1467 SELECT *
1468 FROM ot1
1469  LEFT JOIN
1470  (ot2 LEFT JOIN ot3 ON ot2.a=ot3.a)
1471  ON ot1.a=ot2.a+0 AND ot1.a IN (SELECT a FROM it1);
1472 
1473 --sorted_result
1474 SELECT *
1475 FROM ot1
1476  LEFT JOIN
1477  (ot2 LEFT JOIN ot3 ON ot2.a=ot3.a)
1478  ON ot1.a=ot2.a AND ot1.a IN (SELECT a+0 FROM it1);
1479 
1480 --sorted_result
1481 SELECT *
1482 FROM ot1
1483  LEFT JOIN
1484  (ot2 LEFT JOIN ot3 ON ot2.a=ot3.a)
1485  ON ot1.a=ot2.a AND ot1.a IN (SELECT a FROM it1)
1486  LEFT JOIN
1487  ot1 AS ot4
1488  ON ot2.a=ot4.a;
1489 
1490 --sorted_result
1491 SELECT *
1492 FROM ot1
1493  LEFT JOIN
1494  (ot2 LEFT JOIN ot3 ON ot2.a=ot3.a
1495  LEFT JOIN ot1 AS ot4 ON ot3.a=ot4.a)
1496  ON ot1.a=ot2.a AND ot1.a IN (SELECT a FROM it1);
1497 
1498 DROP TABLE ot1,ot2,ot3,it1,it2,it3;
1499 
1500 CREATE TABLE t (
1501  a INTEGER DEFAULT NULL
1502 ) ENGINE=InnoDB;
1503 INSERT INTO t VALUES (1);
1504 
1505 CREATE TABLE t2 (
1506  a INTEGER DEFAULT NULL
1507 ) ENGINE=InnoDB;
1508 INSERT INTO t2 VALUES (1),(1);
1509 
1510 CREATE TABLE t4 (
1511  a INTEGER DEFAULT NULL
1512 ) ENGINE=InnoDB;
1513 INSERT INTO t4 VALUES (1),(1);
1514 
1515 CREATE TABLE v (
1516  a INTEGER DEFAULT NULL
1517 ) ENGINE=InnoDB;
1518 INSERT INTO v VALUES (1),(1);
1519 
1520 let $query=
1521 SELECT *
1522 FROM t AS t1
1523  LEFT JOIN
1524  (t2
1525  LEFT JOIN t AS t3
1526  ON t3.a IN (SELECT a FROM t AS it)
1527  JOIN t4
1528  ON t4.a=100
1529  )
1530  ON TRUE
1531 WHERE t1.a IN (SELECT * FROM v AS it2);
1532 eval explain $query;
1533 eval $query;
1534 
1535 DROP TABLE t,t2,t4,v;
1536 
1537 --echo # End of WL#5561
1538 
1539 --echo #
1540 --echo # Bug#48868: Left outer join in subquery causes segmentation fault in
1541 --echo # make_join_select.
1542 --echo #
1543 CREATE TABLE t1 (i INTEGER);
1544 INSERT INTO t1 VALUES (1);
1545 INSERT INTO t1 VALUES (2);
1546 CREATE TABLE t2 (i INTEGER);
1547 INSERT INTO t2 VALUES(1);
1548 CREATE TABLE t3 (i INTEGER);
1549 INSERT INTO t3 VALUES (1);
1550 INSERT INTO t3 VALUES (2);
1551 
1552 SELECT * FROM t1 WHERE (t1.i) IN
1553  (SELECT t2.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i);
1554 
1555 DROP TABLE t1, t2, t3;
1556 
1557 --echo
1558 --echo Bug#37899: Wrongly checked optimization prerequisite caused failed
1559 --echo assertion.
1560 --echo
1561 CREATE TABLE t1 (
1562  `pk` int(11),
1563  `varchar_nokey` varchar(5)
1564 );
1565 
1566 INSERT INTO t1 VALUES
1567 (1,'qk'),(2,'j'),(3,'aew');
1568 
1569 SELECT *
1570 FROM t1
1571 WHERE varchar_nokey IN (
1572  SELECT
1573  varchar_nokey
1574  FROM
1575  t1
1576 ) XOR pk = 30;
1577 drop table t1;
1578 
1579 --echo #
1580 --echo # BUG#41842: Semi-join materialization strategy crashes when the upper query has HAVING
1581 --echo #
1582 
1583 CREATE TABLE t1 (
1584  pk int(11) NOT NULL AUTO_INCREMENT,
1585  int_nokey int(11) NOT NULL,
1586  time_key time NOT NULL,
1587  datetime_key datetime NOT NULL,
1588  datetime_nokey datetime NOT NULL,
1589  varchar_key varchar(1) NOT NULL,
1590  varchar_nokey varchar(1) NOT NULL,
1591  PRIMARY KEY (pk),
1592  KEY time_key (time_key),
1593  KEY datetime_key (datetime_key),
1594  KEY varchar_key (varchar_key)
1595 );
1596 INSERT INTO t1 VALUES
1597 (1,0, '00:16:10','2008-09-03 14:25:40','2008-09-03 14:25:40','h','h'),
1598 (2,7, '00:00:00','2001-01-13 00:00:00','2001-01-13 00:00:00','',''),
1599 (3,0, '00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','x','x'),
1600 (4,2, '16:29:24','2000-10-16 01:39:08','2000-10-16 01:39:08','w','w'),
1601 (5,1, '09:23:32','0000-00-00 00:00:00','0000-00-00 00:00:00','p','p'),
1602 (6,3, '00:00:00','2007-12-02 00:00:00','2007-12-02 00:00:00','o','o'),
1603 (7,3, '00:00:00','2008-09-11 00:00:00','2008-09-11 00:00:00','',''),
1604 (8,0, '13:59:04','0000-00-00 00:00:00','0000-00-00 00:00:00','s','s'),
1605 (9,7, '09:01:06','0000-00-00 00:00:00','0000-00-00 00:00:00','d','d'),
1606 (10,5,'00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','n','n'),
1607 (11,0,'21:06:46','0000-00-00 00:00:00','0000-00-00 00:00:00','o','o'),
1608 (12,2,'00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','',''),
1609 (13,6,'14:45:34','2003-07-28 02:34:08','2003-07-28 02:34:08','w','w'),
1610 (14,1,'15:04:12','0000-00-00 00:00:00','0000-00-00 00:00:00','o','o'),
1611 (15,0,'00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','x','x'),
1612 (16,0,'15:55:23','2004-03-17 00:32:27','2004-03-17 00:32:27','p','p'),
1613 (17,1,'16:30:00','2004-12-27 19:20:00','2004-12-27 19:20:00','d','d'),
1614 (18,0,'00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','h','h'),
1615 (19,0,'14:13:26','2008-11-09 05:53:48','2008-11-09 05:53:48','o','o'),
1616 (20,0,'00:00:00','2009-10-11 06:58:04','2009-10-11 06:58:04','k','k');
1617 
1618 CREATE TABLE t2 (
1619  pk int(11) NOT NULL AUTO_INCREMENT,
1620  int_nokey int(11) NOT NULL,
1621  time_key time NOT NULL,
1622  datetime_key datetime NOT NULL,
1623  datetime_nokey datetime NOT NULL,
1624  varchar_key varchar(1) NOT NULL,
1625  varchar_nokey varchar(1) NOT NULL,
1626  PRIMARY KEY (pk),
1627  KEY time_key (time_key),
1628  KEY datetime_key (datetime_key),
1629  KEY varchar_key (varchar_key)
1630 );
1631 INSERT INTO t2 VALUES
1632 (10,0,'19:39:13','0000-00-00 00:00:00','0000-00-00 00:00:00','g','g'),
1633 (11,8,'03:43:53','0000-00-00 00:00:00','0000-00-00 00:00:00','b','b');
1634 SELECT OUTR.datetime_nokey AS X FROM t1 AS OUTR
1635 WHERE
1636  OUTR.varchar_nokey IN (SELECT
1637  INNR . varchar_nokey AS Y
1638  FROM t2 AS INNR
1639  WHERE
1640  INNR . datetime_key >= INNR . time_key OR
1641  INNR . pk = INNR . int_nokey
1642  )
1643  AND OUTR . varchar_nokey <= 'w'
1644 HAVING X > '2012-12-12';
1645 drop table t1, t2;
1646 
1647 --echo
1648 --echo Bug#46797 "Crash in fix_semijoin_strategies_for_picked_join_order
1649 --echo with semijoin=on"
1650 --echo
1651 CREATE TABLE t1 (
1652  varchar_key varchar(1) DEFAULT NULL,
1653  KEY varchar_key (varchar_key)
1654 );
1655 
1656 CREATE TABLE t2 (
1657  varchar_key varchar(1) DEFAULT NULL,
1658  KEY varchar_key (varchar_key)
1659 );
1660 INSERT INTO t2 VALUES
1661  (NULL),(NULL),(NULL),(NULL),('a'),('a'),('a'),('b'),('b'),('b'),('b'),('c'),
1662  ('c'),('c'),('c'),('c'),('c'),('c'),('d'),('d'),('d'),('d'),('d'),('d'),('e'),
1663  ('e'),('e'),('e'),('e'),('e'),('f'),('f'),('f'),('g'),('g'),('h'),('h'),('h'),
1664  ('h'),('i'),('j'),('j'),('j'),('k'),('k'),('l'),('l'),('m'),('m'),('m'),('m'),
1665  ('n'),('n'),('n'),('o'),('o'),('o'),('p'),('p'),('p'),('q'),('q'),('q'),('r'),
1666  ('r'),('r'),('r'),('s'),('s'),('s'),('s'),('t'),('t'),('t'),('t'),('u'),('u'),
1667  ('u'),('u'),('v'),('v'),('v'),('v'),('w'),('w'),('w'),('w'),('w'),('w'),('x'),
1668  ('x'),('x'),('y'),('y'),('y'),('y'),('z'),('z'),('z'),('z');
1669 
1670 CREATE TABLE t3 (
1671  varchar_key varchar(1) DEFAULT NULL,
1672  KEY varchar_key (varchar_key)
1673 ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
1674 INSERT INTO t3 VALUES
1675  (NULL),('c'),('d'),('e'),('f'),('h'),('j'),('k'),('k'),('m'),('m'),('m'),
1676  ('n'),('o'),('r'),('t'),('t'),('u'),('w'),('y');
1677 
1678 SELECT varchar_key FROM t3
1679 WHERE (SELECT varchar_key FROM t3
1680  WHERE (varchar_key,varchar_key)
1681  IN (SELECT t1.varchar_key, t2 .varchar_key
1682  FROM t1 RIGHT JOIN t2 ON t1.varchar_key
1683  )
1684  );
1685 
1686 DROP TABLE t1, t2, t3;
1687 
1688 
1689 --echo #
1690 --echo # Bug#46556 Returning incorrect, empty results for some IN subqueries
1691 --echo # w/semijoin=on
1692 --echo #
1693 
1694 CREATE TABLE t0 (
1695  pk INTEGER,
1696  vkey VARCHAR(1),
1697  vnokey VARCHAR(1),
1698  PRIMARY KEY (pk),
1699  KEY vkey(vkey)
1700 );
1701 
1702 INSERT INTO t0
1703 VALUES (1,'g','g'), (2,'v','v'), (3,'t','t'), (4,'u','u'), (5,'n','n');
1704 
1705 EXPLAIN EXTENDED SELECT vkey FROM t0 WHERE pk IN
1706  (SELECT t1.pk FROM t0 t1 JOIN t0 t2 ON t2.vkey = t1.vnokey);
1707 
1708 SELECT vkey FROM t0 WHERE pk IN
1709  (SELECT t1.pk FROM t0 t1 JOIN t0 t2 ON t2.vkey = t1.vnokey);
1710 
1711 DROP TABLE t0;
1712 
1713 --echo # End of bug#46556
1714 
1715 
1716 # The following test case fails when executed with subquery materialization
1717 # (Bug#54281). Hence, skip it if semijoin=off and materialization=on
1718 if (`select (locate('materialization', @@optimizer_switch) = 0) OR locate('semijoin=on', @@optimizer_switch) + locate('materialization=off', @@optimizer_switch) > 0`)
1719 {
1720 
1721 --echo
1722 --echo Bug#48834: Procedure with view + subquery + semijoin=on
1723 --echo crashes on second call.
1724 --echo
1725 
1726 CREATE TABLE t1 ( t1field integer, primary key (t1field));
1727 CREATE TABLE t2 ( t2field integer, primary key (t2field));
1728 
1729 CREATE VIEW v1 AS
1730  SELECT t1field as v1field
1731  FROM t1 A
1732  WHERE A.t1field IN (SELECT t1field FROM t2 );
1733 
1734 CREATE VIEW v2 AS
1735  SELECT t2field as v2field
1736  FROM t2 A
1737  WHERE A.t2field IN (SELECT t2field FROM t2 );
1738 
1739 DELIMITER |;
1740 CREATE PROCEDURE p1 ()
1741  BEGIN
1742  SELECT v1field
1743  FROM v1
1744  WHERE v1field IN ( SELECT v2field as vf_inner FROM v2 );
1745  END|
1746 DELIMITER ;|
1747 
1748 INSERT INTO t1 VALUES (1),(2),(3);
1749 INSERT INTO t2 VALUES (2),(3),(4);
1750 
1751 CALL p1;
1752 CALL p1;
1753 
1754 DROP TABLE t1,t2;
1755 DROP VIEW v1,v2;
1756 DROP PROCEDURE p1;
1757 
1758 --echo # End of BUG#48834
1759 }
1760 
1761 
1762 --echo #
1763 --echo # Bug#46692 "Crash occurring on queries with nested FROM subqueries
1764 --echo # using materialization."
1765 --echo #
1766 CREATE TABLE t1 (
1767  pk INTEGER PRIMARY KEY,
1768  int_key INTEGER,
1769  KEY int_key(int_key)
1770 );
1771 INSERT INTO t1 VALUES (10,186),(11,NULL),(12,2),(13,3),(14,0),(15,133),(16,1);
1772 
1773 CREATE TABLE t2 (
1774  pk INTEGER PRIMARY KEY,
1775  int_key INTEGER,
1776  KEY int_key(int_key)
1777 );
1778 INSERT INTO t2 VALUES (1,7),(2,2);
1779 
1780 SELECT * FROM t1 WHERE (140, 4) IN
1781  (SELECT t2.int_key, t2 .pk FROM t2 STRAIGHT_JOIN t1 ON t2.int_key);
1782 
1783 DROP TABLE t1, t2;
1784 
1785 --echo #
1786 --echo # Bug#42353 "SELECT ... WHERE oe IN (SELECT w/ LEFT JOIN) query
1787 --echo # causes crash."
1788 --echo #
1789 CREATE TABLE t1 (
1790  pk INTEGER PRIMARY KEY,
1791  int_nokey INTEGER,
1792  int_key INTEGER,
1793  date_key DATE,
1794  datetime_nokey DATETIME,
1795  varchar_nokey VARCHAR(1)
1796 );
1797 
1798 CREATE TABLE t2 (
1799  date_nokey DATE
1800 );
1801 
1802 CREATE TABLE t3 (
1803  pk INTEGER PRIMARY KEY,
1804  int_nokey INTEGER,
1805  date_key date,
1806  varchar_key VARCHAR(1),
1807  varchar_nokey VARCHAR(1),
1808  KEY date_key (date_key)
1809 );
1810 
1811 SELECT date_key FROM t1
1812 WHERE (int_key, int_nokey)
1813  IN (SELECT t3.int_nokey, t3.pk
1814  FROM t2 LEFT JOIN t3 ON (t2.date_nokey < t3.date_key)
1815  WHERE t3.varchar_key <= t3.varchar_nokey OR t3.int_nokey <= t3.pk
1816  )
1817  AND (varchar_nokey <> 'f' OR NOT int_key < 7);
1818 
1819 
1820 --echo #
1821 --echo # Bug#45933 "Crash in optimize_semijoin_nests on JOIN in subquery
1822 --echo # + AND in outer query".
1823 --echo #
1824 INSERT INTO t1 VALUES (10,7,5,'2009-06-16','2002-04-10 14:25:30','w'),
1825  (11,7,0,'0000-00-00','0000-00-00 00:00:00','s'),
1826  (12,4,0,'2003-07-14','2006-09-14 04:01:02','y'),
1827  (13,0,4,'2002-07-25','0000-00-00 00:00:00','c'),
1828  (14,1,8,'2007-07-03','0000-00-00 00:00:00','q'),
1829  (15,6,5,'2001-11-12','0000-00-00 00:00:00',''),
1830  (16,2,9,'0000-00-00','0000-00-00 00:00:00','j'),
1831  (29,9,1,'0000-00-00','2003-08-11 00:00:00','m');
1832 INSERT INTO t3 VALUES (1,9,'0000-00-00','b','b'),
1833  (2,2,'2002-09-17','h','h');
1834 
1835 SELECT t1.varchar_nokey FROM t1 JOIN t3 ON t1.datetime_nokey
1836 WHERE t1.varchar_nokey
1837  IN (SELECT varchar_nokey FROM t1
1838  WHERE (pk)
1839  IN (SELECT t3.int_nokey
1840  FROM t3 LEFT JOIN t1 ON t1.varchar_nokey
1841  WHERE t3.date_key BETWEEN '2008-06-07' AND '2006-06-26'
1842  )
1843  );
1844 
1845 DROP TABLE t1, t2, t3;
1846 
1847 --echo #
1848 --echo # Bug#45219 "Crash on SELECT DISTINCT query containing a
1849 --echo # LEFT JOIN in subquery"
1850 --echo #
1851 
1852 CREATE TABLE t1 (
1853  pk INTEGER NOT NULL,
1854  int_nokey INTEGER NOT NULL,
1855  datetime_key DATETIME NOT NULL,
1856  varchar_key VARCHAR(1) NOT NULL,
1857  PRIMARY KEY (pk),
1858  KEY datetime_key (datetime_key),
1859  KEY varchar_key (varchar_key)
1860 );
1861 INSERT INTO t1 VALUES
1862 (1,9,'0000-00-00 00:00:00','p'),(2,0,'2002-02-09 07:38:13','v'),
1863 (3,8,'2001-05-03 12:08:14','t'),(4,3,'0000-00-00 00:00:00','u'),
1864 (5,7,'2009-07-28 03:43:30','n'),(6,0,'2009-08-04 00:00:00','l'),
1865 (7,1,'0000-00-00 00:00:00','h'),(8,9,'0000-00-00 00:00:00','u'),
1866 (9,0,'2005-08-02 17:16:54','n'),(10,9,'2002-12-21 00:00:00','j'),
1867 (11,0,'2005-08-15 12:37:35','k'),(12,5,'0000-00-00 00:00:00','e'),
1868 (13,0,'2006-03-10 00:00:00','i'),(14,8,'2005-05-16 11:02:36','u'),
1869 (15,8,'2008-11-02 00:00:00','n'),(16,5,'2006-03-15 00:00:00','b'),
1870 (17,1,'0000-00-00 00:00:00','x'),(18,7,'0000-00-00 00:00:00',''),
1871 (19,0,'2008-12-17 20:15:40','q'),(20,9,'0000-00-00 00:00:00','u');
1872 
1873 CREATE TABLE t2 LIKE t1;
1874 INSERT INTO t2 VALUES
1875 (10,0,'2006-07-07 07:26:28','q'),(11,5,'2002-09-23 00:00:00','m'),
1876 (12,7,'0000-00-00 00:00:00','j'),(13,1,'2006-06-07 00:00:00','z'),
1877 (14,8,'2000-09-16 12:15:34','a'),(15,2,'2007-08-05 15:47:52',''),
1878 (16,1,'0000-00-00 00:00:00','e'),(17,8,'2005-12-02 19:34:26','t'),
1879 (18,5,'0000-00-00 00:00:00','q'),(19,4,'0000-00-00 00:00:00','b'),
1880 (20,5,'2007-12-28 00:00:00','w'),(21,3,'2004-08-02 11:48:43','m'),
1881 (22,0,'0000-00-00 00:00:00','x'),(23,8,'2004-04-19 12:18:43',''),
1882 (24,0,'2009-04-27 00:00:00','w'),(25,4,'2006-10-20 14:52:15','x'),
1883 (26,0,'0000-00-00 00:00:00','e'),(27,0,'2002-03-22 11:48:37','e'),
1884 (28,2,'0000-00-00 00:00:00','p'),(29,0,'2001-01-04 03:55:07','x');
1885 
1886 CREATE TABLE t3 LIKE t1;
1887 INSERT INTO t3 VALUES
1888 (10,8,'2007-08-19 08:08:38','i'),(11,0,'2000-05-21 03:51:51','');
1889 
1890 SELECT DISTINCT datetime_key FROM t1
1891 WHERE (int_nokey, pk)
1892  IN (SELECT t3.pk, t3.pk FROM t2 LEFT JOIN t3 ON t3.varchar_key)
1893  AND pk = 9;
1894 
1895 DROP TABLE t1, t2, t3;
1896 
1897 --echo #
1898 --echo # Bug#46550 Azalea returning duplicate results for some IN subqueries
1899 --echo # w/ semijoin=on
1900 --echo #
1901 
1902 --disable_warnings
1903 DROP TABLE IF EXISTS t0, t1, t2;
1904 --enable_warnings
1905 
1906 CREATE TABLE t0 (
1907  int_key int(11) DEFAULT NULL,
1908  varchar_key varchar(1) DEFAULT NULL,
1909  varchar_nokey varchar(1) DEFAULT NULL,
1910  KEY int_key (int_key),
1911  KEY varchar_key (varchar_key,int_key)
1912 );
1913 
1914 INSERT INTO t0 VALUES
1915 (1,'m','m'),
1916 (40,'h','h'),
1917 (1,'r','r'),
1918 (1,'h','h'),
1919 (9,'x','x'),
1920 (NULL,'q','q'),
1921 (NULL,'k','k'),
1922 (7,'l','l'),
1923 (182,'k','k'),
1924 (202,'a','a'),
1925 (7,'x','x'),
1926 (6,'j','j'),
1927 (119,'z','z'),
1928 (4,'d','d'),
1929 (5,'h','h'),
1930 (1,'u','u'),
1931 (3,'q','q'),
1932 (7,'a','a'),
1933 (3,'e','e'),
1934 (6,'l','l');
1935 
1936 CREATE TABLE t1 (
1937  int_key int(11) DEFAULT NULL,
1938  varchar_key varchar(1) DEFAULT NULL,
1939  varchar_nokey varchar(1) DEFAULT NULL,
1940  KEY int_key (int_key),
1941  KEY varchar_key (varchar_key,int_key)
1942 );
1943 INSERT INTO t1 VALUES (7,NULL,NULL),(4,'x','x');
1944 
1945 CREATE TABLE t2 (
1946  int_key int(11) DEFAULT NULL,
1947  varchar_key varchar(1) DEFAULT NULL,
1948  varchar_nokey varchar(1) DEFAULT NULL,
1949  KEY int_key (int_key),
1950  KEY varchar_key (varchar_key,int_key)
1951 );
1952 INSERT INTO t2 VALUES (123,NULL,NULL);
1953 
1954 SELECT int_key
1955 FROM t0
1956 WHERE varchar_nokey IN (
1957  SELECT t1 .varchar_key from t1
1958 );
1959 SELECT t0.int_key
1960 FROM t0
1961 WHERE t0.varchar_nokey IN (
1962  SELECT t1_1 .varchar_key
1963  FROM t1 AS t1_1 JOIN t1 AS t1_2 ON t1_1 .int_key
1964 );
1965 
1966 EXPLAIN
1967 SELECT t0.int_key
1968 FROM t0
1969 WHERE t0.varchar_nokey IN (
1970  SELECT t1_1 .varchar_key
1971  FROM t1 AS t1_1 JOIN t1 AS t1_2 ON t1_1 .int_key
1972 );
1973 
1974 SELECT t0.int_key
1975 FROM t0, t2
1976 WHERE t0.varchar_nokey IN (
1977  SELECT t1_1 .varchar_key
1978  FROM t1 AS t1_1 JOIN t1 AS t1_2 ON t1_1 .int_key
1979 );
1980 
1981 EXPLAIN
1982 SELECT t0.int_key
1983 FROM t0, t2
1984 WHERE t0.varchar_nokey IN (
1985  SELECT t1_1 .varchar_key
1986  FROM t1 AS t1_1 JOIN t1 AS t1_2 ON t1_1 .int_key
1987 );
1988 
1989 DROP TABLE t0, t1, t2;
1990 
1991 --echo # End of bug#46550
1992 
1993 
1994 
1995 --echo
1996 --echo Bug #48073 Subquery on char columns from view crashes Mysql
1997 --echo
1998 
1999 --disable_warnings
2000 DROP TABLE IF EXISTS t1, t2;
2001 DROP VIEW IF EXISTS v1;
2002 --enable_warnings
2003 
2004 CREATE TABLE t1 (
2005  city VARCHAR(50) NOT NULL,
2006  country_id SMALLINT UNSIGNED NOT NULL
2007 );
2008 
2009 INSERT INTO t1 VALUES
2010 ('Batna',2),
2011 ('Bchar',2),
2012 ('Skikda',2),
2013 ('Tafuna',3),
2014 ('Algeria',2) ;
2015 
2016 CREATE TABLE t2 (
2017  country_id SMALLINT UNSIGNED NOT NULL,
2018  country VARCHAR(50) NOT NULL
2019 );
2020 
2021 INSERT INTO t2 VALUES
2022 (2,'Algeria'),
2023 (3,'American Samoa') ;
2024 
2025 CREATE VIEW v1 AS
2026 SELECT country_id, country
2027 FROM t2
2028 WHERE LEFT(country,1) = "A"
2029 ;
2030 
2031 SELECT city, country_id
2032 FROM t1
2033 WHERE city IN (
2034  SELECT country
2035  FROM t2
2036  WHERE LEFT(country, 1) = "A"
2037 );
2038 
2039 SELECT city, country_id
2040 FROM t1
2041 WHERE city IN (
2042  SELECT country
2043  FROM v1
2044 );
2045 
2046 drop table t1, t2;
2047 drop view v1;
2048 
2049 --echo # End of bug#48073
2050 
2051 --echo
2052 --echo Bug#49097 subquery with view generates wrong result with
2053 --echo non-prepared statement
2054 --echo
2055 
2056 --disable_warnings
2057 DROP TABLE IF EXISTS t1, t2;
2058 DROP VIEW IF EXISTS v1;
2059 --enable_warnings
2060 
2061 CREATE TABLE t1 (
2062  city VARCHAR(50) NOT NULL,
2063  country_id SMALLINT UNSIGNED NOT NULL
2064 );
2065 
2066 INSERT INTO t1 VALUES
2067 ('Batna',2),
2068 ('Bchar',2),
2069 ('Skikda',2),
2070 ('Tafuna',3),
2071 ('Algeria',2) ;
2072 
2073 CREATE TABLE t2 (
2074  country_id SMALLINT UNSIGNED NOT NULL,
2075  country VARCHAR(50) NOT NULL
2076 );
2077 
2078 INSERT INTO t2 VALUES
2079 (2,'Algeria'),
2080 (3,'XAmerican Samoa') ;
2081 
2082 CREATE VIEW v1 AS
2083 SELECT country_id, country
2084 FROM t2
2085 WHERE LEFT(country,1) = "A"
2086 ;
2087 
2088 SELECT city, country_id
2089 FROM t1
2090 WHERE country_id IN (
2091  SELECT country_id
2092  FROM t2
2093  WHERE LEFT(country,1) = "A"
2094 );
2095 
2096 SELECT city, country_id
2097 FROM t1
2098 WHERE country_id IN (
2099  SELECT country_id
2100  FROM v1
2101 );
2102 
2103 PREPARE stmt FROM
2104 "
2105 SELECT city, country_id
2106 FROM t1
2107 WHERE country_id IN (
2108  SELECT country_id
2109  FROM v1
2110 );
2111 ";
2112 
2113 execute stmt;
2114 
2115 deallocate prepare stmt;
2116 drop table t1, t2;
2117 drop view v1;
2118 
2119 --echo # End of Bug#49097
2120 
2121 --echo #
2122 --echo # Bug#49198 Wrong result for second call of procedure
2123 --echo # with view in subselect.
2124 --echo #
2125 
2126 CREATE TABLE t1 (t1field integer, primary key (t1field));
2127 CREATE TABLE t2 (t2field integer, primary key (t2field));
2128 CREATE TABLE t3 (t3field integer, primary key (t3field));
2129 
2130 CREATE VIEW v2 AS SELECT * FROM t2;
2131 CREATE VIEW v3 AS SELECT * FROM t3;
2132 
2133 INSERT INTO t1 VALUES(1),(2);
2134 INSERT INTO t2 VALUES(1),(2);
2135 INSERT INTO t3 VALUES(1),(2);
2136 
2137 PREPARE stmt FROM
2138 "
2139 SELECT t1field
2140 FROM t1
2141 WHERE t1field IN (SELECT * FROM v2);
2142 ";
2143 
2144 EXECUTE stmt;
2145 EXECUTE stmt;
2146 
2147 PREPARE stmt FROM
2148 "
2149 EXPLAIN
2150 SELECT t1field
2151 FROM t1
2152 WHERE t1field IN (SELECT * FROM v2)
2153  AND t1field IN (SELECT * FROM v3)
2154 ";
2155 
2156 EXECUTE stmt;
2157 EXECUTE stmt;
2158 
2159 DROP TABLE t1, t2, t3;
2160 DROP VIEW v2, v3;
2161 
2162 --echo # End of Bug#49198
2163 
2164 --echo #
2165 --echo # Bug#48623 Multiple subqueries are optimized incorrectly
2166 --echo #
2167 
2168 CREATE TABLE ot(val VARCHAR(10));
2169 CREATE TABLE it1(val VARCHAR(10));
2170 CREATE TABLE it2(val VARCHAR(10));
2171 
2172 INSERT INTO ot VALUES('aaa'), ('bbb'), ('eee'), ('mmm'), ('ppp');
2173 INSERT INTO it1 VALUES('aaa'), ('aaa'), ('bbb'), ('eee'), ('mmm'), ('ppp');
2174 INSERT INTO it2 VALUES('aaa'), ('bbb'), ('eee'), ('mmm'), ('ppp');
2175 
2176 EXPLAIN
2177 SELECT *
2178 FROM ot
2179 WHERE ot.val IN (SELECT it1.val FROM it1
2180  WHERE it1.val LIKE 'a%' OR it1.val LIKE 'e%')
2181  AND ot.val IN (SELECT it2.val FROM it2
2182  WHERE it2.val LIKE 'a%' OR it2.val LIKE 'e%');
2183 
2184 SELECT *
2185 FROM ot
2186 WHERE ot.val IN (SELECT it1.val FROM it1
2187  WHERE it1.val LIKE 'a%' OR it1.val LIKE 'e%')
2188  AND ot.val IN (SELECT it2.val FROM it2
2189  WHERE it2.val LIKE 'a%' OR it2.val LIKE 'e%');
2190 
2191 DROP TABLE ot;
2192 DROP TABLE it1;
2193 DROP TABLE it2;
2194 
2195 --echo # End of Bug#48623
2196 
2197 --echo #
2198 --echo # Bug #51487 Assertion failure when semi-join flattening occurs
2199 --echo # for a subquery in HAVING
2200 --echo #
2201 
2202 CREATE TABLE t1 (a INT, b INT);
2203 INSERT INTO t1 VALUES (1,10),(2,11),(1,13);
2204 
2205 CREATE TABLE t2 AS SELECT * FROM t1;
2206 CREATE TABLE t3 AS SELECT * FROM t1;
2207 
2208 SELECT COUNT(*) FROM t1
2209 GROUP BY t1.a
2210 HAVING t1.a IN (SELECT t3.a FROM t3
2211  WHERE t3.b IN (SELECT b FROM t2 WHERE t2.a=t1.a));
2212 
2213 DROP TABLE t1, t2, t3;
2214 
2215 --echo # End of Bug#51487
2216 
2217 --echo #
2218 --echo # BUG#38075: Wrong result: rows matching a subquery with outer join not returned
2219 --echo #
2220 
2221 --disable_warnings
2222 DROP TABLE IF EXISTS ot1, it1, it2;
2223 --enable_warnings
2224 
2225 CREATE TABLE it2 (
2226  int_key int(11) NOT NULL,
2227  datetime_key datetime NOT NULL,
2228  KEY int_key (int_key),
2229  KEY datetime_key (datetime_key)
2230 );
2231 INSERT INTO it2 VALUES
2232  (5,'2002-04-10 14:25:30'), (0,'0000-00-00 00:00:00'),
2233  (0,'2006-09-14 04:01:02'), (4,'0000-00-00 00:00:00'),
2234  (8,'0000-00-00 00:00:00'), (5,'0000-00-00 00:00:00'),
2235  (9,'0000-00-00 00:00:00'), (8,'2007-04-01 11:04:17'),
2236  (1,'0000-00-00 00:00:00'), (7,'2009-01-12 00:00:00'),
2237  (0,'2009-06-05 00:00:00'), (3,'2006-02-14 18:06:35'),
2238  (5,'2006-02-21 07:08:16'), (0,'0000-00-00 00:00:00'),
2239  (7,'0000-00-00 00:00:00'), (0,'0000-00-00 00:00:00'),
2240  (0,'2007-02-13 00:00:00'), (1,'0000-00-00 00:00:00'),
2241  (0,'0000-00-00 00:00:00'), (1,'2003-08-11 00:00:00');
2242 CREATE TABLE ot1 (
2243  int_nokey int(11) NOT NULL,
2244  int_key int(11) NOT NULL,
2245  KEY int_key (int_key)
2246 );
2247 INSERT INTO ot1 VALUES
2248  (5,0), (3,0), (0,2), (3,0), (1,3), (0,0), (1,7), (7,0), (1,7), (0,7),
2249  (0,9), (8,2), (4,4), (9,3), (0,9), (2,5), (0,5), (8,0), (5,8), (1,5);
2250 CREATE TABLE it1 (
2251  int_nokey int(11) NOT NULL,
2252  int_key int(11) NOT NULL,
2253  KEY int_key (int_key)
2254 );
2255 INSERT INTO it1 VALUES
2256  (9,5), (0,4);
2257 --sorted_result
2258 SELECT int_key FROM ot1
2259 WHERE int_nokey IN (SELECT it2.int_key
2260  FROM it1 LEFT JOIN it2 ON it2.datetime_key);
2261 EXPLAIN
2262 SELECT int_key FROM ot1
2263 WHERE int_nokey IN (SELECT it2.int_key
2264  FROM it1 LEFT JOIN it2 ON it2.datetime_key);
2265 DROP TABLE ot1, it1, it2;
2266 
2267 --echo # End of BUG#38075
2268 
2269 --echo #
2270 --echo # BUG#50089: Second call of procedure with view in subselect crashes server
2271 --echo #
2272 
2273 CREATE TABLE t1(t1field INTEGER, PRIMARY KEY(t1field));
2274 
2275 CREATE VIEW v1 AS
2276  SELECT t1field AS v1field
2277  FROM t1 a
2278  WHERE a.t1field IN (SELECT t1field FROM t1);
2279 
2280 INSERT INTO t1 VALUES(1),(2);
2281 
2282 SELECT t1field
2283 FROM t1
2284 WHERE t1field IN (SELECT v1field FROM v1);
2285 
2286 EXPLAIN
2287 SELECT t1field
2288 FROM t1
2289 WHERE t1field IN (SELECT v1field FROM v1);
2290 
2291 --sorted_result
2292 SELECT t1.t1field
2293 FROM t1 LEFT JOIN t1 AS t2 ON t1.t1field IN (SELECT v1field FROM v1);
2294 
2295 EXPLAIN
2296 SELECT t1field
2297 FROM t1
2298 WHERE t1field IN (SELECT v1field FROM v1);
2299 
2300 delimiter |;
2301 CREATE PROCEDURE p1()
2302  BEGIN
2303  SELECT t1field
2304  FROM t1
2305  WHERE t1field IN (SELECT v1field FROM v1);
2306  END|
2307 delimiter ;|
2308 
2309 CALL p1;
2310 CALL p1;
2311 
2312 PREPARE stmt FROM
2313 "
2314 SELECT t1field
2315 FROM t1
2316 WHERE t1field IN (SELECT v1field FROM v1);
2317 ";
2318 
2319 EXECUTE stmt;
2320 EXECUTE stmt;
2321 
2322 DROP PROCEDURE p1;
2323 DROP VIEW v1;
2324 DROP TABLE t1;
2325 
2326 --echo # End of BUG#50089
2327 
2328 --echo #
2329 --echo # Bug#45191: Incorrectly initialized semi-join led to a wrong result.
2330 --echo #
2331 CREATE TABLE STAFF (EMPNUM CHAR(3) NOT NULL,
2332  EMPNAME CHAR(20), GRADE DECIMAL(4), CITY CHAR(15));
2333 
2334 CREATE TABLE PROJ (PNUM CHAR(3) NOT NULL,
2335  PNAME CHAR(20), PTYPE CHAR(6),
2336  BUDGET DECIMAL(9),
2337  CITY CHAR(15));
2338 
2339 CREATE TABLE WORKS (EMPNUM CHAR(3) NOT NULL,
2340  PNUM CHAR(3) NOT NULL, HOURS DECIMAL(5));
2341 INSERT INTO STAFF VALUES ('E1','Alice',12,'Deale');
2342 INSERT INTO STAFF VALUES ('E2','Betty',10,'Vienna');
2343 INSERT INTO STAFF VALUES ('E3','Carmen',13,'Vienna');
2344 INSERT INTO STAFF VALUES ('E4','Don',12,'Deale');
2345 INSERT INTO STAFF VALUES ('E5','Ed',13,'Akron');
2346 
2347 INSERT INTO PROJ VALUES ('P1','MXSS','Design',10000,'Deale');
2348 INSERT INTO PROJ VALUES ('P2','CALM','Code',30000,'Vienna');
2349 INSERT INTO PROJ VALUES ('P3','SDP','Test',30000,'Tampa');
2350 INSERT INTO PROJ VALUES ('P4','SDP','Design',20000,'Deale');
2351 INSERT INTO PROJ VALUES ('P5','IRM','Test',10000,'Vienna');
2352 INSERT INTO PROJ VALUES ('P6','PAYR','Design',50000,'Deale');
2353 
2354 INSERT INTO WORKS VALUES ('E1','P1',40);
2355 INSERT INTO WORKS VALUES ('E1','P2',20);
2356 INSERT INTO WORKS VALUES ('E1','P3',80);
2357 INSERT INTO WORKS VALUES ('E1','P4',20);
2358 INSERT INTO WORKS VALUES ('E1','P5',12);
2359 INSERT INTO WORKS VALUES ('E1','P6',12);
2360 INSERT INTO WORKS VALUES ('E2','P1',40);
2361 INSERT INTO WORKS VALUES ('E2','P2',80);
2362 INSERT INTO WORKS VALUES ('E3','P2',20);
2363 INSERT INTO WORKS VALUES ('E4','P2',20);
2364 INSERT INTO WORKS VALUES ('E4','P4',40);
2365 INSERT INTO WORKS VALUES ('E4','P5',80);
2366 
2367 explain SELECT EMPNUM, EMPNAME
2368 FROM STAFF
2369 WHERE EMPNUM IN
2370  (SELECT EMPNUM FROM WORKS
2371  WHERE PNUM IN
2372  (SELECT PNUM FROM PROJ));
2373 
2374 SELECT EMPNUM, EMPNAME
2375 FROM STAFF
2376 WHERE EMPNUM IN
2377  (SELECT EMPNUM FROM WORKS
2378  WHERE PNUM IN
2379  (SELECT PNUM FROM PROJ));
2380 
2381 drop table STAFF,WORKS,PROJ;
2382 
2383 --echo # End of bug#45191
2384 
2385 --echo #
2386 --echo # BUG#36896: Server crash on SELECT FROM DUAL
2387 --echo #
2388 create table t1 (a int);
2389 select 1 as res from dual where (1) in (select * from t1);
2390 drop table t1;
2391 
2392 --echo
2393 --echo BUG#40118 Crash when running Batched Key Access and requiring one match for each key
2394 --echo
2395 create table t0(a int);
2396 insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
2397 create table t1 (a int, key(a));
2398 insert into t1 select * from t0;
2399 alter table t1 add b int not null, add filler char(200);
2400 insert into t1 select * from t1;
2401 insert into t1 select * from t1;
2402 
2403 select * from t0 where t0.a in (select t1.a from t1 where t1.b=0);
2404 drop table t0, t1;
2405 
2406 --echo #
2407 --echo # BUG#32665 Query with dependent subquery is too slow
2408 --echo #
2409 create table t1 (
2410  idIndividual int primary key
2411 );
2412 insert into t1 values (1),(2);
2413 
2414 create table t2 (
2415  idContact int primary key,
2416  contactType int,
2417  idObj int
2418 );
2419 insert into t2 values (1,1,1),(2,2,2),(3,3,3);
2420 
2421 create table t3 (
2422  idAddress int primary key,
2423  idContact int,
2424  postalStripped varchar(100)
2425 );
2426 
2427 insert into t3 values (1,1, 'foo'), (2,2,'bar');
2428 
2429 --echo The following must be converted to a semi-join:
2430 explain extended SELECT a.idIndividual FROM t1 a
2431 WHERE a.idIndividual IN
2432  ( SELECT c.idObj FROM t3 cona
2433  INNER JOIN t2 c ON c.idContact=cona.idContact
2434  WHERE cona.postalStripped='T2H3B2'
2435  );
2436 drop table t1,t2,t3;
2437 
2438 #
2439 # Bug#11867 queries with ROW(,elems>) IN (SELECT DISTINCT <cols> FROM ...)
2440 #
2441 
2442 CREATE TABLE t1 (one int, two int, flag char(1));
2443 CREATE TABLE t2 (one int, two int, flag char(1));
2444 INSERT INTO t1 VALUES(1,2,'Y'),(2,3,'Y'),(3,4,'Y'),(5,6,'N'),(7,8,'N');
2445 INSERT INTO t2 VALUES(1,2,'Y'),(2,3,'Y'),(3,4,'Y'),(5,6,'N'),(7,8,'N');
2446 
2447 SELECT * FROM t1
2448  WHERE ROW(one,two) IN (SELECT DISTINCT one,two FROM t2 WHERE flag = 'N');
2449 SELECT * FROM t1
2450  WHERE ROW(one,two) IN (SELECT DISTINCT one,two FROM t1 WHERE flag = 'N');
2451 
2452 insert into t2 values (null,null,'N');
2453 insert into t2 values (null,3,'0');
2454 insert into t2 values (null,5,'0');
2455 insert into t2 values (10,null,'0');
2456 insert into t1 values (10,3,'0');
2457 insert into t1 values (10,5,'0');
2458 insert into t1 values (10,10,'0');
2459 SELECT one,two,ROW(one,two) IN (SELECT one,two FROM t2 WHERE flag = 'N') as 'test' from t1;
2460 SELECT one,two from t1 where ROW(one,two) IN (SELECT one,two FROM t2 WHERE flag = 'N');
2461 SELECT one,two,ROW(one,two) IN (SELECT one,two FROM t2 WHERE flag = 'N' group by one,two) as 'test' from t1;
2462 SELECT one,two,ROW(one,two) IN (SELECT one,two FROM t2 WHERE flag = '0') as 'test' from t1;
2463 SELECT one,two,ROW(one,two) IN (SELECT one,two FROM t2 WHERE flag = '0' group by one,two) as 'test' from t1;
2464 explain extended SELECT one,two,ROW(one,two) IN (SELECT one,two FROM t2 WHERE flag = '0') as 'test' from t1;
2465 explain extended SELECT one,two from t1 where ROW(one,two) IN (SELECT one,two FROM t2 WHERE flag = 'N');
2466 explain extended SELECT one,two,ROW(one,two) IN (SELECT one,two FROM t2 WHERE flag = '0' group by one,two) as 'test' from t1;
2467 DROP TABLE t1,t2;
2468 
2469 
2470 #
2471 # Bug#12392 where cond with IN predicate for rows and NULL values in table
2472 #
2473 
2474 CREATE TABLE t1 (a char(5), b char(5));
2475 INSERT INTO t1 VALUES (NULL,'aaa'), ('aaa','aaa');
2476 
2477 SELECT * FROM t1 WHERE (a,b) IN (('aaa','aaa'), ('aaa','bbb'));
2478 
2479 DROP TABLE t1;
2480 
2481 
2482 #
2483 # Bug#30788 Inconsistent retrieval of char/varchar
2484 #
2485 
2486 CREATE TABLE t1 (a CHAR(1), b VARCHAR(10));
2487 INSERT INTO t1 VALUES ('a', 'aa');
2488 INSERT INTO t1 VALUES ('a', 'aaa');
2489 SELECT a,b FROM t1 WHERE b IN (SELECT a FROM t1);
2490 CREATE INDEX I1 ON t1 (a);
2491 CREATE INDEX I2 ON t1 (b);
2492 EXPLAIN SELECT a,b FROM t1 WHERE b IN (SELECT a FROM t1);
2493 SELECT a,b FROM t1 WHERE b IN (SELECT a FROM t1);
2494 
2495 CREATE TABLE t2 (a VARCHAR(1), b VARCHAR(10));
2496 INSERT INTO t2 SELECT * FROM t1;
2497 CREATE INDEX I1 ON t2 (a);
2498 CREATE INDEX I2 ON t2 (b);
2499 EXPLAIN SELECT a,b FROM t2 WHERE b IN (SELECT a FROM t2);
2500 SELECT a,b FROM t2 WHERE b IN (SELECT a FROM t2);
2501 EXPLAIN
2502 SELECT a,b FROM t1 WHERE b IN (SELECT a FROM t1 WHERE LENGTH(a)<500);
2503 SELECT a,b FROM t1 WHERE b IN (SELECT a FROM t1 WHERE LENGTH(a)<500);
2504 
2505 DROP TABLE t1,t2;
2506 
2507 
2508 --echo #
2509 --echo # BUG#45928 "Differing query results depending on MRR and
2510 --echo # engine_condition_pushdown settings"
2511 --echo #
2512 
2513 CREATE TABLE `t1` (
2514  `pk` int(11) NOT NULL AUTO_INCREMENT,
2515  `time_nokey` time NOT NULL,
2516  `varchar_key` varchar(1) NOT NULL,
2517  `varchar_nokey` varchar(1) NOT NULL,
2518  PRIMARY KEY (`pk`),
2519  KEY `varchar_key` (`varchar_key`)
2520 ) AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;
2521 INSERT INTO `t1` VALUES (10,'00:00:00','i','i'),(11,'00:00:00','','');
2522 
2523 SELECT `time_nokey` G1 FROM t1 WHERE ( `varchar_nokey` , `varchar_key` ) IN (
2524 SELECT `varchar_nokey` , `varchar_nokey` ) AND `varchar_key` >= 'c' HAVING G1 ORDER
2525 BY `pk` ;
2526 
2527 DROP TABLE t1;
2528 
2529 --echo #
2530 --echo # BUG#45863 "Assertion failed: (fixed == 0), function fix_fields(),
2531 --echo # file item.cc, line 4448"
2532 --echo #
2533 --disable_warnings
2534 DROP TABLE IF EXISTS C, BB;
2535 --enable_warnings
2536 
2537 CREATE TABLE C (
2538  varchar_nokey varchar(1) NOT NULL
2539 );
2540 INSERT INTO C VALUES
2541  ('k'),('a'),(''),('u'),('e'),('v'),('i'),
2542  ('t'),('u'),('f'),('u'),('m'),('j'),('f'),
2543  ('v'),('j'),('g'),('e'),('h'),('z');
2544 CREATE TABLE BB (
2545  varchar_nokey varchar(1) NOT NULL
2546 );
2547 INSERT INTO BB VALUES ('i'),('t');
2548 -- error ER_BAD_FIELD_ERROR
2549 SELECT varchar_nokey FROM C
2550 WHERE (varchar_nokey, OUTR) IN (SELECT varchar_nokey
2551  FROM BB);
2552 -- error ER_BAD_FIELD_ERROR
2553 SELECT varchar_nokey FROM C
2554 WHERE (varchar_nokey, OUTR) IN (SELECT varchar_nokey, varchar_nokey
2555  FROM BB);
2556 DROP TABLE C,BB;
2557 
2558 --echo #
2559 --echo # During work with BUG#45863 I had problems with a query that was
2560 --echo # optimized differently in regular and prepared mode.
2561 --echo # Because there was a bug in one of the selected strategies, I became
2562 --echo # aware of the problem. Adding an EXPLAIN query to catch this.
2563 
2564 --disable_warnings
2565 DROP TABLE IF EXISTS t1, t2, t3;
2566 --enable_warnings
2567 
2568 CREATE TABLE t1
2569  (EMPNUM CHAR(3) NOT NULL,
2570  EMPNAME CHAR(20),
2571  GRADE DECIMAL(4),
2572  CITY CHAR(15));
2573 
2574 CREATE TABLE t2
2575  (PNUM CHAR(3) NOT NULL,
2576  PNAME CHAR(20),
2577  PTYPE CHAR(6),
2578  BUDGET DECIMAL(9),
2579  CITY CHAR(15));
2580 
2581 CREATE TABLE t3
2582  (EMPNUM CHAR(3) NOT NULL,
2583  PNUM CHAR(3) NOT NULL,
2584  HOURS DECIMAL(5));
2585 
2586 INSERT INTO t1 VALUES ('E1','Alice',12,'Deale');
2587 INSERT INTO t1 VALUES ('E2','Betty',10,'Vienna');
2588 INSERT INTO t1 VALUES ('E3','Carmen',13,'Vienna');
2589 INSERT INTO t1 VALUES ('E4','Don',12,'Deale');
2590 INSERT INTO t1 VALUES ('E5','Ed',13,'Akron');
2591 
2592 INSERT INTO t2 VALUES ('P1','MXSS','Design',10000,'Deale');
2593 INSERT INTO t2 VALUES ('P2','CALM','Code',30000,'Vienna');
2594 INSERT INTO t2 VALUES ('P3','SDP','Test',30000,'Tampa');
2595 INSERT INTO t2 VALUES ('P4','SDP','Design',20000,'Deale');
2596 INSERT INTO t2 VALUES ('P5','IRM','Test',10000,'Vienna');
2597 INSERT INTO t2 VALUES ('P6','PAYR','Design',50000,'Deale');
2598 
2599 INSERT INTO t3 VALUES ('E1','P1',40);
2600 INSERT INTO t3 VALUES ('E1','P2',20);
2601 INSERT INTO t3 VALUES ('E1','P3',80);
2602 INSERT INTO t3 VALUES ('E1','P4',20);
2603 INSERT INTO t3 VALUES ('E1','P5',12);
2604 INSERT INTO t3 VALUES ('E1','P6',12);
2605 INSERT INTO t3 VALUES ('E2','P1',40);
2606 INSERT INTO t3 VALUES ('E2','P2',80);
2607 INSERT INTO t3 VALUES ('E3','P2',20);
2608 INSERT INTO t3 VALUES ('E4','P2',20);
2609 INSERT INTO t3 VALUES ('E4','P4',40);
2610 INSERT INTO t3 VALUES ('E4','P5',80);
2611 
2612 CREATE UNIQUE INDEX t1_IDX ON t1(EMPNUM);
2613 
2614 EXPLAIN SELECT EMPNAME
2615 FROM t1
2616 WHERE EMPNUM IN
2617  (SELECT EMPNUM
2618  FROM t3
2619  WHERE PNUM IN
2620  (SELECT PNUM
2621  FROM t2
2622  WHERE PTYPE = 'Design'));
2623 
2624 PREPARE stmt FROM "EXPLAIN SELECT EMPNAME
2625 FROM t1
2626 WHERE EMPNUM IN
2627  (SELECT EMPNUM
2628  FROM t3
2629  WHERE PNUM IN
2630  (SELECT PNUM
2631  FROM t2
2632  WHERE PTYPE = 'Design'))";
2633 EXECUTE stmt;
2634 EXECUTE stmt;
2635 DEALLOCATE PREPARE stmt;
2636 
2637 DROP INDEX t1_IDX ON t1;
2638 CREATE INDEX t1_IDX ON t1(EMPNUM);
2639 
2640 EXPLAIN SELECT EMPNAME
2641 FROM t1
2642 WHERE EMPNUM IN
2643  (SELECT EMPNUM
2644  FROM t3
2645  WHERE PNUM IN
2646  (SELECT PNUM
2647  FROM t2
2648  WHERE PTYPE = 'Design'));
2649 
2650 PREPARE stmt FROM "EXPLAIN SELECT EMPNAME
2651 FROM t1
2652 WHERE EMPNUM IN
2653  (SELECT EMPNUM
2654  FROM t3
2655  WHERE PNUM IN
2656  (SELECT PNUM
2657  FROM t2
2658  WHERE PTYPE = 'Design'))";
2659 EXECUTE stmt;
2660 EXECUTE stmt;
2661 DEALLOCATE PREPARE stmt;
2662 
2663 DROP INDEX t1_IDX ON t1;
2664 
2665 EXPLAIN SELECT EMPNAME
2666 FROM t1
2667 WHERE EMPNUM IN
2668  (SELECT EMPNUM
2669  FROM t3
2670  WHERE PNUM IN
2671  (SELECT PNUM
2672  FROM t2
2673  WHERE PTYPE = 'Design'));
2674 
2675 PREPARE stmt FROM "EXPLAIN SELECT EMPNAME
2676 FROM t1
2677 WHERE EMPNUM IN
2678  (SELECT EMPNUM
2679  FROM t3
2680  WHERE PNUM IN
2681  (SELECT PNUM
2682  FROM t2
2683  WHERE PTYPE = 'Design'))";
2684 EXECUTE stmt;
2685 EXECUTE stmt;
2686 DEALLOCATE PREPARE stmt;
2687 
2688 DROP TABLE t1, t2, t3;
2689 
2690 --echo #
2691 --echo # BUG#45221 Query SELECT pk FROM C WHERE pk IN (SELECT int_key) failing
2692 --echo #
2693 
2694 CREATE TABLE t1 (
2695  i1_key INT,
2696  i2 INT,
2697  i3 INT,
2698  KEY i1_index (i1_key)
2699 );
2700 
2701 INSERT INTO t1 VALUES (9,1,2), (9,2,1);
2702 
2703 CREATE TABLE t2 (
2704  pk INT NOT NULL,
2705  i1 INT,
2706  PRIMARY KEY (pk)
2707 );
2708 
2709 INSERT INTO t2 VALUES (9,1);
2710 
2711 SELECT pk
2712 FROM t2
2713 WHERE
2714  pk IN (
2715  SELECT i1_key
2716  FROM t1
2717  WHERE t1.i2 < t1.i3 XOR t2.i1 > 1
2718  ORDER BY t1.i2 desc);
2719 
2720 DROP TABLE t1,t2;
2721 
2722 --echo # BUG#50361 Doublenested noncorrelated subquery with FirstMatch and join cache wrong result
2723 --echo #
2724 
2725 CREATE TABLE t1(
2726  id INTEGER
2727  );
2728 INSERT INTO t1 VALUES(10),(20);
2729 create table t2 select * from t1;
2730 create table t3 select * from t1;
2731 
2732 SELECT *
2733 FROM t1
2734 WHERE 1 IN(SELECT 1
2735  FROM t2
2736  WHERE 1 IN(SELECT 1
2737  FROM t3));
2738 
2739 explain extended SELECT *
2740 FROM t1
2741 WHERE 1 IN(SELECT 1
2742  FROM t2
2743  WHERE 1 IN(SELECT 1
2744  FROM t3));
2745 
2746 delete from t2;
2747 delete from t3;
2748 
2749 INSERT INTO t1 VALUES(30),(40),(50),(60),(70),(80),(90);
2750 insert into t2 select * from t1;
2751 insert into t3 select * from t1;
2752 create table t4 select * from t1;
2753 
2754 SELECT *
2755 FROM t1
2756 WHERE 1 IN(SELECT 1
2757  FROM t2
2758  WHERE 1 IN(SELECT 1
2759  FROM t3
2760  WHERE 1 IN(SELECT 1
2761  FROM t4)));
2762 
2763 explain SELECT *
2764 FROM t1
2765 WHERE 1 IN(SELECT 1
2766  FROM t2
2767  WHERE 1 IN(SELECT 1
2768  FROM t3
2769  WHERE 1 IN(SELECT 1
2770  FROM t4)));
2771 
2772 SELECT *
2773 FROM t1
2774 WHERE 1 IN(SELECT 1
2775  FROM t1
2776  WHERE 1 IN(SELECT 1
2777  FROM t1
2778  WHERE 1 IN(SELECT 1
2779  FROM t1)));
2780 
2781 drop table t1,t2,t3,t4;
2782 
2783 --echo #
2784 --echo # Bug#53236 Segfault in DTCollation::set(DTCollation&)
2785 --echo #
2786 
2787 CREATE TABLE t1 (
2788  pk INTEGER AUTO_INCREMENT,
2789  col_varchar VARCHAR(1),
2790  PRIMARY KEY (pk)
2791 )
2792 ;
2793 
2794 INSERT INTO t1 (col_varchar)
2795 VALUES
2796 ('w'),
2797 ('m')
2798 ;
2799 
2800 SELECT table1.pk
2801 FROM ( t1 AS table1 JOIN t1 AS table2 ON (table1.col_varchar =
2802  table2.col_varchar) )
2803 WHERE ( 1, 2 ) IN ( SELECT SUBQUERY1_t1.pk AS SUBQUERY1_field1,
2804  SUBQUERY1_t1.pk AS SUBQUERY1_field2
2805  FROM ( t1 AS SUBQUERY1_t1 JOIN t1 AS SUBQUERY1_t2
2806  ON (SUBQUERY1_t2.col_varchar =
2807  SUBQUERY1_t1.col_varchar) ) )
2808 ;
2809 
2810 drop table t1;
2811 
2812 --echo #
2813 --echo # BUG#53298 "wrong result with semijoin (no semijoin strategy chosen)"
2814 --echo #
2815 
2816 create table t1 (uid int, fid int);
2817 insert into t1 values (1,1), (3,1);
2818 
2819 create table t2 (uid int, name varchar(128));
2820 insert into t2 values (1, "A"), (2, "B");
2821 
2822 create table t3 (uid int, fid int, index(uid));
2823 insert into t3 values (1,3), (1,3);
2824 
2825 create table t4 (uid int);
2826 insert into t4 values (3);
2827 
2828 explain select t2.uid from t2, t1
2829  where t1.uid in (select t4.uid from t4, t3 where t3.uid=1 and t4.uid=t3.fid)
2830  and t2.uid=t1.fid;
2831 
2832 --sorted_result
2833 select t2.uid from t2, t1
2834  where t1.uid in (select t4.uid from t4, t3 where t3.uid=1 and t4.uid=t3.fid)
2835  and t2.uid=t1.fid;
2836 
2837 drop table t1,t2,t3,t4;
2838 
2839 
2840 #
2841 # BUG#46548 IN-subqueries return 0 rows with materialization=on
2842 #
2843 CREATE TABLE t1 (
2844  pk int,
2845  a varchar(1),
2846  b varchar(4),
2847  c varchar(4),
2848  d varchar(4),
2849  PRIMARY KEY (pk)
2850 );
2851 INSERT INTO t1 VALUES (1,'o','ffff','ffff','ffoo'),(2,'f','ffff','ffff','ffff');
2852 
2853 CREATE TABLE t2 LIKE t1;
2854 INSERT INTO t2 VALUES (1,'i','iiii','iiii','iiii'),(2,'f','ffff','ffff','ffff');
2855 
2856 EXPLAIN SELECT pk FROM t1 WHERE (a) IN (SELECT a FROM t2 WHERE pk > 0);
2857 SELECT pk FROM t1 WHERE (a) IN (SELECT a FROM t2 WHERE pk > 0);
2858 SELECT pk FROM t1 WHERE (b,c,d) IN (SELECT b,c,d FROM t2 WHERE pk > 0);
2859 DROP TABLE t1, t2;
2860 
2861 #
2862 # Bug #44303 Assertion failures in Field_new_decimal::store_decimal
2863 # when executing materialized InsideOut semijoin
2864 #
2865 CREATE TABLE t1 (f1 INT, f2 DECIMAL(5,3)) ENGINE=MyISAM;
2866 INSERT INTO t1 (f1, f2) VALUES (1, 1.789);
2867 INSERT INTO t1 (f1, f2) VALUES (13, 1.454);
2868 INSERT INTO t1 (f1, f2) VALUES (10, 1.668);
2869 
2870 CREATE TABLE t2 LIKE t1;
2871 INSERT INTO t2 VALUES (1, 1.789);
2872 INSERT INTO t2 VALUES (13, 1.454);
2873 
2874 EXPLAIN SELECT COUNT(*) FROM t1 WHERE (f1,f2) IN (SELECT f1,f2 FROM t2);
2875 SELECT COUNT(*) FROM t1 WHERE (f1,f2) IN (SELECT f1,f2 FROM t2);
2876 
2877 DROP TABLE t1, t2;
2878 
2879 
2880 #
2881 # Bug #27348: Assertion abort for a query with two subqueries to be flattened
2882 # Bug #35674: Range optimizer ignores conditions on inner tables in
2883 # semi-join IN subqueries
2884 #
2885 CREATE TABLE t1 (
2886  ID int(11) NOT NULL auto_increment,
2887  Name char(35) NOT NULL default '',
2888  Country char(3) NOT NULL default '',
2889  Population int(11) NOT NULL default '0',
2890  PRIMARY KEY (ID),
2891  INDEX (Population),
2892  INDEX (Country)
2893 );
2894 CREATE TABLE t2 (
2895  Code char(3) NOT NULL default '',
2896  Name char(52) NOT NULL default '',
2897  SurfaceArea float(10,2) NOT NULL default '0.00',
2898  Population int(11) NOT NULL default '0',
2899  Capital int(11) default NULL,
2900  PRIMARY KEY (Code),
2901  UNIQUE INDEX (Name),
2902  INDEX (Population)
2903 );
2904 CREATE TABLE t3 (
2905  Country char(3) NOT NULL default '',
2906  Language char(30) NOT NULL default '',
2907  Percentage float(3,1) NOT NULL default '0.0',
2908  PRIMARY KEY (Country, Language),
2909  INDEX (Percentage)
2910 );
2911 
2912 --disable_query_log
2913 INSERT INTO t1 VALUES
2914 (1,'Kabul','AFG',1780000),(2,'Qandahar','AFG',237500),
2915 (3,'Herat','AFG',186800),(4,'Mazar-e-Sharif','AFG',127800),
2916 (5,'Amsterdam','NLD',731200),(6,'Rotterdam','NLD',593321),
2917 (7,'Haag','NLD',440900),(8,'Utrecht','NLD',234323),
2918 (9,'Eindhoven','NLD',201843),(10,'Tilburg','NLD',193238),
2919 (11,'Groningen','NLD',172701),(12,'Breda','NLD',160398),
2920 (13,'Apeldoorn','NLD',153491),(14,'Nijmegen','NLD',152463),
2921 (15,'Enschede','NLD',149544),(16,'Haarlem','NLD',148772),
2922 (17,'Almere','NLD',142465),(18,'Arnhem','NLD',138020),
2923 (19,'Zaanstad','NLD',135621),(20,'´s-Hertogenbosch','NLD',129170),
2924 (21,'Amersfoort','NLD',126270),(22,'Maastricht','NLD',122087),
2925 (23,'Dordrecht','NLD',119811),(24,'Leiden','NLD',117196),
2926 (25,'Haarlemmermeer','NLD',110722),(26,'Zoetermeer','NLD',110214),
2927 (27,'Emmen','NLD',105853),(28,'Zwolle','NLD',105819),
2928 (29,'Ede','NLD',101574),(30,'Delft','NLD',95268);
2929 
2930 INSERT INTO t2 VALUES
2931 ('AFG','Afghanistan',652090.00,22720000,1),
2932 ('NLD','Netherlands',41526.00,15864000,5),
2933 ('ANT','Netherlands Antilles',800.00,217000,33),
2934 ('ALB','Albania',28748.00,3401200,34),
2935 ('DZA','Algeria',2381741.00,31471000,35),
2936 ('ASM','American Samoa',199.00,68000,54),
2937 ('AND','Andorra',468.00,78000,55),
2938 ('AGO','Angola',1246700.00,12878000,56),
2939 ('AIA','Anguilla',96.00,8000,62),
2940 ('ATG','Antigua and Barbuda',442.00,68000,63),
2941 ('ARE','United Arab Emirates',83600.00,2441000,65),
2942 ('ARG','Argentina',2780400.00,37032000,69),
2943 ('ARM','Armenia',29800.00,3520000,126),
2944 ('ABW','Aruba',193.00,103000,129),
2945 ('AUS','Australia',7741220.00,18886000,135),
2946 ('AZE','Azerbaijan',86600.00,7734000,144);
2947 
2948 INSERT INTO t3 VALUES
2949 ('AFG','Pashto',52.4),('NLD','Dutch',95.6),
2950 ('ANT','Papiamento',86.2),('ALB','Albaniana',97.9),
2951 ('DZA','Arabic',86.0),('ASM','Samoan',90.6),
2952 ('AND','Spanish',44.6),('AGO','Ovimbundu',37.2),
2953 ('AIA','English',0.0),('ATG','Creole English',95.7),
2954 ('ARE','Arabic',42.0),('ARG','Spanish',96.8),
2955 ('ARM','Armenian',93.4),('ABW','Papiamento',76.7),
2956 ('AUS','English',81.2),('AZE','Azerbaijani',89.0),
2957 ('BHS','Creole English',89.7),('BHR','Arabic',67.7),
2958 ('BGD','Bengali',97.7),('BRB','Bajan',95.1),
2959 ('BEL','Dutch',59.2),('BLZ','English',50.8);
2960 --enable_query_log
2961 
2962 let $query=
2963 SELECT Name FROM t2
2964  WHERE t2.Code IN (SELECT Country FROM t1 WHERE Population > 5000000)
2965  AND
2966  t2.Code IN (SELECT Country FROM t3
2967  WHERE Language='English' AND Percentage > 10 AND
2968  t2.Population > 100000);
2969 --eval EXPLAIN $query
2970 --eval EXPLAIN FORMAT=JSON $query
2971 
2972 DROP TABLE t1,t2,t3;
2973 
2974 #
2975 # BUG#30993: Subqueries: LooseScan strategy produces wrong query results, with duplicates
2976 #
2977 
2978 CREATE TABLE t1 (
2979  Code char(3) NOT NULL DEFAULT '',
2980  Name char(52) NOT NULL DEFAULT '',
2981  Continent enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') NOT NULL DEFAULT 'Asia',
2982  Region char(26) NOT NULL DEFAULT '',
2983  SurfaceArea float(10,2) NOT NULL DEFAULT '0.00',
2984  IndepYear smallint(6) DEFAULT NULL,
2985  Population int(11) NOT NULL DEFAULT '0',
2986  LifeExpectancy float(3,1) DEFAULT NULL,
2987  GNP float(10,2) DEFAULT NULL,
2988  GNPOld float(10,2) DEFAULT NULL,
2989  LocalName char(45) NOT NULL DEFAULT '',
2990  GovernmentForm char(45) NOT NULL DEFAULT '',
2991  HeadOfState char(60) DEFAULT NULL,
2992  Capital int(11) DEFAULT NULL,
2993  Code2 char(2) NOT NULL DEFAULT '',
2994  PRIMARY KEY (Code)
2995 );
2996 
2997 CREATE TABLE t2 (
2998  ID int(11) NOT NULL AUTO_INCREMENT,
2999  Name char(35) NOT NULL DEFAULT '',
3000  CountryCode char(3) NOT NULL DEFAULT '',
3001  District char(20) NOT NULL DEFAULT '',
3002  Population int(11) NOT NULL DEFAULT '0',
3003  PRIMARY KEY (ID),
3004  KEY CountryCode (CountryCode)
3005 );
3006 
3007 --echo Fill the table with test data
3008 --disable_query_log
3009 insert into t2 (ID, Name, CountryCode, Population) values
3010 (1,'Kabul','AFG',1780000), (2,'Qandahar','AFG',237500), (3,'Herat','AFG',186800),
3011 (4,'Mazar-e-Sharif','AFG',127800), (33,'Willemstad','ANT',2345), (34,'Tirana','ALB',270000),
3012 (55,'Andorra la Vella','AND',21189), (61,'South Hill','AIA',961), (62,'The Valley','AIA',595),
3013 (63,'Saint John´s','ATG',24000), (64,'Dubai','ARE',669181), (65,'Abu Dhabi','ARE',398695),
3014 (66,'Sharja','ARE',320095), (67,'al-Ayn','ARE',225970), (68,'Ajman','ARE',114395),
3015 (126,'Yerevan','ARM',1248700), (127,'Gjumri','ARM',211700), (128,'Vanadzor','ARM',172700),
3016 (129,'Oranjestad','ABW',29034), (144,'Baku','AZE',1787800), (145,'Gäncä','AZE',299300),
3017 (146,'Sumqayit','AZE',283000), (147,'Mingäçevir','AZE',93900), (148,'Nassau','BHS',172000),
3018 (149,'al-Manama','BHR',148000), (150,'Dhaka','BGD',3612850), (151,'Chittagong','BGD',1392860),
3019 (152,'Khulna','BGD',663340), (153,'Rajshahi','BGD',294056), (154,'Narayanganj','BGD',202134),
3020 (155,'Rangpur','BGD',191398), (156,'Mymensingh','BGD',188713), (157,'Barisal','BGD',170232),
3021 (158,'Tungi','BGD',168702), (159,'Jessore','BGD',139710), (160,'Comilla','BGD',135313),
3022 (161,'Nawabganj','BGD',130577), (162,'Dinajpur','BGD',127815), (163,'Bogra','BGD',120170),
3023 (164,'Sylhet','BGD',117396), (165,'Brahmanbaria','BGD',109032), (166,'Tangail','BGD',106004),
3024 (167,'Jamalpur','BGD',103556), (168,'Pabna','BGD',103277), (169,'Naogaon','BGD',101266),
3025 (170,'Sirajganj','BGD',99669), (171,'Narsinghdi','BGD',98342), (172,'Saidpur','BGD',96777),
3026 (173,'Gazipur','BGD',96717), (174,'Bridgetown','BRB',6070), (175,'Antwerpen','BEL',446525),
3027 (176,'Gent','BEL',224180), (177,'Charleroi','BEL',200827), (178,'Liège','BEL',185639),
3028 (179,'Bruxelles [Brussel]','BEL',133859), (180,'Brugge','BEL',116246), (181,'Schaerbeek','BEL',105692),
3029 (182,'Namur','BEL',105419), (183,'Mons','BEL',90935), (184,'Belize City','BLZ',55810),
3030 (185,'Belmopan','BLZ',7105), (190,'Saint George','BMU',1800), (191,'Hamilton','BMU',1200),
3031 (192,'Thimphu','BTN',22000), (201,'Sarajevo','BIH',360000), (202,'Banja Luka','BIH',143079),
3032 (203,'Zenica','BIH',96027), (538,'Bandar Seri Begawan','BRN',21484), (539,'Sofija','BGR',1122302),
3033 (540,'Plovdiv','BGR',342584), (541,'Varna','BGR',299801), (542,'Burgas','BGR',195255),
3034 (543,'Ruse','BGR',166467), (544,'Stara Zagora','BGR',147939), (545,'Pleven','BGR',121952),
3035 (546,'Sliven','BGR',105530), (547,'Dobric','BGR',100399), (548,'Šumen','BGR',94686),
3036 (553,'George Town','CYM',19600), (584,'San José','CRI',339131), (1523,'Wien','AUT',1608144),
3037 (1524,'Graz','AUT',240967), (1525,'Linz','AUT',188022), (1526,'Salzburg','AUT',144247),
3038 (1527,'Innsbruck','AUT',111752), (1528,'Klagenfurt','AUT',91141), (1810,'Montréal','CAN',1016376),
3039 (1811,'Calgary','CAN',768082), (1812,'Toronto','CAN',688275), (1813,'North York','CAN',622632),
3040 (1814,'Winnipeg','CAN',618477), (1815,'Edmonton','CAN',616306), (1816,'Mississauga','CAN',608072),
3041 (1817,'Scarborough','CAN',594501), (1818,'Vancouver','CAN',514008), (1819,'Etobicoke','CAN',348845),
3042 (1820,'London','CAN',339917), (1821,'Hamilton','CAN',335614), (1822,'Ottawa','CAN',335277),
3043 (1823,'Laval','CAN',330393), (1824,'Surrey','CAN',304477), (1825,'Brampton','CAN',296711),
3044 (1826,'Windsor','CAN',207588), (1827,'Saskatoon','CAN',193647), (1828,'Kitchener','CAN',189959),
3045 (1829,'Markham','CAN',189098), (1830,'Regina','CAN',180400), (1831,'Burnaby','CAN',179209),
3046 (1832,'Québec','CAN',167264), (1833,'York','CAN',154980), (1834,'Richmond','CAN',148867),
3047 (1835,'Vaughan','CAN',147889), (1836,'Burlington','CAN',145150), (1837,'Oshawa','CAN',140173),
3048 (1838,'Oakville','CAN',139192), (1839,'Saint Catharines','CAN',136216), (1840,'Longueuil','CAN',127977),
3049 (1841,'Richmond Hill','CAN',116428), (1842,'Thunder Bay','CAN',115913), (1843,'Nepean','CAN',115100),
3050 (1844,'Cape Breton','CAN',114733), (1845,'East York','CAN',114034), (1846,'Halifax','CAN',113910),
3051 (1847,'Cambridge','CAN',109186), (1848,'Gloucester','CAN',107314), (1849,'Abbotsford','CAN',105403),
3052 (1850,'Guelph','CAN',103593), (1851,'Saint John´s','CAN',101936), (1852,'Coquitlam','CAN',101820),
3053 (1853,'Saanich','CAN',101388), (1854,'Gatineau','CAN',100702), (1855,'Delta','CAN',95411),
3054 (1856,'Sudbury','CAN',92686), (1857,'Kelowna','CAN',89442), (1858,'Barrie','CAN',89269),
3055 (1890,'Shanghai','CHN',9696300), (1891,'Peking','CHN',7472000), (1892,'Chongqing','CHN',6351600),
3056 (1893,'Tianjin','CHN',5286800), (1894,'Wuhan','CHN',4344600), (1895,'Harbin','CHN',4289800),
3057 (1896,'Shenyang','CHN',4265200), (1897,'Kanton [Guangzhou]','CHN',4256300), (1898,'Chengdu','CHN',3361500),
3058 (1899,'Nanking [Nanjing]','CHN',2870300), (1900,'Changchun','CHN',2812000), (1901,'Xi´an','CHN',2761400),
3059 (1902,'Dalian','CHN',2697000), (1903,'Qingdao','CHN',2596000), (1904,'Jinan','CHN',2278100),
3060 (1905,'Hangzhou','CHN',2190500), (1906,'Zhengzhou','CHN',2107200), (1907,'Shijiazhuang','CHN',2041500),
3061 (1908,'Taiyuan','CHN',1968400), (1909,'Kunming','CHN',1829500), (1910,'Changsha','CHN',1809800),
3062 (1911,'Nanchang','CHN',1691600), (1912,'Fuzhou','CHN',1593800), (1913,'Lanzhou','CHN',1565800),
3063 (1914,'Guiyang','CHN',1465200), (1915,'Ningbo','CHN',1371200), (1916,'Hefei','CHN',1369100),
3064 (1917,'Urumtši [Ürümqi]','CHN',1310100), (1918,'Anshan','CHN',1200000), (1919,'Fushun','CHN',1200000),
3065 (1920,'Nanning','CHN',1161800), (1921,'Zibo','CHN',1140000), (1922,'Qiqihar','CHN',1070000),
3066 (1923,'Jilin','CHN',1040000), (1924,'Tangshan','CHN',1040000), (1925,'Baotou','CHN',980000),
3067 (1926,'Shenzhen','CHN',950500), (1927,'Hohhot','CHN',916700), (1928,'Handan','CHN',840000),
3068 (1929,'Wuxi','CHN',830000), (1930,'Xuzhou','CHN',810000), (1931,'Datong','CHN',800000),
3069 (1932,'Yichun','CHN',800000), (1933,'Benxi','CHN',770000), (1934,'Luoyang','CHN',760000),
3070 (1935,'Suzhou','CHN',710000), (1936,'Xining','CHN',700200), (1937,'Huainan','CHN',700000),
3071 (1938,'Jixi','CHN',683885), (1939,'Daqing','CHN',660000), (1940,'Fuxin','CHN',640000),
3072 (1941,'Amoy [Xiamen]','CHN',627500), (1942,'Liuzhou','CHN',610000), (1943,'Shantou','CHN',580000),
3073 (1944,'Jinzhou','CHN',570000), (1945,'Mudanjiang','CHN',570000), (1946,'Yinchuan','CHN',544500),
3074 (1947,'Changzhou','CHN',530000), (1948,'Zhangjiakou','CHN',530000), (1949,'Dandong','CHN',520000),
3075 (1950,'Hegang','CHN',520000), (1951,'Kaifeng','CHN',510000), (1952,'Jiamusi','CHN',493409),
3076 (1953,'Liaoyang','CHN',492559), (1954,'Hengyang','CHN',487148), (1955,'Baoding','CHN',483155),
3077 (1956,'Hunjiang','CHN',482043), (1957,'Xinxiang','CHN',473762), (1958,'Huangshi','CHN',457601),
3078 (1959,'Haikou','CHN',454300), (1960,'Yantai','CHN',452127), (1961,'Bengbu','CHN',449245),
3079 (1962,'Xiangtan','CHN',441968), (1963,'Weifang','CHN',428522), (1964,'Wuhu','CHN',425740),
3080 (1965,'Pingxiang','CHN',425579), (1966,'Yingkou','CHN',421589), (1967,'Anyang','CHN',420332),
3081 (1968,'Panzhihua','CHN',415466), (1969,'Pingdingshan','CHN',410775), (1970,'Xiangfan','CHN',410407),
3082 (1971,'Zhuzhou','CHN',409924), (1972,'Jiaozuo','CHN',409100), (1973,'Wenzhou','CHN',401871),
3083 (1974,'Zhangjiang','CHN',400997), (1975,'Zigong','CHN',393184), (1976,'Shuangyashan','CHN',386081),
3084 (1977,'Zaozhuang','CHN',380846), (1978,'Yakeshi','CHN',377869), (1979,'Yichang','CHN',371601),
3085 (1980,'Zhenjiang','CHN',368316), (1981,'Huaibei','CHN',366549), (1982,'Qinhuangdao','CHN',364972),
3086 (1983,'Guilin','CHN',364130), (1984,'Liupanshui','CHN',363954), (1985,'Panjin','CHN',362773),
3087 (1986,'Yangquan','CHN',362268), (1987,'Jinxi','CHN',357052), (1988,'Liaoyuan','CHN',354141),
3088 (1989,'Lianyungang','CHN',354139), (1990,'Xianyang','CHN',352125), (1991,'Tai´an','CHN',350696),
3089 (1992,'Chifeng','CHN',350077), (1993,'Shaoguan','CHN',350043), (1994,'Nantong','CHN',343341),
3090 (1995,'Leshan','CHN',341128), (1996,'Baoji','CHN',337765), (1997,'Linyi','CHN',324720),
3091 (1998,'Tonghua','CHN',324600), (1999,'Siping','CHN',317223), (2000,'Changzhi','CHN',317144),
3092 (2001,'Tengzhou','CHN',315083), (2002,'Chaozhou','CHN',313469), (2003,'Yangzhou','CHN',312892),
3093 (2004,'Dongwan','CHN',308669), (2005,'Ma´anshan','CHN',305421), (2006,'Foshan','CHN',303160),
3094 (2007,'Yueyang','CHN',302800), (2008,'Xingtai','CHN',302789), (2009,'Changde','CHN',301276),
3095 (2010,'Shihezi','CHN',299676), (2011,'Yancheng','CHN',296831), (2012,'Jiujiang','CHN',291187),
3096 (2013,'Dongying','CHN',281728), (2014,'Shashi','CHN',281352), (2015,'Xintai','CHN',281248),
3097 (2016,'Jingdezhen','CHN',281183), (2017,'Tongchuan','CHN',280657), (2018,'Zhongshan','CHN',278829),
3098 (2019,'Shiyan','CHN',273786), (2020,'Tieli','CHN',265683), (2021,'Jining','CHN',265248),
3099 (2022,'Wuhai','CHN',264081), (2023,'Mianyang','CHN',262947), (2024,'Luzhou','CHN',262892),
3100 (2025,'Zunyi','CHN',261862), (2026,'Shizuishan','CHN',257862), (2027,'Neijiang','CHN',256012),
3101 (2028,'Tongliao','CHN',255129), (2029,'Tieling','CHN',254842), (2030,'Wafangdian','CHN',251733),
3102 (2031,'Anqing','CHN',250718), (2032,'Shaoyang','CHN',247227), (2033,'Laiwu','CHN',246833),
3103 (2034,'Chengde','CHN',246799), (2035,'Tianshui','CHN',244974), (2036,'Nanyang','CHN',243303),
3104 (2037,'Cangzhou','CHN',242708), (2038,'Yibin','CHN',241019), (2039,'Huaiyin','CHN',239675),
3105 (2040,'Dunhua','CHN',235100), (2041,'Yanji','CHN',230892), (2042,'Jiangmen','CHN',230587),
3106 (2043,'Tongling','CHN',228017), (2044,'Suihua','CHN',227881), (2045,'Gongziling','CHN',226569),
3107 (2046,'Xiantao','CHN',222884), (2047,'Chaoyang','CHN',222394), (2048,'Ganzhou','CHN',220129),
3108 (2049,'Huzhou','CHN',218071), (2050,'Baicheng','CHN',217987), (2051,'Shangzi','CHN',215373),
3109 (2052,'Yangjiang','CHN',215196), (2053,'Qitaihe','CHN',214957), (2054,'Gejiu','CHN',214294),
3110 (2055,'Jiangyin','CHN',213659), (2056,'Hebi','CHN',212976), (2057,'Jiaxing','CHN',211526),
3111 (2058,'Wuzhou','CHN',210452), (2059,'Meihekou','CHN',209038), (2060,'Xuchang','CHN',208815),
3112 (2061,'Liaocheng','CHN',207844), (2062,'Haicheng','CHN',205560), (2063,'Qianjiang','CHN',205504),
3113 (2064,'Baiyin','CHN',204970), (2065,'Bei´an','CHN',204899), (2066,'Yixing','CHN',200824),
3114 (2067,'Laizhou','CHN',198664), (2068,'Qaramay','CHN',197602), (2069,'Acheng','CHN',197595),
3115 (2070,'Dezhou','CHN',195485), (2071,'Nanping','CHN',195064), (2072,'Zhaoqing','CHN',194784),
3116 (2073,'Beipiao','CHN',194301), (2074,'Fengcheng','CHN',193784), (2075,'Fuyu','CHN',192981),
3117 (2076,'Xinyang','CHN',192509), (2077,'Dongtai','CHN',192247), (2078,'Yuci','CHN',191356),
3118 (2079,'Honghu','CHN',190772), (2080,'Ezhou','CHN',190123), (2081,'Heze','CHN',189293),
3119 (2082,'Daxian','CHN',188101), (2083,'Linfen','CHN',187309), (2084,'Tianmen','CHN',186332),
3120 (2085,'Yiyang','CHN',185818), (2086,'Quanzhou','CHN',185154), (2087,'Rizhao','CHN',185048),
3121 (2088,'Deyang','CHN',182488), (2089,'Guangyuan','CHN',182241), (2090,'Changshu','CHN',181805),
3122 (2091,'Zhangzhou','CHN',181424), (2092,'Hailar','CHN',180650), (2093,'Nanchong','CHN',180273),
3123 (2094,'Jiutai','CHN',180130), (2095,'Zhaodong','CHN',179976), (2096,'Shaoxing','CHN',179818),
3124 (2097,'Fuyang','CHN',179572), (2098,'Maoming','CHN',178683), (2099,'Qujing','CHN',178669),
3125 (2100,'Ghulja','CHN',177193), (2101,'Jiaohe','CHN',176367), (2102,'Puyang','CHN',175988),
3126 (2103,'Huadian','CHN',175873), (2104,'Jiangyou','CHN',175753), (2105,'Qashqar','CHN',174570),
3127 (2106,'Anshun','CHN',174142), (2107,'Fuling','CHN',173878), (2108,'Xinyu','CHN',173524),
3128 (2109,'Hanzhong','CHN',169930), (2110,'Danyang','CHN',169603), (2111,'Chenzhou','CHN',169400),
3129 (2112,'Xiaogan','CHN',166280), (2113,'Shangqiu','CHN',164880), (2114,'Zhuhai','CHN',164747),
3130 (2115,'Qingyuan','CHN',164641), (2116,'Aqsu','CHN',164092), (2117,'Jining','CHN',163552),
3131 (2118,'Xiaoshan','CHN',162930), (2119,'Zaoyang','CHN',162198), (2120,'Xinghua','CHN',161910),
3132 (2121,'Hami','CHN',161315), (2122,'Huizhou','CHN',161023), (2123,'Jinmen','CHN',160794),
3133 (2124,'Sanming','CHN',160691), (2125,'Ulanhot','CHN',159538), (2126,'Korla','CHN',159344),
3134 (2127,'Wanxian','CHN',156823), (2128,'Rui´an','CHN',156468), (2129,'Zhoushan','CHN',156317),
3135 (2130,'Liangcheng','CHN',156307), (2131,'Jiaozhou','CHN',153364), (2132,'Taizhou','CHN',152442),
3136 (2133,'Suzhou','CHN',151862), (2134,'Yichun','CHN',151585), (2135,'Taonan','CHN',150168),
3137 (2136,'Pingdu','CHN',150123), (2137,'Ji´an','CHN',148583), (2138,'Longkou','CHN',148362),
3138 (2139,'Langfang','CHN',148105), (2140,'Zhoukou','CHN',146288), (2141,'Suining','CHN',146086),
3139 (2142,'Yulin','CHN',144467), (2143,'Jinhua','CHN',144280), (2144,'Liu´an','CHN',144248),
3140 (2145,'Shuangcheng','CHN',142659), (2146,'Suizhou','CHN',142302), (2147,'Ankang','CHN',142170),
3141 (2148,'Weinan','CHN',140169), (2149,'Longjing','CHN',139417), (2150,'Da´an','CHN',138963),
3142 (2151,'Lengshuijiang','CHN',137994), (2152,'Laiyang','CHN',137080), (2153,'Xianning','CHN',136811),
3143 (2154,'Dali','CHN',136554), (2155,'Anda','CHN',136446), (2156,'Jincheng','CHN',136396),
3144 (2157,'Longyan','CHN',134481), (2158,'Xichang','CHN',134419), (2159,'Wendeng','CHN',133910),
3145 (2160,'Hailun','CHN',133565), (2161,'Binzhou','CHN',133555), (2162,'Linhe','CHN',133183),
3146 (2163,'Wuwei','CHN',133101), (2164,'Duyun','CHN',132971), (2165,'Mishan','CHN',132744),
3147 (2166,'Shangrao','CHN',132455), (2167,'Changji','CHN',132260), (2168,'Meixian','CHN',132156),
3148 (2169,'Yushu','CHN',131861), (2170,'Tiefa','CHN',131807), (2171,'Huai´an','CHN',131149),
3149 (2172,'Leiyang','CHN',130115), (2173,'Zalantun','CHN',130031), (2174,'Weihai','CHN',128888),
3150 (2175,'Loudi','CHN',128418), (2176,'Qingzhou','CHN',128258), (2177,'Qidong','CHN',126872),
3151 (2178,'Huaihua','CHN',126785), (2179,'Luohe','CHN',126438), (2180,'Chuzhou','CHN',125341),
3152 (2181,'Kaiyuan','CHN',124219), (2182,'Linqing','CHN',123958), (2183,'Chaohu','CHN',123676),
3153 (2184,'Laohekou','CHN',123366), (2185,'Dujiangyan','CHN',123357), (2186,'Zhumadian','CHN',123232),
3154 (2187,'Linchuan','CHN',121949), (2188,'Jiaonan','CHN',121397), (2189,'Sanmenxia','CHN',120523),
3155 (2190,'Heyuan','CHN',120101), (2191,'Manzhouli','CHN',120023), (2192,'Lhasa','CHN',120000),
3156 (2193,'Lianyuan','CHN',118858), (2194,'Kuytun','CHN',118553), (2195,'Puqi','CHN',117264),
3157 (2196,'Hongjiang','CHN',116188), (2197,'Qinzhou','CHN',114586), (2198,'Renqiu','CHN',114256),
3158 (2199,'Yuyao','CHN',114065), (2200,'Guigang','CHN',114025), (2201,'Kaili','CHN',113958),
3159 (2202,'Yan´an','CHN',113277), (2203,'Beihai','CHN',112673), (2204,'Xuangzhou','CHN',112673),
3160 (2205,'Quzhou','CHN',112373), (2206,'Yong´an','CHN',111762), (2207,'Zixing','CHN',110048),
3161 (2208,'Liyang','CHN',109520), (2209,'Yizheng','CHN',109268), (2210,'Yumen','CHN',109234),
3162 (2211,'Liling','CHN',108504), (2212,'Yuncheng','CHN',108359), (2213,'Shanwei','CHN',107847),
3163 (2214,'Cixi','CHN',107329), (2215,'Yuanjiang','CHN',107004), (2216,'Bozhou','CHN',106346),
3164 (2217,'Jinchang','CHN',105287), (2218,'Fu´an','CHN',105265), (2219,'Suqian','CHN',105021),
3165 (2220,'Shishou','CHN',104571), (2221,'Hengshui','CHN',104269), (2222,'Danjiangkou','CHN',103211),
3166 (2223,'Fujin','CHN',103104), (2224,'Sanya','CHN',102820), (2225,'Guangshui','CHN',102770),
3167 (2226,'Huangshan','CHN',102628), (2227,'Xingcheng','CHN',102384), (2228,'Zhucheng','CHN',102134),
3168 (2229,'Kunshan','CHN',102052), (2230,'Haining','CHN',100478), (2231,'Pingliang','CHN',99265),
3169 (2232,'Fuqing','CHN',99193), (2233,'Xinzhou','CHN',98667), (2234,'Jieyang','CHN',98531),
3170 (2235,'Zhangjiagang','CHN',97994), (2236,'Tong Xian','CHN',97168), (2237,'Ya´an','CHN',95900),
3171 (2238,'Jinzhou','CHN',95761), (2239,'Emeishan','CHN',94000), (2240,'Enshi','CHN',93056),
3172 (2241,'Bose','CHN',93009), (2242,'Yuzhou','CHN',92889), (2243,'Kaiyuan','CHN',91999),
3173 (2244,'Tumen','CHN',91471), (2245,'Putian','CHN',91030), (2246,'Linhai','CHN',90870),
3174 (2247,'Xilin Hot','CHN',90646), (2248,'Shaowu','CHN',90286), (2249,'Junan','CHN',90222),
3175 (2250,'Huaying','CHN',89400), (2251,'Pingyi','CHN',89373), (2252,'Huangyan','CHN',89288),
3176 (2413,'La Habana','CUB',2256000), (2414,'Santiago de Cuba','CUB',433180), (2415,'Camagüey','CUB',298726),
3177 (2416,'Holguín','CUB',249492), (2417,'Santa Clara','CUB',207350), (2418,'Guantánamo','CUB',205078),
3178 (2419,'Pinar del Río','CUB',142100), (2420,'Bayamo','CUB',141000), (2421,'Cienfuegos','CUB',132770),
3179 (2422,'Victoria de las Tunas','CUB',132350), (2423,'Matanzas','CUB',123273), (2424,'Manzanillo','CUB',109350),
3180 (2425,'Sancti-Spíritus','CUB',100751), (2426,'Ciego de Ávila','CUB',98505), (2430,'Nicosia','CYP',195000),
3181 (2431,'Limassol','CYP',154400), (3245,'Zürich','CHE',336800), (3246,'Geneve','CHE',173500),
3182 (3247,'Basel','CHE',166700), (3248,'Bern','CHE',122700), (3249,'Lausanne','CHE',114500),
3183 (3339,'Praha','CZE',1181126), (3340,'Brno','CZE',381862), (3341,'Ostrava','CZE',320041),
3184 (3342,'Plzen','CZE',166759), (3343,'Olomouc','CZE',102702), (3344,'Liberec','CZE',99155),
3185 (3345,'Ceské Budejovice','CZE',98186), (3346,'Hradec Králové','CZE',98080), (3347,'Ústí nad Labem','CZE',95491),
3186 (3348,'Pardubice','CZE',91309), (3520,'Minsk','BLR',1674000), (3521,'Gomel','BLR',475000),
3187 (3522,'Mogiljov','BLR',356000), (3523,'Vitebsk','BLR',340000), (3524,'Grodno','BLR',302000),
3188 (3525,'Brest','BLR',286000), (3526,'Bobruisk','BLR',221000), (3527,'Baranovitši','BLR',167000),
3189 (3528,'Borisov','BLR',151000), (3529,'Pinsk','BLR',130000), (3530,'Orša','BLR',124000),
3190 (3531,'Mozyr','BLR',110000), (3532,'Novopolotsk','BLR',106000), (3533,'Lida','BLR',101000),
3191 (3534,'Soligorsk','BLR',101000), (3535,'Molodetšno','BLR',97000);
3192 
3193 insert into t1 (Code, Name, Continent) values
3194 ('AFG','Afghanistan','Asia'), ('ANT','Netherlands Antilles','North America'),
3195 ('ALB','Albania','Europe'), ('AND','Andorra','Europe'),
3196 ('AIA','Anguilla','North America'), ('ATG','Antigua and Barbuda','North America'),
3197 ('ARE','United Arab Emirates','Asia'), ('ARM','Armenia','Asia'),
3198 ('ABW','Aruba','North America'), ('AZE','Azerbaijan','Asia'),
3199 ('BHS','Bahamas','North America'), ('BHR','Bahrain','Asia'),
3200 ('BGD','Bangladesh','Asia'), ('BRB','Barbados','North America'),
3201 ('BEL','Belgium','Europe'), ('BLZ','Belize','North America'),
3202 ('BMU','Bermuda','North America'), ('BTN','Bhutan','Asia'),
3203 ('BIH','Bosnia and Herzegovina','Europe'), ('BRN','Brunei','Asia'),
3204 ('BGR','Bulgaria','Europe'), ('CYM','Cayman Islands','North America'),
3205 ('CRI','Costa Rica','North America'), ('AUT','Austria','Europe'),
3206 ('CAN','Canada','North America'), ('CHN','China','Asia'),
3207 ('CUB','Cuba','North America'), ('CYP','Cyprus','Asia'),
3208 ('CHE','Switzerland','Europe'), ('CZE','Czech Republic','Europe'),
3209 ('BLR','Belarus','Europe');
3210 update t2 set population=6000000 where Name in ('Wien', 'Vancouver', 'Praha');
3211 --enable_query_log
3212 
3213 --echo This must not use LooseScan:
3214 EXPLAIN SELECT Name FROM t1
3215  WHERE t1.Code IN (
3216  SELECT t2.CountryCode FROM t2 WHERE Population > 5000000);
3217 
3218 SELECT Name FROM t1
3219  WHERE t1.Code IN (
3220  SELECT t2.CountryCode FROM t2 WHERE Population > 5000000);
3221 
3222 drop table t1, t2;
3223 
3224 
3225 #
3226 # BUG#35160 "Subquery optimization: table pullout is not reflected in EXPLAIN EXTENDED"
3227 #
3228 create table t0 (a int);
3229 insert into t0 values (0),(1),(2),(3),(4);
3230 
3231 create table t1 (a int, b int, key(a));
3232 insert into t1 select a,a from t0;
3233 
3234 create table t2 (a int, b int, primary key(a));
3235 insert into t2 select * from t1;
3236 
3237 # Table t2 should be pulled out because t2.a=t0.a equality
3238 --echo Table t2, unlike table t1, should be displayed as pulled out
3239 explain extended select * from t0
3240 where t0.a in ( select t1.a from t1,t2 where t2.a=t0.a and
3241 t1.b=t2.b);
3242 
3243 #
3244 # BUG#46556 "Returning incorrect, empty results for some IN subqueries
3245 # w/ semijoin=on"
3246 #
3247 
3248 # The above query did not have a valid plan before the fix of BUG#46556.
3249 # Add some data that would cause wrong result with the old plan.
3250 update t1 set a=3, b=11 where a=4;
3251 update t2 set b=11 where a=3;
3252 
3253 # the query just below may exhibit BUG#49129:
3254 create temporary table tmp select * from t0 where t0.a in
3255  (select t1.a from t1, t2 where t2.a=t0.a and t1.b=t2.b);
3256 # detect it and warn in result file if it's the case:
3257 create temporary table tmp_as_ref (a int);
3258 insert into tmp_as_ref values(0),(1),(2),(3); # correct desired result
3259 if (`select count(*) from tmp_as_ref left join tmp on tmp.a=tmp_as_ref.a
3260 where tmp.a is null`)
3261 {
3262  --echo
3263  --echo # The result below is wrong due to Bug#49129
3264 }
3265 select * from tmp;
3266 
3267 drop table t0, t1, t2, tmp, tmp_as_ref;
3268 
3269 #
3270 # BUG#35767: Processing of uncorrelated subquery with semi-join cause wrong result and crash
3271 #
3272 CREATE TABLE t1 (
3273  id int(11) NOT NULL,
3274  PRIMARY KEY (id));
3275 
3276 CREATE TABLE t2 (
3277  id int(11) NOT NULL,
3278  fid int(11) NOT NULL,
3279  PRIMARY KEY (id));
3280 
3281 insert into t1 values(1);
3282 insert into t2 values(1,7503),(2,1);
3283 
3284 --error 1054
3285 explain select count(*)
3286 from t1
3287 where fid IN (select fid from t2 where (id between 7502 and 8420) order by fid );
3288 
3289 drop table t1, t2;
3290 
3291 #
3292 # BUG#36137 "virtual longlong Item_in_subselect::val_int(): Assertion `0' failed."
3293 #
3294 create table t1 (a int, b int, key (a), key (b));
3295 insert into t1 values (2,4),(2,4),(2,4);
3296 select t1.a from t1
3297 where
3298  t1.a in (select 1 from t1 where t1.a in (select 1 from t1) group by t1.a);
3299 drop table t1;
3300 
3301 #
3302 # BUG#36128: not in subquery causes crash in cleanup..
3303 #
3304 create table t1(a int,b int,key(a),key(b));
3305 insert into t1 values (1,1),(2,2),(3,3);
3306 select 1 from t1
3307 where t1.a not in (select 1 from t1
3308  where t1.a in (select 1 from t1)
3309  group by t1.b);
3310 drop table t1;
3311 
3312 #
3313 # BUG#33743 "nested subqueries, unique index, wrong result"
3314 #
3315 CREATE TABLE t1
3316  (EMPNUM CHAR(3) NOT NULL,
3317  EMPNAME CHAR(20),
3318  GRADE DECIMAL(4),
3319  CITY CHAR(15));
3320 
3321 CREATE TABLE t2
3322  (PNUM CHAR(3) NOT NULL,
3323  PNAME CHAR(20),
3324  PTYPE CHAR(6),
3325  BUDGET DECIMAL(9),
3326  CITY CHAR(15));
3327 
3328 CREATE TABLE t3
3329  (EMPNUM CHAR(3) NOT NULL,
3330  PNUM CHAR(3) NOT NULL,
3331  HOURS DECIMAL(5));
3332 
3333 INSERT INTO t1 VALUES ('E1','Alice',12,'Deale');
3334 INSERT INTO t1 VALUES ('E2','Betty',10,'Vienna');
3335 INSERT INTO t1 VALUES ('E3','Carmen',13,'Vienna');
3336 INSERT INTO t1 VALUES ('E4','Don',12,'Deale');
3337 INSERT INTO t1 VALUES ('E5','Ed',13,'Akron');
3338 
3339 INSERT INTO t2 VALUES ('P1','MXSS','Design',10000,'Deale');
3340 INSERT INTO t2 VALUES ('P2','CALM','Code',30000,'Vienna');
3341 INSERT INTO t2 VALUES ('P3','SDP','Test',30000,'Tampa');
3342 INSERT INTO t2 VALUES ('P4','SDP','Design',20000,'Deale');
3343 INSERT INTO t2 VALUES ('P5','IRM','Test',10000,'Vienna');
3344 INSERT INTO t2 VALUES ('P6','PAYR','Design',50000,'Deale');
3345 
3346 INSERT INTO t3 VALUES ('E1','P1',40);
3347 INSERT INTO t3 VALUES ('E1','P2',20);
3348 INSERT INTO t3 VALUES ('E1','P3',80);
3349 INSERT INTO t3 VALUES ('E1','P4',20);
3350 INSERT INTO t3 VALUES ('E1','P5',12);
3351 INSERT INTO t3 VALUES ('E1','P6',12);
3352 INSERT INTO t3 VALUES ('E2','P1',40);
3353 INSERT INTO t3 VALUES ('E2','P2',80);
3354 INSERT INTO t3 VALUES ('E3','P2',20);
3355 INSERT INTO t3 VALUES ('E4','P2',20);
3356 INSERT INTO t3 VALUES ('E4','P4',40);
3357 INSERT INTO t3 VALUES ('E4','P5',80);
3358 
3359 
3360 SELECT * FROM t1;
3361 CREATE UNIQUE INDEX t1_IDX ON t1(EMPNUM);
3362 --sorted_result
3363 SELECT EMPNAME
3364 FROM t1
3365 WHERE EMPNUM IN
3366  (SELECT EMPNUM
3367  FROM t3
3368  WHERE PNUM IN
3369  (SELECT PNUM
3370  FROM t2
3371  WHERE PTYPE = 'Design'));
3372 
3373 DROP INDEX t1_IDX ON t1;
3374 CREATE INDEX t1_IDX ON t1(EMPNUM);
3375 --sorted_result
3376 SELECT EMPNAME
3377 FROM t1
3378 WHERE EMPNUM IN
3379  (SELECT EMPNUM
3380  FROM t3
3381  WHERE PNUM IN
3382  (SELECT PNUM
3383  FROM t2
3384  WHERE PTYPE = 'Design'));
3385 
3386 DROP INDEX t1_IDX ON t1;
3387 --sorted_result
3388 SELECT EMPNAME
3389 FROM t1
3390 WHERE EMPNUM IN
3391  (SELECT EMPNUM
3392  FROM t3
3393  WHERE PNUM IN
3394  (SELECT PNUM
3395  FROM t2
3396  WHERE PTYPE = 'Design'));
3397 
3398 DROP TABLE t1, t2, t3;
3399 
3400 #
3401 # BUG#33245 "Crash on VIEW referencing FROM table in an IN clause"
3402 #
3403 CREATE TABLE t1 (f1 INT NOT NULL);
3404 CREATE VIEW v1 (a) AS SELECT f1 IN (SELECT f1 FROM t1) FROM t1;
3405 SELECT * FROM v1;
3406 drop view v1;
3407 drop table t1;
3408 
3409 
3410 #
3411 # BUG#35550 "Semi-join subquery in ON clause and no WHERE crashes the server"
3412 #
3413 create table t0 (a int);
3414 insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
3415 
3416 create table t1(a int, b int);
3417 insert into t1 values (0,0),(1,1),(2,2);
3418 create table t2 as select * from t1;
3419 
3420 create table t3 (pk int, a int, primary key(pk));
3421 insert into t3 select a,a from t0;
3422 
3423 explain
3424 select * from t1 left join t2 on (t2.a= t1.a and t2.a in (select pk from t3));
3425 
3426 drop table t0, t1, t2, t3;
3427 
3428 
3429 #
3430 # BUG#35468 "Slowdown and wrong result for uncorrelated subquery w/o where"
3431 #
3432 
3433 create table t0 (a int);
3434 insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
3435 create table t1 (a int) as select A.a + 10 *(B.a + 10*C.a) as a from t0 A, t0 B, t0 C;
3436 create table t2 (id int, a int, primary key(id), key(a)) as select a as id, a as a from t1;
3437 show create table t2;
3438 set @a=0;
3439 create table t3 as select * from t2 limit 0;
3440 insert into t3 select @a:=@a+1, t2.a from t2, t0;
3441 insert into t3 select @a:=@a+1, t2.a from t2, t0;
3442 insert into t3 select @a:=@a+1, t2.a from t2, t0;
3443 
3444 alter table t3 add primary key(id), add key(a);
3445 --echo The following must use loose index scan over t3, key a:
3446 explain select count(a) from t2 where a in ( SELECT a FROM t3);
3447 select count(a) from t2 where a in ( SELECT a FROM t3);
3448 
3449 drop table t0,t1,t2,t3;
3450 
3451 
3452 --echo #
3453 --echo # Bug#33062: subquery in stored routine cause crash
3454 --echo #
3455 CREATE TABLE t1(a INT);
3456 CREATE TABLE t2(c INT);
3457 
3458 DELIMITER //;
3459 
3460 CREATE PROCEDURE p1(v1 int)
3461 BEGIN
3462  SELECT 1 FROM t1 WHERE a = v1 AND a IN (SELECT c FROM t2);
3463 END
3464 //
3465 
3466 CREATE PROCEDURE p2(v1 int)
3467 BEGIN
3468  SELECT 1 FROM t1 WHERE a IN (SELECT c FROM t2);
3469 END
3470 //
3471 
3472 CREATE PROCEDURE p3(v1 int)
3473 BEGIN
3474  SELECT 1
3475  FROM
3476  t1 t01,t1 t02,t1 t03,t1 t04,t1 t05,t1 t06,t1 t07,t1 t08,
3477  t1 t09,t1 t10,t1 t11,t1 t12,t1 t13,t1 t14,t1 t15,t1 t16,
3478  t1 t17,t1 t18,t1 t19,t1 t20,t1 t21,t1 t22,t1 t23,t1 t24,
3479  t1 t25,t1 t26,t1 t27,t1 t28,t1 t29,t1 t30,t1 t31,t1 t32,
3480  t1 t33,t1 t34,t1 t35,t1 t36,t1 t37,t1 t38,t1 t39,t1 t40,
3481  t1 t41,t1 t42,t1 t43,t1 t44,t1 t45,t1 t46,t1 t47,t1 t48,
3482  t1 t49,t1 t50,t1 t51,t1 t52,t1 t53,t1 t54,t1 t55,t1 t56,
3483  t1 t57,t1 t58,t1 t59,t1 t60
3484  WHERE t01.a IN (SELECT c FROM t2);
3485 END
3486 //
3487 
3488 CREATE PROCEDURE p4(v1 int)
3489 BEGIN
3490  SELECT 1
3491  FROM
3492  t1 t01,t1 t02,t1 t03,t1 t04,t1 t05,t1 t06,t1 t07,t1 t08,
3493  t1 t09,t1 t10,t1 t11,t1 t12,t1 t13,t1 t14,t1 t15,t1 t16,
3494  t1 t17,t1 t18,t1 t19,t1 t20,t1 t21,t1 t22,t1 t23,t1 t24,
3495  t1 t25,t1 t26,t1 t27,t1 t28,t1 t29,t1 t30,t1 t31,t1 t32,
3496  t1 t33,t1 t34,t1 t35,t1 t36,t1 t37,t1 t38,t1 t39,t1 t40,
3497  t1 t41,t1 t42,t1 t43,t1 t44,t1 t45,t1 t46,t1 t47,t1 t48,
3498  t1 t49,t1 t50,t1 t51,t1 t52,t1 t53,t1 t54,t1 t55,t1 t56,
3499  t1 t57,t1 t58,t1 t59,t1 t60
3500  WHERE t01.a = v1 AND t01.a IN (SELECT c FROM t2);
3501 END
3502 //
3503 
3504 DELIMITER ;//
3505 
3506 CALL p1(1);
3507 CALL p2(1);
3508 CALL p3(1);
3509 CALL p4(1);
3510 
3511 DROP TABLE t1, t2;
3512 DROP PROCEDURE p1;
3513 DROP PROCEDURE p2;
3514 DROP PROCEDURE p3;
3515 DROP PROCEDURE p4;
3516 
3517 
3518 --echo #
3519 --echo # Bug#48213 Materialized subselect crashes if using GEOMETRY type
3520 --echo #
3521 
3522 CREATE TABLE t1 (
3523  pk int,
3524  a varchar(1),
3525  b varchar(4),
3526  c tinyblob,
3527  d blob,
3528  e mediumblob,
3529  f longblob,
3530  g tinytext,
3531  h text,
3532  i mediumtext,
3533  j longtext,
3534  k geometry,
3535  PRIMARY KEY (pk)
3536 );
3537 
3538 INSERT INTO t1 VALUES (1,'o','ffff','ffff','ffoo','ffff','ffff','ffff','ffff','ffff','ffff',GeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))')), (2,'f','ffff','ffff','ffff', 'ffff','ffff','ffff','ffff','ffff','ffff',GeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))'));
3539 
3540 CREATE TABLE t2 LIKE t1;
3541 INSERT INTO t2 VALUES (1,'i','iiii','iiii','iiii','iiii','ffff','ffff','ffff','ffff','ffff',GeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))')), (2,'f','ffff','ffff','ffff','ffff','ffff','ffff','ffff','ffff','ffff',GeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))'));
3542 
3543 # Test that materialization is skipped for semijoins where materialized
3544 # table would contain GEOMETRY or different kinds of BLOB/TEXT columns
3545 let $query=
3546 SELECT pk FROM t1 WHERE (a, b) IN (SELECT a, b FROM t2 WHERE pk > 0);
3547 eval EXPLAIN EXTENDED $query;
3548 eval $query;
3549 
3550 let $query=
3551 SELECT pk FROM t1 WHERE (b, c) IN (SELECT b, c FROM t2 WHERE pk > 0);
3552 eval EXPLAIN EXTENDED $query;
3553 eval $query;
3554 
3555 let $query=
3556 SELECT pk FROM t1 WHERE (b, d) IN (SELECT b, d FROM t2 WHERE pk > 0);
3557 eval EXPLAIN EXTENDED $query;
3558 eval $query;
3559 
3560 let $query=
3561 SELECT pk FROM t1 WHERE (b, e) IN (SELECT b, e FROM t2 WHERE pk > 0);
3562 eval EXPLAIN EXTENDED $query;
3563 eval $query;
3564 
3565 let $query=
3566 SELECT pk FROM t1 WHERE (b, f) IN (SELECT b, f FROM t2 WHERE pk > 0);
3567 eval EXPLAIN EXTENDED $query;
3568 eval $query;
3569 
3570 let $query=
3571 SELECT pk FROM t1 WHERE (b, g) IN (SELECT b, g FROM t2 WHERE pk > 0);
3572 eval EXPLAIN EXTENDED $query;
3573 eval $query;
3574 
3575 let $query=
3576 SELECT pk FROM t1 WHERE (b, h) IN (SELECT b, h FROM t2 WHERE pk > 0);
3577 eval EXPLAIN EXTENDED $query;
3578 eval $query;
3579 
3580 let $query=
3581 SELECT pk FROM t1 WHERE (b, i) IN (SELECT b, i FROM t2 WHERE pk > 0);
3582 eval EXPLAIN EXTENDED $query;
3583 eval $query;
3584 
3585 let $query=
3586 SELECT pk FROM t1 WHERE (b, j) IN (SELECT b, j FROM t2 WHERE pk > 0);
3587 eval EXPLAIN EXTENDED $query;
3588 eval $query;
3589 
3590 let $query=
3591 SELECT pk FROM t1 WHERE (b, k) IN (SELECT b, k FROM t2 WHERE pk > 0);
3592 eval EXPLAIN EXTENDED $query;
3593 eval $query;
3594 
3595 DROP TABLE t1, t2;
3596 --echo # End of Bug#48213
3597 
3598 --echo #
3599 --echo # BUG#53060: LooseScan semijoin strategy does not return all rows
3600 --echo #
3601 
3602 CREATE TABLE t1 (i INTEGER);
3603 INSERT INTO t1 VALUES (1), (2), (3), (4), (5);
3604 CREATE TABLE t2 (i INTEGER, j INTEGER, KEY k(i, j));
3605 INSERT INTO t2 VALUES (1, 0), (1, 1), (2, 0), (2, 1);
3606 
3607 EXPLAIN
3608 SELECT * FROM t1 WHERE (i) IN (SELECT i FROM t2 where j > 0);
3609 SELECT * FROM t1 WHERE (i) IN (SELECT i FROM t2 where j > 0);
3610 
3611 DROP TABLE t1, t2;
3612 
3613 --echo # End of BUG#53060
3614 --echo #
3615 --echo # Bug#53305 "Duplicate weedout + join buffer (join cache --level=7,8) loses rows"
3616 --echo #
3617 
3618 create table t1 (uid int, fid int, index(uid));
3619 insert into t1 values
3620  (1,1), (1,2), (1,3), (1,4),
3621  (2,5), (2,6), (2,7), (2,8),
3622  (3,1), (3,2), (3,9);
3623 
3624 create table t2 (uid int primary key, name varchar(128), index(name));
3625 insert into t2 values
3626  (1, "A"), (2, "B"), (3, "C"), (4, "D"), (5, "E"),
3627  (6, "F"), (7, "G"), (8, "H"), (9, "I");
3628 
3629 create table t3 (uid int, fid int, index(uid));
3630 insert into t3 values
3631  (1,1), (1,2), (1,3),(1,4),
3632  (2,5), (2,6), (2,7), (2,8),
3633  (3,1), (3,2), (3,9);
3634 
3635 create table t4 (uid int primary key, name varchar(128), index(name));
3636 insert into t4 values
3637  (1, "A"), (2, "B"), (3, "C"), (4, "D"), (5, "E"),
3638  (6, "F"), (7, "G"), (8, "H"), (9, "I");
3639 
3640 explain select name from t2, t1
3641  where t1.uid in (select t4.uid from t4, t3 where t3.uid=1 and t4.uid=t3.fid)
3642  and t2.uid=t1.fid;
3643 
3644 --sorted_result
3645 select name from t2, t1
3646  where t1.uid in (select t4.uid from t4, t3 where t3.uid=1 and t4.uid=t3.fid)
3647  and t2.uid=t1.fid;
3648 
3649 drop table t1,t2,t3,t4;
3650 
3651 --echo #
3652 --echo # Bug#43768 Prepared query with nested subqueries core dump on second execution
3653 --echo #
3654 
3655 CREATE TABLE t1 (
3656  id INT PRIMARY KEY,
3657  partner_id VARCHAR(35)
3658 );
3659 
3660 INSERT INTO t1 VALUES
3661  (1, 'partner1'), (2, 'partner2'),
3662  (3, 'partner3'), (4, 'partner4');
3663 
3664 CREATE TABLE t2 (
3665  id INT NOT NULL,
3666  t1_line_id INT,
3667  article_id VARCHAR(20),
3668  PRIMARY KEY(id, t1_line_id)
3669 );
3670 
3671 INSERT INTO t2 VALUES
3672  (1, 1, 'sup'), (2, 1, 'sup'),
3673  (2, 2, 'sup'), (2, 3, 'sup'),
3674  (2, 4, 'imp'), (3, 1, 'sup'),
3675  (4, 1, 'sup');
3676 
3677 CREATE TABLE t3 (
3678  user_id VARCHAR(50),
3679  article_id VARCHAR(20) NOT NULL,
3680  PRIMARY KEY(user_id)
3681 );
3682 
3683 INSERT INTO t3 VALUES('nicke', 'imp');
3684 
3685 EXPLAIN
3686 SELECT t1.partner_id
3687 FROM t1
3688 WHERE t1.id IN (
3689  SELECT t2.id
3690  FROM t2
3691  WHERE article_id IN (
3692  SELECT article_id FROM t3
3693  WHERE user_id = 'nicke'
3694  )
3695  );
3696 
3697 SELECT t1.partner_id
3698 FROM t1
3699 WHERE t1.id IN (
3700  SELECT t2.id
3701  FROM t2
3702  WHERE article_id IN (
3703  SELECT article_id FROM t3
3704  WHERE user_id = 'nicke'
3705  )
3706  );
3707 
3708 PREPARE stmt FROM
3709 'EXPLAIN SELECT t1.partner_id
3710 FROM t1
3711 WHERE t1.id IN (
3712  SELECT t2.id
3713  FROM t2
3714  WHERE article_id IN (
3715  SELECT article_id FROM t3
3716  WHERE user_id = \'nicke\'
3717  )
3718  )';
3719 EXECUTE stmt;
3720 EXECUTE stmt;
3721 
3722 PREPARE stmt FROM
3723 'SELECT t1.partner_id
3724 FROM t1
3725 WHERE t1.id IN (
3726  SELECT t2.id
3727  FROM t2
3728  WHERE article_id IN (
3729  SELECT article_id FROM t3
3730  WHERE user_id = \'nicke\'
3731  )
3732  )';
3733 EXECUTE stmt;
3734 EXECUTE stmt;
3735 
3736 DROP TABLE t1,t2,t3;
3737 
3738 --echo # End of Bug#43768
3739 
3740 --echo #
3741 --echo # Bug#53058 - semijoin execution of subquery with outerjoin yields wrong result
3742 --echo #
3743 CREATE TABLE t1 (i INTEGER);
3744 CREATE TABLE t2 (i INTEGER);
3745 CREATE TABLE t3 (i INTEGER);
3746 INSERT INTO t1 VALUES (1), (2);
3747 INSERT INTO t2 VALUES (6);
3748 INSERT INTO t3 VALUES (1), (2);
3749 explain extended SELECT * FROM t1 WHERE (t1.i) IN
3750 (SELECT t3.i FROM t3 LEFT JOIN t2 ON t2.i=t3.i);
3751 SELECT * FROM t1 WHERE (t1.i) IN
3752 (SELECT t3.i FROM t3 LEFT JOIN t2 ON t2.i=t3.i);
3753 drop table t1,t2,t3;
3754 
3755 --echo #
3756 --echo # BUG#49453: re-execution of prepared statement with view
3757 --echo # and semijoin crashes
3758 --echo #
3759 CREATE TABLE t1 (city VARCHAR(50), country_id INT);
3760 CREATE TABLE t2 (country_id INT, country VARCHAR(50));
3761 
3762 INSERT INTO t1 VALUES
3763  ('Batna',2),('Bchar',2),('Skikda',2),('Tafuna',3),('Algeria',2) ;
3764 INSERT INTO t2 VALUES (2,'Algeria'),(2,'AlgeriaDup'),(3,'XAmerican Samoa');
3765 
3766 CREATE VIEW v1 AS
3767  SELECT country_id as vf_country_id
3768  FROM t2
3769  WHERE LEFT(country,1) = "A";
3770 
3771 PREPARE stmt FROM "
3772 SELECT city, country_id
3773 FROM t1
3774 WHERE country_id IN (SELECT vf_country_id FROM v1);
3775 ";
3776 
3777 --echo
3778 EXECUTE stmt;
3779 EXECUTE stmt;
3780 
3781 DROP TABLE t1,t2;
3782 DROP VIEW v1;
3783 
3784 --echo #
3785 --echo # Bug#54437 Extra rows with LEFT JOIN + semijoin (firstmatch
3786 --echo # and duplicates weedout)
3787 --echo #
3788 create table t1 (a int);
3789 create table t2 (a int);
3790 create table t3 (a int);
3791 insert into t1 values(1),(1);
3792 insert into t2 values(1),(1),(1),(1);
3793 insert into t3 values(2),(2);
3794 
3795 let $query=select * from t1 where t1.a in (select t2.a from t2 left join t3 on t2.a=t3.a);
3796 eval explain $query;
3797 eval $query;
3798 
3799 drop table t1,t2,t3;
3800 
3801 --echo #
3802 --echo # Bug#55955: crash in MEMORY engine with IN(LEFT JOIN (JOIN))
3803 --echo #
3804 CREATE TABLE t1 (a INT);
3805 CREATE TABLE t2 (a INT);
3806 CREATE TABLE t3 (a INT);
3807 INSERT INTO t1 VALUES(1),(1);
3808 INSERT INTO t2 VALUES(1),(1);
3809 INSERT INTO t3 VALUES(2),(2);
3810 
3811 let $query=
3812 SELECT * FROM t1
3813 WHERE t1.a IN (SELECT t2.a
3814  FROM t2 LEFT JOIN (t2 AS t2inner, t3) ON t2.a=t3.a);
3815 eval explain $query;
3816 eval $query;
3817 
3818 DROP TABLE t1,t2,t3;
3819 
3820 --echo #
3821 --echo # BUG#52329 - Wrong result: subquery materialization, IN,
3822 --echo # non-null field followed by nullable
3823 --echo #
3824 
3825 CREATE TABLE t1 (a1 CHAR(8) NOT NULL, a2 char(8) NOT NULL);
3826 
3827 CREATE TABLE t2a (b1 char(8), b2 char(8));
3828 CREATE TABLE t2b (b1 CHAR(8), b2 char(8) NOT NULL);
3829 CREATE TABLE t2c (b1 CHAR(8) NOT NULL, b2 char(8));
3830 
3831 INSERT INTO t1 VALUES ('1 - 12', '2 - 22');
3832 
3833 INSERT INTO t2a VALUES ('1 - 11', '2 - 21'),
3834  ('1 - 11', '2 - 21'),
3835  ('1 - 12', '2 - 22'),
3836  ('1 - 12', '2 - 22'),
3837  ('1 - 13', '2 - 23');
3838 
3839 INSERT INTO t2b SELECT * FROM t2a;
3840 INSERT INTO t2c SELECT * FROM t2a;
3841 
3842 SELECT * FROM t1
3843 WHERE (a1, a2) IN (
3844  SELECT b1, b2 FROM t2c WHERE b1 > '0' GROUP BY b1, b2);
3845 
3846 SELECT * FROM t1
3847 WHERE (a1, a2) IN (
3848  SELECT b1, b2 FROM t2a WHERE b1 > '0');
3849 
3850 
3851 SELECT * FROM t1
3852 WHERE (a1, a2) IN (
3853  SELECT b1, b2 FROM t2b WHERE b1 > '0');
3854 
3855 
3856 SELECT * FROM t1
3857 WHERE (a1, a2) IN (
3858  SELECT b1, b2 FROM t2c WHERE b1 > '0');
3859 
3860 
3861 DROP TABLE t1,t2a,t2b,t2c;
3862 
3863 --echo # End BUG#52329
3864 
3865 --echo #
3866 --echo # Bug#45174: Incorrectly applied equality propagation caused wrong
3867 --echo # result on a query with a materialized semi-join.
3868 --echo #
3869 
3870 CREATE TABLE t1 (
3871  varchar_nokey varchar(1) NOT NULL
3872 );
3873 
3874 INSERT INTO t1 VALUES
3875  ('v'), ('u'), ('n'), ('l'), ('h'), ('u'), ('n'), ('j'), ('k'),
3876  ('e'), ('i'), ('u'), ('n'), ('b'), ('x'), (''), ('q'), ('u');
3877 
3878 CREATE TABLE t2 (
3879  pk int NOT NULL,
3880  varchar_key varchar(1) NOT NULL,
3881  varchar_nokey varchar(1) NOT NULL,
3882  PRIMARY KEY(pk),
3883  KEY varchar_key(varchar_key)
3884 );
3885 
3886 INSERT INTO t2 VALUES
3887  (11,'m','m'), (12,'j','j'), (13,'z','z'), (14,'a','a'), (15,'',''),
3888  (16,'e','e'), (17,'t','t'), (19,'b','b'), (20,'w','w'), (21,'m','m'),
3889  (23,'',''), (24,'w','w'), (26,'e','e'), (27,'e','e'), (28,'p','p');
3890 
3891 let $query=
3892 SELECT varchar_nokey
3893 FROM t1
3894 WHERE (varchar_nokey, varchar_nokey) IN (SELECT varchar_key, varchar_nokey
3895  FROM t2
3896  WHERE varchar_nokey < 'n' XOR pk);
3897 eval $query;
3898 eval explain $query;
3899 
3900 DROP TABLE t1, t2;
3901 
3902 --echo # End of the test for bug#45174.
3903 
3904 --echo #
3905 --echo # Bug#50019: Wrong result for IN-query with materialization
3906 --echo #
3907 
3908 CREATE TABLE t1(i INT);
3909 INSERT INTO t1 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
3910 CREATE TABLE t2(i INT);
3911 INSERT INTO t2 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
3912 CREATE TABLE t3(i INT);
3913 INSERT INTO t3 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
3914 
3915 let $query=
3916 SELECT * FROM t1 WHERE t1.i IN (SELECT t2.i
3917  FROM t2 JOIN t3
3918  WHERE t2.i + t3.i = 5);
3919 eval $query;
3920 eval explain $query;
3921 
3922 DROP TABLE t1,t2,t3;
3923 
3924 --echo # End of the test for bug#50019.
3925 
3926 --echo #
3927 --echo # Bug#52068: Optimizer generates invalid semijoin materialization plan
3928 --echo #
3929 
3930 CREATE TABLE ot1(a INTEGER);
3931 INSERT INTO ot1 VALUES(5), (8);
3932 CREATE TABLE it2(a INTEGER);
3933 INSERT INTO it2 VALUES(9), (5), (1), (8);
3934 CREATE TABLE it3(a INTEGER);
3935 INSERT INTO it3 VALUES(7), (1), (0), (5), (1), (4);
3936 CREATE TABLE ot4(a INTEGER);
3937 INSERT INTO ot4 VALUES(1), (3), (5), (7), (9), (7), (3), (1);
3938 
3939 let $query=
3940 SELECT * FROM ot1,ot4
3941 WHERE (ot1.a,ot4.a) IN (SELECT it2.a,it3.a
3942  FROM it2,it3);
3943 
3944 eval $query;
3945 eval explain $query;
3946 
3947 DROP TABLE IF EXISTS ot1, ot4, it2, it3;
3948 
3949 --echo # End of the test for bug#52068.
3950 
3951 --echo #
3952 --echo # Bug#57623: subquery within before insert trigger causes crash (sj=on)
3953 --echo #
3954 
3955 CREATE TABLE ot1(a INT);
3956 CREATE TABLE ot2(a INT);
3957 CREATE TABLE ot3(a INT);
3958 CREATE TABLE it1(a INT);
3959 
3960 INSERT INTO ot1 VALUES(0),(1),(2),(3),(4),(5),(6),(7);
3961 INSERT INTO ot2 VALUES(0),(2),(4),(6);
3962 INSERT INTO ot3 VALUES(0),(3),(6);
3963 INSERT INTO it1 VALUES(0),(1),(2),(3),(4),(5),(6),(7);
3964 
3965 let $query=
3966 SELECT *
3967 FROM ot1
3968  LEFT JOIN
3969  (ot2 JOIN ot3 on ot2.a=ot3.a)
3970  ON ot1.a=ot2.a AND ot1.a IN (SELECT a from it1);
3971 
3972 eval explain $query;
3973 --sorted_result
3974 eval $query;
3975 eval prepare s from '$query';
3976 --sorted_result
3977 execute s;
3978 --sorted_result
3979 execute s;
3980 deallocate prepare s;
3981 
3982 DROP TABLE ot1, ot2, ot3, it1;
3983 
3984 --echo # End of the test for bug#57623.
3985 
3986 --echo #
3987 --echo # Bug#11766739: Crash in tmp_table_param::init() with semijoin=on
3988 --echo #
3989 
3990 CREATE TABLE t1 (f1 INTEGER) ENGINE=MyISAM;
3991 CREATE TABLE t2 (f1 INTEGER, f2 INTEGER) ENGINE=MyISAM;
3992 
3993 INSERT INTO t1 VALUES (1);
3994 INSERT INTO t2 VALUES (1,1), (2,1);
3995 
3996 let $query=
3997 SELECT * FROM t2
3998 WHERE f2 IN (SELECT t1.f1
3999  FROM t1 LEFT OUTER JOIN (t2 AS b1 JOIN t2 AS b2 ON TRUE) ON TRUE);
4000 eval EXPLAIN $query;
4001 eval $query;
4002 
4003 DROP TABLE t1, t2;
4004 
4005 --echo # End of the test for bug#11766739.
4006 
4007 --echo #
4008 --echo # Bug#11766642: crash in Item_field::register_field_in_read_map with view
4009 --echo #
4010 CREATE TABLE t1(a INT);
4011 CREATE VIEW v1 AS SELECT a FROM t1;
4012 
4013 INSERT INTO t1 VALUES (0),(1),(2);
4014 
4015 SELECT a FROM t1 WHERE a IN
4016  (SELECT a XOR a FROM v1)
4017 ORDER BY a;
4018 
4019 DROP TABLE t1;
4020 DROP VIEW v1;
4021 
4022 --echo #
4023 --echo # Bug#12546542 MISSING ROW WHEN USING OPTIMIZER_JOIN_CACHE_LEVEL>=3
4024 --echo #
4025 CREATE TABLE t1 (
4026  f2 varchar(1024)
4027 );
4028 INSERT INTO t1 VALUES ('v'),('we');
4029 CREATE TABLE t2 (
4030  col_varchar_1024_utf8 varchar(1024) CHARACTER SET utf8 DEFAULT NULL,
4031  col_int_key int,
4032  col_int int
4033 );
4034 INSERT INTO t2 VALUES ('we',4,NULL),('v',1305673728,6);
4035 CREATE TABLE t3 (
4036  col_int_key int,
4037  col_int int
4038 );
4039 INSERT INTO t3 VALUES (4,4);
4040 
4041 SELECT *
4042 FROM t1
4043 WHERE f2 IN (SELECT a1.col_varchar_1024_utf8 AS f2
4044  FROM t2 AS a1 LEFT JOIN t3 AS a2
4045  ON a1.col_int_key = a2.col_int_key
4046  WHERE a1.col_int BETWEEN 1 AND 10 OR a2.col_int IS NOT NULL);
4047 DROP TABLE t1,t2,t3;
4048 
4049 --echo #
4050 --echo # BUG#12616344 - JCL: DIFFERENT RESULT SET AND DIFFERENT AMOUNT
4051 --echo # OF ROWS WHEN JCL>=3
4052 --echo #
4053 # duplicate of Bug#12546542 but still tested as query is different
4054 CREATE TABLE t1 (col_int_nokey int, col_int_key int, col_varchar_key varchar(1));
4055 INSERT INTO t1 VALUES (0,4,'c'),(1,6,'u');
4056 CREATE TABLE t2 (pk int, col_int_nokey int, col_varchar_nokey varchar(1));
4057 INSERT INTO t2 VALUES (1,4,'b'),(94,6,'u');
4058 CREATE TABLE t3 (pk int, col_int_nokey int, col_varchar_key varchar(1));
4059 INSERT INTO t3 VALUES (1,4,'j'),(2,6,'v');
4060 SELECT table2.col_int_key
4061 from t3 as table1 join t1 as table2 on table2.col_int_nokey
4062 where table1.col_int_nokey in
4063 (
4064  select subquery2_t2.col_int_nokey
4065  from t3 as subquery2_t1
4066  right join
4067  t2 as subquery2_t2
4068  join t1 as subquery2_t3
4069  on subquery2_t3.col_int_key = subquery2_t2.col_int_nokey
4070  on subquery2_t3.col_varchar_key = subquery2_t2.col_varchar_nokey
4071  where subquery2_t1.col_varchar_key != table1.col_varchar_key
4072  or subquery2_t2.pk <= table1.pk
4073 );
4074 
4075 DROP TABLE t1,t2,t3;
4076 
4077 --echo #
4078 --echo # Bug#12608157: ASSERT IN FIELD_LONG::VAL_INT WHEN USING MEMORY ENGINE
4079 --echo #
4080 
4081 CREATE TABLE t1 (i1 int);
4082 INSERT INTO t1 VALUES (1);
4083 
4084 CREATE TABLE t2 (i1 int, i2 int) ENGINE=memory;
4085 INSERT INTO t2 VALUES (1, 2),(7, 3);
4086 
4087 SELECT GRANDPARENT1.i1
4088 FROM t2 AS GRANDPARENT1
4089 WHERE GRANDPARENT1.i2
4090  IN ( SELECT PARENT1.i2
4091  FROM t2 AS PARENT1 JOIN t1 AS PARENT2 ON (PARENT1.i1 = PARENT2.i1)
4092  WHERE
4093  GRANDPARENT1.i1 IN ( SELECT CHILD1.i1 FROM t2 AS CHILD1 )
4094  ORDER BY PARENT1.i1)
4095 ORDER BY GRANDPARENT1.i2 ;
4096 
4097 DROP TABLE t1,t2;
4098 
4099 --echo #
4100 --echo # Bug#12640083: Same query executed as WHERE subquery gives different
4101 --echo # results on IN() compare
4102 --echo #
4103 
4104 CREATE TABLE t1 (
4105  pk int NOT NULL,
4106  col_varchar_1024_utf8_key varchar(1024) CHARACTER SET utf8 DEFAULT NULL,
4107  col_varchar_10_latin1_key varchar(10) DEFAULT NULL,
4108  PRIMARY KEY (pk),
4109  KEY col_varchar_1024_utf8_key(col_varchar_1024_utf8_key(333)),
4110  KEY col_varchar_10_latin1_key(col_varchar_10_latin1_key)
4111 );
4112 
4113 INSERT INTO t1 VALUES
4114 (1, 'a', 'a'),
4115 (2, 'ab', 'ab'),
4116 (3, 'abc', 'abc'),
4117 (4, 'abcd', 'abcd');
4118 
4119 CREATE TABLE t2 (
4120  pk int NOT NULL AUTO_INCREMENT,
4121  PRIMARY KEY (pk)
4122 ) ENGINE=Innodb;
4123 
4124 CREATE TABLE t3
4125 SELECT alias1.col_varchar_10_latin1_key
4126 FROM t1 AS alias1
4127  LEFT JOIN t1 AS alias2
4128  JOIN t2 AS alias3
4129  ON alias2.col_varchar_10_latin1_key
4130  ON alias1.col_varchar_1024_utf8_key
4131 WHERE alias1.pk AND alias1.pk < 3 OR alias1.pk AND alias3.pk;
4132 
4133 let $query=
4134 SELECT *
4135 FROM t3
4136 WHERE col_varchar_10_latin1_key IN (
4137  SELECT alias1.col_varchar_10_latin1_key
4138  FROM t1 AS alias1
4139  LEFT JOIN t1 AS alias2
4140  JOIN t2 AS alias3
4141  ON alias2.col_varchar_10_latin1_key
4142  ON alias1.col_varchar_1024_utf8_key
4143  WHERE alias1.pk AND alias1.pk < 3 OR alias1.pk AND alias3.pk);
4144 
4145 eval EXPLAIN $query;
4146 eval $query;
4147 
4148 DROP TABLE t1, t2, t3;
4149 
4150 --echo # End of the test for bug#12640083.
4151 
4152 --echo #
4153 --echo # Bug#12603200 - Assert in QUICK_INDEX_MERGE_SELECT::need_sorted_output
4154 --echo #
4155 
4156 CREATE TABLE t1 (
4157  pk int NOT NULL,
4158  col_int_key int NOT NULL,
4159  col_varchar_nokey varchar(1) NOT NULL,
4160  col_varchar_key varchar(1) NOT NULL,
4161  PRIMARY KEY(pk),
4162  KEY col_int_key(col_int_key),
4163  KEY col_varchar_key(col_varchar_key, col_int_key)
4164 ) engine=innodb;
4165 
4166 INSERT INTO t1 VALUES
4167 (1,7,'a','a'),
4168 (2,0,'v','v'),
4169 (3,9,'c','c'),
4170 (4,3,'m','m'),
4171 (5,2,'a','a'),
4172 (6,1,'d','d'),
4173 (7,8,'y','y'),
4174 (8,6,'t','t'),
4175 (11,7,'a','x'),
4176 (12,0,'v','v'),
4177 (13,9,'c','c'),
4178 (14,3,'m','m'),
4179 (15,2,'a','x'),
4180 (16,1,'d','d'),
4181 (17,8,'y','y'),
4182 (18,6,'t','u');
4183 
4184 CREATE TABLE t2 (
4185  pk int NOT NULL,
4186  col_int_key int NOT NULL,
4187  col_varchar_key varchar(1) NOT NULL,
4188  PRIMARY KEY(pk),
4189  KEY col_varchar_key(col_varchar_key, col_int_key)
4190 ) engine=innodb;
4191 
4192 INSERT INTO t2(pk,col_int_key,col_varchar_key) VALUES
4193 (8,7,'c'),
4194 (11,4,'l'),
4195 (12,7,'b'),
4196 (13,0,'c'),
4197 (14,2,'i'),
4198 (15,9,'h'),
4199 (16,4,'q'),
4200 (17,1,'m'),
4201 (18,9,'b'),
4202 (19,2,'e'),
4203 (20,1,'c'),
4204 (21,7,'z'),
4205 (22,4,'l'),
4206 (23,7,'z'),
4207 (24,0,'c'),
4208 (25,2,'i'),
4209 (26,9,'h'),
4210 (27,4,'q'),
4211 (28,0,'a'),
4212 (29,1,'d');
4213 
4214 let $query=
4215 SELECT outr.col_varchar_key AS x, outr.pk AS y
4216 FROM t1 AS outr
4217 WHERE outr.col_varchar_key IN (SELECT innr.col_varchar_key
4218  FROM t2 AS innr
4219  WHERE innr.col_varchar_key = 'a' OR innr.pk = 8)
4220  AND outr.col_varchar_nokey < 't'
4221 ORDER BY outr.col_varchar_key, outr.pk;
4222 
4223 -- disable_query_log
4224 -- disable_result_log
4225 ANALYZE TABLE t1;
4226 ANALYZE TABLE t2;
4227 -- enable_result_log
4228 -- enable_query_log
4229 
4230 eval EXPLAIN $query;
4231 eval $query;
4232 
4233 DROP TABLE t1, t2;
4234 
4235 --echo # End of bug#12603200
4236 
4237 --echo #
4238 --echo # Bug#12603183: Segfault in hp_movelink
4239 --echo #
4240 
4241 CREATE TABLE t1 (
4242  col_varchar_key varchar(1) ,
4243  col_varchar_nokey varchar(1) ,
4244  KEY col_varchar_key(col_varchar_key)
4245 );
4246 
4247 INSERT INTO t1 VALUES
4248 ('i','i'),
4249 ('h','h'),
4250 ('q','q'),
4251 ('a','a'),
4252 ('v','v'),
4253 ('u','u'),
4254 ('s','s'),
4255 ('y','y'),
4256 ('z','z'),
4257 ('h','h'),
4258 ('p','p'),
4259 ('e','e'),
4260 ('i','i'),
4261 ('y','y'),
4262 ('w','w');
4263 
4264 CREATE TABLE t2 (
4265  col_varchar_nokey varchar(1)
4266 );
4267 
4268 INSERT INTO t2 VALUES
4269 ('b');
4270 
4271 let $query=
4272 SELECT grandparent1.col_varchar_nokey
4273 FROM t1 AS grandparent1 LEFT JOIN t2 AS grandparent2 USING (col_varchar_nokey)
4274 WHERE (grandparent1.col_varchar_key) IN
4275  (SELECT parent1.col_varchar_nokey
4276  FROM t1 AS parent1
4277  WHERE parent1.col_varchar_key IN
4278  (SELECT child1.col_varchar_nokey AS c1
4279  FROM t1 AS child1 LEFT JOIN t2 AS child2
4280  ON (child1.col_varchar_key > child2.col_varchar_nokey)));
4281 
4282 eval EXPLAIN $query;
4283 --sorted_result
4284 eval $query;
4285 
4286 DROP TABLE t1, t2;
4287 
4288 --echo # End of test for bug#12603183.
4289 
4290 --echo #
4291 --echo # Bug#12818569: Diff nr of rows returned when using IN/ALL+subquery
4292 --echo #
4293 
4294 CREATE TABLE t1 (
4295  col_int_key INT NOT NULL,
4296  col_datetime_key DATETIME NOT NULL,
4297  col_varchar_key VARCHAR(1) NOT NULL,
4298  KEY col_int_key (col_int_key),
4299  KEY col_datetime_key(col_datetime_key),
4300  KEY col_varchar_key (col_varchar_key,col_int_key)
4301 ) ENGINE=InnoDB;
4302 
4303 INSERT INTO t1 VALUES
4304  (7,'2004-06-06 04:22:12','v'), (0,'2005-11-13 01:12:31','s'),
4305  (9,'2002-05-04 01:50:00','l'), (3,'2004-10-27 10:28:45','y'),
4306  (4,'2006-07-22 05:24:23','c'), (2,'2002-05-16 21:34:03','i'),
4307  (5,'2008-04-17 10:45:30','h'), (3,'2009-04-21 02:58:02','q'),
4308  (1,'2008-01-11 11:01:51','a'), (3,'1900-01-01 00:00:00','v'),
4309  (6,'2007-05-17 18:24:57','u'), (7,'2007-08-07 00:00:00','s'),
4310  (5,'2001-08-28 00:00:00','y'), (1,'2004-04-16 00:27:28','z'),
4311  (204,'2005-05-03 07:06:22','h'), (224,'2009-03-11 17:09:50','p'),
4312  (9,'2007-12-08 01:54:28','e'), (5,'2009-07-28 18:19:54','i'),
4313  (0,'2008-06-08 00:00:00','y'), (3,'2005-02-09 09:20:26','w');
4314 
4315 CREATE TABLE t2 (
4316  col_varchar_nokey VARCHAR(1) NOT NULL
4317 ) ENGINE=InnoDB;
4318 
4319 INSERT INTO t2 VALUES ('v'), ('y'), ('j'), ('c'), ('d'), ('r');
4320 
4321 -- disable_query_log
4322 -- disable_result_log
4323 ANALYZE TABLE t1;
4324 ANALYZE TABLE t2;
4325 -- enable_result_log
4326 -- enable_query_log
4327 
4328 let $query=
4329 SELECT col_varchar_key
4330 FROM t1
4331 WHERE col_varchar_key IN (SELECT col_varchar_nokey
4332  FROM t2)
4333 ORDER BY col_datetime_key LIMIT 4;
4334 
4335 eval explain $query;
4336 eval $query;
4337 
4338 DROP TABLE t1, t2;
4339 
4340 --echo # End of test for bug#12818569.
4341 
4342 --echo #
4343 --echo # Bug#12803439: Assert in replace_subcondition() on update query
4344 --echo #
4345 
4346 CREATE TABLE t1(a INTEGER);
4347 
4348 INSERT INTO t1 values(1), (2);
4349 
4350 CREATE TABLE t2(a INTEGER);
4351 
4352 INSERT INTO t2 VALUES(1), (3);
4353 
4354 SELECT *
4355 FROM t1
4356 WHERE a IN (SELECT a
4357  FROM t2
4358  HAVING a IN (SELECT a
4359  FROM t2)
4360  )
4361 HAVING a IN (SELECT a
4362  FROM t2);
4363 
4364 DROP TABLE t1, t2;
4365 
4366 --echo # End of test for bug#12803439.
4367 
4368 --echo #
4369 --echo # Bug#12797534: Segfault in hp_movelink still exists
4370 --echo #
4371 
4372 CREATE TABLE t1 (
4373  g1 VARCHAR(1) NOT NULL
4374 ) ENGINE=InnoDB;
4375 
4376 INSERT INTO t1 VALUES ('d'), ('s');
4377 
4378 CREATE TABLE t2 (
4379  pk INT NOT NULL,
4380  col_int_key INT NOT NULL,
4381  col_varchar_key VARCHAR(1) NOT NULL,
4382  col_varchar_nokey VARCHAR(1) NOT NULL,
4383  PRIMARY KEY (pk),
4384  KEY col_varchar_key(col_varchar_key, col_int_key)
4385 ) ENGINE=InnoDB;
4386 
4387 INSERT INTO t2 VALUES
4388  (1,4,'j','j'), (2,6,'v','v'), (3,3,'c','c'), (4,5,'m','m'),
4389  (5,3,'d','d'), (6,246,'d','d'), (7,2,'y','y'), (8,9,'t','t'),
4390  (9,3,'d','d'), (10,8,'s','s'), (11,1,'r','r'), (12,8,'m','m'),
4391  (13,8,'b','b'), (14,5,'x','x'), (15,7,'g','g'), (16,5,'p','p'),
4392  (17,1,'q','q'), (18,6,'w','w'), (19,2,'d','d'), (20,9,'e','e');
4393 
4394 CREATE TABLE t3 (
4395  pk INTEGER NOT NULL,
4396  PRIMARY KEY (pk)
4397 ) ENGINE=InnoDB;
4398 
4399 INSERT INTO t3 VALUES (10);
4400 
4401 -- disable_query_log
4402 -- disable_result_log
4403 ANALYZE TABLE t1;
4404 ANALYZE TABLE t2;
4405 ANALYZE TABLE t3;
4406 ANALYZE TABLE grandparent1;
4407 ANALYZE TABLE parent1;
4408 -- enable_result_log
4409 -- enable_query_log
4410 
4411 let $query=
4412 SELECT *
4413 FROM t1
4414 WHERE g1 NOT IN
4415  (SELECT grandparent1.col_varchar_nokey AS g1
4416  FROM t2 AS grandparent1
4417  WHERE grandparent1.col_varchar_key IN
4418  (SELECT parent1.col_varchar_nokey AS p1
4419  FROM t2 AS parent1 LEFT JOIN t3 AS parent2 USING (pk)
4420  )
4421  AND grandparent1.col_varchar_key IS NOT NULL
4422  );
4423 
4424 eval EXPLAIN $query;
4425 eval $query;
4426 
4427 DROP TABLE t1, t2, t3;
4428 
4429 CREATE TABLE t1 (
4430  pk INTEGER AUTO_INCREMENT,
4431  col_int_key INTEGER ,
4432  col_varchar_key VARCHAR(1) ,
4433  col_varchar_nokey VARCHAR(1) ,
4434  PRIMARY KEY (pk),
4435  KEY (col_varchar_key,col_int_key)
4436  ) ENGINE=INNODB;
4437 INSERT INTO t1 (col_int_key,col_varchar_key,col_varchar_nokey) VALUES
4438  (0,'x','x'), (1,'j','j'), (1,'r','r'), (9,'v','v'), (5,'r','r');
4439 
4440 CREATE TABLE t2 (
4441  pk INTEGER AUTO_INCREMENT,
4442  col_int_key INTEGER ,
4443  col_varchar_key VARCHAR(1) ,
4444  col_varchar_nokey VARCHAR(1) ,
4445  PRIMARY KEY (pk),
4446  KEY (col_int_key),
4447  KEY (col_varchar_key,col_int_key)
4448  ) AUTO_INCREMENT=10 ENGINE=INNODB;
4449 INSERT INTO t2 (col_int_key, col_varchar_key, col_varchar_nokey) VALUES
4450  (NULL,'x','x'), (NULL,'j','j'), (8,'c','c');
4451 
4452 CREATE TABLE t3
4453 SELECT outr.col_varchar_nokey AS x
4454 FROM t1 AS outr
4455 WHERE outr.col_varchar_nokey IN
4456  (SELECT innr.col_varchar_nokey AS y
4457  FROM t2 AS innr
4458  WHERE innr.col_int_key IS NULL)
4459  AND outr.col_varchar_nokey IS NOT NULL
4460  AND NOT col_varchar_key IS NULL;
4461 
4462 SELECT *
4463 FROM t3
4464 WHERE x NOT IN
4465  (SELECT outr.col_varchar_nokey AS x
4466  FROM t1 AS outr
4467  WHERE outr.col_varchar_nokey IN
4468  (SELECT innr.col_varchar_nokey AS y
4469  FROM t2 AS innr
4470  WHERE innr.col_int_key IS NULL)
4471  AND outr.col_varchar_nokey IS NOT NULL
4472  AND NOT col_varchar_key IS NULL);
4473 
4474 DROP TABLE t1, t2, t3;
4475 
4476 --echo # End of test for bug#12797534.
4477 
4478 --echo #
4479 --echo # Bug#12714094: Assert in optimize_semijoin_nests()
4480 --echo #
4481 
4482 CREATE TABLE it (
4483  pk int NOT NULL,
4484  col_varchar VARCHAR(10) DEFAULT NULL,
4485  PRIMARY KEY (pk)
4486 ) ENGINE=MyISAM;
4487 
4488 INSERT INTO it VALUES (1, 'g');
4489 
4490 CREATE TABLE ot
4491  SELECT alias1.pk AS field1
4492  FROM it AS alias1
4493  LEFT JOIN it AS alias2
4494  ON alias1.col_varchar = alias2.col_varchar
4495 ;
4496 SELECT *
4497 FROM ot
4498 WHERE field1 IN (
4499  SELECT alias1.pk
4500  FROM it AS alias1
4501  LEFT JOIN it AS alias2
4502  ON alias1.col_varchar = alias2.col_varchar
4503 );
4504 
4505 DROP TABLE it, ot;
4506 
4507 --echo # End of test for bug#12714094
4508 
4509 --echo #
4510 --echo # Bug#12867557: Valgrind: conditional jump/move at key_cmp
4511 --echo #
4512 
4513 CREATE TABLE t1 (
4514  pk INTEGER AUTO_INCREMENT,
4515  col_int_key INTEGER,
4516  PRIMARY KEY (pk),
4517  KEY (col_int_key)
4518 ) AUTO_INCREMENT=10;
4519 
4520 INSERT INTO t1 (col_int_key) VALUES (8);
4521 
4522 CREATE TABLE t2 (
4523  pk INTEGER AUTO_INCREMENT,
4524  col_int_key INTEGER,
4525  col_time_key TIME,
4526  PRIMARY KEY (pk),
4527  KEY (col_int_key),
4528  KEY (col_time_key)
4529 ) AUTO_INCREMENT=10;
4530 
4531 INSERT INTO t2 (col_int_key, col_time_key)
4532 VALUES
4533  (8, '22:55:23.019225'), (7, '10:19:31.050677'), (1, '14:40:36.038608'),
4534  (7, '04:37:47.062416'), (9, '19:34:06.054514'), (NULL,'20:35:33.022996'),
4535  (1, NULL), (9, '14:43:37.057393'), (2, '02:23:09.043438'),
4536  (9, '01:22:45.041064'), (2, '00:00:00'), (4, '00:13:25.038482'),
4537  (0, '03:47:16.042671'), (4, '01:41:48.007423'), (8, '00:00:00'),
4538  (NULL, '22:32:04.047407'), (NULL, '16:44:14.028443'), (0, '17:38:37.059754'),
4539  (NULL, '08:46:48.042388'), (8, '14:11:27.044095');
4540 
4541 CREATE TABLE t0
4542 SELECT DISTINCT grandparent1.col_time_key AS g1
4543 FROM t2 AS grandparent1
4544 WHERE grandparent1.col_int_key IN
4545  (SELECT parent1.col_int_key AS p1
4546  FROM t1 AS parent1)
4547  AND grandparent1.pk > 9;
4548 
4549 UPDATE t0
4550 SET g1 = g1
4551 WHERE g1 IN
4552  (SELECT grandparent1.col_time_key AS g1
4553  FROM t2 AS grandparent1
4554  WHERE grandparent1.col_int_key IN
4555  (SELECT parent1.col_int_key AS p1
4556  FROM t1 AS parent1)
4557  AND grandparent1.pk > 9);
4558 
4559 DROP TABLE t0, t1, t2;
4560 
4561 --echo # End of test for bug#12867557
4562 
4563 --echo #
4564 --echo # Bug#12711441: crash in fix_after_pullout
4565 --echo #
4566 
4567 CREATE TABLE t1 (
4568  pk int NOT NULL,
4569  col_int_nokey int DEFAULT NULL,
4570  col_int_key int DEFAULT NULL,
4571  col_time_key time DEFAULT NULL,
4572  col_varchar_key varchar(1) DEFAULT NULL,
4573  PRIMARY KEY (pk)
4574 );
4575 
4576 CREATE VIEW v1 AS SELECT * FROM t1;
4577 
4578 CREATE TABLE t2 (
4579  col_int_key int DEFAULT NULL,
4580  col_varchar_key varchar(1) DEFAULT NULL,
4581  col_varchar_nokey varchar(1) DEFAULT NULL,
4582  KEY col_varchar_key(col_varchar_key, col_int_key)
4583 );
4584 
4585 CREATE TABLE t3 (
4586  pk int NOT NULL,
4587  col_int_key INT DEFAULT NULL,
4588  PRIMARY KEY (pk)
4589 );
4590 
4591 CREATE TABLE t4 (
4592  col_int_nokey INT DEFAULT NULL,
4593  col_varchar_key varchar(1) DEFAULT NULL,
4594  col_varchar_nokey varchar(1) DEFAULT NULL,
4595  KEY col_varchar_key(col_varchar_key)
4596 );
4597 
4598 CREATE TABLE ts
4599  SELECT alias1.col_time_key AS field1
4600  FROM v1 AS alias1
4601  RIGHT JOIN t3 AS alias2
4602  ON alias2.col_int_key = alias1.col_int_nokey
4603  WHERE alias1.pk >= SOME(
4604  SELECT SQ1_alias1.pk AS SQ1_field1
4605  FROM t3 AS SQ1_alias1
4606  INNER JOIN (t2 AS SQ1_alias2
4607  INNER JOIN t4 AS SQ1_alias3
4608  ON SQ1_alias3.col_varchar_key = SQ1_alias2.col_varchar_nokey)
4609  ON SQ1_alias3.col_int_nokey = SQ1_alias2.col_int_key
4610  WHERE SQ1_alias2.col_varchar_key <= alias1.col_varchar_key
4611  AND SQ1_alias3.col_varchar_nokey <> alias1.col_varchar_key)
4612 ;
4613 
4614 SELECT * FROM ts WHERE field1 IN (
4615  SELECT alias1.col_time_key AS field1
4616  FROM v1 AS alias1
4617  RIGHT JOIN t3 AS alias2
4618  ON alias2.col_int_key = alias1.col_int_nokey
4619  WHERE alias1.pk >= SOME(
4620  SELECT SQ1_alias1.pk AS SQ1_field1
4621  FROM t3 AS SQ1_alias1
4622  INNER JOIN (t2 AS SQ1_alias2
4623  INNER JOIN t4 AS SQ1_alias3
4624  ON SQ1_alias3.col_varchar_key = SQ1_alias2.col_varchar_nokey)
4625  ON SQ1_alias3.col_int_nokey = SQ1_alias2.col_int_key
4626  WHERE SQ1_alias2.col_varchar_key <= alias1.col_varchar_key
4627  AND SQ1_alias3.col_varchar_nokey <> alias1.col_varchar_key)
4628 );
4629 
4630 DROP TABLE t1, t2, t3, t4, ts;
4631 DROP VIEW v1;
4632 
4633 --echo # End of test for bug#12711441.
4634 
4635 --echo #
4636 --echo # Bug#12664936: Same query executed as where subquery ...
4637 --echo #
4638 
4639 CREATE TABLE t1 (
4640  col_varchar_key VARCHAR(1),
4641  KEY col_varchar_key (col_varchar_key)
4642 );
4643 
4644 INSERT INTO t1 VALUES
4645  ('o'), ('w'), ('m'), ('q'),
4646  ('f'), ('p'), ('j'), ('c');
4647 
4648 CREATE TABLE t2 (
4649  col_int_nokey INTEGER,
4650  col_int_key INTEGER,
4651  col_varchar_key varchar(1),
4652  KEY col_int_key (col_int_key)
4653 );
4654 
4655 INSERT INTO t2 VALUES
4656  (8,5,'u'),(4,5,'p'),(8,1,'o'),(NULL,7,'v'),
4657  (1,2,'g'),(2,1,'q'),(NULL,7,'l'),(3,1,'n');
4658 
4659 CREATE TABLE t4
4660 SELECT t2.col_int_nokey, t2.col_varchar_key
4661 FROM t1 JOIN t2 ON t2.col_varchar_key = t1.col_varchar_key
4662 WHERE t2.col_int_key = 1;
4663 
4664 let $query=
4665 SELECT *
4666 FROM t4
4667 WHERE (col_int_nokey, col_varchar_key) IN
4668  (SELECT t2.col_int_nokey, t2.col_varchar_key
4669  FROM t1 JOIN t2 ON t2.col_varchar_key = t1.col_varchar_key
4670  WHERE t2.col_int_key = 1
4671 );
4672 
4673 eval EXPLAIN $query;
4674 eval $query;
4675 
4676 DROP TABLE t1, t2, t4;
4677 
4678 --echo # End of test for bug#12664936.
4679 
4680 --echo #
4681 --echo # Bug#13340270: assertion table->sort.record_pointers == __null
4682 --echo #
4683 
4684 CREATE TABLE t1 (
4685  pk int NOT NULL,
4686  col_int_key int DEFAULT NULL,
4687  col_varchar_key varchar(1) DEFAULT NULL,
4688  col_varchar_nokey varchar(1) DEFAULT NULL,
4689  PRIMARY KEY (pk),
4690  KEY col_int_key (col_int_key),
4691  KEY col_varchar_key (col_varchar_key, col_int_key)
4692 ) ENGINE=InnoDB;
4693 
4694 INSERT INTO t1 VALUES
4695 (10,8,'x','x'),
4696 (11,7,'d','d'),
4697 (12,1,'r','r'),
4698 (13,7,'f','f'),
4699 (14,9,'y','y'),
4700 (15,NULL,'u','u'),
4701 (16,1,'m','m'),
4702 (17,9,NULL,NULL),
4703 (18,2,'o','o'),
4704 (19,9,'w','w'),
4705 (20,2,'m','m'),
4706 (21,4,'q','q');
4707 
4708 let $query=
4709  SELECT alias1.col_varchar_nokey AS field1
4710  FROM t1 AS alias1 JOIN t1 AS alias2
4711  ON alias2.col_int_key = alias1.pk OR
4712  alias2.col_int_key = alias1.col_int_key
4713  WHERE alias1.pk = 58 OR alias1.col_varchar_key = 'o'
4714 ;
4715 
4716 eval CREATE TABLE t2
4717  $query
4718 ;
4719 
4720 -- disable_query_log
4721 -- disable_result_log
4722 ANALYZE TABLE t1;
4723 ANALYZE TABLE t2;
4724 -- enable_result_log
4725 -- enable_query_log
4726 
4727 eval EXPLAIN SELECT *
4728 FROM t2
4729 WHERE (field1) IN ($query);
4730 
4731 eval SELECT *
4732 FROM t2
4733 WHERE (field1) IN ($query);
4734 
4735 DROP TABLE t1, t2;
4736 
4737 --echo # End of test for bug#13340270.
4738 
4739 --echo #
4740 --echo # Bug#13335319: Seg fault when analyzing FirstMatch semi-join strategy
4741 --echo #
4742 
4743 CREATE TABLE ot1(a INTEGER);
4744 
4745 INSERT INTO ot1 VALUES(1), (2), (3);
4746 
4747 CREATE TABLE ot2(a INTEGER);
4748 
4749 INSERT INTO ot2 VALUES(1), (2), (4), (6), (8), (10);
4750 
4751 CREATE TABLE it1(a INTEGER);
4752 
4753 INSERT INTO it1 VALUES(1), (3), (5), (7);
4754 
4755 CREATE TABLE it2(a INTEGER);
4756 
4757 INSERT INTO it2 VALUES(1), (3), (5), (7), (9);
4758 
4759 let $query=
4760 SELECT ot1.a, ot2.a
4761 FROM ot1, ot2
4762 WHERE ot1.a IN (SELECT a FROM it1) AND
4763  ot2.a IN (SELECT a FROM it2);
4764 
4765 eval explain $query;
4766 eval $query;
4767 
4768 DROP TABLE ot1, ot2, it1, it2;
4769 
4770 --echo # End of test for bug#13335319.
4771 
4772 --echo #
4773 --echo # Bug#13334882: Assertion keypart_map failed in MyIsam function
4774 --echo #
4775 
4776 CREATE TABLE t1 (
4777  pk int NOT NULL,
4778  col_int_nokey INT NOT NULL,
4779  col_int_key INT NOT NULL,
4780  PRIMARY KEY (pk),
4781  KEY col_int_key (col_int_key)
4782 ) ENGINE=MyISAM;
4783 
4784 INSERT INTO t1 VALUES
4785 (1,4,0),
4786 (2,6,8),
4787 (3,3,1),
4788 (7,2,6),
4789 (8,9,1),
4790 (9,3,6),
4791 (10,8,2),
4792 (11,1,4),
4793 (12,8,8),
4794 (13,8,4),
4795 (14,5,4);
4796 
4797 CREATE TABLE t2 (
4798  pk int NOT NULL,
4799  col_int_nokey int NOT NULL,
4800  col_int_key int NOT NULL,
4801  PRIMARY KEY (pk),
4802  KEY col_int_key (col_int_key)
4803 ) ENGINE=MyISAM;
4804 
4805 INSERT INTO t2 VALUES
4806 (10,8,7);
4807 
4808 CREATE TABLE t3
4809 SELECT grandparent1.col_int_nokey AS g1
4810 FROM t1 AS grandparent1
4811 WHERE (grandparent1.col_int_nokey, grandparent1.col_int_key) IN
4812  (SELECT parent1.col_int_key AS p1,
4813  parent1.col_int_key AS p2
4814  FROM t1 AS parent1
4815  LEFT JOIN t2 AS parent2
4816  ON parent1.col_int_nokey = parent2.col_int_key
4817  )
4818  AND grandparent1.col_int_key <> 3
4819 ;
4820 
4821 let $query=
4822 SELECT * FROM t3
4823 WHERE g1 NOT IN
4824  (SELECT grandparent1.col_int_nokey AS g1
4825  FROM t1 AS grandparent1
4826  WHERE (grandparent1.col_int_nokey, grandparent1.col_int_key) IN
4827  (SELECT parent1.col_int_key AS p1,
4828  parent1.col_int_key AS p2
4829  FROM t1 AS parent1
4830  LEFT JOIN t2 AS parent2
4831  ON parent1.col_int_nokey = parent2.col_int_key
4832  )
4833  AND grandparent1.col_int_key <> 3
4834 );
4835 
4836 eval explain $query;
4837 eval explain format=json $query;
4838 eval $query;
4839 
4840 DROP TABLE t1, t2, t3;
4841 
4842 --echo # End of test for bug#13334882.
4843 
4844 --echo #
4845 --echo # Bug#13339643: Assertion on JOIN::flatten_subqueries on second execution
4846 --echo #
4847 
4848 CREATE TABLE t1 (
4849  col_int_nokey INT,
4850  col_varchar_nokey VARCHAR(1)
4851 );
4852 
4853 INSERT INTO t1 VALUES
4854  (1,'o'),
4855  (2,'t');
4856 
4857 CREATE TABLE t2 LIKE t1;
4858 
4859 INSERT INTO t2 VALUES
4860  (1,'o'),
4861  (4,'f');
4862 
4863 CREATE VIEW v_t2 AS SELECT * FROM t2;
4864 
4865 CREATE TABLE t3 LIKE t1;
4866 
4867 INSERT INTO t3 VALUES
4868  (1,'o'),
4869  (4,'f');
4870 
4871 let $query=
4872 SELECT alias1.col_varchar_nokey
4873 FROM t1 AS alias1
4874  INNER JOIN v_t2 AS alias2
4875  ON alias2.col_int_nokey = alias1.col_int_nokey AND
4876  'o' IN (SELECT col_varchar_nokey
4877  FROM t3);
4878 eval explain $query;
4879 eval $query;
4880 
4881 eval PREPARE stmt FROM "$query";
4882 EXECUTE stmt;
4883 
4884 DROP VIEW v_t2;
4885 DROP TABLE t1, t2, t3;
4886 --echo # End of test for bug#13339643.
4887 
4888 --echo #
4889 --echo # Bug#13424134: Wrong result on JOIN + nested WHERE ... IN clauses
4890 --echo #
4891 
4892 CREATE TABLE t1 (
4893  pk int NOT NULL,
4894  col_int_nokey int NOT NULL,
4895  col_int_key int NOT NULL,
4896  PRIMARY KEY (pk),
4897  KEY col_int_key (col_int_key)
4898 ) ENGINE=MyIsam;
4899 
4900 INSERT INTO t1 VALUES
4901  (10,1,7), (13,7,3), (18,0,1), (23,8,1);
4902 
4903 CREATE TABLE t2 (
4904  pk int NOT NULL,
4905  col_int_key int NOT NULL,
4906  PRIMARY KEY (pk),
4907  KEY col_int_key (col_int_key)
4908 ) ENGINE=MyIsam;
4909 
4910 INSERT INTO t2 VALUES (1,7);
4911 
4912 let $query=
4913 SELECT t1a.*
4914 FROM t1 AS t1a
4915  JOIN t1 AS t1b USING ( col_int_nokey )
4916 WHERE t1a.col_int_key IN (
4917  SELECT pk
4918  FROM t2
4919  WHERE col_int_key IN (
4920  SELECT col_int_nokey
4921  FROM t1
4922  )
4923 );
4924 
4925 eval EXPLAIN $query;
4926 eval $query;
4927 
4928 ALTER TABLE t1 ENGINE=Innodb;
4929 ALTER TABLE t2 ENGINE=Innodb;
4930 
4931 eval $query;
4932 
4933 DROP TABLE t1, t2;
4934 
4935 --echo # End of test for bug#13424134.
4936 
4937 --echo #
4938 --echo # Bug#13414014: Extra rows in result on semijoin query with where ...
4939 --echo #
4940 
4941 CREATE TABLE t1 (
4942  c INT,
4943  d INT,
4944  a VARCHAR(1),
4945  b VARCHAR(1),
4946  KEY a (a)
4947 );
4948 
4949 INSERT INTO t1 VALUES
4950  (NULL,8,'x','x'), (7,4,'q','q'), (6,8,'c','c');
4951 
4952 CREATE TABLE t2 (
4953  a VARCHAR(1),
4954  KEY a (a)
4955 );
4956 
4957 INSERT INTO t2 VALUES
4958  ('c'), (NULL), ('x'), ('q');
4959 
4960 let $query=
4961 SELECT *
4962 FROM t2 AS ot
4963 WHERE (a, a) IN
4964  (SELECT a, b
4965  FROM t1 AS it
4966  WHERE it.a = 'x' OR it.c > it.d
4967  )
4968 ;
4969 
4970 eval explain $query;
4971 eval $query;
4972 
4973 DROP TABLE t1, t2;
4974 
4975 --echo # End of test for bug#13414014.
4976 
4977 --echo #
4978 --echo # Bug#13545215: Missing rows on nested in-subquery with materialization
4979 --echo #
4980 
4981 CREATE TABLE t1 (
4982  col_int_key int,
4983  col_varchar_key varchar(1),
4984  col_varchar_nokey varchar(1),
4985  KEY col_int_key (col_int_key),
4986  KEY col_varchar_key (col_varchar_key,col_int_key)
4987 ) ;
4988 
4989 INSERT INTO t1 VALUES
4990  (8,'x','x'), (0,'p','p'), (8,'c','c');
4991 
4992 CREATE TABLE t2 (
4993  pk int NOT NULL,
4994  col_varchar_key varchar(1),
4995  col_varchar_nokey varchar(1),
4996  PRIMARY KEY (pk),
4997  KEY col_varchar_key (col_varchar_key)
4998 );
4999 
5000 INSERT INTO t2 VALUES
5001  (1,'v','v'), (2,'v','v'), (3,'c','c'), (4,NULL,NULL),
5002  (5,'x','x'), (6,'i','i'), (7,'e','e'), (8,'p','p');
5003 
5004 CREATE TABLE t3 (
5005  col_int_nokey int
5006 );
5007 
5008 INSERT INTO t3 VALUES (7);
5009 
5010 let $query=
5011 SELECT grandparent1.col_varchar_nokey
5012 FROM t1 AS grandparent1 JOIN t1 AS grandparent2 USING (col_int_key)
5013 WHERE grandparent1.col_varchar_key IN (
5014  SELECT col_varchar_nokey
5015  FROM t2 AS parent1
5016  WHERE col_varchar_key IN (
5017  SELECT child1.col_varchar_nokey
5018  FROM t2 AS child1 LEFT JOIN t3 AS child2
5019  ON child1.pk < child2.col_int_nokey
5020  )
5021  );
5022 
5023 eval explain $query;
5024 --sorted_result
5025 eval $query;
5026 
5027 DROP TABLE t1, t2, t3;
5028 
5029 --echo # End of test for bug#13545215.
5030 
5031 --echo #
5032 --echo # BUG#13553211 - MISSING ROWS ON SELECT WITH IN-SUBQUERY AND
5033 --echo # MATERIALIZATION + SEMIJOIN ON
5034 --echo #
5035 CREATE TABLE t1 (
5036  col_int_key int(11) DEFAULT NULL,
5037  col_varchar_key varchar(1) DEFAULT NULL,
5038  col_varchar_nokey varchar(1) DEFAULT NULL,
5039  KEY col_int_key (col_int_key),
5040  KEY col_varchar_key (col_varchar_key,col_int_key)
5041 );
5042 
5043 INSERT INTO t1 VALUES (4,'v','v');
5044 INSERT INTO t1 VALUES (62,'v','v');
5045 INSERT INTO t1 VALUES (7,'c','c');
5046 INSERT INTO t1 VALUES (1,NULL,NULL);
5047 
5048 let $query=
5049 SELECT
5050  alias1.col_varchar_nokey AS a1_nokey,
5051  alias1.col_varchar_key AS a1_key,
5052  alias2.col_varchar_nokey AS a2_nokey
5053 FROM
5054  t1 AS alias1, t1 AS alias2
5055 WHERE
5056  (alias1.col_varchar_nokey,alias2.col_varchar_nokey)
5057  IN
5058  (
5059  SELECT
5060  SQ2_alias2.col_varchar_nokey, SQ2_alias1.col_varchar_key
5061  FROM
5062  t1 AS SQ2_alias1, t1 AS SQ2_alias2
5063  )
5064 ;
5065 
5066 eval EXPLAIN $query;
5067 --sorted_result
5068 eval $query;
5069 
5070 DROP TABLE t1;
5071 
5072 --echo #
5073 --echo # Bug#13541406: Wrong result with loosescan on select .. where .. in
5074 --echo #
5075 
5076 CREATE TABLE t1 (
5077  col_int_key INT NOT NULL,
5078  col_varchar_nokey VARCHAR(1) NOT NULL,
5079  KEY col_int_key (col_int_key)
5080 ) ENGINE=InnoDB;
5081 
5082 INSERT INTO t1 VALUES
5083  (7,'v'), (0,'s'), (9,'l'), (3,'y'), (4,'c'), (2,'i'), (5,'h'), (3,'q'),
5084  (1,'a'), (3,'v'), (6,'u'), (7,'s'), (5,'y'), (1,'z'), (204,'h'), (224,'p'),
5085  (9,'e'), (5,'i'), (0,'y'), (3,'w');
5086 
5087 CREATE TABLE t2 (
5088  pk INT NOT NULL,
5089  col_int_key INT NOT NULL,
5090  col_varchar_key VARCHAR(1) NOT NULL,
5091  col_varchar_nokey VARCHAR(1) NOT NULL,
5092  PRIMARY KEY (pk),
5093  KEY col_int_key (col_int_key),
5094  KEY col_varchar_key (col_varchar_key,col_int_key)
5095 ) ENGINE=InnoDB;
5096 
5097 INSERT INTO t2 VALUES
5098  (1,0,'j','j'), (2,8,'v','v'), (3,1,'c','c'), (4,8,'m','m'),
5099  (5,9,'d','d'), (6,24,'d','d'), (7,6,'y','y'), (8,1,'t','t'),
5100  (9,6,'d','d'), (10,2,'s','s'), (11,4,'r','r'), (12,8,'m','m'),
5101  (13,4,'b','b'), (14,4,'x','x'), (15,7,'g','g'), (16,4,'p','p'),
5102  (17,1,'q','q'), (18,9,'w','w'), (19,4,'d','d'), (20,8,'e','e');
5103 
5104 -- disable_query_log
5105 -- disable_result_log
5106 ANALYZE TABLE t1;
5107 ANALYZE TABLE t2;
5108 -- enable_result_log
5109 -- enable_query_log
5110 
5111 let $query=
5112 SELECT ot1.col_int_key AS field1
5113 FROM t2 AS ot1, t2 AS ot2
5114 WHERE (ot1.col_varchar_key, ot2.col_varchar_nokey) IN (
5115  SELECT it2.col_varchar_nokey, it1.col_varchar_key
5116  FROM t2 AS it1 JOIN t1 AS it2 ON it2.col_int_key = it1.pk);
5117 
5118 --echo # This query should never use a LooseScan strategy
5119 
5120 eval explain $query;
5121 --sorted_result
5122 eval $query;
5123 
5124 DROP TABLE t1, t2;
5125 
5126 --echo # End of test for bug#13541406.
5127 
5128 --echo #
5129 --echo # Bug#13576391: Missing rows on select with in-subquery and
5130 --echo # batched-key-access=on and semijoin
5131 --echo #
5132 
5133 CREATE TABLE t1 (
5134  col_int_nokey int NOT NULL,
5135  col_varchar_key varchar(1) NOT NULL,
5136  KEY col_varchar_key (col_varchar_key)
5137 ) engine=InnoDB;
5138 
5139 INSERT INTO t1 VALUES
5140  (1,'v'), (7,'s'), (4,'l'), (7,'y'), (0,'c'), (2,'i'), (9,'h'), (4,'q'),
5141  (0,'a'), (9,'v'), (1,'u'), (3,'s'), (8,'y'), (8,'z'), (18,'h'), (84,'p'),
5142  (6,'e'), (3,'i'), (6,'y'), (6,'w');
5143 
5144 CREATE TABLE t2 (
5145  col_int_nokey int NOT NULL,
5146  col_varchar_nokey varchar(1) NOT NULL
5147 ) engine=InnoDB;
5148 
5149 INSERT INTO t2 VALUES
5150  (4,'j'), (6,'v'), (3,'c'), (5,'m'), (3,'d'), (246,'d'), (2,'y'), (9,'t'),
5151  (3,'d'), (8,'s'), (1,'r'), (8,'m'), (8,'b'), (5,'x'), (7,'g'), (5,'p'),
5152  (1,'q'), (6,'w'), (2,'d'), (9,'e');
5153 
5154 -- disable_query_log
5155 -- disable_result_log
5156 ANALYZE TABLE t1;
5157 ANALYZE TABLE t2;
5158 -- enable_result_log
5159 -- enable_query_log
5160 
5161 let $query=
5162 SELECT col_varchar_nokey
5163 FROM t2 AS ot
5164 WHERE col_varchar_nokey IN (
5165  SELECT col_varchar_key
5166  FROM t1 AS it
5167  WHERE it.col_int_nokey <= it.col_int_nokey
5168  AND NOT ot.col_int_nokey < 2
5169 )
5170 ORDER BY col_varchar_nokey;
5171 
5172 eval explain $query;
5173 eval $query;
5174 
5175 ALTER TABLE t1 ENGINE=MyISAM;
5176 ALTER TABLE t2 ENGINE=MyISAM;
5177 
5178 eval explain $query;
5179 eval $query;
5180 
5181 ALTER TABLE t1 ENGINE=Memory;
5182 ALTER TABLE t2 ENGINE=Memory;
5183 
5184 eval explain $query;
5185 eval $query;
5186 
5187 DROP TABLE t1, t2;
5188 
5189 --echo # End of test for bug#13576391.
5190 
5191 --echo #
5192 --echo # Bug #13589848 "MISSING ROW ON SELECT WITH NESTED IN CLAUSES WHEN LOOSESCAN=ON"
5193 --echo #
5194 CREATE TABLE t1 (
5195  id INT,
5196  col_varchar_key VARCHAR(1),
5197  col_varchar_nokey VARCHAR(1),
5198  KEY (col_varchar_key)
5199 );
5200 
5201 INSERT INTO t1 VALUES (100,'m','m'),
5202 (200,'b','b'), (300,'x','x');
5203 
5204 CREATE TABLE t2 (
5205  col_varchar_key VARCHAR(1),
5206  col_varchar_nokey VARCHAR(1),
5207  KEY (col_varchar_key)
5208 );
5209 
5210 INSERT INTO t2 VALUES ('b','b');
5211 
5212 CREATE TABLE t3 (
5213  col_varchar_key VARCHAR(1),
5214  col_varchar_nokey VARCHAR(1),
5215  KEY (col_varchar_key)
5216 );
5217 
5218 INSERT INTO t3 VALUES ('k','k');
5219 
5220 let $query=SELECT GP1.id
5221 FROM t1 AS GP1 JOIN t3 AS GP2
5222  ON GP2.col_varchar_key <> GP1.col_varchar_nokey
5223 WHERE (GP1.col_varchar_nokey, GP1.col_varchar_nokey)
5224  IN (
5225  SELECT col_varchar_nokey, col_varchar_nokey
5226  FROM t1
5227  WHERE col_varchar_nokey
5228  IN ( SELECT col_varchar_key
5229  FROM t2 LEFT JOIN t3 USING (col_varchar_key) )
5230  )
5231 ;
5232 
5233 eval EXPLAIN $query;
5234 eval $query;
5235 
5236 DROP TABLE t1,t2,t3;
5237 
5238 --echo #
5239 --echo # Bug #13596176: Missing row on select with nested in clause when
5240 --echo # matr=on and bnl=off + MyISAM
5241 --echo #
5242 
5243 CREATE TABLE t1 (
5244  int_key int DEFAULT NULL,
5245  vc_key varchar(1) DEFAULT NULL,
5246  vc_nokey varchar(1) DEFAULT NULL,
5247  KEY int_key (int_key),
5248  KEY vc_key (vc_key, int_key)
5249 ) ENGINE=MyISAM;
5250 
5251 INSERT INTO t1 VALUES
5252  (8,'x','x'), (7,'d','d'), (1,'r','r'), (7,'f','f'),
5253  (9,'y','y'), (NULL,'u','u'), (1,'m','m'), (9,NULL,NULL),
5254  (2,'o','o'), (9,'w','w'), (2,'m','m'), (4,'q','q'),
5255  (0,NULL,NULL), (4,'d','d'), (8,'g','g'), (NULL,'x','x'),
5256  (NULL,'f','f'), (0,'p','p'), (NULL,'j','j'), (8,'c','c');
5257 
5258 CREATE TABLE t2 (
5259  int_key int DEFAULT NULL,
5260  vc_key varchar(1) DEFAULT NULL,
5261  KEY int_key (int_key),
5262  KEY vc_key (vc_key, int_key)
5263 ) ENGINE=MyISAM;
5264 
5265 INSERT INTO t2 VALUES (8,'g');
5266 
5267 let $query=
5268 SELECT vc_key
5269 FROM t1 as outr
5270 WHERE (vc_nokey, vc_key ) IN
5271  (SELECT vc_nokey, vc_nokey
5272  FROM t1 middle
5273  WHERE vc_nokey IN
5274  (SELECT child1.vc_key
5275  FROM t2 AS child1 JOIN t1 AS child2 USING (int_key)
5276  )
5277  );
5278 
5279 eval explain $query;
5280 eval $query;
5281 
5282 DROP TABLE t1, t2;
5283 
5284 --echo # End of test for bug#13596176.
5285 
5286 --echo #
5287 --echo # BUG#11754478: MAX/MIN + SUBQUERY + AND FAILS TO RETURN ANY ROWS
5288 --echo # BUG#13599013: MAX/MIN + SUBQUERY IN WHERE CLAUSE MATCHING NO
5289 --echo # ROWS + INDEX DOES NOT RETURN NULL
5290 --echo #
5291 
5292 CREATE TABLE t1 (
5293  pk int(11) PRIMARY KEY,
5294  int_key int(11),
5295  KEY int_key (int_key)
5296 );
5297 
5298 INSERT INTO t1 VALUES (1,0),(2,0),(3,2),(4,0),(5,3),(6,0);
5299 
5300 SELECT MIN(int_key) FROM t1 WHERE (4, 4) IN (SELECT 1, 2);
5301 SELECT MIN(int_key) FROM t1 WHERE (4, 4) IN (SELECT 4, 4);
5302 SELECT MIN(pk) FROM t1 WHERE pk IN (SELECT int_key FROM t1) AND pk = 6;
5303 
5304 DROP TABLE t1;
5305 
5306 --echo # BUG#13726217: Crash in Item_ident::fix_after_pullout()
5307 
5308 CREATE TABLE t1(a INTEGER) engine=innodb;
5309 INSERT INTO t1 VALUES (0);
5310 
5311 SELECT 0
5312 FROM t1
5313 WHERE 0 IN
5314  (SELECT 0
5315  FROM t1
5316  WHERE 0 LIKE
5317  (SELECT elt(a, 0) AS b
5318  FROM t1
5319  GROUP BY a
5320  HAVING b
5321  )
5322  );
5323 
5324 DROP TABLE t1;
5325 
5326 --echo # End of test for bug#13726217.
5327 
5328 --echo # BUG#13773979: Missing rows on second execution of prepared statement
5329 
5330 CREATE TABLE t1 (
5331  col_int_nokey INT,
5332  col_int_key INT,
5333  col_varchar_key VARCHAR(1)
5334 );
5335 
5336 INSERT INTO t1 VALUES
5337  (1,7,'v'), (7,0,'s'), (4,9,'l'), (7,3,'y'),
5338  (2,2,'i'), (9,5,'h'), (0,1,'a'), (9,3,'v');
5339 
5340 CREATE VIEW v1 AS SELECT * FROM t1;
5341 
5342 let $query=
5343 SELECT *
5344 FROM t1
5345 WHERE col_int_key IN (
5346  SELECT alias1.col_int_nokey AS field1
5347  FROM v1 AS alias1
5348  WHERE alias1.col_varchar_key < 'v'
5349 );
5350 eval $query;
5351 eval prepare stmt FROM "$query";
5352 execute stmt;
5353 execute stmt;
5354 
5355 DEALLOCATE PREPARE stmt;
5356 
5357 DROP VIEW v1;
5358 DROP TABLE t1;
5359 
5360 --echo # End of test for bug#13773979.
5361 
5362 --echo #
5363 --echo # BUG#13685026 ASSERTION CUR_SJ_INNER_TABLES == 0 IN
5364 --echo # --OPTIMIZE_TABLE_ORDER::CHOOSE_TABLE_ORDER
5365 --echo #
5366 
5367 CREATE TABLE t1 (
5368  col_int_key INT(11) NOT NULL,
5369  col_datetime_key DATETIME NOT NULL,
5370  col_varchar_key VARCHAR(1) NOT NULL,
5371  col_varchar_nokey VARCHAR(1) NOT NULL,
5372  KEY col_int_key (col_int_key),
5373  KEY col_datetime_key (col_datetime_key),
5374  KEY col_varchar_key (col_varchar_key,col_int_key)
5375 );
5376 
5377 INSERT INTO t1 VALUES (0,'2002-02-13 17:30:06','j','j');
5378 INSERT INTO t1 VALUES (8,'2008-09-27 00:34:58','v','v');
5379 
5380 CREATE TABLE t2 (
5381  col_int_key INT(11) NOT NULL,
5382  col_datetime_key DATETIME NOT NULL,
5383  col_varchar_key VARCHAR(1) NOT NULL,
5384  col_varchar_nokey VARCHAR(1) NOT NULL,
5385  KEY col_int_key (col_int_key),
5386  KEY col_datetime_key (col_datetime_key),
5387  KEY col_varchar_key (col_varchar_key,col_int_key)
5388 );
5389 
5390 INSERT INTO t2 VALUES (7,'2003-08-21 00:00:00','b','b');
5391 
5392 SET @old_depth=@@optimizer_search_depth;
5393 SET optimizer_search_depth=4;
5394 
5395 let $query=SELECT col_datetime_key
5396 FROM t1 as outr
5397 WHERE col_datetime_key IN (
5398  SELECT alias1.col_datetime_key
5399  FROM t1 AS alias1
5400  LEFT JOIN t1 as alias3
5401  STRAIGHT_JOIN ( t2 AS alias4
5402  JOIN t1 AS alias5
5403  ON alias5.col_varchar_key <= alias4.col_varchar_nokey )
5404  ON alias5.col_int_key < alias4.col_int_key
5405  ON alias5.col_varchar_key = alias4.col_varchar_key
5406 );
5407 
5408 eval EXPLAIN $query;
5409 eval $query;
5410 
5411 DROP TABLE t1,t2;
5412 SET @@optimizer_search_depth=@old_depth;
5413 
5414 --echo #
5415 --echo # BUG#13848789: SEGFAULT IN JOIN_READ_NEXT_SAME AT
5416 --echo # SQL/SQL_EXECUTOR.CC ON HAVING...IN...JOIN
5417 --echo #
5418 
5419 CREATE TABLE t1 (
5420  col_int_key INT,
5421  col_varchar_key VARCHAR(1),
5422  KEY col_int_key (col_int_key),
5423  KEY col_varchar_key (col_varchar_key)
5424 );
5425 
5426 INSERT INTO t1 VALUES (8,'x');
5427 
5428 CREATE TABLE t2 (
5429  col_varchar_key VARCHAR(1),
5430  KEY col_varchar_key (col_varchar_key)
5431 );
5432 
5433 INSERT INTO t2 VALUES ('x'), ('y');
5434 
5435 let $query= SELECT MIN(col_int_key)
5436 FROM t1 as t1_outer
5437 HAVING (1, 2) IN (
5438  SELECT t1_inner.col_int_key, MAX(t1_inner.col_int_key)
5439  FROM t1 as t1_inner JOIN t2
5440  ON t2.col_varchar_key = t1_inner.col_varchar_key
5441 );
5442 
5443 
5444 --eval explain $query
5445 --eval $query
5446 
5447 DROP TABLE t1,t2;
5448 
5449 --echo # Bug#13838810: Segfault in evaluate_null_complemented_join_record
5450 
5451 CREATE TABLE t1 (
5452  pk int NOT NULL,
5453  col_int_nokey int DEFAULT NULL,
5454  col_int_key int DEFAULT NULL,
5455  col_varchar_key varchar(1) DEFAULT NULL,
5456  PRIMARY KEY (pk),
5457  KEY col_int_key (col_int_key),
5458  KEY col_varchar_key (col_varchar_key,col_int_key)
5459 ) ENGINE=InnoDB;
5460 
5461 INSERT INTO t1 VALUES (10,NULL,8,'x');
5462 
5463 CREATE TABLE t2 (
5464  pk int NOT NULL,
5465  col_varchar_nokey varchar(1) DEFAULT NULL,
5466  PRIMARY KEY (pk)
5467 ) ENGINE=InnoDB;
5468 
5469 INSERT INTO t2 VALUES (1,'x');
5470 
5471 CREATE TABLE t3 (
5472  pk int NOT NULL,
5473  col_varchar_key varchar(1) DEFAULT NULL,
5474  col_varchar_nokey varchar(1) DEFAULT NULL,
5475  PRIMARY KEY (pk),
5476  KEY col_varchar_key (col_varchar_key)
5477 ) ENGINE=InnoDB;
5478 
5479 INSERT INTO t3 VALUES
5480  (1,'v','v'), (2,'v','v'), (3,'c','c'), (4,NULL,NULL);
5481 
5482 let $query=
5483 SELECT table1.pk,table2.pk, table3.pk
5484 FROM t2 AS table1
5485  LEFT JOIN t1 AS table2
5486  LEFT JOIN t1 AS table3
5487  ON table3.col_int_key = table2.col_int_key
5488  ON table3.pk = table2.col_int_nokey AND
5489  table1.col_varchar_nokey IN (
5490  SELECT subquery3_t1.col_varchar_nokey
5491  FROM t3 AS subquery3_t1
5492  LEFT JOIN t1 AS subquery3_t2
5493  ON subquery3_t2.col_varchar_key = subquery3_t1.col_varchar_key
5494  WHERE subquery3_t2.col_int_nokey <> 9
5495  )
5496 ;
5497 
5498 eval EXPLAIN $query;
5499 eval $query;
5500 
5501 DROP TABLE t1, t2, t3;
5502 
5503 --echo Extra test case for specific code coverage
5504 
5505 CREATE TABLE t1(pk INTEGER);
5506 INSERT INTO t1 VALUES(1), (2);
5507 
5508 let $query=
5509 SELECT *
5510 FROM t1 AS ot1 LEFT JOIN t1 AS ot2
5511  ON ot1.pk=ot2.pk AND
5512  ot2.pk IN
5513  (SELECT it1.pk
5514  FROM t1 AS it1 LEFT JOIN t1 AS it2 ON it1.pk=it2.pk);
5515 eval explain $query;
5516 eval $query;
5517 
5518 DROP TABLE t1;
5519 
5520 --echo # End of test for bug#13838810.
5521 
5522 --echo #
5523 --echo # BUG#13685026 ASSERTION CUR_SJ_INNER_TABLES == 0 IN
5524 --echo # --OPTIMIZE_TABLE_ORDER::CHOOSE_TABLE_ORDER
5525 --echo #
5526 
5527 CREATE TABLE t1 (
5528  col_int_key INT(11) NOT NULL,
5529  col_datetime_key DATETIME NOT NULL,
5530  col_varchar_key VARCHAR(1) NOT NULL,
5531  col_varchar_nokey VARCHAR(1) NOT NULL,
5532  KEY col_int_key (col_int_key),
5533  KEY col_datetime_key (col_datetime_key),
5534  KEY col_varchar_key (col_varchar_key,col_int_key)
5535 );
5536 
5537 INSERT INTO t1 VALUES (0,'2002-02-13 17:30:06','j','j');
5538 INSERT INTO t1 VALUES (8,'2008-09-27 00:34:58','v','v');
5539 
5540 CREATE TABLE t2 (
5541  col_int_key INT(11) NOT NULL,
5542  col_datetime_key DATETIME NOT NULL,
5543  col_varchar_key VARCHAR(1) NOT NULL,
5544  col_varchar_nokey VARCHAR(1) NOT NULL,
5545  KEY col_int_key (col_int_key),
5546  KEY col_datetime_key (col_datetime_key),
5547  KEY col_varchar_key (col_varchar_key,col_int_key)
5548 );
5549 
5550 INSERT INTO t2 VALUES (7,'2003-08-21 00:00:00','b','b');
5551 
5552 SET @old_depth=@@optimizer_search_depth;
5553 SET optimizer_search_depth=4;
5554 
5555 let $query=SELECT col_datetime_key
5556 FROM t1 as outr
5557 WHERE col_datetime_key IN (
5558  SELECT alias1.col_datetime_key
5559  FROM t1 AS alias1
5560  LEFT JOIN t1 as alias3
5561  STRAIGHT_JOIN ( t2 AS alias4
5562  JOIN t1 AS alias5
5563  ON alias5.col_varchar_key <= alias4.col_varchar_nokey )
5564  ON alias5.col_int_key < alias4.col_int_key
5565  ON alias5.col_varchar_key = alias4.col_varchar_key
5566 );
5567 
5568 eval EXPLAIN $query;
5569 eval $query;
5570 
5571 DROP TABLE t1,t2;
5572 SET @@optimizer_search_depth=@old_depth;
5573 
5574 --echo #
5575 --echo # Bug#13845930: Segfault in st_join_table::and_with_condition
5576 --echo #
5577 
5578 CREATE TABLE t1 (
5579  col_int INTEGER
5580 );
5581 
5582 CREATE TABLE t2 (
5583  col_varchar_1 VARCHAR(1),
5584  col_varchar_2 VARCHAR(1)
5585 );
5586 
5587 INSERT INTO t2 VALUES ('x','x'), ('c','c');
5588 
5589 PREPARE stmt FROM '
5590 SELECT alias2.col_varchar_2 AS field1
5591 FROM t2 AS alias1
5592  JOIN
5593  (t2 AS alias2
5594  LEFT JOIN t2 AS alias3
5595  ON (8, 92) IN
5596  (SELECT sq1_alias1.col_int,
5597  sq1_alias2.col_int
5598  FROM t1 AS sq1_alias1 JOIN t1 AS sq1_alias2
5599  )
5600  )
5601  ON alias3.col_varchar_1 = alias2.col_varchar_2
5602 ';
5603 
5604 EXECUTE stmt;
5605 EXECUTE stmt;
5606 
5607 DEALLOCATE prepare stmt;
5608 
5609 DROP TABLE t1, t2;
5610 
5611 --echo # End of test for bug#13845930.
5612 
5613 --echo #
5614 --echo # Bug#13855925: Assert 'prebuilt->search_tuple->n_fields > 0'
5615 --echo # in ha_innobase::index_read
5616 --echo #
5617 
5618 CREATE TABLE t1 (
5619  pk INTEGER AUTO_INCREMENT,
5620  col_int_nokey INT,
5621  col_int_key INT,
5622  col_varchar_key VARCHAR(1),
5623  col_varchar_nokey VARCHAR(1),
5624  PRIMARY KEY (pk),
5625  KEY (col_varchar_key)
5626 ) ENGINE=INNODB;
5627 
5628 INSERT INTO t1 (
5629  col_int_key, col_int_nokey,
5630  col_varchar_key, col_varchar_nokey
5631 ) VALUES
5632  (4, 2, 'v','v'), (62, 150, 'v','v'), (7, NULL, 'c','c'), (1, 2, NULL, NULL),
5633  (0, 5, 'x','x'), (7, 3, 'i','i'), (7, 1, 'e','e'), (1, 4, 'p','p'),
5634  (7, NULL, 's','s'), (1, 2, 'j','j'), (5, 6, 'z','z'), (2, 6, 'c','c'),
5635  (0, 8, 'a','a'), (1, 2, 'q','q'), (8, 6, 'y','y'), (1, 8, NULL, NULL),
5636  (1, 3, 'r','r'), (9, 3, 'v','v'), (1, 9, NULL, NULL), (5, 6, 'r','r');
5637 
5638 CREATE TABLE t2 (
5639  pk INT AUTO_INCREMENT,
5640  col_int_nokey INT,
5641  col_int_key INT,
5642  PRIMARY KEY (pk),
5643  KEY (col_int_key)
5644 ) AUTO_INCREMENT=10 ENGINE=INNODB;
5645 
5646 INSERT INTO t2 (col_int_key, col_int_nokey) VALUES
5647  (8, NULL), (7, 8), (1, 1), (7, 9), (9, 4), (NULL, 3), (1, 2), (9, NULL),
5648  (2, 2), (9, NULL), (2, 6), (4, 7), (0, 2), (4, 5), (8, 7), (NULL, 6),
5649  (NULL, 6), (0, 2), (NULL, 9), (8, 6);
5650 
5651 CREATE TABLE t3 (
5652  pk INT AUTO_INCREMENT,
5653  col_varchar_key VARCHAR(1),
5654  PRIMARY KEY (pk),
5655  KEY (col_varchar_key)
5656 ) ENGINE=INNODB;
5657 
5658 INSERT INTO t3 (col_varchar_key) VALUES
5659  ('c'), ('c'), ('q'), ('g'), ('e'), ('l'), (NULL), ('c'), ('h'), ('d'),
5660  ('c'), ('i'), ('t'), ('g'), ('q'), ('l'), ('n'), ('z'), ('n'), ('r'), ('p');
5661 
5662 -- disable_query_log
5663 -- disable_result_log
5664 ANALYZE TABLE t1;
5665 ANALYZE TABLE t2;
5666 ANALYZE TABLE t3;
5667 -- enable_result_log
5668 -- enable_query_log
5669 
5670 CREATE VIEW v1 AS
5671 SELECT table2.col_varchar_nokey AS field1
5672 FROM t2 AS table1
5673  INNER JOIN (t1 AS table2
5674  STRAIGHT_JOIN t2 AS table3
5675  ON table3.col_int_key = table2.pk AND
5676  table3.col_int_nokey = ANY
5677  (SELECT subquery1_t2.col_int_nokey AS subquery1_field1
5678  FROM t2 AS subquery1_t1
5679  RIGHT OUTER JOIN t1 AS subquery1_t2
5680  INNER JOIN t1 AS subquery1_t3
5681  ON subquery1_t3.col_int_key = subquery1_t2.pk
5682  ON subquery1_t3.col_varchar_key=subquery1_t2.col_varchar_nokey
5683  WHERE subquery1_t1.pk > 1
5684  )
5685  )
5686  ON table3.col_int_key IN
5687  (SELECT subquery2_t1.col_int_key AS subquery2_field1
5688  FROM t2 AS subquery2_t1
5689  RIGHT OUTER JOIN t3 AS subquery2_t2
5690  LEFT OUTER JOIN t1 AS subquery2_t3
5691  ON subquery2_t3.col_varchar_key = subquery2_t2.col_varchar_key
5692  ON subquery2_t3.pk = subquery2_t2.pk
5693  )
5694 ;
5695 
5696 explain SELECT * FROM v1;
5697 SELECT * FROM v1;
5698 
5699 DROP VIEW v1;
5700 DROP TABLE t1,t2,t3;
5701 
5702 --echo # End of test for bug#13855925.
5703 
5704 --echo #
5705 --echo # Bug#13897959: Segfault in setup_semijoin_dups_elimination()
5706 --echo #
5707 
5708 CREATE TABLE t1 (
5709  col_datetime_key DATETIME DEFAULT NULL,
5710  KEY col_datetime_key (col_datetime_key)
5711 ) ENGINE=MyISAM;
5712 
5713 INSERT INTO t1 VALUES
5714  ('2001-04-18 00:00:00'), ('2008-12-18 19:39:55'),
5715  ('2000-08-01 12:19:39'), ('2004-09-25 21:29:06'),
5716  ('2009-09-20 09:11:48'), ('2004-03-27 09:32:04');
5717 
5718 CREATE TABLE t2 (
5719  col_date_nokey date DEFAULT NULL,
5720  col_time_key time DEFAULT NULL,
5721  col_datetime_key datetime DEFAULT NULL,
5722  col_varchar_key varchar(1) DEFAULT NULL,
5723  col_varchar_nokey varchar(1) DEFAULT NULL,
5724  KEY col_time_key (col_time_key),
5725  KEY col_datetime_key (col_datetime_key),
5726  KEY col_varchar_key(col_varchar_key)
5727 ) ENGINE=MyISAM;
5728 
5729 INSERT INTO t2 VALUES ('1900-01-01',NULL,'2001-11-04 19:07:55','x','x');
5730 
5731 SELECT grandparent1.col_varchar_nokey
5732 FROM t2 AS grandparent1 LEFT JOIN t1 USING (col_datetime_key)
5733 WHERE grandparent1.col_varchar_nokey IN (
5734  SELECT col_varchar_nokey
5735  FROM t2 AS parent1
5736  WHERE parent1.col_time_key > grandparent1.col_date_nokey
5737 );
5738 
5739 DROP TABLE t1, t2;
5740 
5741 --echo # End of test for bug#13897959.
5742 
5743 --echo #
5744 --echo # Bug#13898625 ASSERT `(REMAINING_TABLES_AFTER != 0) ...' IN
5745 --echo # BEST_EXTENSION_BY_LIMITED_SEARCH
5746 --echo #
5747 
5748 CREATE TABLE t1 (
5749  pk int(11) NOT NULL,
5750  col_int_nokey INT,
5751  col_int_key INT,
5752  col_varchar_key VARCHAR(1),
5753  col_varchar_nokey VARCHAR(1),
5754  PRIMARY KEY (pk),
5755  KEY col_int_key (col_int_key),
5756  KEY col_varchar_key (col_varchar_key,col_int_key)
5757 );
5758 
5759 INSERT INTO t1 VALUES (26,6,NULL,'f','f');
5760 INSERT INTO t1 VALUES (29,6,8,'c','c');
5761 
5762 CREATE TABLE t2 (
5763  pk INT NOT NULL,
5764  col_int_nokey INT,
5765  col_int_key INT,
5766  col_varchar_key VARCHAR(1),
5767  col_varchar_nokey VARCHAR(1),
5768  PRIMARY KEY (pk),
5769  KEY col_int_key (col_int_key),
5770  KEY col_varchar_key (col_varchar_key,col_int_key)
5771 );
5772 
5773 INSERT INTO t2 VALUES (1,2,4,'v','v');
5774 INSERT INTO t2 VALUES (2,150,62,'v','v');
5775 INSERT INTO t2 VALUES (5,5,0,'x','x');
5776 INSERT INTO t2 VALUES (6,3,7,'i','i');
5777 INSERT INTO t2 VALUES (7,1,7,'e','e');
5778 
5779 CREATE VIEW view_c AS SELECT * FROM t2;
5780 
5781 let $query=
5782  SELECT SUM( alias1.col_varchar_key ) AS field1
5783  FROM t1 AS alias1
5784  RIGHT JOIN t2 AS alias2
5785  INNER JOIN t1 AS alias3
5786  ON (alias3.col_varchar_key = alias2.col_varchar_key )
5787  ON ( "v" ) IN (
5788  SELECT sq1_alias1.col_varchar_nokey AS sq1_field1
5789  FROM t1 AS sq1_alias1
5790  )
5791  WHERE alias3.pk IN (
5792  SELECT sq2_alias1.col_int_key AS sq2_field1
5793  FROM ( view_c AS sq2_alias1, t1 AS sq2_alias2 )
5794  )
5795 ;
5796 
5797 eval PREPARE prep_stmt_7430 FROM '$query';
5798 EXECUTE prep_stmt_7430;
5799 EXECUTE prep_stmt_7430;
5800 eval EXPLAIN $query;
5801 
5802 # Assertion sj_inner_tables == ((remaining_tables |
5803 # new_join_tab->table->map) & sj_inner_tables)
5804 
5805 let $query=
5806  SELECT SUM( alias1.col_varchar_key ) AS field1
5807  FROM t1 AS alias1
5808  RIGHT JOIN t2 AS alias2
5809  INNER JOIN t1 AS alias3
5810  ON (alias3.col_varchar_key = alias2.col_varchar_key )
5811  ON ( "v" ) IN (
5812  SELECT sq1_alias1.col_varchar_nokey AS sq1_field1
5813  FROM t1 AS sq1_alias1
5814  )
5815  WHERE alias3.pk IN (
5816  SELECT sq2_alias1.col_int_key AS sq2_field1
5817  FROM ( view_c AS sq2_alias1 , t1 AS sq2_alias2 )
5818  WHERE sq2_alias1.col_varchar_nokey <> alias2.col_varchar_key
5819  AND sq2_alias1.col_varchar_key < "l"
5820  )
5821 ;
5822 
5823 eval PREPARE prep_stmt_7430 FROM '$query';
5824 EXECUTE prep_stmt_7430;
5825 EXECUTE prep_stmt_7430;
5826 eval EXPLAIN $query;
5827 
5828 DROP TABLE t1,t2;
5829 DROP VIEW view_c;
5830 
5831 --echo #
5832 --echo # Bug#13902463 SEGFAULT IN BITMAP<64U>::MERGE OR ADD_KEY_FIELD
5833 --echo # ON SECOND EXEC OF PREP STMT
5834 --echo #
5835 
5836 CREATE TABLE t1 (
5837  pk INT,
5838  col_int_nokey INT,
5839  col_int_key INT,
5840  col_varchar_key VARCHAR(1),
5841  col_varchar_nokey VARCHAR(1),
5842  KEY col_varchar_key (col_varchar_key)
5843 );
5844 
5845 CREATE VIEW view_b AS SELECT * FROM t1;
5846 
5847 let $query=
5848  SELECT alias2.col_varchar_nokey AS field1
5849  FROM t1 AS alias1
5850  INNER JOIN t1 AS alias2
5851  ON (alias1.col_varchar_key = alias2.col_varchar_nokey
5852  AND ( alias1.col_int_key ) IN (
5853  SELECT t1.col_int_nokey
5854  FROM t1
5855  )
5856  )
5857  WHERE alias1.col_varchar_key IN (
5858  SELECT sq2_alias2.col_varchar_nokey AS sq2_field1
5859  FROM view_b AS sq2_alias1
5860  INNER JOIN t1 AS sq2_alias2
5861  ON (sq2_alias2.col_varchar_key = sq2_alias1.col_varchar_key )
5862  WHERE sq2_alias1.pk > alias2.pk
5863  )
5864 ;
5865 
5866 eval PREPARE prep_stmt_20421 FROM '$query';
5867 EXECUTE prep_stmt_20421;
5868 EXECUTE prep_stmt_20421;
5869 eval EXPLAIN $query;
5870 
5871 ALTER TABLE t1 DROP INDEX col_varchar_key;
5872 # Assertion join->best_read < double(1.79769313486231570815e+308L)
5873 eval PREPARE prep_stmt_20421 FROM '$query';
5874 EXECUTE prep_stmt_20421;
5875 EXECUTE prep_stmt_20421;
5876 eval EXPLAIN $query;
5877 
5878 DROP TABLE t1;
5879 DROP VIEW view_b;
5880 
5881 --echo #
5882 --echo # Bug#13907277: Segfault in evaluate_null_complemented_join_record
5883 --echo #
5884 
5885 CREATE TABLE t1 (
5886  pk INTEGER,
5887  col_varchar_nokey VARCHAR(1),
5888  col_varchar_key VARCHAR(1),
5889  PRIMARY KEY (pk)
5890 );
5891 INSERT INTO t1 VALUES (1, 'x', 'x');
5892 
5893 CREATE TABLE t2 (
5894  pk INTEGER,
5895  PRIMARY KEY (pk)
5896 );
5897 INSERT INTO t2 VALUES (1);
5898 
5899 CREATE TABLE t3 (
5900  pk INTEGER,
5901  col_int_nokey INTEGER,
5902  col_int_key INTEGER,
5903  col_varchar_nokey VARCHAR(1),
5904  PRIMARY KEY (pk)
5905 );
5906 INSERT INTO t3 VALUES (1, 6, 5, 'r');
5907 
5908 let $query=
5909 SELECT outer_t1.pk, outer_t2.pk
5910 FROM t3 AS outer_t1
5911  RIGHT JOIN t2 AS outer_t2
5912  ON outer_t1.col_int_nokey IN
5913  (SELECT inner_t1.col_int_nokey
5914  FROM t3 AS inner_t1
5915  LEFT JOIN t1 AS inner_t2
5916  INNER JOIN t1 AS inner_t3
5917  ON inner_t3.pk = inner_t2.pk
5918  ON inner_t3.col_varchar_nokey = inner_t2.col_varchar_key
5919  );
5920 
5921 eval explain $query;
5922 eval $query;
5923 
5924 DROP TABLE t1, t2, t3;
5925 
5926 --echo # End of test for bug#13907277.
5927 
5928 --echo #
5929 --echo # Bug#13955713: Assert 'JOIN->best_read < ...' on second execution
5930 --echo #
5931 
5932 CREATE TABLE t1 (
5933  pk INTEGER,
5934  col_varchar_key VARCHAR(1),
5935  col_varchar_nokey VARCHAR(1)
5936 );
5937 
5938 PREPARE stmt FROM "
5939 SELECT MIN(alias2.col_varchar_key) AS field1
5940 FROM t1 AS alias1
5941  INNER JOIN (t1 AS alias2
5942  INNER JOIN t1 AS alias3
5943  ON 8 IN
5944  (SELECT sq1_alias1.pk AS sq1_field2
5945  FROM t1 AS sq1_alias1
5946  WHERE 9 IN
5947  (SELECT SUM(t1_sq1_alias1.pk) AS t1_sq1_field2
5948  FROM t1 AS t1_sq1_alias1
5949  )
5950  )
5951  )
5952  ON alias3.col_varchar_nokey = alias2.col_varchar_key
5953 WHERE EXISTS
5954  (SELECT sq2_alias1.pk AS sq2_field1
5955  FROM t1 AS sq2_alias1
5956  WHERE sq2_alias1.col_varchar_key < alias1.col_varchar_nokey
5957  )
5958 ";
5959 
5960 EXECUTE stmt;
5961 EXECUTE stmt;
5962 
5963 DEALLOCATE PREPARE stmt;
5964 DROP TABLE t1;
5965 
5966 --echo # End of test for bug#13955713.
5967 
5968 --echo #
5969 --echo # Bug#13956813: Segfault in memcpy from Join_cache::write_record_data()
5970 --echo #
5971 
5972 CREATE TABLE t1 (
5973  pk INT,
5974  col_varchar_key VARCHAR(1),
5975  col_varchar_nokey VARCHAR(1)
5976 );
5977 
5978 CREATE TABLE t2 (
5979  pk INT,
5980  col_varchar_key VARCHAR(1),
5981  col_varchar_nokey VARCHAR(1)
5982 );
5983 
5984 INSERT INTO t2 VALUES
5985  (10,'j','j'), (11,'z','z'), (12,'c','c'), (13,'a','a'),
5986  (14,'q','q'), (15,'y','y'), (16,NULL,NULL), (17,'r','r'),
5987  (18,'v','v'), (19,NULL,NULL), (20,'r','r');
5988 
5989 CREATE TABLE t3 (
5990  pk INT,
5991  col_int_key INT,
5992  col_varchar_key VARCHAR(1),
5993  KEY col_int_key (col_int_key)
5994 );
5995 
5996 INSERT INTO t3 VALUES
5997  (15,NULL,'u'), (16,1,'m'), (17,9,NULL), (18,2,'o'),
5998  (19,9,'w'), (20,2,'m'), (21,4,'q'), (22,0,NULL),
5999  (23,4,'d'), (24,8,'g'), (25,NULL,'x'), (26,NULL,'f'),
6000  (27,0,'p'), (28,NULL,'j'), (29,8,'c');
6001 
6002 CREATE VIEW view_inline_0 AS
6003 SELECT t1.*
6004 FROM t1 INNER JOIN t3
6005  ON t1.pk = t3.pk;
6006 
6007 CREATE VIEW view_inline_1 AS
6008 SELECT sq2_alias2.col_varchar_key AS sq2_field1,
6009  sq2_alias1.col_varchar_key AS sq2_field2
6010 FROM t3 AS sq2_alias1 LEFT OUTER JOIN t3 AS sq2_alias2
6011  ON sq2_alias1.pk = sq2_alias2.col_int_key;
6012 
6013 CREATE VIEW view_inline_2 AS
6014 SELECT 'p', 'p' UNION SELECT 'k', 's';
6015 
6016 let $query=
6017 SELECT SUM(alias1.col_varchar_nokey) AS field2
6018 FROM t2 AS alias2
6019  LEFT JOIN (SELECT * FROM view_inline_0) AS alias1
6020  ON alias2.col_varchar_key = alias1.col_varchar_key AND
6021  (alias2.col_varchar_nokey, alias2.col_varchar_key) IN
6022  (SELECT * FROM view_inline_1
6023  )
6024 WHERE (alias1.col_varchar_key, alias1.col_varchar_nokey) IN
6025  (SELECT * FROM view_inline_2
6026  );
6027 
6028 eval explain $query;
6029 eval $query;
6030 
6031 DROP VIEW view_inline_0, view_inline_1, view_inline_2;
6032 DROP TABLE t1, t2, t3;
6033 
6034 --echo # End of test for bug#13956813.
6035 
6036 --echo #
6037 --echo # Bug#13974177: Assert !(tab->table->regginfo.not_exists_optimize...
6038 --echo #
6039 
6040 CREATE TABLE t1 (
6041  pk INTEGER AUTO_INCREMENT,
6042  col_int_nokey INTEGER,
6043  col_int_key INTEGER,
6044  col_varchar_key VARCHAR(1),
6045  col_varchar_nokey VARCHAR(1),
6046  PRIMARY KEY (pk),
6047  KEY (col_int_key),
6048  KEY (col_varchar_key, col_int_key)
6049 );
6050 
6051 INSERT INTO t1(col_int_key, col_int_nokey, col_varchar_key, col_varchar_nokey)
6052 VALUES
6053  (0, 4, 'j', 'j'), (8, 6, 'v', 'v'), (1, 3, 'c', 'c'), (8, 5, 'm', 'm'),
6054  (9, 3, 'd', 'd'), (24, 246, 'd', 'd'), (6, 2, 'y', 'y'), (1, 9, 't', 't'),
6055  (6, 3, 'd', 'd'), (2, 8, 's', 's'), (4, 1, 'r', 'r'), (8, 8, 'm', 'm'),
6056  (4, 8, 'b', 'b'), (4, 5, 'x', 'x'), (7, 7, 'g', 'g'), (4, 5, 'p', 'p'),
6057  (1, 1, 'q', 'q'), (9, 6, 'w', 'w'), (4, 2, 'd', 'd'), (8, 9, 'e', 'e');
6058 
6059 CREATE TABLE t2 (
6060  pk INTEGER AUTO_INCREMENT,
6061  col_int_nokey INTEGER NOT NULL,
6062  col_time_key TIME NOT NULL,
6063  col_time_nokey TIME NOT NULL,
6064  PRIMARY KEY (pk),
6065  KEY (col_time_key)
6066 ) ENGINE=InnoDB;
6067 
6068 INSERT INTO t2 (col_int_nokey, col_time_key, col_time_nokey) VALUES
6069  (7, '00:00:00', '00:00:00'), (0, '00:00:00', '00:00:00'),
6070  (9, '06:35:17', '06:35:17'), (3, '18:07:14', '18:07:14'),
6071  (4, '20:36:52', '20:36:52'), (2, '21:29:07', '21:29:07'),
6072  (5, '23:45:57', '23:45:57'), (3, '22:54:57', '22:54:57'),
6073  (1, '18:45:09', '18:45:09'), (3, '14:30:46', '14:30:46'),
6074  (6, '19:23:43', '19:23:43'), (7, '03:39:30', '03:39:30'),
6075  (5, '23:37:52', '23:37:52'), (1, '16:59:30', '16:59:30'),
6076  (204, '22:21:15', '22:21:15'), (224, '12:24:37', '12:24:37'),
6077  (9, '15:02:08', '15:02:08'), (5, '23:59:59', '23:59:59'),
6078  (0, '08:23:30', '08:23:30'), (3, '08:32:22', '08:32:22');
6079 
6080 -- disable_query_log
6081 -- disable_result_log
6082 ANALYZE TABLE t1;
6083 ANALYZE TABLE t2;
6084 -- enable_result_log
6085 -- enable_query_log
6086 
6087 let $query=
6088 SELECT ot1.col_int_key AS x
6089 FROM t1 AS ot2
6090  LEFT JOIN t1 AS ot1
6091  ON ot2.col_varchar_nokey > ot1.col_varchar_key
6092 WHERE (ot1.col_int_nokey, ot1.pk) IN
6093  (SELECT it1.pk AS x,
6094  it1.col_int_nokey AS y
6095  FROM t2 AS it2
6096  LEFT JOIN t2 AS it1
6097  ON it2.col_time_nokey = it1.col_time_key
6098  ) AND ot1.pk IS NULL
6099 ;
6100 
6101 eval explain $query;
6102 eval $query;
6103 
6104 DROP TABLE t1, t2;
6105 
6106 --echo # End of test for bug#13974177.
6107 
6108 --echo #
6109 --echo # Bug#13971022: Assert 'keyparts > 0' failed in create_ref_for_key...
6110 --echo #
6111 
6112 CREATE TABLE t1 (
6113  pk INT,
6114  col_int_key INT,
6115  col_varchar_key VARCHAR(1),
6116  PRIMARY KEY (pk),
6117  KEY col_varchar_key (col_varchar_key,col_int_key)
6118 );
6119 
6120 CREATE TABLE t2 (
6121  pk INT,
6122  col_int_key INT,
6123  col_varchar_key VARCHAR(1),
6124  col_varchar_nokey VARCHAR(1),
6125  PRIMARY KEY (pk)
6126 ) ENGINE=InnoDB;
6127 
6128 CREATE TABLE t3 (
6129  i INT
6130 );
6131 
6132 let $query=
6133 SELECT table1.pk AS field1
6134 FROM ( SELECT subquery1_t1. *
6135  FROM t2 AS subquery1_t1
6136  JOIN t2 AS subquery1_t2
6137  ON subquery1_t2.pk = subquery1_t1.pk) AS table1
6138  STRAIGHT_JOIN t2 AS table2
6139  ON table1.col_int_key IN (SELECT 7 FROM t3)
6140 WHERE table1.col_varchar_nokey IN
6141  (SELECT subquery3_t1.col_varchar_key AS subquery3_field1
6142  FROM t1 AS subquery3_t1
6143  )
6144 ;
6145 
6146 eval explain $query;
6147 eval $query;
6148 
6149 DROP TABLE t1, t2, t3;
6150 
6151 --echo # End of test for bug#13971022.
6152 
6153 --echo #
6154 --echo # Bug#13623473 "MISSING ROWS ON SELECT AND JOIN WITH
6155 --echo # TIME/DATETIME COMPARE" - Subquery part of test.
6156 --echo #
6157 
6158 SET TIMESTAMP=UNIX_TIMESTAMP('2012-01-31 10:14:35');
6159 
6160 CREATE TABLE t1 (
6161  pk INT NOT NULL,
6162  col_int_nokey INT,
6163  col_int_key INT NOT NULL,
6164  PRIMARY KEY (pk),
6165  KEY col_int_key (col_int_key)
6166 ) ENGINE=InnoDB;
6167 
6168 INSERT INTO t1 VALUES (10,1,7), (11,7,0), (12,4,9), (13,7,3),
6169 (14,0,4), (15,2,2), (16,9,5), (17,4,3), (18,0,1), (19,9,3), (20,1,6),
6170 (21,3,7), (22,8,5), (23,8,1), (24,18,204), (25,84,224), (26,6,9),
6171 (27,3,5), (28,6,0), (29,6,3);
6172 
6173 CREATE TABLE t2 (
6174  col_int_nokey INT NOT NULL,
6175  col_datetime_key DATETIME NOT NULL,
6176  col_varchar_key VARCHAR(1) NOT NULL,
6177  KEY col_datetime_key (col_datetime_key),
6178  KEY col_varchar_key (col_varchar_key)
6179 ) ENGINE=InnoDB;
6180 
6181 INSERT INTO t2 VALUES (1,'2001-11-04 19:07:55','k');
6182 
6183 CREATE TABLE t3 (
6184  col_time_key TIME,
6185  KEY col_time_key (col_time_key)
6186 ) ENGINE=InnoDB;
6187 
6188 INSERT INTO t3 VALUES ('21:22:34'), ('10:50:38'), ('00:21:38'),
6189 ('04:08:02'), ('16:25:11'), ('10:14:58'), ('19:47:59'), ('11:14:24'),
6190 ('00:00:00'), ('00:00:00'), ('15:57:25'), ('07:05:51'), ('19:22:21'),
6191 ('03:53:16'), ('09:16:38'), ('15:37:26'), ('00:00:00'), ('05:03:03'),
6192 ('02:59:24'), ('00:01:58');
6193 
6194 -- disable_query_log
6195 -- disable_result_log
6196 ANALYZE TABLE t1;
6197 ANALYZE TABLE t2;
6198 ANALYZE TABLE t3;
6199 -- enable_result_log
6200 -- enable_query_log
6201 
6202 let $query=
6203 SELECT outr.col_int_nokey
6204 FROM t2 as outr
6205  STRAIGHT_JOIN t3 AS outr2
6206  ON outr2.col_time_key > outr.col_datetime_key
6207 WHERE outr.col_int_nokey IN (
6208  SELECT col_int_key
6209  FROM t1 AS innr
6210  WHERE innr.pk >= innr.col_int_nokey
6211 ) AND (
6212  outr.col_int_nokey <= 6
6213  OR
6214  outr.col_varchar_key IS NULL
6215 );
6216 eval EXPLAIN EXTENDED $query;
6217 --sorted_result
6218 eval $query;
6219 
6220 DROP TABLE t1,t2,t3;
6221 
6222 SET TIMESTAMP = DEFAULT;
6223 
6224 --echo # End of test for bug#13623473.
6225 
6226 --echo #
6227 --echo # Bug#13980954: Missing data on left join + null value + where..in
6228 --echo #
6229 
6230 CREATE TABLE t1 (
6231  ik INT,
6232  vc varchar(1)
6233 );
6234 
6235 INSERT INTO t1 VALUES (8, 'x'), (NULL, 'x');
6236 
6237 CREATE TABLE t2 (
6238  ik INT,
6239  vc varchar(1)
6240 );
6241 
6242 INSERT INTO t2 VALUES
6243  (0, 'x'), (7, 'i'), (7, 'e'), (1, 'p'), (7, 's'), (1, 'j');
6244 
6245 let $query=
6246 SELECT t2.vc, t2.ik AS t2_ik, t1.ik AS t1_ik
6247 FROM t2 LEFT JOIN t1 ON t2.vc=t1.vc
6248 WHERE t2.vc IN (SELECT vc FROM t2 AS t3);
6249 
6250 eval explain format=json $query;
6251 eval $query;
6252 
6253 DROP TABLE t1, t2;
6254 
6255 --echo # End of test for bug#13980954.
6256 
6257 --echo #
6258 --echo # Bug#14048292: Segfault in Item_field::result_type on 2nd execution
6259 --echo # of prep stmt with join of view
6260 --echo #
6261 
6262 CREATE TABLE t1 (
6263  col_int INT
6264 );
6265 
6266 INSERT INTO t1 VALUES (0), (1);
6267 
6268 CREATE VIEW view_t1 AS SELECT * FROM t1;
6269 
6270 let $query=
6271 SELECT alias1.col_int
6272 FROM t1 AS alias1
6273  LEFT JOIN view_t1 AS alias2
6274  ON alias1.col_int IN
6275  (SELECT sq1_alias1.col_int
6276  FROM t1 AS sq1_alias1
6277  );
6278 
6279 eval explain $query;
6280 
6281 eval PREPARE stmt FROM "$query";
6282 EXECUTE stmt;
6283 EXECUTE stmt;
6284 
6285 DEALLOCATE PREPARE stmt;
6286 DROP VIEW view_t1;
6287 DROP TABLE t1;
6288 
6289 --echo # End of test for bug#14048292.
6290 
6291 --echo #
6292 --echo # Bug#14064201: Missing data on join of derived table + WHERE .. IN
6293 --echo # with two operands
6294 --echo #
6295 
6296 CREATE TABLE t1 (
6297  col_varchar_nokey VARCHAR(1)
6298 );
6299 
6300 INSERT INTO t1 VALUES
6301  ('v'), ('s'), ('l'), ('y'), ('c'), ('i'), ('h'), ('q'), ('a'), ('v'),
6302  ('u'), ('s'), ('y'), ('z'), ('h'), ('p'), ('e'), ('i'), ('y'), ('w');
6303 
6304 CREATE TABLE t2 (
6305  col_varchar_key VARCHAR(1),
6306  col_varchar_nokey VARCHAR(1),
6307  KEY col_varchar_key(col_varchar_key)
6308 );
6309 
6310 INSERT INTO t2 VALUES
6311  ('j','j'), ('v','v'), ('c','c'), ('m','m'), ('d','d'), ('d','d'), ('y','y');
6312 
6313 let $query=
6314 SELECT *
6315 FROM (SELECT * FROM t2) AS derived1
6316  LEFT JOIN t1
6317  USING (col_varchar_nokey)
6318 WHERE (col_varchar_nokey, col_varchar_nokey) IN
6319  (SELECT col_varchar_nokey, col_varchar_key
6320  FROM t2 AS derived2
6321  );
6322 
6323 eval explain format=json $query;
6324 eval $query;
6325 
6326 DROP TABLE t1, t2;
6327 
6328 CREATE TABLE t1 (
6329  col_int_nokey int NOT NULL,
6330  col_int_key int NOT NULL,
6331  KEY col_int_key (col_int_key)
6332 );
6333 
6334 INSERT INTO t1 VALUES
6335  (1,7), (7,0), (4,9), (7,3), (0,4), (2,2), (9,5), (4,3), (0,1), (9,3),
6336  (1,6), (3,7), (8,5), (8,1), (18,204), (84,224), (6,9), (3,5), (6,0), (6,3);
6337 
6338 CREATE TABLE t2 (
6339  col_int_nokey int NOT NULL,
6340  col_int_key int NOT NULL,
6341  KEY col_int_key (col_int_key)
6342 );
6343 
6344 INSERT INTO t2 VALUES
6345  (4,0), (6,8), (3,1), (5,8), (3,9), (246,24), (2,6), (9,1), (3,6), (8,2),
6346  (1,4), (8,8), (8,4), (5,4), (7,7), (5,4), (1,1), (6,9), (2,4), (9,8);
6347 
6348 let $query=
6349 SELECT grandparent1.*
6350 FROM t1 AS grandparent1
6351  LEFT JOIN t1 USING (col_int_nokey)
6352 WHERE (col_int_nokey, col_int_nokey) IN
6353  (SELECT col_int_nokey, col_int_key
6354  FROM t2
6355  );
6356 
6357 eval explain format=json $query;
6358 eval $query;
6359 
6360 DROP TABLE t1, t2;
6361 
6362 CREATE TABLE t1 (
6363  pk int,
6364  col_int_key int,
6365  col_datetime_key datetime,
6366  col_varchar_key varchar(1),
6367  col_varchar_nokey varchar(1),
6368  PRIMARY KEY (pk),
6369  KEY col_int_key (col_int_key),
6370  KEY col_datetime_key (col_datetime_key),
6371  KEY col_varchar_key (col_varchar_key,col_int_key)
6372 ) engine=MyISAM;
6373 
6374 INSERT INTO t1 VALUES
6375  (10,7,'2004-06-06 04:22:12','v','v'), (11,0,'2005-11-13 01:12:31','s','s'),
6376  (12,9,'2002-05-04 01:50:00','l','l'), (13,3,'2004-10-27 10:28:45','y','y'),
6377  (14,4,'2006-07-22 05:24:23','c','c'), (15,2,'2002-05-16 21:34:03','i','i'),
6378  (16,5,'2008-04-17 10:45:30','h','h'), (17,3,'2009-04-21 02:58:02','q','q'),
6379  (18,1,'2008-01-11 11:01:51','a','a'), (19,3,'1900-01-01 00:00:00','v','v'),
6380  (20,6,'2007-05-17 18:24:57','u','u'), (21,7,'2007-08-07 00:00:00','s','s'),
6381  (22,5,'2001-08-28 00:00:00','y','y'), (23,1,'2004-04-16 00:27:28','z','z'),
6382  (24,204,'2005-05-03 07:06:22','h','h'), (25,224,'2009-03-11 17:09:50','p','p'),
6383  (26,9,'2007-12-08 01:54:28','e','e'), (27,5,'2009-07-28 18:19:54','i','i'),
6384  (28,0,'2008-06-08 00:00:00','y','y'), (29,3,'2005-02-09 09:20:26','w','w');
6385 
6386 CREATE TABLE t2 (
6387  pk int,
6388  col_int_key int,
6389  col_datetime_key datetime,
6390  col_varchar_key varchar(1),
6391  col_varchar_nokey varchar(1),
6392  PRIMARY KEY (pk),
6393  KEY col_int_key (col_int_key),
6394  KEY col_datetime_key (col_datetime_key),
6395  KEY col_varchar_key (col_varchar_key,col_int_key)
6396 ) engine=MyISAM;
6397 
6398 INSERT INTO t2 VALUES
6399  (1,0,'2002-02-13 17:30:06','j','j'), (2,8,'2008-09-27 00:34:58','v','v'),
6400  (3,1,'2007-05-28 00:00:00','c','c'), (4,8,'2009-07-25 09:21:20','m','m'),
6401  (5,9,'2002-01-16 00:00:00','d','d'), (6,24,'2006-10-12 04:32:53','d','d'),
6402  (7,6,'2001-02-15 03:08:38','y','y'), (8,1,'2004-10-02 20:31:15','t','t'),
6403  (9,6,'2002-08-20 22:48:00','d','d'), (10,2,'1900-01-01 00:00:00','s','s'),
6404  (11,4,'2005-08-15 00:00:00','r','r'), (12,8,'1900-01-01 00:00:00','m','m'),
6405  (13,4,'2008-05-16 08:09:06','b','b'), (14,4,'2001-01-20 12:47:23','x','x'),
6406  (15,7,'2008-07-02 00:00:00','g','g'), (16,4,'1900-01-01 00:00:00','p','p'),
6407  (17,1,'2002-12-08 11:34:58','q','q'), (18,9,'1900-01-01 00:00:00','w','w'),
6408  (19,4,'1900-01-01 00:00:00','d','d'), (20,8,'2002-08-25 20:35:06','e','e');
6409 
6410 SELECT alias1.col_datetime_key
6411 FROM t2 AS alias1
6412  RIGHT JOIN t2 AS alias2
6413  JOIN t2 AS alias3
6414  ON alias3.pk = alias2.pk
6415  ON alias3.col_varchar_nokey = alias2.col_varchar_key OR
6416  alias2.col_varchar_nokey
6417 WHERE (alias2.col_varchar_key, alias2.col_varchar_key) IN
6418  (SELECT sq2_alias2.col_varchar_key, sq2_alias1.col_varchar_nokey
6419  FROM t1 AS sq2_alias1, t1 AS sq2_alias2
6420  WHERE sq2_alias2.col_int_key < 2);
6421 
6422 ALTER TABLE t1 DISABLE KEYS;
6423 ALTER TABLE t2 DISABLE KEYS;
6424 
6425 let $query=
6426 SELECT alias1.col_datetime_key
6427 FROM t2 AS alias1
6428  RIGHT JOIN t2 AS alias2
6429  JOIN t2 AS alias3
6430  ON alias3.pk = alias2.pk
6431  ON alias3.col_varchar_nokey = alias2.col_varchar_key OR
6432  alias2.col_varchar_nokey
6433 WHERE (alias2.col_varchar_key, alias2.col_varchar_key) IN
6434  (SELECT sq2_alias2.col_varchar_key, sq2_alias1.col_varchar_nokey
6435  FROM t1 AS sq2_alias1, t1 AS sq2_alias2
6436  WHERE sq2_alias2.col_int_key < 2);
6437 
6438 eval explain format=json $query;
6439 eval $query;
6440 
6441 DROP TABLE t1, t2;
6442 
6443 --echo # End of test for bug#14064201.
6444 
6445 set @@optimizer_switch=@old_opt_switch;
6446 # New tests go here.
6447 
6448 --echo # End of 5.6 tests