# General purpose bug fix tests go here : subselect.test too large --echo # --echo # Bug #46791: Assertion failed:(table->key_read==0),function unknown --echo # function,file sql_base.cc --echo # CREATE TABLE t1 (a INT, b INT, KEY(a)); INSERT INTO t1 VALUES (1,1),(2,2); CREATE TABLE t2 LIKE t1; INSERT INTO t2 VALUES (1,1),(2,2); CREATE TABLE t3 LIKE t1; --echo # should have 1 impossible where and 2 dependent subqueries EXPLAIN SELECT 1 FROM t1 WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE 1 = (SELECT MIN(t2.b) FROM t3)) ORDER BY count(*); --echo # should not crash the next statement SELECT 1 FROM t1 WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE 1 = (SELECT MIN(t2.b) FROM t3)) ORDER BY count(*); --echo # should not crash: the crash is caused by the previous statement SELECT 1; DROP TABLE t1,t2,t3; --echo # --echo # Bug #47106: Crash / segfault on adding EXPLAIN to a non-crashing --echo # query --echo # CREATE TABLE t1 ( a INT, b INT, PRIMARY KEY (a), KEY b (b) ); INSERT INTO t1 VALUES (1, 1), (2, 1); CREATE TABLE t2 LIKE t1; INSERT INTO t2 SELECT * FROM t1; CREATE TABLE t3 LIKE t1; INSERT INTO t3 SELECT * FROM t1; --echo # Should not crash. --echo # Should have 1 impossible where and 2 dependent subqs. EXPLAIN SELECT (SELECT 1 FROM t1,t2 WHERE t2.b > t3.b) FROM t3 WHERE 1 = 0 GROUP BY 1; --echo # should return 0 rows SELECT (SELECT 1 FROM t1,t2 WHERE t2.b > t3.b) FROM t3 WHERE 1 = 0 GROUP BY 1; DROP TABLE t1,t2,t3; --echo End of 5.0 tests. # # Fix for LP#612894 # Some aggregate functions (such as MIN MAX) work incorrectly in subqueries # after getting NULL value # CREATE TABLE t1 (col_int_nokey int(11) NOT NULL, col_varchar_nokey varchar(1) NOT NULL) engine=myisam; INSERT INTO t1 VALUES (2,'s'),(0,'v'),(2,'s'); CREATE TABLE t2 ( pk int(11) NOT NULL AUTO_INCREMENT, `col_int_key` int(11) NOT NULL, col_varchar_key varchar(1) NOT NULL, PRIMARY KEY (pk), KEY `col_int_key` (`col_int_key`), KEY `col_varchar_key` (`col_varchar_key`) ) ENGINE=MyISAM; INSERT INTO t2 VALUES (4,10,'g'), (5,20,'v'); SELECT t1.col_int_nokey,(SELECT MIN( t2_a.col_int_key ) FROM t2 t2_a, t2 t2_b, t1 t1_a WHERE t1_a.col_varchar_nokey = t2_b.col_varchar_key and t1.col_int_nokey ) as sub FROM t1; SELECT t1.col_int_nokey,(SELECT MIN( t2_a.col_int_key ) +1 FROM t2 t2_a, t2 t2_b, t1 t1_a WHERE t1_a.col_varchar_nokey = t2_b.col_varchar_key and t1.col_int_nokey ) as sub FROM t1; DROP TABLE t1,t2; --echo # --echo # Bug#54568: create view cause Assertion failed: 0, --echo # file .\item_subselect.cc, line 836 --echo # EXPLAIN SELECT 1 LIKE ( 1 IN ( SELECT 1 ) ); DESCRIBE SELECT 1 LIKE ( 1 IN ( SELECT 1 ) ); --echo # None of the below should crash CREATE VIEW v1 AS SELECT 1 LIKE ( 1 IN ( SELECT 1 ) ); CREATE VIEW v2 AS SELECT 1 LIKE '%' ESCAPE ( 1 IN ( SELECT 1 ) ); DROP VIEW v1, v2; --echo # --echo # Bug#51070: Query with a NOT IN subquery predicate returns a wrong --echo # result set --echo # CREATE TABLE t1 ( a INT, b INT ); INSERT INTO t1 VALUES ( 1, NULL ), ( 2, NULL ); CREATE TABLE t2 ( c INT, d INT ); INSERT INTO t2 VALUES ( NULL, 3 ), ( NULL, 4 ); CREATE TABLE t3 ( e INT, f INT ); INSERT INTO t3 VALUES ( NULL, NULL ), ( NULL, NULL ); CREATE TABLE t4 ( a INT ); INSERT INTO t4 VALUES (1), (2), (3); CREATE TABLE t5 ( a INT ); INSERT INTO t5 VALUES (NULL), (2); --replace_column 1 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x EXPLAIN SELECT * FROM t1 WHERE ( a, b ) NOT IN ( SELECT c, d FROM t2 ); SELECT * FROM t1 WHERE ( a, b ) NOT IN ( SELECT c, d FROM t2 ); EXPLAIN SELECT * FROM t1 WHERE ( a, b ) NOT IN ( SELECT c, d FROM t2 ) IS NULL; SELECT * FROM t1 WHERE ( a, b ) NOT IN ( SELECT c, d FROM t2 ) IS NULL; SELECT * FROM t1 WHERE ( a, b ) IN ( SELECT c, d FROM t2 ) IS NULL; SELECT * FROM t1 WHERE ( a, b ) NOT IN ( SELECT c, d FROM t2 ) IS UNKNOWN; SELECT * FROM t1 WHERE (( a, b ) NOT IN ( SELECT c, d FROM t2 )) IS UNKNOWN; SELECT * FROM t1 WHERE 1 = 1 AND ( a, b ) NOT IN ( SELECT c, d FROM t2 ); --replace_column 1 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x EXPLAIN SELECT * FROM t1 WHERE ( a, b ) NOT IN ( SELECT e, f FROM t3 ); SELECT * FROM t1 WHERE ( a, b ) NOT IN ( SELECT e, f FROM t3 ); --replace_column 1 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x EXPLAIN SELECT * FROM t2 WHERE ( c, d ) NOT IN ( SELECT a, b FROM t1 ); SELECT * FROM t2 WHERE ( c, d ) NOT IN ( SELECT a, b FROM t1 ); --replace_column 1 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x EXPLAIN SELECT * FROM t3 WHERE ( e, f ) NOT IN ( SELECT c, d FROM t2 ); SELECT * FROM t3 WHERE ( e, f ) NOT IN ( SELECT c, d FROM t2 ); --replace_column 1 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x EXPLAIN SELECT * FROM t2 WHERE ( c, d ) NOT IN ( SELECT e, f FROM t3 ); SELECT * FROM t2 WHERE ( c, d ) NOT IN ( SELECT e, f FROM t3 ); SELECT * FROM t1 WHERE ( a, b ) NOT IN ( SELECT c, d FROM t2 WHERE c = 1 AND c <> 1 ); SELECT * FROM t1 WHERE b NOT IN ( SELECT c FROM t2 WHERE c = 1 ); SELECT * FROM t1 WHERE NULL NOT IN ( SELECT c FROM t2 WHERE c = 1 AND c <> 1 ); DROP TABLE t1, t2, t3, t4, t5; --echo # --echo # Bug#58207: invalid memory reads when using default column value and --echo # tmptable needed --echo # CREATE TABLE t(a VARCHAR(245) DEFAULT 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'); INSERT INTO t VALUES (''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''); SELECT * FROM (SELECT default(a) FROM t GROUP BY a) d; DROP TABLE t; --echo # --echo # End of 5.1 tests. --echo # --echo # --echo # BUG#46743 "Azalea processing correlated, aggregate SELECT --echo # subqueries incorrectly" --echo # CREATE TABLE t1 (c int); INSERT INTO t1 VALUES (NULL); CREATE TABLE t2 (d int , KEY (d)); # index is needed for bug INSERT INTO t2 VALUES (NULL),(NULL); # two rows needed for bug # we see that subquery returns 0 rows --echo 0 rows in subquery SELECT 1 AS RESULT FROM t2,t1 WHERE d = c; # so here it ends up as NULL --echo base query SELECT (SELECT 1 FROM t2 WHERE d = c) AS RESULT FROM t1 ; EXPLAIN EXTENDED SELECT (SELECT 1 FROM t2 WHERE d = c) AS RESULT FROM t1 ; --echo first equivalent variant SELECT (SELECT 1 FROM t2 WHERE d = IFNULL(c,NULL)) AS RESULT FROM t1 GROUP BY c ; EXPLAIN EXTENDED SELECT (SELECT 1 FROM t2 WHERE d = IFNULL(c,NULL)) AS RESULT FROM t1 GROUP BY c; --echo second equivalent variant # used to fail with 1242: Subquery returns more than 1 row SELECT (SELECT 1 FROM t2 WHERE d = c) AS RESULT FROM t1 GROUP BY c ; EXPLAIN EXTENDED SELECT (SELECT 1 FROM t2 WHERE d = c) AS RESULT FROM t1 GROUP BY c ; DROP TABLE t1,t2; --echo # --echo # BUG#45928 "Differing query results depending on MRR and --echo # engine_condition_pushdown settings" --echo # CREATE TABLE `t1` ( `pk` int(11) NOT NULL AUTO_INCREMENT, `time_nokey` time NOT NULL, `varchar_key` varchar(1) NOT NULL, `varchar_nokey` varchar(1) NOT NULL, PRIMARY KEY (`pk`), KEY `varchar_key` (`varchar_key`) ) AUTO_INCREMENT=12 DEFAULT CHARSET=latin1; INSERT INTO `t1` VALUES (10,'00:00:00','i','i'),(11,'00:00:00','',''); set @old_optimizer_switch = @@session.optimizer_switch, @old_optimizer_use_mrr = @@session.optimizer_use_mrr, @old_engine_condition_pushdown = @@session.engine_condition_pushdown; SET SESSION OPTIMIZER_SWITCH = 'materialization=off,semijoin=off,loosescan=off,firstmatch=off'; SET SESSION optimizer_use_mrr = 'force'; SET SESSION engine_condition_pushdown = 1; SELECT `time_nokey` G1 FROM t1 WHERE ( `varchar_nokey` , `varchar_key` ) IN ( SELECT `varchar_nokey` , `varchar_nokey` ) AND `varchar_key` >= 'c' HAVING G1 ORDER BY `pk` ; set @@session.optimizer_switch = @old_optimizer_switch, @@session.optimizer_use_mrr = @old_optimizer_use_mrr, @@session.engine_condition_pushdown = @old_engine_condition_pushdown; DROP TABLE t1; --echo # --echo # BUG#45863 "Assertion failed: (fixed == 0), function fix_fields(), --echo # file item.cc, line 4448" --echo # --disable_warnings DROP TABLE IF EXISTS C, BB; --enable_warnings CREATE TABLE C ( varchar_nokey varchar(1) NOT NULL ); INSERT INTO C VALUES ('k'),('a'),(''),('u'),('e'),('v'),('i'), ('t'),('u'),('f'),('u'),('m'),('j'),('f'), ('v'),('j'),('g'),('e'),('h'),('z'); CREATE TABLE BB ( varchar_nokey varchar(1) NOT NULL ); INSERT INTO BB VALUES ('i'),('t'); -- error ER_OPERAND_COLUMNS SELECT varchar_nokey FROM C WHERE (varchar_nokey, OUTR) IN (SELECT varchar_nokey FROM BB); -- error ER_BAD_FIELD_ERROR SELECT varchar_nokey FROM C WHERE (varchar_nokey, OUTR) IN (SELECT varchar_nokey, varchar_nokey FROM BB); DROP TABLE C,BB; --echo # --echo # During work with BUG#45863 I had problems with a query that was --echo # optimized differently in regular and prepared mode. --echo # Because there was a bug in one of the selected strategies, I became --echo # aware of the problem. Adding an EXPLAIN query to catch this. --disable_warnings DROP TABLE IF EXISTS t1, t2, t3; --enable_warnings CREATE TABLE t1 (EMPNUM CHAR(3) NOT NULL, EMPNAME CHAR(20), GRADE DECIMAL(4), CITY CHAR(15)); CREATE TABLE t2 (PNUM CHAR(3) NOT NULL, PNAME CHAR(20), PTYPE CHAR(6), BUDGET DECIMAL(9), CITY CHAR(15)); CREATE TABLE t3 (EMPNUM CHAR(3) NOT NULL, PNUM CHAR(3) NOT NULL, HOURS DECIMAL(5)); INSERT INTO t1 VALUES ('E1','Alice',12,'Deale'); INSERT INTO t1 VALUES ('E2','Betty',10,'Vienna'); INSERT INTO t1 VALUES ('E3','Carmen',13,'Vienna'); INSERT INTO t1 VALUES ('E4','Don',12,'Deale'); INSERT INTO t1 VALUES ('E5','Ed',13,'Akron'); INSERT INTO t2 VALUES ('P1','MXSS','Design',10000,'Deale'); INSERT INTO t2 VALUES ('P2','CALM','Code',30000,'Vienna'); INSERT INTO t2 VALUES ('P3','SDP','Test',30000,'Tampa'); INSERT INTO t2 VALUES ('P4','SDP','Design',20000,'Deale'); INSERT INTO t2 VALUES ('P5','IRM','Test',10000,'Vienna'); INSERT INTO t2 VALUES ('P6','PAYR','Design',50000,'Deale'); INSERT INTO t3 VALUES ('E1','P1',40); INSERT INTO t3 VALUES ('E1','P2',20); INSERT INTO t3 VALUES ('E1','P3',80); INSERT INTO t3 VALUES ('E1','P4',20); INSERT INTO t3 VALUES ('E1','P5',12); INSERT INTO t3 VALUES ('E1','P6',12); INSERT INTO t3 VALUES ('E2','P1',40); INSERT INTO t3 VALUES ('E2','P2',80); INSERT INTO t3 VALUES ('E3','P2',20); INSERT INTO t3 VALUES ('E4','P2',20); INSERT INTO t3 VALUES ('E4','P4',40); INSERT INTO t3 VALUES ('E4','P5',80); SET @old_optimizer_switch = @@session.optimizer_switch; SET @old_join_cache_level = @@session.join_cache_level; SET SESSION optimizer_switch = 'firstmatch=on,loosescan=on,materialization=on,semijoin=on'; SET SESSION join_cache_level = 1; CREATE UNIQUE INDEX t1_IDX ON t1(EMPNUM); EXPLAIN SELECT EMPNAME FROM t1 WHERE EMPNUM IN (SELECT EMPNUM FROM t3 WHERE PNUM IN (SELECT PNUM FROM t2 WHERE PTYPE = 'Design')); PREPARE stmt FROM "EXPLAIN SELECT EMPNAME FROM t1 WHERE EMPNUM IN (SELECT EMPNUM FROM t3 WHERE PNUM IN (SELECT PNUM FROM t2 WHERE PTYPE = 'Design'))"; EXECUTE stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; DROP INDEX t1_IDX ON t1; CREATE INDEX t1_IDX ON t1(EMPNUM); EXPLAIN SELECT EMPNAME FROM t1 WHERE EMPNUM IN (SELECT EMPNUM FROM t3 WHERE PNUM IN (SELECT PNUM FROM t2 WHERE PTYPE = 'Design')); PREPARE stmt FROM "EXPLAIN SELECT EMPNAME FROM t1 WHERE EMPNUM IN (SELECT EMPNUM FROM t3 WHERE PNUM IN (SELECT PNUM FROM t2 WHERE PTYPE = 'Design'))"; EXECUTE stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; DROP INDEX t1_IDX ON t1; EXPLAIN SELECT EMPNAME FROM t1 WHERE EMPNUM IN (SELECT EMPNUM FROM t3 WHERE PNUM IN (SELECT PNUM FROM t2 WHERE PTYPE = 'Design')); PREPARE stmt FROM "EXPLAIN SELECT EMPNAME FROM t1 WHERE EMPNUM IN (SELECT EMPNUM FROM t3 WHERE PNUM IN (SELECT PNUM FROM t2 WHERE PTYPE = 'Design'))"; EXECUTE stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET SESSION optimizer_switch = @old_optimizer_switch; SET SESSION join_cache_level = @old_join_cache_level; DROP TABLE t1, t2, t3; --echo # --echo # BUG#45221 Query SELECT pk FROM C WHERE pk IN (SELECT int_key) failing --echo # CREATE TABLE t1 ( i1_key INT, i2 INT, i3 INT, KEY i1_index (i1_key) ); INSERT INTO t1 VALUES (9,1,2), (9,2,1); CREATE TABLE t2 ( pk INT NOT NULL, i1 INT, PRIMARY KEY (pk) ); INSERT INTO t2 VALUES (9,1); --echo # Enable Index condition pushdown --replace_column 1 # SELECT @old_icp:=@@engine_condition_pushdown; SET SESSION engine_condition_pushdown = 'ON'; --echo SELECT pk FROM t2 WHERE pk IN ( SELECT i1_key FROM t1 WHERE t1.i2 < t1.i3 XOR t2.i1 > 1 ORDER BY t1.i2 desc); --echo # Restore old value for Index condition pushdown SET SESSION engine_condition_pushdown=@old_icp; DROP TABLE t1,t2; --echo # --echo # BUG#45863 "Assertion failed: (fixed == 0), function fix_fields(), --echo # file item.cc, line 4448" --echo # --disable_warnings DROP TABLE IF EXISTS C, BB; --enable_warnings CREATE TABLE C ( varchar_nokey varchar(1) NOT NULL ); INSERT INTO C VALUES ('k'),('a'),(''),('u'),('e'),('v'),('i'), ('t'),('u'),('f'),('u'),('m'),('j'),('f'), ('v'),('j'),('g'),('e'),('h'),('z'); CREATE TABLE BB ( varchar_nokey varchar(1) NOT NULL ); INSERT INTO BB VALUES ('i'),('t'); -- error ER_OPERAND_COLUMNS SELECT varchar_nokey FROM C WHERE (varchar_nokey, OUTR) IN (SELECT varchar_nokey FROM BB); -- error ER_BAD_FIELD_ERROR SELECT varchar_nokey FROM C WHERE (varchar_nokey, OUTR) IN (SELECT varchar_nokey, varchar_nokey FROM BB); DROP TABLE C,BB; --echo # --echo # During work with BUG#45863 I had problems with a query that was --echo # optimized differently in regular and prepared mode. --echo # Because there was a bug in one of the selected strategies, I became --echo # aware of the problem. Adding an EXPLAIN query to catch this. --disable_warnings DROP TABLE IF EXISTS t1, t2, t3; --enable_warnings CREATE TABLE t1 (EMPNUM CHAR(3) NOT NULL, EMPNAME CHAR(20), GRADE DECIMAL(4), CITY CHAR(15)); CREATE TABLE t2 (PNUM CHAR(3) NOT NULL, PNAME CHAR(20), PTYPE CHAR(6), BUDGET DECIMAL(9), CITY CHAR(15)); CREATE TABLE t3 (EMPNUM CHAR(3) NOT NULL, PNUM CHAR(3) NOT NULL, HOURS DECIMAL(5)); INSERT INTO t1 VALUES ('E1','Alice',12,'Deale'); INSERT INTO t1 VALUES ('E2','Betty',10,'Vienna'); INSERT INTO t1 VALUES ('E3','Carmen',13,'Vienna'); INSERT INTO t1 VALUES ('E4','Don',12,'Deale'); INSERT INTO t1 VALUES ('E5','Ed',13,'Akron'); INSERT INTO t2 VALUES ('P1','MXSS','Design',10000,'Deale'); INSERT INTO t2 VALUES ('P2','CALM','Code',30000,'Vienna'); INSERT INTO t2 VALUES ('P3','SDP','Test',30000,'Tampa'); INSERT INTO t2 VALUES ('P4','SDP','Design',20000,'Deale'); INSERT INTO t2 VALUES ('P5','IRM','Test',10000,'Vienna'); INSERT INTO t2 VALUES ('P6','PAYR','Design',50000,'Deale'); INSERT INTO t3 VALUES ('E1','P1',40); INSERT INTO t3 VALUES ('E1','P2',20); INSERT INTO t3 VALUES ('E1','P3',80); INSERT INTO t3 VALUES ('E1','P4',20); INSERT INTO t3 VALUES ('E1','P5',12); INSERT INTO t3 VALUES ('E1','P6',12); INSERT INTO t3 VALUES ('E2','P1',40); INSERT INTO t3 VALUES ('E2','P2',80); INSERT INTO t3 VALUES ('E3','P2',20); INSERT INTO t3 VALUES ('E4','P2',20); INSERT INTO t3 VALUES ('E4','P4',40); INSERT INTO t3 VALUES ('E4','P5',80); SET @old_optimizer_switch = @@session.optimizer_switch; SET @old_join_cache_level = @@session.join_cache_level; SET SESSION optimizer_switch = 'firstmatch=on,loosescan=on,materialization=on,semijoin=on'; SET SESSION join_cache_level = 1; CREATE UNIQUE INDEX t1_IDX ON t1(EMPNUM); EXPLAIN SELECT EMPNAME FROM t1 WHERE EMPNUM IN (SELECT EMPNUM FROM t3 WHERE PNUM IN (SELECT PNUM FROM t2 WHERE PTYPE = 'Design')); PREPARE stmt FROM "EXPLAIN SELECT EMPNAME FROM t1 WHERE EMPNUM IN (SELECT EMPNUM FROM t3 WHERE PNUM IN (SELECT PNUM FROM t2 WHERE PTYPE = 'Design'))"; EXECUTE stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; DROP INDEX t1_IDX ON t1; CREATE INDEX t1_IDX ON t1(EMPNUM); EXPLAIN SELECT EMPNAME FROM t1 WHERE EMPNUM IN (SELECT EMPNUM FROM t3 WHERE PNUM IN (SELECT PNUM FROM t2 WHERE PTYPE = 'Design')); PREPARE stmt FROM "EXPLAIN SELECT EMPNAME FROM t1 WHERE EMPNUM IN (SELECT EMPNUM FROM t3 WHERE PNUM IN (SELECT PNUM FROM t2 WHERE PTYPE = 'Design'))"; EXECUTE stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; DROP INDEX t1_IDX ON t1; EXPLAIN SELECT EMPNAME FROM t1 WHERE EMPNUM IN (SELECT EMPNUM FROM t3 WHERE PNUM IN (SELECT PNUM FROM t2 WHERE PTYPE = 'Design')); PREPARE stmt FROM "EXPLAIN SELECT EMPNAME FROM t1 WHERE EMPNUM IN (SELECT EMPNUM FROM t3 WHERE PNUM IN (SELECT PNUM FROM t2 WHERE PTYPE = 'Design'))"; EXECUTE stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET SESSION optimizer_switch = @old_optimizer_switch; SET SESSION join_cache_level = @old_join_cache_level; DROP TABLE t1, t2, t3; --echo # --echo # BUG#716293: "Range checked for each record" is not used if condition refers to outside of subquery --echo # create table t1 (a int); insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); create table t2 (a int, b int, `filler` char(200), key(a), key (b)); insert into t2 select A.a + 10*B.a + 100 * C.a, A.a + 10*B.a + 100 * C.a, 'filler' from t1 A, t1 B, t1 C; --echo # The following must use "Range checked for each record" for table B explain select a, (select sum(X.a+B.b) from t1 X, t2 B where B.a=A.a or B.b=A.a) from t1 A; drop table t1, t2; --echo # --echo # BUG#723822: Crash in get_constant_key_infix with EXISTS ( SELECT .. DISTINCT ) --echo # CREATE TABLE t1 ( f1 int(11), f3 varchar(1)) ; INSERT INTO t1 VALUES ('8','c'),('5','f'); ALTER TABLE t1 ADD KEY (f3,f1); CREATE TABLE t2 ( f4 varchar(1)) ; INSERT INTO t2 VALUES ('f'),('d'); SELECT * FROM t2 WHERE EXISTS ( SELECT DISTINCT f3 FROM t1 WHERE f3 <= t2.f4 ); drop table t1,t2; --echo # --echo # LP BUG#718763 Second crash in select_describe() and materialization --echo # CREATE TABLE t1 ( f1 int(11), f3 int(11), f10 varchar(1), KEY (f3)) ; INSERT INTO t1 VALUES ('28','6','m'),('29','4','c'); CREATE TABLE t2 (f11 varchar(1)) ; INSERT INTO t2 VALUES ('f'),('d'); SET @old_optimizer_switch = @@session.optimizer_switch; SET SESSION optimizer_switch = 'materialization=on'; EXPLAIN SELECT * FROM t1 WHERE f3 = ( SELECT t1.f3 FROM t1 WHERE ( t1.f10 ) IN ( SELECT f11 FROM t2 GROUP BY f11 )); SELECT * FROM t1 WHERE f3 = ( SELECT t1.f3 FROM t1 WHERE ( t1.f10 ) IN ( SELECT f11 FROM t2 GROUP BY f11 )); EXPLAIN SELECT * FROM t1 WHERE f3 = ( SELECT f3 FROM t1 WHERE ( f10, f10 ) IN ( SELECT f11, f11 FROM t2 GROUP BY f11 )); SELECT * FROM t1 WHERE f3 = ( SELECT f3 FROM t1 WHERE ( f10, f10 ) IN ( SELECT f11, f11 FROM t2 GROUP BY f11 )); SET SESSION optimizer_switch = @old_optimizer_switch; drop table t1,t2; --echo # --echo # LP BUG#715738: Wrong result with implicit grouping and empty result set --echo # CREATE TABLE t1 (f1 int, f2 int); CREATE TABLE t2 (f3 int, f4 int not null, PRIMARY KEY (f3)); set @save_optimizer_switch=@@optimizer_switch; SET @@optimizer_switch = 'materialization=on,semijoin=off'; EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4) FROM t2); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4) FROM t2); EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3+f4, min(f4) FROM t2); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3+f4, min(f4) FROM t2); EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4)+max(f4) FROM t2); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4)+max(f4) FROM t2); EXPLAIN SELECT (2, 0) NOT IN (SELECT f3, min(f4) FROM t2) as not_in; SELECT (2, 0) NOT IN (SELECT f3, min(f4) FROM t2) as not_in; EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, count(f4) FROM t2); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, count(f4) FROM t2); EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, f3 + count(f4) FROM t2); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, f3 + count(f4) FROM t2); EXPLAIN SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2) as not_in; SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2) as not_in; EXPLAIN SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 HAVING max(f4) > 7) as not_in; SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 HAVING max(f4) > 7) as not_in; EXPLAIN SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 HAVING max(f4) is null) as not_in; SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 HAVING max(f4) is null) as not_in; EXPLAIN SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4) FROM t2) as not_in; SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4) FROM t2) as not_in; EXPLAIN SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4)+f3 FROM t2) as not_in; SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4)+f3 FROM t2) as not_in; EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2); SET @@optimizer_switch = 'materialization=off,semijoin=off'; EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4) FROM t2); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4) FROM t2); EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3+f4, min(f4) FROM t2); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3+f4, min(f4) FROM t2); EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4)+max(f4) FROM t2); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4)+max(f4) FROM t2); EXPLAIN SELECT (2, 0) NOT IN (SELECT f3, min(f4) FROM t2) as not_in; SELECT (2, 0) NOT IN (SELECT f3, min(f4) FROM t2) as not_in; EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, count(f4) FROM t2); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, count(f4) FROM t2); EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, f3 + count(f4) FROM t2); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, f3 + count(f4) FROM t2); EXPLAIN SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2) as not_in; SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2) as not_in; EXPLAIN SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 HAVING max(f4) > 7) as not_in; SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 HAVING max(f4) > 7) as not_in; EXPLAIN SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 HAVING max(f4) is null) as not_in; SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 HAVING max(f4) is null) as not_in; EXPLAIN SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4) FROM t2) as not_in; SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4) FROM t2) as not_in; EXPLAIN SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4)+f3 FROM t2) as not_in; SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4)+f3 FROM t2) as not_in; EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2); INSERT INTO t1 VALUES (1, 2); INSERT INTO t1 VALUES (3, 4); INSERT INTO t2 VALUES (5, 6); INSERT INTO t2 VALUES (7, 8); SET @@optimizer_switch = 'materialization=on,semijoin=off'; EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4) FROM t2 WHERE f3 > 10); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4) FROM t2 WHERE f3 > 10); EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3+f4, min(f4) FROM t2 WHERE f3 > 10); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3+f4, min(f4) FROM t2 WHERE f3 > 10); EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4)+max(f4) FROM t2 WHERE f3 > 10); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4)+max(f4) FROM t2 WHERE f3 > 10); EXPLAIN SELECT (2, 0) NOT IN (SELECT f3, min(f4) FROM t2 WHERE f3 > 10) as not_in; SELECT (2, 0) NOT IN (SELECT f3, min(f4) FROM t2 WHERE f3 > 10) as not_in; EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10); EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, f3 + count(f4) FROM t2 WHERE f3 > 10); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, f3 + count(f4) FROM t2 WHERE f3 > 10); EXPLAIN SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10) as not_in; SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10) as not_in; EXPLAIN SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10 HAVING max(f4) > 7) as not_in; SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10 HAVING max(f4) > 7) as not_in; EXPLAIN SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10 HAVING max(f4) is null) as not_in; SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10 HAVING max(f4) is null) as not_in; EXPLAIN SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4) FROM t2 WHERE f3 > 10) as not_in; SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4) FROM t2 WHERE f3 > 10) as not_in; EXPLAIN SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4)+f3 FROM t2 WHERE f3 > 10) as not_in; SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4)+f3 FROM t2 WHERE f3 > 10) as not_in; EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2 WHERE f3 > 10); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2 WHERE f3 > 10); SET @@optimizer_switch = 'materialization=off,semijoin=off'; EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4) FROM t2 WHERE f3 > 10); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4) FROM t2 WHERE f3 > 10); EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3+f4, min(f4) FROM t2 WHERE f3 > 10); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3+f4, min(f4) FROM t2 WHERE f3 > 10); EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4)+max(f4) FROM t2 WHERE f3 > 10); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4)+max(f4) FROM t2 WHERE f3 > 10); EXPLAIN SELECT (2, 0) NOT IN (SELECT f3, min(f4) FROM t2 WHERE f3 > 10) as not_in; SELECT (2, 0) NOT IN (SELECT f3, min(f4) FROM t2 WHERE f3 > 10) as not_in; EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10); EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, f3 + count(f4) FROM t2 WHERE f3 > 10); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, f3 + count(f4) FROM t2 WHERE f3 > 10); EXPLAIN SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10) as not_in; SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10) as not_in; EXPLAIN SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10 HAVING max(f4) > 7) as not_in; SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10 HAVING max(f4) > 7) as not_in; EXPLAIN SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10 HAVING max(f4) is null) as not_in; SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10 HAVING max(f4) is null) as not_in; EXPLAIN SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4) FROM t2 WHERE f3 > 10) as not_in; SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4) FROM t2 WHERE f3 > 10) as not_in; EXPLAIN SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4)+f3 FROM t2 WHERE f3 > 10) as not_in; SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4)+f3 FROM t2 WHERE f3 > 10) as not_in; EXPLAIN SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2 WHERE f3 > 10); SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2 WHERE f3 > 10); set @@optimizer_switch=@save_optimizer_switch; drop table t1,t2; --echo # --echo # LP BUG#613029 Wrong result with materialization and semijoin, and --echo # valgrind warnings in Protocol::net_store_data with materialization --echo # for implicit grouping --echo # CREATE TABLE t1 ( pk int(11) NOT NULL AUTO_INCREMENT, f2 int(11) NOT NULL, f3 varchar(1) NOT NULL, PRIMARY KEY (pk), KEY f2 (f2)); INSERT INTO t1 VALUES (1,9,'x'); INSERT INTO t1 VALUES (2,5,'g'); CREATE TABLE t2 ( pk int(11) NOT NULL AUTO_INCREMENT, f2 int(11) NOT NULL, f3 varchar(1) NOT NULL, PRIMARY KEY (pk), KEY f2 (f2)); INSERT INTO t2 VALUES (1,7,'p'); set @save_optimizer_switch=@@optimizer_switch; set @@optimizer_switch='materialization=off,semijoin=off'; EXPLAIN SELECT t1.f3, MAX(t1.f2) FROM t1, t2 WHERE (t2.pk = t1.pk) AND t2.pk IN (SELECT f2 FROM t1); SELECT t1.f3, MAX(t1.f2) FROM t1, t2 WHERE (t2.pk = t1.pk) AND t2.pk IN (SELECT f2 FROM t1); set @@optimizer_switch='materialization=on,semijoin=off'; EXPLAIN SELECT t1.f3, MAX(t1.f2) FROM t1, t2 WHERE (t2.pk = t1.pk) AND t2.pk IN (SELECT f2 FROM t1); SELECT t1.f3, MAX(t1.f2) FROM t1, t2 WHERE (t2.pk = t1.pk) AND t2.pk IN (SELECT f2 FROM t1); -- echo TODO: add a test case for semijoin when the wrong result is fixed -- echo set @@optimizer_switch='materialization=off,semijoin=on'; set @@optimizer_switch=@save_optimizer_switch; drop table t1, t2;