2
# test of left outer join
6
drop table if exists t0,t1,t2,t3,t4,t5;
10
grp int(11) default NULL,
11
a bigint(20) unsigned default NULL,
12
c char(10) NOT NULL default ''
14
INSERT INTO t1 VALUES (1,1,'a'),(2,2,'b'),(2,3,'c'),(3,4,'E'),(3,5,'C'),(3,6,'D'),(NULL,NULL,'');
15
create table t2 (id int, a bigint unsigned not null, c char(10), d int, primary key (a));
16
insert into t2 values (1,1,"a",1),(3,4,"A",4),(3,5,"B",5),(3,6,"C",6),(4,7,"D",7);
18
select t1.*,t2.* from t1 JOIN t2 where t1.a=t2.a;
19
select t1.*,t2.* from t1 left join t2 on (t1.a=t2.a) order by t1.grp,t1.a,t2.c;
20
select t1.*,t2.* from { oj t2 left outer join t1 on (t1.a=t2.a) };
21
select t1.*,t2.* from t1 as t0,{ oj t2 left outer join t1 on (t1.a=t2.a) } WHERE t0.a=2;
22
select t1.*,t2.* from t1 left join t2 using (a);
23
select t1.*,t2.* from t1 left join t2 using (a) where t1.a=t2.a;
24
select t1.*,t2.* from t1 left join t2 using (a,c);
26
select t1.*,t2.* from t1 left join t2 using (c);
27
select t1.*,t2.* from t1 natural left outer join t2;
29
select t1.*,t2.* from t1 left join t2 on (t1.a=t2.a) where t2.id=3;
30
select t1.*,t2.* from t1 left join t2 on (t1.a=t2.a) where t2.id is null;
32
explain select t1.*,t2.* from t1,t2 where t1.a=t2.a and isnull(t2.a)=1;
33
explain select t1.*,t2.* from t1 left join t2 on t1.a=t2.a where isnull(t2.a)=1;
36
select t1.*,t2.*,t3.a from t1 left join t2 on (t1.a=t2.a) left join t1 as t3 on (t2.a=t3.a);
38
# The next query should rearange the left joins to get this to work
40
explain select t1.*,t2.*,t3.a from t1 left join t2 on (t3.a=t2.a) left join t1 as t3 on (t1.a=t3.a);
42
select t1.*,t2.*,t3.a from t1 left join t2 on (t3.a=t2.a) left join t1 as t3 on (t1.a=t3.a);
44
# The next query should give an error in MySQL
46
select t1.*,t2.*,t3.a from t1 left join t2 on (t3.a=t2.a) left join t1 as t3 on (t2.a=t3.a);
49
select t1.*,t2.* from t1 inner join t2 using (a);
50
select t1.*,t2.* from t1 inner join t2 on (t1.a=t2.a);
51
select t1.*,t2.* from t1 natural join t2;
56
# Test of left join bug
60
usr_id INT unsigned NOT NULL,
61
uniq_id INT unsigned NOT NULL AUTO_INCREMENT,
62
start_num INT unsigned NOT NULL DEFAULT 1,
63
increment INT unsigned NOT NULL DEFAULT 1,
64
PRIMARY KEY (uniq_id),
65
INDEX usr_uniq_idx (usr_id, uniq_id),
66
INDEX uniq_usr_idx (uniq_id, usr_id)
69
id INT unsigned NOT NULL DEFAULT 0,
70
usr2_id INT unsigned NOT NULL DEFAULT 0,
71
max INT unsigned NOT NULL DEFAULT 0,
72
c_amount INT unsigned NOT NULL DEFAULT 0,
73
d_max INT unsigned NOT NULL DEFAULT 0,
74
d_num INT unsigned NOT NULL DEFAULT 0,
75
orig_time INT unsigned NOT NULL DEFAULT 0,
76
c_time INT unsigned NOT NULL DEFAULT 0,
77
active ENUM ("no","yes") NOT NULL,
78
PRIMARY KEY (id,usr2_id),
80
INDEX usr2_idx (usr2_id)
82
INSERT INTO t1 VALUES (3,NULL,0,50),(3,NULL,0,200),(3,NULL,0,25),(3,NULL,0,84676),(3,NULL,0,235),(3,NULL,0,10),(3,NULL,0,3098),(3,NULL,0,2947),(3,NULL,0,8987),(3,NULL,0,8347654),(3,NULL,0,20398),(3,NULL,0,8976),(3,NULL,0,500),(3,NULL,0,198);
84
#1st select shows that one record is returned with null entries for the right
85
#table, when selecting on an id that does not exist in the right table t2
86
SELECT t1.usr_id,t1.uniq_id,t1.increment,
87
t2.usr2_id,t2.c_amount,t2.max
89
LEFT JOIN t2 ON t2.id = t1.uniq_id
93
# The same with RIGHT JOIN
94
SELECT t1.usr_id,t1.uniq_id,t1.increment,
95
t2.usr2_id,t2.c_amount,t2.max
97
RIGHT JOIN t1 ON t2.id = t1.uniq_id
101
INSERT INTO t2 VALUES (2,3,3000,6000,0,0,746584,837484,'yes');
103
INSERT INTO t2 VALUES (2,3,3000,6000,0,0,746584,837484,'yes');
104
INSERT INTO t2 VALUES (7,3,1000,2000,0,0,746294,937484,'yes');
106
#3rd select should show that one record is returned with null entries for the
107
# right table, when selecting on an id that does not exist in the right table
108
# t2 but this select returns an empty set!!!!
109
SELECT t1.usr_id,t1.uniq_id,t1.increment,t2.usr2_id,t2.c_amount,t2.max FROM t1 LEFT JOIN t2 ON t2.id = t1.uniq_id WHERE t1.uniq_id = 4 ORDER BY t2.c_amount;
110
SELECT t1.usr_id,t1.uniq_id,t1.increment,t2.usr2_id,t2.c_amount,t2.max FROM t1 LEFT JOIN t2 ON t2.id = t1.uniq_id WHERE t1.uniq_id = 4 GROUP BY t2.c_amount;
111
# Removing the ORDER BY works:
112
SELECT t1.usr_id,t1.uniq_id,t1.increment,t2.usr2_id,t2.c_amount,t2.max FROM t1 LEFT JOIN t2 ON t2.id = t1.uniq_id WHERE t1.uniq_id = 4;
117
# Test of LEFT JOIN with const tables (failed for frankie@etsetb.upc.es)
121
cod_asig int(11) DEFAULT '0' NOT NULL,
122
desc_larga_cat varchar(80) DEFAULT '' NOT NULL,
123
desc_larga_cas varchar(80) DEFAULT '' NOT NULL,
124
desc_corta_cat varchar(40) DEFAULT '' NOT NULL,
125
desc_corta_cas varchar(40) DEFAULT '' NOT NULL,
126
cred_total double(3,1) DEFAULT '0.0' NOT NULL,
127
pre_requisit int(11),
129
preco_requisit int(11),
130
PRIMARY KEY (cod_asig)
133
INSERT INTO t1 VALUES (10360,'asdfggfg','Introduccion a los Ordenadores I','asdfggfg','Introduccio Ordinadors I',6.0,NULL,NULL,NULL);
134
INSERT INTO t1 VALUES (10361,'Components i Circuits Electronics I','Componentes y Circuitos Electronicos I','Components i Circuits Electronics I','Comp. i Circ. Electr. I',6.0,NULL,NULL,NULL);
135
INSERT INTO t1 VALUES (10362,'Laboratori d`Ordinadors','Laboratorio de Ordenadores','Laboratori d`Ordinadors','Laboratori Ordinadors',4.5,NULL,NULL,NULL);
136
INSERT INTO t1 VALUES (10363,'Tecniques de Comunicacio Oral i Escrita','Tecnicas de Comunicacion Oral y Escrita','Tecniques de Comunicacio Oral i Escrita','Tec. Com. Oral i Escrita',4.5,NULL,NULL,NULL);
137
INSERT INTO t1 VALUES (11403,'Projecte Fi de Carrera','Proyecto Fin de Carrera','Projecte Fi de Carrera','PFC',9.0,NULL,NULL,NULL);
138
INSERT INTO t1 VALUES (11404,'+lgebra lineal','Algebra lineal','+lgebra lineal','+lgebra lineal',15.0,NULL,NULL,NULL);
139
INSERT INTO t1 VALUES (11405,'+lgebra lineal','Algebra lineal','+lgebra lineal','+lgebra lineal',18.0,NULL,NULL,NULL);
140
INSERT INTO t1 VALUES (11406,'Calcul Infinitesimal','CĆlculo Infinitesimal','Calcul Infinitesimal','Calcul Infinitesimal',15.0,NULL,NULL,NULL);
143
idAssignatura int(11) DEFAULT '0' NOT NULL,
144
Grup int(11) DEFAULT '0' NOT NULL,
145
Places smallint(6) DEFAULT '0' NOT NULL,
146
PlacesOcupades int(11) DEFAULT '0',
147
PRIMARY KEY (idAssignatura,Grup)
151
INSERT INTO t2 VALUES (10360,12,333,0);
152
INSERT INTO t2 VALUES (10361,30,2,0);
153
INSERT INTO t2 VALUES (10361,40,3,0);
154
INSERT INTO t2 VALUES (10360,45,10,0);
155
INSERT INTO t2 VALUES (10362,10,12,0);
156
INSERT INTO t2 VALUES (10360,55,2,0);
157
INSERT INTO t2 VALUES (10360,70,0,0);
158
INSERT INTO t2 VALUES (10360,565656,0,0);
159
INSERT INTO t2 VALUES (10360,32767,7,0);
160
INSERT INTO t2 VALUES (10360,33,8,0);
161
INSERT INTO t2 VALUES (10360,7887,85,0);
162
INSERT INTO t2 VALUES (11405,88,8,0);
163
INSERT INTO t2 VALUES (10360,0,55,0);
164
INSERT INTO t2 VALUES (10360,99,0,0);
165
INSERT INTO t2 VALUES (11411,30,10,0);
166
INSERT INTO t2 VALUES (11404,0,0,0);
167
INSERT INTO t2 VALUES (10362,11,111,0);
168
INSERT INTO t2 VALUES (10363,33,333,0);
169
INSERT INTO t2 VALUES (11412,55,0,0);
170
INSERT INTO t2 VALUES (50003,66,6,0);
171
INSERT INTO t2 VALUES (11403,5,0,0);
172
INSERT INTO t2 VALUES (11406,11,11,0);
173
INSERT INTO t2 VALUES (11410,11410,131,0);
174
INSERT INTO t2 VALUES (11416,11416,32767,0);
175
INSERT INTO t2 VALUES (11409,0,0,0);
178
id int(11) NOT NULL auto_increment,
179
dni_pasaporte char(16) DEFAULT '' NOT NULL,
180
idPla int(11) DEFAULT '0' NOT NULL,
181
cod_asig int(11) DEFAULT '0' NOT NULL,
182
any smallint(6) DEFAULT '0' NOT NULL,
183
quatrimestre smallint(6) DEFAULT '0' NOT NULL,
184
estat char(1) DEFAULT 'M' NOT NULL,
186
UNIQUE dni_pasaporte (dni_pasaporte,idPla),
187
UNIQUE dni_pasaporte_2 (dni_pasaporte,idPla,cod_asig,any,quatrimestre)
190
INSERT INTO t3 VALUES (1,'11111111',1,10362,98,1,'M');
193
id int(11) NOT NULL auto_increment,
194
papa int(11) DEFAULT '0' NOT NULL,
195
fill int(11) DEFAULT '0' NOT NULL,
196
idPla int(11) DEFAULT '0' NOT NULL,
198
KEY papa (idPla,papa),
199
UNIQUE papa_2 (idPla,papa,fill)
202
INSERT INTO t4 VALUES (1,-1,10360,1);
203
INSERT INTO t4 VALUES (2,-1,10361,1);
204
INSERT INTO t4 VALUES (3,-1,10362,1);
206
SELECT DISTINCT fill,desc_larga_cat,cred_total,Grup,Places,PlacesOcupades FROM t4 LEFT JOIN t3 ON t3.cod_asig=fill AND estat='S' AND dni_pasaporte='11111111' AND t3.idPla=1 , t2,t1 WHERE fill=t1.cod_asig AND Places>PlacesOcupades AND fill=idAssignatura AND t4.idPla=1 AND papa=-1;
208
SELECT DISTINCT fill,t3.idPla FROM t4 LEFT JOIN t3 ON t3.cod_asig=t4.fill AND t3.estat='S' AND t3.dni_pasaporte='1234' AND t3.idPla=1 ;
210
INSERT INTO t3 VALUES (3,'1234',1,10360,98,1,'S');
211
SELECT DISTINCT fill,t3.idPla FROM t4 LEFT JOIN t3 ON t3.cod_asig=t4.fill AND t3.estat='S' AND t3.dni_pasaporte='1234' AND t3.idPla=1 ;
213
drop table t1,t2,t3,test.t4;
216
# Test of IS NULL on AUTO_INCREMENT with LEFT JOIN
220
id smallint(5) unsigned NOT NULL auto_increment,
221
name char(60) DEFAULT '' NOT NULL,
224
INSERT INTO t1 VALUES (1,'Antonio Paz');
225
INSERT INTO t1 VALUES (2,'Lilliana Angelovska');
226
INSERT INTO t1 VALUES (3,'Thimble Smith');
229
id smallint(5) unsigned NOT NULL auto_increment,
230
owner smallint(5) unsigned DEFAULT '0' NOT NULL,
234
INSERT INTO t2 VALUES (1,1,'El Gato');
235
INSERT INTO t2 VALUES (2,1,'Perrito');
236
INSERT INTO t2 VALUES (3,3,'Happy');
239
select t1.name, t2.name, t2.id from t1 left join t2 on (t1.id = t2.owner);
240
select t1.name, t2.name, t2.id from t1 left join t2 on (t1.id = t2.owner) where t2.id is null;
241
explain select t1.name, t2.name, t2.id from t1 left join t2 on (t1.id = t2.owner) where t2.id is null;
242
explain select t1.name, t2.name, t2.id from t1 left join t2 on (t1.id = t2.owner) where t2.name is null;
243
select count(*) from t1 left join t2 on (t1.id = t2.owner);
246
select t1.name, t2.name, t2.id from t2 right join t1 on (t1.id = t2.owner);
247
select t1.name, t2.name, t2.id from t2 right join t1 on (t1.id = t2.owner) where t2.id is null;
248
explain select t1.name, t2.name, t2.id from t2 right join t1 on (t1.id = t2.owner) where t2.id is null;
249
explain select t1.name, t2.name, t2.id from t2 right join t1 on (t1.id = t2.owner) where t2.name is null;
250
select count(*) from t2 right join t1 on (t1.id = t2.owner);
253
select t1.name, t2.name, t2.id,t3.id from t2 right join t1 on (t1.id = t2.owner) left join t1 as t3 on t3.id=t2.owner;
254
select t1.name, t2.name, t2.id,t3.id from t1 right join t2 on (t1.id = t2.owner) right join t1 as t3 on t3.id=t2.owner;
255
select t1.name, t2.name, t2.id, t2.owner, t3.id from t1 left join t2 on (t1.id = t2.owner) right join t1 as t3 on t3.id=t2.owner;
259
create table t1 (id int not null, str char(10), index(str));
260
insert into t1 values (1, null), (2, null), (3, "foo"), (4, "bar");
261
select * from t1 where str is not null order by id;
262
select * from t1 where str is null;
266
# Test wrong LEFT JOIN query
270
t1_id bigint(21) NOT NULL auto_increment,
274
t2_id bigint(21) NOT NULL auto_increment,
278
t3_id bigint(21) NOT NULL auto_increment,
282
seq_0_id bigint(21) DEFAULT '0' NOT NULL,
283
seq_1_id bigint(21) DEFAULT '0' NOT NULL,
284
KEY seq_0_id (seq_0_id),
285
KEY seq_1_id (seq_1_id)
288
seq_0_id bigint(21) DEFAULT '0' NOT NULL,
289
seq_1_id bigint(21) DEFAULT '0' NOT NULL,
290
KEY seq_1_id (seq_1_id),
291
KEY seq_0_id (seq_0_id)
294
insert into t1 values (1);
295
insert into t2 values (1);
296
insert into t3 values (1);
297
insert into t4 values (1,1);
298
insert into t5 values (1,1);
301
explain select * from t3 left join t4 on t4.seq_1_id = t2.t2_id left join t1 on t1.t1_id = t4.seq_0_id left join t5 on t5.seq_0_id = t1.t1_id left join t2 on t2.t2_id = t5.seq_1_id where t3.t3_id = 23;
303
drop table t1,t2,t3,t4,t5;
306
# Another LEFT JOIN problem
307
# (The problem was that the result changed when we added ORDER BY)
310
create table t1 (n int, m int, o int, key(n));
311
create table t2 (n int not null, m int, o int, primary key(n));
312
insert into t1 values (1, 2, 11), (1, 2, 7), (2, 2, 8), (1,2,9),(1,3,9);
313
insert into t2 values (1, 2, 3),(2, 2, 8), (4,3,9),(3,2,10);
314
select t1.*, t2.* from t1 left join t2 on t1.n = t2.n and
315
t1.m = t2.m where t1.n = 1;
316
select t1.*, t2.* from t1 left join t2 on t1.n = t2.n and
317
t1.m = t2.m where t1.n = 1 order by t1.o,t1.m;
320
# Test bug with NATURAL join:
322
CREATE TABLE t1 (id1 INT NOT NULL PRIMARY KEY, dat1 CHAR(1), id2 INT);
323
INSERT INTO t1 VALUES (1,'a',1);
324
INSERT INTO t1 VALUES (2,'b',1);
325
INSERT INTO t1 VALUES (3,'c',2);
327
CREATE TABLE t2 (id2 INT NOT NULL PRIMARY KEY, dat2 CHAR(1));
328
INSERT INTO t2 VALUES (1,'x');
329
INSERT INTO t2 VALUES (2,'y');
330
INSERT INTO t2 VALUES (3,'z');
332
SELECT t2.id2 FROM t2 LEFT OUTER JOIN t1 ON t1.id2 = t2.id2 WHERE id1 IS NULL;
333
SELECT t2.id2 FROM t2 NATURAL LEFT OUTER JOIN t1 WHERE id1 IS NULL;
337
create table t1 ( color varchar(20), name varchar(20) );
338
insert into t1 values ( 'red', 'apple' );
339
insert into t1 values ( 'yellow', 'banana' );
340
insert into t1 values ( 'green', 'lime' );
341
insert into t1 values ( 'black', 'grape' );
342
insert into t1 values ( 'blue', 'blueberry' );
343
create table t2 ( count int, color varchar(20) );
344
insert into t2 values (10, 'green');
345
insert into t2 values (5, 'black');
346
insert into t2 values (15, 'white');
347
insert into t2 values (7, 'green');
350
select * from t2 natural join t1;
351
select t2.count, t1.name from t2 natural join t1;
352
select t2.count, t1.name from t2 inner join t1 using (color);
357
# Test of LEFT JOIN + GROUP FUNCTIONS within functions:
361
pcode varchar(8) DEFAULT '' NOT NULL
363
INSERT INTO t1 VALUES ('kvw2000'),('kvw2001'),('kvw3000'),('kvw3001'),('kvw3002'),('kvw3500'),('kvw3501'),('kvw3502'),('kvw3800'),('kvw3801'),('kvw3802'),('kvw3900'),('kvw3901'),('kvw3902'),('kvw4000'),('kvw4001'),('kvw4002'),('kvw4200'),('kvw4500'),('kvw5000'),('kvw5001'),('kvw5500'),('kvw5510'),('kvw5600'),('kvw5601'),('kvw6000'),('klw1000'),('klw1020'),('klw1500'),('klw2000'),('klw2001'),('klw2002'),('kld2000'),('klw2500'),('kmw1000'),('kmw1500'),('kmw2000'),('kmw2001'),('kmw2100'),('kmw3000'),('kmw3200');
365
pcode varchar(8) DEFAULT '' NOT NULL,
368
INSERT INTO t2 VALUES ('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw2000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3000'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw3500'),('kvw6000'),('kvw6000'),('kld2000');
370
SELECT t1.pcode, IF(ISNULL(t2.pcode), 0, COUNT(*)) AS count FROM t1
371
LEFT JOIN t2 ON t1.pcode = t2.pcode GROUP BY t1.pcode;
372
SELECT SQL_BIG_RESULT t1.pcode, IF(ISNULL(t2.pcode), 0, COUNT(*)) AS count FROM t1 LEFT JOIN t2 ON t1.pcode = t2.pcode GROUP BY t1.pcode;
376
# Another left join problem
386
INSERT INTO t1 VALUES (1,NULL,NULL);
387
INSERT INTO t1 VALUES (2,1,NULL);
388
select * from t1 LEFT JOIN t1 t2 ON (t1.id=t2.pid) AND t2.rep_del IS NULL;
389
create index rep_del ON t1(rep_del);
390
select * from t1 LEFT JOIN t1 t2 ON (t1.id=t2.pid) AND t2.rep_del IS NULL;
394
id int(11) DEFAULT '0' NOT NULL,
395
name tinytext DEFAULT '' NOT NULL,
398
INSERT INTO t1 VALUES (1,'yes'),(2,'no');
400
id int(11) DEFAULT '0' NOT NULL,
401
idx int(11) DEFAULT '0' NOT NULL,
404
INSERT INTO t2 VALUES (1,1);
405
explain SELECT * from t1 left join t2 on t1.id=t2.id where t2.id IS NULL;
406
SELECT * from t1 left join t2 on t1.id=t2.id where t2.id IS NULL;
410
# Test problem with using key_column= constant in ON and WHERE
412
create table t1 (bug_id mediumint, reporter mediumint);
413
create table t2 (bug_id mediumint, who mediumint, index(who));
414
insert into t2 values (1,1),(1,2);
415
insert into t1 values (1,1),(2,1);
416
SELECT * FROM t1 LEFT JOIN t2 ON (t1.bug_id = t2.bug_id AND t2.who = 2) WHERE (t1.reporter = 2 OR t2.who = 2);
420
# Test problem with LEFT JOIN
422
create table t1 (fooID smallint unsigned auto_increment, primary key (fooID));
423
create table t2 (fooID smallint unsigned not null, barID smallint unsigned not null, primary key (fooID,barID));
424
insert into t1 (fooID) values (10),(20),(30);
425
insert into t2 values (10,1),(20,2),(30,3);
426
explain select * from t2 left join t1 on t1.fooID = t2.fooID and t1.fooID = 30;
427
select * from t2 left join t1 on t1.fooID = t2.fooID and t1.fooID = 30;
429
select * from t2 left join t1 ignore index(primary) on t1.fooID = t2.fooID and t1.fooID = 30;
432
create table t1 (i int);
433
create table t2 (i int);
434
create table t3 (i int);
435
insert into t1 values(1),(2);
436
insert into t2 values(2),(3);
437
insert into t3 values(2),(4);
439
select * from t1 natural left join t2 natural left join t3;
440
select * from t1 natural left join t2 where (t2.i is not null)=0;
442
select * from t1 natural left join t2 where (t2.i is not null) is not null;
443
select * from t1 natural left join t2 where (i is not null)=0;
445
select * from t1 natural left join t2 where (i is not null) is not null;
451
create table t1 (f1 integer,f2 integer,f3 integer);
452
create table t2 (f2 integer,f4 integer);
453
create table t3 (f3 integer,f5 integer);
455
left outer join t2 using (f2)
456
left outer join t3 using (f3);
459
create table t1 (a1 int, a2 int);
460
create table t2 (b1 int not null, b2 int);
461
create table t3 (c1 int, c2 int);
463
insert into t1 values (1,2), (2,2), (3,2);
464
insert into t2 values (1,3), (2,3);
465
insert into t3 values (2,4), (3,4);
467
select * from t1 left join t2 on b1 = a1 left join t3 on c1 = a1 and b1 is null;
468
explain select * from t1 left join t2 on b1 = a1 left join t3 on c1 = a1 and b1 is null;
470
drop table t1, t2, t3;
472
# Test for BUG#8711 '<=>' was considered to be a NULL-rejecting predicate.
478
insert into t1 (a) values (1),(2),(3),(4);
479
create table t2 (a int);
481
select * from t1 left join t2 on t1.a=t2.a where not (t2.a <=> t1.a);
482
select * from t1 left join t2 on t1.a=t2.a having not (t2.a <=> t1.a);
488
match_id tinyint(3) unsigned not null auto_increment,
489
home tinyint(3) unsigned default '0',
490
unique key match_id (match_id),
491
key match_id_2 (match_id)
494
insert into t1 values("1", "2");
497
player_id tinyint(3) unsigned default '0',
498
match_1_h tinyint(3) unsigned default '0',
499
key player_id (player_id)
502
insert into t2 values("1", "5");
503
insert into t2 values("2", "9");
504
insert into t2 values("3", "3");
505
insert into t2 values("4", "7");
506
insert into t2 values("5", "6");
507
insert into t2 values("6", "8");
508
insert into t2 values("7", "4");
509
insert into t2 values("8", "12");
510
insert into t2 values("9", "11");
511
insert into t2 values("10", "10");
513
explain select s.*, '*', m.*, (s.match_1_h - m.home) UUX from
514
(t2 s left join t1 m on m.match_id = 1)
515
order by m.match_id desc;
517
explain select s.*, '*', m.*, (s.match_1_h - m.home) UUX from
518
(t2 s left join t1 m on m.match_id = 1)
521
select s.*, '*', m.*, (s.match_1_h - m.home) UUX from
522
(t2 s left join t1 m on m.match_id = 1)
525
explain select s.*, '*', m.*, (s.match_1_h - m.home) UUX from
526
t2 s straight_join t1 m where m.match_id = 1
529
select s.*, '*', m.*, (s.match_1_h - m.home) UUX from
530
t2 s straight_join t1 m where m.match_id = 1
535
# Tests for bugs #6307 and 6460
537
create table t1 (a int, b int, unique index idx (a, b));
538
create table t2 (a int, b int, c int, unique index idx (a, b));
540
insert into t1 values (1, 10), (1,11), (2,10), (2,11);
541
insert into t2 values (1,10,3);
543
select t1.a, t1.b, t2.c from t1 left join t2
544
on t1.a=t2.a and t1.b=t2.b and t2.c=3
545
where t1.a=1 and t2.c is null;
550
ts_id bigint(20) default NULL,
551
inst_id tinyint(4) default NULL,
552
flag_name varchar(64) default NULL,
554
UNIQUE KEY ts_id (ts_id,inst_id,flag_name)
555
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
558
ts_id bigint(20) default NULL,
559
inst_id tinyint(4) default NULL,
560
flag_name varchar(64) default NULL,
562
UNIQUE KEY ts_id (ts_id,inst_id,flag_name)
563
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
565
INSERT INTO t1 VALUES
566
(111056548820001, 0, 'flag1', NULL),
567
(111056548820001, 0, 'flag2', NULL),
568
(2, 0, 'other_flag', NULL);
570
INSERT INTO t2 VALUES
571
(111056548820001, 3, 'flag1', 'sss');
573
SELECT t1.flag_name,t2.flag_value
575
ON (t1.ts_id = t2.ts_id AND t1.flag_name = t2.flag_name AND
577
WHERE t1.inst_id = 0 AND t1.ts_id=111056548820001 AND
578
t2.flag_value IS NULL;
583
id int(11) unsigned NOT NULL auto_increment,
584
text_id int(10) unsigned default NULL,
588
INSERT INTO t1 VALUES("1", "0");
589
INSERT INTO t1 VALUES("2", "10");
592
text_id char(3) NOT NULL default '',
593
language_id char(3) NOT NULL default '',
595
PRIMARY KEY (text_id,language_id)
598
INSERT INTO t2 VALUES("0", "EN", "0-EN");
599
INSERT INTO t2 VALUES("0", "SV", "0-SV");
600
INSERT INTO t2 VALUES("10", "EN", "10-EN");
601
INSERT INTO t2 VALUES("10", "SV", "10-SV");
602
SELECT t1.id, t1.text_id, t2.text_data
604
ON t1.text_id = t2.text_id
605
AND t2.language_id = 'SV'
606
WHERE (t1.id LIKE '%' OR t2.text_data LIKE '%');
612
CREATE TABLE t0 (a0 int PRIMARY KEY);
613
CREATE TABLE t1 (a1 int PRIMARY KEY);
614
CREATE TABLE t2 (a2 int);
615
CREATE TABLE t3 (a3 int);
616
INSERT INTO t0 VALUES (1);
617
INSERT INTO t1 VALUES (1);
618
INSERT INTO t2 VALUES (1), (2);
619
INSERT INTO t3 VALUES (1), (2);
621
SELECT * FROM t1 LEFT JOIN t2 ON a1=0;
622
EXPLAIN SELECT * FROM t1 LEFT JOIN t2 ON a1=0;
623
SELECT * FROM t1 LEFT JOIN (t2,t3) ON a1=0;
624
EXPLAIN SELECT * FROM t1 LEFT JOIN (t2,t3) ON a1=0;
625
SELECT * FROM t0, t1 LEFT JOIN (t2,t3) ON a1=0 WHERE a0=a1;
626
EXPLAIN SELECT * FROM t0, t1 LEFT JOIN (t2,t3) ON a1=0 WHERE a0=a1;
628
INSERT INTO t0 VALUES (0);
629
INSERT INTO t1 VALUES (0);
630
SELECT * FROM t0, t1 LEFT JOIN (t2,t3) ON a1=5 WHERE a0=a1 AND a0=1;
631
EXPLAIN SELECT * FROM t0, t1 LEFT JOIN (t2,t3) ON a1=5 WHERE a0=a1 AND a0=1;
635
create table t1 (a int, b int);
636
insert into t1 values (1,1),(2,2),(3,3);
637
create table t2 (a int, b int);
638
insert into t2 values (1,1), (2,2);
640
select * from t2 right join t1 on t2.a=t1.a;
641
select straight_join * from t2 right join t1 on t2.a=t1.a;
643
DROP TABLE t0,t1,t2,t3;
646
# Test for bug #9017: left join mistakingly converted to inner join
649
CREATE TABLE t1 (a int PRIMARY KEY, b int);
650
CREATE TABLE t2 (a int PRIMARY KEY, b int);
652
INSERT INTO t1 VALUES (1,1), (2,1), (3,1), (4,2);
653
INSERT INTO t2 VALUES (1,2), (2,2);
655
SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.a;
656
SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.a WHERE t1.b=1;
657
SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.a
658
WHERE t1.b=1 XOR (NOT ISNULL(t2.a) AND t2.b=1);
659
SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.a WHERE not(0+(t1.a=30 and t2.b=1));
663
# Bug #8681: Bad warning message when group_concat() exceeds max length
664
set group_concat_max_len=5;
665
create table t1 (a int, b varchar(20));
666
create table t2 (a int, c varchar(20));
667
insert into t1 values (1,"aaaaaaaaaa"),(2,"bbbbbbbbbb");
668
insert into t2 values (1,"cccccccccc"),(2,"dddddddddd");
669
select group_concat(t1.b,t2.c) from t1 left join t2 using(a) group by t1.a;
670
select group_concat(t1.b,t2.c) from t1 inner join t2 using(a) group by t1.a;
671
select group_concat(t1.b,t2.c) from t1 left join t2 using(a) group by a;
672
select group_concat(t1.b,t2.c) from t1 inner join t2 using(a) group by a;
674
set group_concat_max_len=default;
679
# BUG#10162 - ON is merged with WHERE, left join is convered to a regular join
681
create table t1 (gid smallint(5) unsigned not null, x int(11) not null, y int(11) not null, art int(11) not null, primary key (gid,x,y));
682
insert t1 values (1, -5, -8, 2), (1, 2, 2, 1), (1, 1, 1, 1);
683
create table t2 (gid smallint(5) unsigned not null, x int(11) not null, y int(11) not null, id int(11) not null, primary key (gid,id,x,y), key id (id));
684
insert t2 values (1, -5, -8, 1), (1, 1, 1, 1), (1, 2, 2, 1);
685
create table t3 ( set_id smallint(5) unsigned not null, id tinyint(4) unsigned not null, name char(12) not null, primary key (id,set_id));
686
insert t3 values (0, 1, 'a'), (1, 1, 'b'), (0, 2, 'c'), (1, 2, 'd'), (1, 3, 'e'), (1, 4, 'f'), (1, 5, 'g'), (1, 6, 'h');
687
explain select name from t1 left join t2 on t1.x = t2.x and t1.y = t2.y
688
left join t3 on t1.art = t3.id where t2.id =1 and t2.x = -5 and t2.y =-8
689
and t1.gid =1 and t2.gid =1 and t3.set_id =1;
690
drop tables t1,t2,t3;
693
# Test for bug #9938: invalid conversion from outer join to inner join
694
# for queries containing indirect reference in WHERE clause
697
CREATE TABLE t1 (EMPNUM INT, GRP INT);
698
INSERT INTO t1 VALUES (0, 10);
699
INSERT INTO t1 VALUES (2, 30);
701
CREATE TABLE t2 (EMPNUM INT, NAME CHAR(5));
702
INSERT INTO t2 VALUES (0, 'KERI');
703
INSERT INTO t2 VALUES (9, 'BARRY');
706
SELECT COALESCE(t2.EMPNUM,t1.EMPNUM) AS EMPNUM, NAME, GRP
707
FROM t2 LEFT OUTER JOIN t1 ON t2.EMPNUM=t1.EMPNUM;
710
SELECT * FROM v1 WHERE EMPNUM < 10;
716
# Test for bug #11285: false Item_equal on expression in outer join
719
CREATE TABLE t1 (c11 int);
720
CREATE TABLE t2 (c21 int);
721
INSERT INTO t1 VALUES (30), (40), (50);
722
INSERT INTO t2 VALUES (300), (400), (500);
723
SELECT * FROM t1 LEFT JOIN t2 ON (c11=c21 AND c21=30) WHERE c11=40;
727
# #12101: erroneously applied outer join elimination in case of WHERE NOT BETWEEN
728
# #12102: erroneously missing outer join elimination in case of WHERE IN/IF
731
CREATE TABLE t1 (a int PRIMARY KEY, b int);
732
CREATE TABLE t2 (a int PRIMARY KEY, b int);
734
INSERT INTO t1 VALUES (1,2), (2,1), (3,2), (4,3), (5,6), (6,5), (7,8), (8,7), (9,10);
735
INSERT INTO t2 VALUES (3,0), (4,1), (6,4), (7,5);
737
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE t2.b <= t1.a AND t1.a <= t1.b;
738
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE t1.a BETWEEN t2.b AND t1.b;
739
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE NOT(t1.a NOT BETWEEN t2.b AND t1.b);
741
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE t2.b > t1.a OR t1.a > t1.b;
742
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE t1.a NOT BETWEEN t2.b AND t1.b;
743
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE NOT(t1.a BETWEEN t2.b AND t1.b);
745
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE t1.a = t2.a OR t2.b > t1.a OR t1.a > t1.b;
746
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE NOT(t1.a != t2.a AND t1.a BETWEEN t2.b AND t1.b);
748
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE t1.a = t2.a AND (t2.b > t1.a OR t1.a > t1.b);
749
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE NOT(t1.a != t2.a OR t1.a BETWEEN t2.b AND t1.b);
751
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE t1.a = t2.a OR t1.a = t2.b;
752
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE t1.a IN(t2.a, t2.b);
753
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE NOT(t1.a NOT IN(t2.a, t2.b));
755
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE t1.a != t1.b AND t1.a != t2.b;
756
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE t1.a NOT IN(t1.b, t2.b);
757
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE NOT(t1.a IN(t1.b, t2.b));
759
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE t2.a != t2.b OR (t1.a != t2.a AND t1.a != t2.b);
760
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE NOT(t2.a = t2.b AND t1.a IN(t2.a, t2.b));
762
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE t2.a != t2.b AND t1.a != t1.b AND t1.a != t2.b;
763
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE NOT(t2.a = t2.b OR t1.a IN(t1.b, t2.b));
765
EXPLAIN SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE t1.a = t2.a OR t1.a = t2.b;
766
EXPLAIN SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE t1.a IN(t2.a, t2.b);
767
EXPLAIN SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE t1.a > IF(t1.a = t2.b-2, t2.b, t2.b-1);
772
# Test for bug #17164: ORed FALSE blocked conversion of outer join into join
775
# Test case moved to join_outer_innodb
778
# Bug 19396: LEFT OUTER JOIN over views in curly braces
781
DROP VIEW IF EXISTS v1,v2;
782
DROP TABLE IF EXISTS t1,t2;
785
CREATE TABLE t1 (a int);
786
CREATE table t2 (b int);
787
INSERT INTO t1 VALUES (1), (2), (3), (4), (1), (1), (3);
788
INSERT INTO t2 VALUES (2), (3);
790
CREATE VIEW v1 AS SELECT a FROM t1 JOIN t2 ON t1.a=t2.b;
791
CREATE VIEW v2 AS SELECT b FROM t2 JOIN t1 ON t2.b=t1.a;
794
FROM v1 LEFT OUTER JOIN v2 ON (v1.a=v2.b) AND (v1.a >= 3)
797
FROM { OJ v1 LEFT OUTER JOIN v2 ON (v1.a=v2.b) AND (v1.a >= 3) }
804
# Bug 19816: LEFT OUTER JOIN with constant ORed predicates in WHERE clause
807
CREATE TABLE t1 (a int);
808
CREATE TABLE t2 (b int);
809
INSERT INTO t1 VALUES (1), (2), (3), (4);
810
INSERT INTO t2 VALUES (2), (3);
813
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b WHERE (1=1);
816
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b WHERE (1 OR 1);
818
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b WHERE (0 OR 1);
820
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b WHERE (1=1 OR 2=2);
822
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b WHERE (1=1 OR 1=0);
827
# Bug 26017: LEFT OUTER JOIN over two constant tables and
828
# a case-insensitive comparison predicate field=const
832
f1 varchar(16) collate latin1_swedish_ci PRIMARY KEY,
833
f2 varchar(16) collate latin1_swedish_ci
836
f1 varchar(16) collate latin1_swedish_ci PRIMARY KEY,
837
f3 varchar(16) collate latin1_swedish_ci
840
INSERT INTO t1 VALUES ('bla','blah');
841
INSERT INTO t2 VALUES ('bla','sheep');
843
SELECT * FROM t1 JOIN t2 USING(f1) WHERE f1='Bla';
844
SELECT * FROM t1 LEFT JOIN t2 USING(f1) WHERE f1='bla';
845
SELECT * FROM t1 LEFT JOIN t2 USING(f1) WHERE f1='Bla';
850
# Bug 28188: 'not exists' optimization for outer joins
853
CREATE TABLE t1 (id int PRIMARY KEY, a varchar(8));
854
CREATE TABLE t2 (id int NOT NULL, b int NOT NULL, INDEX idx(id));
855
INSERT INTO t1 VALUES
856
(1,'aaaaaaa'), (5,'eeeeeee'), (4,'ddddddd'), (2,'bbbbbbb'), (3,'ccccccc');
857
INSERT INTO t2 VALUES
858
(3,10), (2,20), (5,30), (3,20), (5,10), (3,40), (3,30), (2,10), (2,40);
861
SELECT t1.id, a FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.b IS NULL;
864
SELECT t1.id, a FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.b IS NULL;
865
show status like 'Handler_read%';
870
# Bug 28571: outer join with false on condition over constant tables
873
CREATE TABLE t1 (c int PRIMARY KEY, e int NOT NULL);
874
INSERT INTO t1 VALUES (1,0), (2,1);
875
CREATE TABLE t2 (d int PRIMARY KEY);
876
INSERT INTO t2 VALUES (1), (2), (3);
878
EXPLAIN SELECT * FROM t1 LEFT JOIN t2 ON e<>0 WHERE c=1 AND d IS NULL;
879
SELECT * FROM t1 LEFT JOIN t2 ON e<>0 WHERE c=1 AND d IS NULL;
880
SELECT * FROM t1 LEFT JOIN t2 ON e<>0 WHERE c=1 AND d<=>NULL;
885
--echo # Bug#47650: using group by with rollup without indexes returns incorrect
886
--echo # results with where
888
CREATE TABLE t1 ( a INT );
889
INSERT INTO t1 VALUES (1);
891
CREATE TABLE t2 ( a INT, b INT );
892
INSERT INTO t2 VALUES (1, 1),(1, 2),(1, 3),(2, 4),(2, 5);
895
SELECT t1.a, COUNT( t2.b ), SUM( t2.b ), MAX( t2.b )
896
FROM t1 LEFT JOIN t2 USING( a )
897
GROUP BY t1.a WITH ROLLUP;
899
SELECT t1.a, COUNT( t2.b ), SUM( t2.b ), MAX( t2.b )
900
FROM t1 LEFT JOIN t2 USING( a )
901
GROUP BY t1.a WITH ROLLUP;
904
SELECT t1.a, COUNT( t2.b ), SUM( t2.b ), MAX( t2.b )
905
FROM t1 JOIN t2 USING( a )
906
GROUP BY t1.a WITH ROLLUP;
908
SELECT t1.a, COUNT( t2.b ), SUM( t2.b ), MAX( t2.b )
909
FROM t1 JOIN t2 USING( a )
910
GROUP BY t1.a WITH ROLLUP;
915
--echo # Bug#51598 Inconsistent behaviour with a COALESCE statement inside an IN comparison
917
CREATE TABLE t1(f1 INT, f2 INT, f3 INT);
918
INSERT INTO t1 VALUES (1, NULL, 3);
919
CREATE TABLE t2(f1 INT, f2 INT);
920
INSERT INTO t2 VALUES (2, 1);
922
EXPLAIN EXTENDED SELECT * FROM t1 LEFT JOIN t2 ON t1.f2 = t2.f2
923
WHERE (COALESCE(t1.f1, t2.f1), f3) IN ((1, 3), (2, 2));
925
SELECT * FROM t1 LEFT JOIN t2 ON t1.f2 = t2.f2
926
WHERE (COALESCE(t1.f1, t2.f1), f3) IN ((1, 3), (2, 2));
931
--echo # Bug#52357: Assertion failed: join->best_read in greedy_search
932
--echo # optimizer_search_depth=0
934
CREATE TABLE t1( a INT );
936
INSERT INTO t1 VALUES (1),(2);
937
SET optimizer_search_depth = 0;
939
--echo # Should not core dump on query preparation
942
FROM t1 tt3 LEFT OUTER JOIN t1 tt4 ON 1
943
LEFT OUTER JOIN t1 tt5 ON 1
944
LEFT OUTER JOIN t1 tt6 ON 1
945
LEFT OUTER JOIN t1 tt7 ON 1
946
LEFT OUTER JOIN t1 tt8 ON 1
947
RIGHT OUTER JOIN t1 tt2 ON 1
948
RIGHT OUTER JOIN t1 tt1 ON 1
949
STRAIGHT_JOIN t1 tt9 ON 1;
951
SET optimizer_search_depth = DEFAULT;
955
--echo # Bug#46091 STRAIGHT_JOIN + RIGHT JOIN returns different result
957
CREATE TABLE t1 (f1 INT NOT NULL);
958
INSERT INTO t1 VALUES (9),(0);
960
CREATE TABLE t2 (f1 INT NOT NULL);
961
INSERT INTO t2 VALUES
962
(5),(3),(0),(3),(1),(0),(1),(7),(1),(0),(0),(8),(4),(9),(0),(2),(0),(8),(5),(1);
964
SELECT STRAIGHT_JOIN COUNT(*) FROM t1 TA1
965
RIGHT JOIN t2 TA2 JOIN t2 TA3 ON TA2.f1 ON TA3.f1;
967
EXPLAIN SELECT STRAIGHT_JOIN COUNT(*) FROM t1 TA1
968
RIGHT JOIN t2 TA2 JOIN t2 TA3 ON TA2.f1 ON TA3.f1;
973
--echo # Bug#48971 Segfault in add_found_match_trig_cond () at sql_select.cc:5990
975
CREATE TABLE t1(f1 INT, PRIMARY KEY (f1));
976
INSERT INTO t1 VALUES (1),(2);
978
EXPLAIN EXTENDED SELECT STRAIGHT_JOIN jt1.f1 FROM t1 AS jt1
982
LEFT JOIN t1 AS jt5 ON 1
984
RIGHT JOIN t1 AS jt6 ON jt6.f1
987
EXPLAIN EXTENDED SELECT STRAIGHT_JOIN jt1.f1 FROM t1 AS jt1
991
LEFT JOIN t1 AS jt5 ON 1
993
RIGHT JOIN t1 AS jt6 ON jt6.f1
999
--echo # Bug#57688 Assertion `!table || (!table->write_set || bitmap_is_set(table->write_set, field
1002
CREATE TABLE t1 (f1 INT NOT NULL, PRIMARY KEY (f1));
1003
CREATE TABLE t2 (f1 INT NOT NULL, f2 INT NOT NULL, PRIMARY KEY (f1, f2));
1005
INSERT INTO t1 VALUES (4);
1006
INSERT INTO t2 VALUES (3, 3);
1007
INSERT INTO t2 VALUES (7, 7);
1009
EXPLAIN SELECT * FROM t1 LEFT JOIN t2 ON t2.f1 = t1.f1
1011
GROUP BY t2.f1, t2.f2;
1013
SELECT * FROM t1 LEFT JOIN t2 ON t2.f1 = t1.f1
1015
GROUP BY t2.f1, t2.f2;
1017
EXPLAIN SELECT * FROM t1 LEFT JOIN t2 ON t2.f1 = t1.f1
1018
WHERE t1.f1 = 4 AND t2.f1 IS NOT NULL AND t2.f2 IS NOT NULL
1019
GROUP BY t2.f1, t2.f2;
1021
SELECT * FROM t1 LEFT JOIN t2 ON t2.f1 = t1.f1
1022
WHERE t1.f1 = 4 AND t2.f1 IS NOT NULL AND t2.f2 IS NOT NULL
1023
GROUP BY t2.f1, t2.f2;
1028
--echo # Bug#57034 incorrect OUTER JOIN result when joined on unique key
1031
CREATE TABLE t1 (pk INT PRIMARY KEY,
1033
col_int_unique INT UNIQUE KEY);
1034
INSERT INTO t1 VALUES (1,NULL,2), (2,0,0);
1036
CREATE TABLE t2 (pk INT PRIMARY KEY,
1038
col_int_unique INT UNIQUE KEY);
1039
INSERT INTO t2 VALUES (1,0,1), (2,0,2);
1042
SELECT * FROM t1 LEFT JOIN t2
1043
ON t1.col_int_unique = t2.col_int_unique AND t1.col_int = t2.col_int
1046
SELECT * FROM t1 LEFT JOIN t2
1047
ON t1.col_int_unique = t2.col_int_unique AND t1.col_int = t2.col_int
1053
--echo # Bug#48046 Server incorrectly processing JOINs on NULL values
1056
# bug#48046 is a duplicate of bug#57034
1059
`pk` int(11) NOT NULL AUTO_INCREMENT,
1060
`time_key` time DEFAULT NULL,
1061
`varchar_key` varchar(1) DEFAULT NULL,
1062
`varchar_nokey` varchar(1) DEFAULT NULL,
1064
KEY `time_key` (`time_key`),
1065
KEY `varchar_key` (`varchar_key`)
1066
) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
1068
INSERT INTO `BB` VALUES (10,'18:27:58',NULL,NULL);
1070
SELECT table1.time_key AS field1, table2.pk
1071
FROM BB table1 LEFT JOIN BB table2
1072
ON table2.varchar_nokey = table1.varchar_key
1078
--echo # Bug#49600 Server incorrectly processing RIGHT JOIN with
1079
--echo # constant WHERE clause and no index
1082
# bug#49600 is a duplicate of bug#57034
1085
`col_datetime_key` datetime DEFAULT NULL,
1086
`col_varchar_key` varchar(1) DEFAULT NULL,
1087
`col_varchar_nokey` varchar(1) DEFAULT NULL,
1088
KEY `col_datetime_key` (`col_datetime_key`),
1089
KEY `col_varchar_key` (`col_varchar_key`)
1090
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
1092
INSERT INTO `BB` VALUES ('1900-01-01 00:00:00',NULL,NULL);
1094
SELECT table1.col_datetime_key
1095
FROM BB table1 RIGHT JOIN BB table2
1096
ON table2 .col_varchar_nokey = table1.col_varchar_key
1099
# Disable keys, and we get incorrect result for the same query
1100
ALTER TABLE BB DISABLE KEYS;
1102
SELECT table1.col_datetime_key
1103
FROM BB table1 RIGHT JOIN BB table2
1104
ON table2 .col_varchar_nokey = table1.col_varchar_key
1111
--echo # Bug#58490: Incorrect result in multi level OUTER JOIN
1112
--echo # in combination with IS NULL
1115
CREATE TABLE t1 (i INT NOT NULL);
1116
INSERT INTO t1 VALUES (0), (2),(3),(4);
1117
CREATE TABLE t2 (i INT NOT NULL);
1118
INSERT INTO t2 VALUES (0),(1), (3),(4);
1119
CREATE TABLE t3 (i INT NOT NULL);
1120
INSERT INTO t3 VALUES (0),(1),(2), (4);
1121
CREATE TABLE t4 (i INT NOT NULL);
1122
INSERT INTO t4 VALUES (0),(1),(2),(3) ;
1151
# Most simplified testcase to reproduce the bug.
1152
# (Has to be at least a two level nested outer join)
1166
# We then add some equi-join inside the query above:
1167
# (There Used to be some problems here with first
1168
# proposed patch for this bug)
1189
JOIN (t4 AS t4a JOIN t4 AS t4b ON t4a.i=t4b.i)
1202
JOIN (t4 AS t4a, t4 AS t4b)
1209
DROP TABLE t1,t2,t3,t4;
1211
## Bug#49322 & bug#58490 are duplicates. However, we include testcases
1214
--echo # Bug#49322(Duplicate): Server is adding extra NULL row
1215
--echo # on processing a WHERE clause
1218
CREATE TABLE h (pk INT NOT NULL, col_int_key INT);
1219
INSERT INTO h VALUES (1,NULL),(4,2),(5,2),(3,4),(2,8);
1221
CREATE TABLE m (pk INT NOT NULL, col_int_key INT);
1222
INSERT INTO m VALUES (1,2),(2,7),(3,5),(4,7),(5,5),(6,NULL),(7,NULL),(8,9);
1223
CREATE TABLE k (pk INT NOT NULL, col_int_key INT);
1224
INSERT INTO k VALUES (1,9),(2,2),(3,5),(4,2),(5,7),(6,0),(7,5);
1226
# Baseline query wo/ 'WHERE ... IS NULL' - was correct
1228
SELECT TABLE1.pk FROM k TABLE1
1229
RIGHT JOIN h TABLE2 ON TABLE1.col_int_key=TABLE2.col_int_key
1230
RIGHT JOIN m TABLE4 ON TABLE2.col_int_key=TABLE4.col_int_key;
1232
# Adding 'WHERE ... IS NULL' -> incorrect result
1234
SELECT TABLE1.pk FROM k TABLE1
1235
RIGHT JOIN h TABLE2 ON TABLE1.col_int_key=TABLE2.col_int_key
1236
RIGHT JOIN m TABLE4 ON TABLE2.col_int_key=TABLE4.col_int_key
1237
WHERE TABLE1.pk IS NULL;
1242
--echo # Bug #11765810 58813: SERVER THREAD HANGS WHEN JOIN + WHERE + GROUP BY
1243
--echo # IS EXECUTED TWICE FROM P
1245
CREATE TABLE t1 ( a INT ) ENGINE = MYISAM;
1246
INSERT INTO t1 VALUES (1);
1247
PREPARE prep_stmt FROM '
1248
SELECT 1 AS f FROM t1
1262
--echo End of 5.1 tests
1265
--echo # Bug#54235 Extra rows with join_cache_level=4,6,8 and two LEFT JOIN
1268
CREATE TABLE t1 (a int);
1269
CREATE TABLE t2 (a int);
1270
CREATE TABLE t3 (a int);
1271
CREATE TABLE t4 (a int);
1273
INSERT INTO t1 VALUES (null),(null);
1275
let $query = SELECT t1.a FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.a)
1276
ON 0 WHERE t1.a OR t3.a;
1278
eval explain $query;
1282
let $query = SELECT t1.a FROM t1 LEFT JOIN
1283
(t2 LEFT JOIN (t3 LEFT JOIN t4 ON 1) ON t2.a)
1284
ON 0 WHERE t1.a OR t4.a;
1286
eval explain $query;
1290
DROP TABLE t1,t2,t3,t4;
1293
--echo # Bug#56254 Assertion tab->ref.use_count fails in
1294
--echo # join_read_key_unlock_row() on 4-way JOIN
1302
KEY col_int_key (col_int_key)
1305
INSERT INTO t1 VALUES (6, -448724992, NULL);
1309
col_varchar_10 VARCHAR(10)
1312
INSERT INTO t2 VALUES (6,'afasdkiyum');
1315
col_varchar_10 VARCHAR(10),
1324
INSERT INTO t4 VALUES (1);
1325
INSERT INTO t4 VALUES (2);
1332
ON t3.col_int = t4.pk
1333
ON t2.col_varchar_10 = t3.col_varchar_10
1334
ON t2.col_int = t1.pk
1335
WHERE t1.col_int_key IS NULL OR t4.pk < t3.col_int;
1337
DROP TABLE t1,t2,t3,t4;
1340
--echo # BUG#12567331 - INFINITE LOOP WHEN RESOLVING AN ALIASED COLUMN
1341
--echo # USED IN GROUP BY
1343
CREATE TABLE t1 (pk int(11));
1345
PREPARE prep_stmt_9846 FROM '
1346
SELECT alias1.pk AS field1 FROM
1361
execute prep_stmt_9846;
1362
execute prep_stmt_9846;
1363
deallocate prepare prep_stmt_9846;
1367
--echo # Bug#13040136 - ASSERT IN PLAN_CHANGE_WATCHDOG::~PLAN_CHANGE_WATCHDOG()
1370
col_varchar_10 VARCHAR(10),
1371
col_int_key INTEGER,
1372
col_varchar_10_key VARCHAR(10),
1373
pk INTEGER NOT NULL,
1376
KEY (col_varchar_10_key)
1378
INSERT INTO t1 VALUES ('q',NULL,'o',1);
1381
pk INTEGER NOT NULL AUTO_INCREMENT,
1382
col_varchar_10_key VARCHAR(10),
1383
col_int_key INTEGER,
1384
col_varchar_10 VARCHAR(10),
1386
KEY (col_varchar_10_key),
1387
KEY col_int_key (col_int_key)
1389
INSERT INTO t2 VALUES
1390
(1,'r',NULL,'would'),(2,'tell',-655032320,'t'),
1391
(3,'d',9,'a'),(4,'gvafasdkiy',6,'ugvafasdki'),
1392
(5,'that\'s',NULL,'she'),(6,'bwftwugvaf',7,'cbwftwugva'),
1393
(7,'f',-700055552,'mkacbwftwu'),(8,'a',9,'be'),
1394
(9,'d',NULL,'u'),(10,'ckiixcsxmk',NULL,'o');
1396
SELECT DISTINCT t2.col_int_key
1400
ON t1.col_varchar_10 = t2.col_varchar_10_key
1402
ORDER BY t2.col_int_key;
1407
--echo # Bug#13068506 - QUERY WITH GROUP BY ON NON-AGGR COLUMN RETURNS WRONG RESULT
1409
CREATE TABLE t1 (i1 int);
1410
INSERT INTO t1 VALUES (100), (101);
1412
CREATE TABLE t2 (i2 int, i3 int);
1413
INSERT INTO t2 VALUES (20,1),(10,2);
1415
CREATE TABLE t3 (i4 int(11));
1416
INSERT INTO t3 VALUES (1),(2);
1418
let $query= SELECT (
1420
FROM t3 RIGHT JOIN t2 ON ( t2.i3 = 2 )
1421
WHERE t2.i3 <> t1.i1
1428
--eval $query GROUP BY field1;
1431
drop table t1,t2,t3;
1433
--echo # Bug#11766384 - 59487: WRONG RESULT WITH STRAIGHT_JOIN AND RIGHT JOIN
1436
pk int(11) NOT NULL,
1437
col_varchar_10_latin1_key varchar(10) DEFAULT NULL
1438
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
1439
INSERT INTO t1 VALUES (1,'1');
1442
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
1443
INSERT INTO t2 VALUES (1);
1446
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
1447
INSERT INTO t3 VALUES (1);
1449
pk int(11) NOT NULL,
1450
col_int int(11) DEFAULT NULL,
1451
col_int_key int(11) DEFAULT NULL,
1452
col_varchar_10_latin1_key varchar(10) DEFAULT NULL
1453
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
1454
INSERT INTO t4 VALUES (1,1,1,'1');
1456
col_int int(11) DEFAULT NULL,
1457
col_varchar_10_utf8_key varchar(10) CHARACTER SET utf8 DEFAULT NULL
1458
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
1459
INSERT INTO t5 VALUES (1,'1');
1461
col_int_key int(11) DEFAULT NULL,
1462
col_varchar_10_latin1_key varchar(10) DEFAULT NULL,
1464
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
1465
INSERT INTO t6 VALUES (1,'1',1);
1467
# EXPLAIN of query above (t2 is before t5 in plan)
1469
let $rest_of_query=t6a.pk, t2.pk
1486
ON t4.col_int_key = t1.pk
1493
ON t5.col_varchar_10_utf8_key = t6b.col_varchar_10_latin1_key
1495
ON t1.pk = t5.col_int
1497
ON t4.col_varchar_10_latin1_key = t1.col_varchar_10_latin1_key
1498
AND t5.col_varchar_10_utf8_key = 0
1501
WHERE t6b.col_int_key IS TRUE
1504
eval SELECT STRAIGHT_JOIN $rest_of_query;
1505
eval EXPLAIN SELECT STRAIGHT_JOIN $rest_of_query;
1507
# right result (same query, just remove STRAIGHT_JOIN):
1509
eval SELECT $rest_of_query;
1510
eval EXPLAIN SELECT $rest_of_query;
1512
drop table t1,t2,t3,t4,t5,t6;
1515
--echo # Verify that the "not exists" optimization works.
1517
CREATE TABLE t1(a INT);
1518
CREATE TABLE t2(a INT NOT NULL);
1519
INSERT INTO t1 VALUES(1),(2);
1520
INSERT INTO t2 VALUES(1),(2);
1521
let $query=SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.a WHERE t2.a IS NULL;
1522
eval EXPLAIN $query;
1525
# Without the "not exists" optimization, there would be more read_rnd_next
1526
SHOW STATUS LIKE 'HANDLER_READ%';
1530
--echo # Bug#13464334 SAME QUERY PRODUCES DIFFERENT RESULTS WHEN USED WITH AND
1531
--echo # WITHOUT UNION ALL
1534
CREATE TABLE t1 (p1 INT PRIMARY KEY, a CHAR(1));
1535
CREATE TABLE t2 (p2 INT PRIMARY KEY, b CHAR(1));
1536
INSERT INTO t1 VALUES (1,'a'),(2,'b'),(3,'c');
1537
INSERT INTO t2 VALUES (1,'h'),(2,'i'),(3,'j'),(4,'k');
1538
CREATE VIEW v1 AS SELECT * FROM t1;
1539
CREATE VIEW v2 AS SELECT * FROM t2;
1540
(SELECT p1 FROM v2 LEFT JOIN v1 ON b = a WHERE p2 = 1 GROUP BY p1 ORDER BY p1)
1541
UNION (SELECT NULL LIMIT 0);
1546
--echo # Bug#13980954 Missing data on left join + null value + where..in
1549
CREATE TABLE t1 (ik INT, vc varchar(1)) ENGINE=Innodb;
1552
SELECT straight_join t1.vc, t1.ik
1553
FROM t1 JOIN t1 AS t2 ON t1.vc=t2.vc LEFT JOIN t1 AS t3 ON t1.vc=t3.vc;
1555
eval explain format=json $query;