mirror of
https://github.com/MariaDB/server.git
synced 2025-02-01 03:21:53 +01:00
adce16f96f
Analysis: The reason for the crash was that the inner subquery was executed via a scan on a final temporary table applied after all other operations. This final operation is implemented by changing the contents of the JOIN object of the subquery to represent a table scan over the temp table. At the same time query optimization of the outer subquery required evaluation of the inner subquery, which happened before the actual EXPLAIN. The evaluation left the JOIN object of the inner subquery in the changed state, where it represented a table scan over a temp table, and EXPLAIN crashed because the temp table is not associated with any table reference (TABLE_LIST object). The reason the JOIN was not restored was because its saving/restoration was controlled by the join->select_lex->uncacheable flag, which was not set in the case of materialization. Solution: In the methods Item_in_subselect::[single | row]_value_transformer() set: select_lex->uncacheable|= UNCACHEABLE_EXPLAIN; In addition, for symmetry, change: master_unit->uncacheable|= UNCACHEABLE_EXPLAIN; instead of UNCACHEABLE_DEPENDENT because if a subquery was not dependent initially, the changed methods do not change this fact. The subquery may later become correlated if it is transformed to an EXISTS query, but it may stay uncorrelated if executed via materialization.
677 lines
18 KiB
Text
677 lines
18 KiB
Text
# 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 # 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;
|