CREATE TABLE t1 (id int(11) NOT NULL PRIMARY KEY, name varchar(20), INDEX (name)) ENGINE=InnoDB; CREATE TABLE t2 (id int(11) NOT NULL PRIMARY KEY, fkey int(11), FOREIGN KEY (fkey) REFERENCES t2(id)) ENGINE=InnoDB; INSERT INTO t1 VALUES (1,'A1'),(2,'A2'),(3,'B'); INSERT INTO t2 VALUES (1,1),(2,2),(3,2),(4,3),(5,3); EXPLAIN SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id WHERE t1.name LIKE 'A%'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index PRIMARY,name name 23 NULL 3 Using where; Using index 1 SIMPLE t2 ref fkey fkey 5 test.t1.id 1 Using index EXPLAIN SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id WHERE t1.name LIKE 'A%' OR FALSE; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 index NULL fkey 5 NULL 5 Using index 1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 test.t2.fkey 1 Using where DROP TABLE t1,t2; # # BUG#58456: Assertion 0 in QUICK_INDEX_MERGE_SELECT::need_sorted_output # in opt_range.h # CREATE TABLE t1 ( col_int INT, col_int_key INT, pk INT NOT NULL, PRIMARY KEY (pk), KEY col_int_key (col_int_key) ) ENGINE=InnoDB; INSERT INTO t1 VALUES (NULL,1,1), (6,2,2), (5,3,3), (NULL,4,4); INSERT INTO t1 VALUES (1,NULL,6), (8,5,7), (NULL,8,8), (8,NULL,5); CREATE TABLE t2 ( pk INT PRIMARY KEY ) ENGINE=InnoDB; EXPLAIN SELECT t1.pk FROM t2 LEFT JOIN t1 ON t2.pk = t1.col_int WHERE t1.col_int_key BETWEEN 5 AND 6 AND t1.pk IS NULL OR t1.pk IN (5) ORDER BY pk; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables SELECT t1.pk FROM t2 LEFT JOIN t1 ON t2.pk = t1.col_int WHERE t1.col_int_key BETWEEN 5 AND 6 AND t1.pk IS NULL OR t1.pk IN (5) ORDER BY pk; pk DROP TABLE t1,t2; # End BUG#58456 CREATE TABLE t1(a int, b int, KEY (a), PRIMARY KEY (b)) ENGINE=InnoDB; CREATE TABLE t2 (b int, PRIMARY KEY (b)); INSERT INTO t2 VALUES (4),(9); SELECT STRAIGHT_JOIN t1.a FROM t1 RIGHT JOIN t2 ON t1.b = t2.b WHERE (t1.b NOT BETWEEN 1 AND 7 OR t1.a IS NULL AND t1.b = t2.b) AND t2.b = 4 GROUP BY 1; a DROP TABLE t1,t2; # Bug #59487: WRONG RESULT WITH STRAIGHT_JOIN AND RIGHT JOIN # CREATE TABLE t1 ( pk int(11) NOT NULL, col_varchar_10_latin1_key varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO t1 VALUES (1,'1'); CREATE TABLE t2 ( pk int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO t2 VALUES (1); CREATE TABLE t3 ( pk int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO t3 VALUES (1); CREATE TABLE t4 ( pk int(11) NOT NULL, col_int int(11) DEFAULT NULL, col_int_key int(11) DEFAULT NULL, col_varchar_10_latin1_key varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO t4 VALUES (1,1,1,'1'); CREATE TABLE t5 ( col_int int(11) DEFAULT NULL, col_varchar_10_utf8_key varchar(10) CHARACTER SET utf8 DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO t5 VALUES (1,'1'); CREATE TABLE t6 ( col_int_key int(11) DEFAULT NULL, col_varchar_10_latin1_key varchar(10) DEFAULT NULL, pk int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO t6 VALUES (1,'1',1); SELECT STRAIGHT_JOIN t6a.pk, t2.pk FROM t6 AS t6a LEFT JOIN ( t2 RIGHT JOIN ( (t1 LEFT JOIN (t4 JOIN t3 ON t4.col_int) ON t4.col_int_key = t1.pk) LEFT JOIN (t5 JOIN t6 AS t6b ON t5.col_varchar_10_utf8_key = t6b.col_varchar_10_latin1_key) ON t1.pk = t5.col_int ) ON t4.col_varchar_10_latin1_key = t1.col_varchar_10_latin1_key AND t5.col_varchar_10_utf8_key = 0 ) ON t6a.pk IS TRUE WHERE t6b.col_int_key IS TRUE; pk pk 1 NULL EXPLAIN SELECT STRAIGHT_JOIN t6a.pk, t2.pk FROM t6 AS t6a LEFT JOIN ( t2 RIGHT JOIN ( (t1 LEFT JOIN (t4 JOIN t3 ON t4.col_int) ON t4.col_int_key = t1.pk) LEFT JOIN (t5 JOIN t6 AS t6b ON t5.col_varchar_10_utf8_key = t6b.col_varchar_10_latin1_key) ON t1.pk = t5.col_int ) ON t4.col_varchar_10_latin1_key = t1.col_varchar_10_latin1_key AND t5.col_varchar_10_utf8_key = 0 ) ON t6a.pk IS TRUE WHERE t6b.col_int_key IS TRUE; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t6a ALL NULL NULL NULL NULL 1 Using where 1 SIMPLE t1 ALL NULL NULL NULL NULL 1 Using join buffer (flat, BNL join) 1 SIMPLE t4 ALL NULL NULL NULL NULL 1 Using where; Using join buffer (incremental, BNL join) 1 SIMPLE t3 ALL NULL NULL NULL NULL 1 Using join buffer (incremental, BNL join) 1 SIMPLE t5 ALL NULL NULL NULL NULL 1 Using where; Using join buffer (incremental, BNL join) 1 SIMPLE t6b ALL NULL NULL NULL NULL 1 Using where; Using join buffer (incremental, BNL join) 1 SIMPLE t2 ALL NULL NULL NULL NULL 1 Using where; Using join buffer (incremental, BNL join) SELECT t6a.pk, t2.pk FROM t6 AS t6a LEFT JOIN ( t2 RIGHT JOIN ( (t1 LEFT JOIN (t4 JOIN t3 ON t4.col_int) ON t4.col_int_key = t1.pk) LEFT JOIN (t5 JOIN t6 AS t6b ON t5.col_varchar_10_utf8_key = t6b.col_varchar_10_latin1_key) ON t1.pk = t5.col_int ) ON t4.col_varchar_10_latin1_key = t1.col_varchar_10_latin1_key AND t5.col_varchar_10_utf8_key = 0 ) ON t6a.pk IS TRUE WHERE t6b.col_int_key IS TRUE; pk pk 1 NULL EXPLAIN SELECT t6a.pk, t2.pk FROM t6 AS t6a LEFT JOIN ( t2 RIGHT JOIN ( (t1 LEFT JOIN (t4 JOIN t3 ON t4.col_int) ON t4.col_int_key = t1.pk) LEFT JOIN (t5 JOIN t6 AS t6b ON t5.col_varchar_10_utf8_key = t6b.col_varchar_10_latin1_key) ON t1.pk = t5.col_int ) ON t4.col_varchar_10_latin1_key = t1.col_varchar_10_latin1_key AND t5.col_varchar_10_utf8_key = 0 ) ON t6a.pk IS TRUE WHERE t6b.col_int_key IS TRUE; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t6a ALL NULL NULL NULL NULL 1 Using where 1 SIMPLE t1 ALL NULL NULL NULL NULL 1 Using join buffer (flat, BNL join) 1 SIMPLE t4 ALL NULL NULL NULL NULL 1 Using where; Using join buffer (incremental, BNL join) 1 SIMPLE t3 ALL NULL NULL NULL NULL 1 Using join buffer (incremental, BNL join) 1 SIMPLE t5 ALL NULL NULL NULL NULL 1 Using where; Using join buffer (incremental, BNL join) 1 SIMPLE t2 ALL NULL NULL NULL NULL 1 Using where; Using join buffer (incremental, BNL join) 1 SIMPLE t6b ALL NULL NULL NULL NULL 1 Using where; Using join buffer (incremental, BNL join) drop table t1,t2,t3,t4,t5,t6;