MDEV-3798: EXPLAIN UPDATE/DELETE:
Backport mysql-test/t/myisam_explain_non_select_all.test from mysql-5.6 - the .result file was modified because MariaDB choses different query plans in a number cases. Also, we don't have some of the "incorrect EXPLAIN output" bugs that they still have. The .test file and includes were taken verbatim with one exception: two tests were disabled with --disable parsing: 1. @@sql_safe_updates is not enforced EXPLAINs of multitable updates. In MariaDB, the execution itself will produce ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE, but EXPLAIN won't. 2. Their case #71 hits some old bug in MyISAM (See their comments in explain_non_select.inc for details).
This commit is contained in:
parent
7e919c52a5
commit
582ecb2a25
833
mysql-test/include/explain_non_select.inc
Normal file
833
mysql-test/include/explain_non_select.inc
Normal file
@ -0,0 +1,833 @@
|
||||
# This file is a collection of regression and coverage tests
|
||||
# for WL#4897: Add EXPLAIN INSERT/UPDATE/DELETE.
|
||||
|
||||
-- disable_query_log
|
||||
-- disable_result_log
|
||||
# SET GLOBAL innodb_stats_persistent=0;
|
||||
-- enable_result_log
|
||||
-- enable_query_log
|
||||
|
||||
# set end_markers_in_json=on;
|
||||
|
||||
--echo #1
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
--let $query = UPDATE t1 SET a = 10 WHERE a < 10
|
||||
--let $select = SELECT * FROM t1 WHERE a < 10
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #2
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
--let $query = DELETE FROM t1 WHERE a < 10
|
||||
--let $select = SELECT * FROM t1 WHERE a < 10
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #3
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
--let $query = DELETE FROM t1 USING t1 WHERE a = 1
|
||||
--let $select = SELECT * FROM t1 WHERE a = 1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #4
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
CREATE TABLE t2 (b INT);
|
||||
INSERT INTO t2 VALUES (1), (2), (3);
|
||||
--let $query = UPDATE t1, t2 SET t1.a = 10 WHERE t1.a = 1
|
||||
--let $select = SELECT * FROM t1, t2 WHERE t1.a = 1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #5
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
CREATE TABLE t2 (b INT);
|
||||
INSERT INTO t2 VALUES (1), (2), (3);
|
||||
--let $query = UPDATE t1 t11, (SELECT * FROM t2) t12 SET t11.a = 10 WHERE t11.a = 1
|
||||
--let $select = SELECT * FROM t1 t11, (SELECT * FROM t2) t12 WHERE t11.a = 1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #6
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
CREATE TABLE t2 (b INT);
|
||||
INSERT INTO t2 VALUES (1), (2), (3);
|
||||
--let $query = UPDATE t1 SET a = 10 WHERE 1 IN (SELECT 1 FROM t2 WHERE t2.b < 3)
|
||||
--let $select = SELECT * FROM t1 WHERE 1 IN (SELECT 1 FROM t2 WHERE t2.b < 3)
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #7
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
CREATE TABLE t2 (b INT);
|
||||
INSERT INTO t2 VALUES (1), (2), (3);
|
||||
--let $query = UPDATE t1 SET a = 10 WHERE a IN (SELECT b FROM t2 WHERE t1.a < 3)
|
||||
--let $select = SELECT * FROM t1 WHERE a IN (SELECT b FROM t2 WHERE t1.a < 3)
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #7
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
CREATE TABLE t2 (b INT);
|
||||
INSERT INTO t2 VALUES (1), (2), (3);
|
||||
--let $query = UPDATE t1, t2 SET a = 10 WHERE a IN (SELECT b FROM t2 WHERE t2.b < 3)
|
||||
--let $select = SELECT * FROM t1, t2 WHERE a IN (SELECT b FROM t2 WHERE t2.b < 3)
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #8
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
CREATE TABLE t2 (b INT);
|
||||
INSERT INTO t2 VALUES (1), (2), (3);
|
||||
--let $query = UPDATE t1 t11, (SELECT * FROM t2) t12 SET t11.a = t11.a + 10
|
||||
--let $select = SELECT * FROM t1 t11, (SELECT * FROM t2) t12
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #9
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
CREATE TABLE t2 (b INT);
|
||||
INSERT INTO t2 VALUES (1), (2), (3);
|
||||
--let $query = UPDATE t1 t11, (SELECT 1 FROM DUAL) t12 SET t11.a = t11.a + 10
|
||||
--let $select = SELECT * FROM t1 t11, (SELECT 1 FROM DUAL) t12
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #10
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
CREATE TABLE t2 (b INT);
|
||||
INSERT INTO t2 VALUES (1), (2), (3);
|
||||
--let $query = UPDATE t1 t11, (SELECT * FROM t2) t12 SET t11.a = 10 WHERE t11.a > 1
|
||||
--let $select = SELECT * FROM t1 t11, (SELECT * FROM t2) t12 WHERE t11.a > 1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #11
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
--let $query = DELETE FROM t1 WHERE a > 1 LIMIT 1
|
||||
--let $select = SELECT * FROM t1 WHERE a > 1 LIMIT 1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #12
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
--let $query = DELETE FROM t1 WHERE 0
|
||||
--let $select = SELECT * FROM t1 WHERE 0
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #13
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
--let $query = DELETE FROM t1 USING t1 WHERE 0
|
||||
--let $select = SELECT * FROM t1 WHERE 0
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #14
|
||||
CREATE TABLE t1 (a INT, b INT, UNIQUE KEY (a), KEY (b));
|
||||
INSERT INTO t1 VALUES (3, 3), (7, 7);
|
||||
--let $query = DELETE FROM t1 WHERE a = 3
|
||||
--let $select = SELECT * FROM t1 WHERE a = 3
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #15
|
||||
CREATE TABLE t1 (a INT, b INT, UNIQUE KEY (a), KEY (b));
|
||||
INSERT INTO t1 VALUES (3, 3), (7, 7);
|
||||
--let $query = DELETE FROM t1 WHERE a < 3
|
||||
--let $select = SELECT * FROM t1 WHERE a < 3
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #16
|
||||
CREATE TABLE t1 ( a int PRIMARY KEY );
|
||||
--let $query = DELETE FROM t1 WHERE t1.a > 0 ORDER BY t1.a
|
||||
--let $select = SELECT * FROM t1 WHERE t1.a > 0 ORDER BY t1.a
|
||||
--source include/explain_utils.inc
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
--let $query = DELETE FROM t1 WHERE t1.a > 0 ORDER BY t1.a
|
||||
--let $select = SELECT * FROM t1 WHERE t1.a > 0 ORDER BY t1.a
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #17
|
||||
CREATE TABLE t1(a INT PRIMARY KEY);
|
||||
INSERT INTO t1 VALUES (4),(3),(1),(2);
|
||||
--let $query = DELETE FROM t1 WHERE (@a:= a) ORDER BY a LIMIT 1
|
||||
--let $select = SELECT * FROM t1 WHERE (@a:= a) ORDER BY a LIMIT 1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #18
|
||||
CREATE TABLE t1 (a DATE, b TIME, c INT, KEY c(c), KEY b(b), KEY a(a));
|
||||
INSERT INTO t1 VALUES (), (), (), (), (), (), (), (), (), ();
|
||||
UPDATE t1 SET a = c, b = c;
|
||||
--let $query = DELETE FROM t1 ORDER BY a ASC, b ASC LIMIT 1
|
||||
--let $select = SELECT * FROM t1 ORDER BY a ASC, b ASC LIMIT 1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #19
|
||||
CREATE TABLE t1 (a1 INT NOT NULL, b1 INT NOT NULL);
|
||||
CREATE TABLE t2 (a2 INT NOT NULL, b2 INT NOT NULL, PRIMARY KEY (a2,b2));
|
||||
CREATE TABLE t3 (a3 INT NOT NULL, b3 INT NOT NULL, PRIMARY KEY (a3,b3));
|
||||
INSERT INTO t1 VALUES (1,1), (2,1), (1,3);
|
||||
INSERT INTO t2 VALUES (1,1), (2,2), (3,3);
|
||||
INSERT INTO t3 VALUES (1,1), (2,1), (1,3);
|
||||
--let $query = DELETE t1,t2,t3 FROM t1,t2,t3 WHERE a1=a2 AND b2=a3 AND b1=b3
|
||||
--let $select = SELECT * FROM t1,t2,t3 WHERE a1=a2 AND b2=a3 AND b1=b3
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2, t3;
|
||||
|
||||
--echo #20
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
CREATE TABLE t2 (a INT);
|
||||
INSERT INTO t2 VALUES (1), (2), (3);
|
||||
--let $query = UPDATE t1 SET a = 10 WHERE a IN (SELECT a FROM t2)
|
||||
--let $select = SELECT * FROM t1 WHERE a IN (SELECT a FROM t2)
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #21
|
||||
CREATE TABLE t1 (a1 INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3), (4), (5);
|
||||
CREATE TABLE t2 (a2 VARCHAR(10));
|
||||
INSERT INTO t2 VALUES (1), (2), (3), (4), (5);
|
||||
SET @save_optimizer_switch= @@optimizer_switch;
|
||||
--disable_query_log
|
||||
if (`select locate('semijoin', @@optimizer_switch) > 0`)
|
||||
{
|
||||
SET @@optimizer_switch= 'semijoin=off';
|
||||
}
|
||||
--enable_query_log
|
||||
--let $query = DELETE FROM t1 WHERE a1 IN (SELECT a2 FROM t2 WHERE a2 > 2)
|
||||
--let $select = SELECT * FROM t1 WHERE a1 IN (SELECT a2 FROM t2 WHERE a2 > 2)
|
||||
--source include/explain_utils.inc
|
||||
SET @@optimizer_switch= @save_optimizer_switch;
|
||||
TRUNCATE t1;
|
||||
INSERT INTO t1 VALUES (1), (2), (3), (4), (5);
|
||||
--let $query = DELETE FROM t1 WHERE a1 IN (SELECT a2 FROM t2 WHERE a2 > 2)
|
||||
--let $select = SELECT * FROM t1 WHERE a1 IN (SELECT a2 FROM t2 WHERE a2 > 2)
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #22
|
||||
CREATE TABLE t1 (i INT, j INT);
|
||||
INSERT INTO t1 VALUES (1, 1), (2, 2), (3, 3), (4, 4), (5, 5);
|
||||
--let $query = UPDATE t1 SET i = 10
|
||||
--let $select = SELECT * FROM t1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #23
|
||||
CREATE TABLE t1 (i INT, j INT);
|
||||
INSERT INTO t1 VALUES (1, 1), (2, 2), (3, 3), (4, 4), (5, 5);
|
||||
--let $query = DELETE FROM t1
|
||||
--let $select = SELECT * FROM t1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #24
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2(a INT, b INT, c INT, d INT, INDEX(a, b, c));
|
||||
INSERT INTO t2 (a, b, c) SELECT i, i, i FROM t1;
|
||||
INSERT INTO t2 (a, b, c) SELECT t1.i, t1.i, t1.i FROM t1, t1 x1, t1 x2;
|
||||
--let $query = DELETE FROM t2 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--let $select = SELECT * FROM t2 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--let $no_rows = 1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #25
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
CREATE TABLE t2 (i INT);
|
||||
--let $query = INSERT INTO t2 SELECT * FROM t1
|
||||
--let $select = SELECT * FROM t1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #26
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
CREATE TABLE t2 (i INT);
|
||||
--let $query = REPLACE INTO t2 SELECT * FROM t1
|
||||
--let $select = SELECT * FROM t1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #27
|
||||
CREATE TABLE t1 (i INT);
|
||||
--let $query = INSERT INTO t1 SET i = 10
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #28
|
||||
CREATE TABLE t1 (i INT);
|
||||
--let $query = REPLACE INTO t1 SET i = 10
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #29
|
||||
CREATE TABLE t1 (a INT, i INT PRIMARY KEY);
|
||||
INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
--let $query = DELETE FROM t1 WHERE i > 10 AND i <= 18 ORDER BY i LIMIT 5
|
||||
--let $select = SELECT * FROM t1 WHERE i > 10 AND i <= 18 ORDER BY i LIMIT 5
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #30
|
||||
CREATE TABLE t1(a INT, i CHAR(2), INDEX(i(1)));
|
||||
INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
--let $query = DELETE FROM t1 WHERE i > 10 AND i <= 18 ORDER BY i LIMIT 5
|
||||
--let $select = SELECT * FROM t1 WHERE i > 10 AND i <= 18 ORDER BY i LIMIT 5
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #31
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2(a INT, b INT, c INT, d INT, INDEX(a, b, c));
|
||||
INSERT INTO t2 (a, b, c) SELECT i, i, i FROM t1;
|
||||
--let $query = DELETE FROM t2 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--let $select = SELECT * FROM t2 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #32
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2(a INT, b INT, c INT, d INT, INDEX(a, b, c));
|
||||
INSERT INTO t2 (a, b, c) SELECT i, i, i FROM t1;
|
||||
INSERT INTO t2 (a, b, c) SELECT t1.i, t1.i, t1.i FROM t1, t1 x1, t1 x2;
|
||||
--let $query = DELETE FROM t2 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--let $select = SELECT * FROM t2 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--let $no_rows = 1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #33
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2 (a CHAR(2), b CHAR(2), c CHAR(2), d CHAR(2), INDEX (a,b(1),c));
|
||||
INSERT INTO t2 SELECT i, i, i, i FROM t1;
|
||||
--let $query = DELETE FROM t2 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--let $select = SELECT * FROM t2 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #34
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2 (a CHAR(2), b CHAR(2), c CHAR(2), d CHAR(2), INDEX (a,b,c))
|
||||
ENGINE=HEAP;
|
||||
INSERT INTO t2 SELECT i, i, i, i FROM t1;
|
||||
--let $query = DELETE FROM t2 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--let $select = SELECT * FROM t2 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #35
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35),(36),(37),(38),(39),
|
||||
(40),(41),(42);
|
||||
CREATE TABLE t2 (i INT, key1 INT, key2 INT, INDEX (key1), INDEX (key2));
|
||||
INSERT INTO t2 (key1, key2) SELECT i, i FROM t1;
|
||||
--let $query = DELETE FROM t2 WHERE key1 < 13 or key2 < 14 ORDER BY key1
|
||||
--let $select = SELECT * FROM t2 WHERE key1 < 13 or key2 < 14 ORDER BY key1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #36
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2(a INT, i INT PRIMARY KEY);
|
||||
INSERT INTO t2 (i) SELECT i FROM t1;
|
||||
--let $query = DELETE FROM t2 WHERE i > 10 AND i <= 18 ORDER BY i DESC LIMIT 5
|
||||
--let $select = SELECT * FROM t2 WHERE i > 10 AND i <= 18 ORDER BY i DESC LIMIT 5
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #37
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2 (a CHAR(2), b CHAR(2), c CHAR(2), INDEX (a, b));
|
||||
INSERT INTO t2 SELECT i, i, i FROM t1;
|
||||
--let $query = DELETE FROM t2 ORDER BY a, b DESC LIMIT 5
|
||||
--let $select = SELECT * FROM t2 ORDER BY a, b DESC LIMIT 5
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #38
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2 (a CHAR(2), b CHAR(2), c INT, INDEX (a, b));
|
||||
INSERT INTO t2 (a, b) SELECT i, i FROM t1;
|
||||
INSERT INTO t2 (a, b) SELECT t1.i, t1.i FROM t1, t1 x1, t1 x2;
|
||||
--let $query = DELETE FROM t2 ORDER BY a DESC, b DESC LIMIT 5
|
||||
--let $select = SELECT * FROM t2 ORDER BY a DESC, b DESC LIMIT 5
|
||||
--let $no_rows = 1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #39
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2(a INT, i INT PRIMARY KEY);
|
||||
INSERT INTO t2 (i) SELECT i FROM t1;
|
||||
--let $query = UPDATE t2 SET a = 10 WHERE i > 10 AND i <= 18 ORDER BY i LIMIT 5
|
||||
--let $select = SELECT * FROM t2 WHERE i > 10 AND i <= 18 ORDER BY i LIMIT 5
|
||||
--let $no_rows = 1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #40
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2(a INT, i CHAR(2), INDEX(i(1)));
|
||||
INSERT INTO t2 (i) SELECT i FROM t1;
|
||||
--let $query = UPDATE t2 SET a = 10 WHERE i > 10 AND i <= 18 ORDER BY i LIMIT 5
|
||||
--let $select = SELECT * FROM t2 WHERE i > 10 AND i <= 18 ORDER BY i LIMIT 5
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #41
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2(a INT, b INT, c INT, d INT, INDEX(a, b, c));
|
||||
INSERT INTO t2 (a, b, c) SELECT i, i, i FROM t1;
|
||||
--let $query = UPDATE t2 SET d = 10 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--let $select = SELECT * FROM t2 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #42
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2(a INT, b INT, c INT, d INT, INDEX(a, b, c));
|
||||
INSERT INTO t2 (a, b, c) SELECT i, i, i FROM t1;
|
||||
INSERT INTO t2 (a, b, c) SELECT t1.i, t1.i, t1.i FROM t1, t1 x1, t1 x2;
|
||||
--let $query = UPDATE t2 SET d = 10 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--let $select = SELECT * FROM t2 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--let $no_rows = 1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #43
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2 (a CHAR(2), b CHAR(2), c CHAR(2), d CHAR(2), INDEX (a,b(1),c));
|
||||
INSERT INTO t2 SELECT i, i, i, i FROM t1;
|
||||
--let $query = UPDATE t2 SET d = 10 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--let $select = SELECT * FROM t2 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #44
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2 (a CHAR(2), b CHAR(2), c CHAR(2), d CHAR(2), INDEX (a,b,c))
|
||||
ENGINE=HEAP;
|
||||
INSERT INTO t2 SELECT i, i, i, i FROM t1;
|
||||
--let $query = UPDATE t2 SET d = 10 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--let $select = SELECT * FROM t2 WHERE b = 10 ORDER BY a, c LIMIT 5
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #45
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35),(36),(37),(38),(39),
|
||||
(40),(41),(42);
|
||||
CREATE TABLE t2 (i INT, key1 INT, key2 INT, INDEX (key1), INDEX (key2));
|
||||
INSERT INTO t2 (key1, key2) SELECT i, i FROM t1;
|
||||
--let $query = UPDATE t2 SET i = 123 WHERE key1 < 13 or key2 < 14 ORDER BY key1
|
||||
--let $select = SELECT * FROM t2 WHERE key1 < 13 or key2 < 14 ORDER BY key1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #46
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2(a INT, i INT PRIMARY KEY);
|
||||
INSERT INTO t2 (i) SELECT i FROM t1;
|
||||
--let $query = UPDATE t2 SET a = 10 WHERE i > 10 AND i <= 18 ORDER BY i DESC LIMIT 5
|
||||
--let $select = SELECT * FROM t2 WHERE i > 10 AND i <= 18 ORDER BY i DESC LIMIT 5
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #47
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2 (a CHAR(2), b CHAR(2), c CHAR(2), INDEX (a, b));
|
||||
INSERT INTO t2 SELECT i, i, i FROM t1;
|
||||
--let $query = UPDATE t2 SET c = 10 ORDER BY a, b DESC LIMIT 5
|
||||
--let $select = SELECT * FROM t2 ORDER BY a, b DESC LIMIT 5
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #48
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||
(30),(31),(32),(33),(34),(35);
|
||||
CREATE TABLE t2 (a CHAR(2), b CHAR(2), c INT, INDEX (a, b));
|
||||
INSERT INTO t2 (a, b) SELECT i, i FROM t1;
|
||||
INSERT INTO t2 (a, b) SELECT t1.i, t1.i FROM t1, t1 x1, t1 x2;
|
||||
--let $query = UPDATE t2 SET c = 10 ORDER BY a DESC, b DESC LIMIT 5
|
||||
--let $select = SELECT * FROM t2 ORDER BY a DESC, b DESC LIMIT 5
|
||||
--let $no_rows = 1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #49
|
||||
CREATE TABLE t1 (
|
||||
pk INT NOT NULL AUTO_INCREMENT,
|
||||
c1_idx CHAR(1) DEFAULT 'y',
|
||||
c2 INT,
|
||||
PRIMARY KEY (pk),
|
||||
INDEX c1_idx (c1_idx)
|
||||
);
|
||||
INSERT INTO t1 VALUES (1,'y',1), (2,'n',2), (3,'y',3), (4,'n',4);
|
||||
--let $query = UPDATE t1 SET c2 = 0 WHERE c1_idx = 'y' ORDER BY pk DESC LIMIT 2
|
||||
--let $select = SELECT * FROM t1 WHERE c1_idx = 'y' ORDER BY pk DESC LIMIT 2
|
||||
--source include/explain_utils.inc
|
||||
--let $query = DELETE FROM t1 WHERE c1_idx = 'y' ORDER BY pk DESC LIMIT 2
|
||||
--let $select = SELECT * FROM t1 WHERE c1_idx = 'y' ORDER BY pk DESC LIMIT 2
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #50
|
||||
CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY);
|
||||
INSERT INTO t1 VALUES (),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),();
|
||||
--let $query = UPDATE t1 SET a=a+10 WHERE a > 34
|
||||
--let $select = SELECT * FROM t1 WHERE a > 34
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #51
|
||||
CREATE TABLE t1 (c1 INT, c2 INT, c3 INT);
|
||||
CREATE TABLE t2 (c1 INT, c2 INT);
|
||||
INSERT INTO t1 VALUES (1, 1, 10), (2, 2, 20);
|
||||
--let $query = UPDATE t1 LEFT JOIN t2 ON t1.c1 = t2.c1 SET t2.c2 = 10
|
||||
--let $select = SELECT * FROM t1 LEFT JOIN t2 ON t1.c1 = t2.c1
|
||||
--source include/explain_utils.inc
|
||||
--let $query = UPDATE t1 LEFT JOIN t2 ON t1.c1 = t2.c1 SET t2.c2 = 10 WHERE t1.c3 = 10
|
||||
--let $select = SELECT * FROM t1 LEFT JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c3 = 10
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #52
|
||||
CREATE TABLE t1(f1 INT, f2 INT);
|
||||
CREATE TABLE t2(f3 INT, f4 INT);
|
||||
CREATE INDEX IDX ON t2(f3);
|
||||
INSERT INTO t1 VALUES(1,0),(2,0);
|
||||
INSERT INTO t2 VALUES(1,1),(2,2);
|
||||
--let $query = UPDATE t1 SET t1.f2=(SELECT MAX(t2.f4) FROM t2 WHERE t2.f3=t1.f1)
|
||||
--let $select = SELECT (SELECT MAX(t2.f4) FROM t2 WHERE t2.f3=t1.f1) FROM t1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #55
|
||||
CREATE TABLE t1(a INT);
|
||||
INSERT INTO t1 VALUES (1);
|
||||
SET @a = NULL;
|
||||
EXPLAIN DELETE FROM t1 WHERE (@a:= a);
|
||||
if (`SELECT @a IS NOT NULL`) {
|
||||
die Unexpectedly modified user variable;
|
||||
}
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #56
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
--error ER_BAD_FIELD_ERROR
|
||||
DELETE FROM t1 USING t1 WHERE uknown_column = 12345;
|
||||
--error ER_BAD_FIELD_ERROR
|
||||
EXPLAIN EXTENDED DELETE FROM t1 USING t1 WHERE uknown_column = 12345;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #57
|
||||
CREATE TABLE t1(f1 INT);
|
||||
--error ER_BAD_FIELD_ERROR
|
||||
EXPLAIN EXTENDED UPDATE t1 SET f2=1 ORDER BY f2;
|
||||
--error ER_BAD_FIELD_ERROR
|
||||
UPDATE t1 SET f2=1 ORDER BY f2;
|
||||
DROP TABLE t1;
|
||||
|
||||
--disable_parsing
|
||||
--echo #59
|
||||
CREATE TABLE t1 ( a INT, KEY( a ) );
|
||||
INSERT INTO t1 VALUES (0), (1);
|
||||
CREATE VIEW v1 AS SELECT t11.a, t12.a AS b FROM t1 t11, t1 t12;
|
||||
SET SESSION sql_safe_updates = 1;
|
||||
--error ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE
|
||||
EXPLAIN EXTENDED UPDATE IGNORE v1 SET a = 1;
|
||||
--error ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE
|
||||
UPDATE IGNORE v1 SET a = 1;
|
||||
SET SESSION sql_safe_updates = DEFAULT;
|
||||
DROP TABLE t1;
|
||||
DROP VIEW v1;
|
||||
--enable_parsing
|
||||
|
||||
--echo #62
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (0), (1);
|
||||
CREATE VIEW v1 AS SELECT t11.a, t12.a AS b FROM t1 t11, t1 t12;
|
||||
--let $query = UPDATE v1 SET a = 1 WHERE a > 0
|
||||
--let $select = SELECT * FROM v1 WHERE a > 0
|
||||
--source include/explain_utils.inc
|
||||
--let $query = UPDATE t1, v1 SET v1.a = 1 WHERE t1.a = v1.a
|
||||
--let $select = SELECT * FROM t1, v1 WHERE t1.a = v1.a
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
DROP VIEW v1;
|
||||
|
||||
--echo #63
|
||||
CREATE TABLE t1 (a INT, PRIMARY KEY(a));
|
||||
INSERT INTO t1 VALUES (1), (2), (3), (4), (5);
|
||||
CREATE VIEW v1 (a) AS SELECT a FROM t1;
|
||||
--let $query = DELETE FROM v1 WHERE a < 4
|
||||
--let $select = SELECT * FROM v1 WHERE a < 4
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
DROP VIEW v1;
|
||||
|
||||
--echo #64
|
||||
CREATE TABLE t1 (a INT, b INT, PRIMARY KEY(a));
|
||||
INSERT INTO t1 VALUES (1,2), (2,3), (3,4), (4,5), (5,10);
|
||||
CREATE TABLE t2 (x INT);
|
||||
INSERT INTO t2 VALUES (1), (2), (3), (4);
|
||||
CREATE VIEW v1 (a,c) AS SELECT a, b+1 FROM t1;
|
||||
--let $query = DELETE v1 FROM t2, v1 WHERE t2.x = v1.a
|
||||
--let $select = SELECT * FROM t2, v1 WHERE t2.x = v1.a
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1,t2;
|
||||
DROP VIEW v1;
|
||||
|
||||
--echo #65
|
||||
CREATE TABLE t1 (a INT, b INT, PRIMARY KEY(a));
|
||||
INSERT INTO t1 VALUES (1,2), (2,3), (3,4), (4,5), (5,10);
|
||||
CREATE TABLE t2 (x INT);
|
||||
INSERT INTO t2 VALUES (1), (2), (3), (4);
|
||||
CREATE VIEW v1 (a,c) AS SELECT a, b+1 FROM t1;
|
||||
--let $query = DELETE v1 FROM t2, v1 WHERE t2.x = v1.a
|
||||
--let $select = SELECT * FROM t2, v1 WHERE t2.x = v1.a
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1,t2;
|
||||
DROP VIEW v1;
|
||||
|
||||
--echo #66
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE VIEW v1 (x) AS SELECT a FROM t1;
|
||||
--let $query = INSERT INTO v1 VALUES (10)
|
||||
--let $select = SELECT NULL
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1;
|
||||
DROP VIEW v1;
|
||||
|
||||
--echo #67
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE TABLE t2 (b INT);
|
||||
INSERT INTO t2 VALUES (1), (2), (3);
|
||||
CREATE VIEW v1 (x) AS SELECT b FROM t2;
|
||||
--let $query = INSERT INTO v1 SELECT * FROM t1
|
||||
--let $select = SELECT * FROM t1
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1, t2;
|
||||
DROP VIEW v1;
|
||||
|
||||
--echo #68
|
||||
CREATE TABLE t1 (i INT);
|
||||
EXPLAIN INSERT DELAYED INTO t1 VALUES (1);
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #69
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
CREATE TABLE t2 (b INT);
|
||||
INSERT INTO t2 VALUES (1), (2), (3);
|
||||
--let $query = UPDATE t1 SET a = 10 WHERE a IN (SELECT * FROM (SELECT b FROM t2 ORDER BY b LIMIT 2,2) x)
|
||||
--let $select = SELECT * FROM t1 WHERE a IN (SELECT * FROM (SELECT b FROM t2 ORDER BY b LIMIT 2,2) x)
|
||||
--source include/explain_utils.inc
|
||||
--let $query = UPDATE t1, t2 SET a = 10 WHERE a IN (SELECT * FROM (SELECT b FROM t2 ORDER BY b LIMIT 2,2) x)
|
||||
--let $select = SELECT * FROM t1, t2 WHERE a IN (SELECT * FROM (SELECT b FROM t2 ORDER BY b LIMIT 2,2) x)
|
||||
--source include/explain_utils.inc
|
||||
--let $query = UPDATE t1, (SELECT * FROM t2) y SET a = 10 WHERE a IN (SELECT * FROM (SELECT b FROM t2 ORDER BY b LIMIT 2,2) x)
|
||||
--let $select = SELECT * FROM t1, (SELECT * FROM t2) y WHERE a IN (SELECT * FROM (SELECT b FROM t2 ORDER BY b LIMIT 2,2) x)
|
||||
--source include/explain_utils.inc
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo #70
|
||||
CREATE TABLE t1 (c1 INT KEY);
|
||||
CREATE TABLE t2 (c2 INT);
|
||||
CREATE TABLE t3 (c3 INT);
|
||||
EXPLAIN EXTENDED UPDATE t3 SET c3 = (
|
||||
SELECT COUNT(d1.c1)
|
||||
FROM (
|
||||
SELECT a11.c1 FROM t1 AS a11
|
||||
STRAIGHT_JOIN t2 AS a21 ON a21.c2 = a11.c1
|
||||
JOIN t1 AS a12 ON a12.c1 = a11.c1
|
||||
) d1
|
||||
);
|
||||
|
||||
DROP TABLE t1, t2, t3;
|
||||
|
||||
--disable_parsing
|
||||
--echo #71
|
||||
#
|
||||
# Bug: after EXPLAIN bulk INSERT...SELECT and bulk INSERT...SELECT
|
||||
# to a # MyISAM table the SELECT query may fail with the
|
||||
# "1030: Got error 124 from storage engine" error message.
|
||||
#
|
||||
CREATE TABLE t1 (c1 INT NOT NULL, c2 INT NOT NULL, INDEX i1(c1));
|
||||
INSERT INTO t1 VALUES (1,0),(2,0),(3,0),(4,0),(5,0),(6,0),(7,0),(8,0);
|
||||
--disable_query_log
|
||||
let $1=7;
|
||||
SET @d=8;
|
||||
while ($1) {
|
||||
eval INSERT INTO t1 SELECT c1 + @d, c2 + @d FROM t1;
|
||||
eval SET @d = @d*2;
|
||||
dec $1;
|
||||
}
|
||||
--enable_query_log
|
||||
CREATE TABLE t2 LIKE t1;
|
||||
|
||||
# replace "rows" column for InnoDB
|
||||
--replace_column 9 X
|
||||
EXPLAIN INSERT INTO t2 SELECT * FROM t1;
|
||||
INSERT INTO t2 SELECT * FROM t1;
|
||||
--disable_result_log
|
||||
SELECT * FROM t1 LEFT JOIN t2 ON t1.c1 = t2.c1;
|
||||
--enable_result_log
|
||||
|
||||
DROP TABLE t1, t2;
|
||||
--enable_parsing
|
||||
|
||||
--echo #73
|
||||
|
||||
CREATE TABLE t1 (id INT);
|
||||
CREATE TABLE t2 (id INT);
|
||||
INSERT INTO t1 VALUES (1), (2);
|
||||
|
||||
EXPLAIN SELECT * FROM t1 LEFT JOIN t2 USING(id) GROUP BY t1.id;
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo #74
|
||||
|
||||
CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (1), (2), (3), (4), (5);
|
||||
|
||||
--echo # used key is modified & Using temporary
|
||||
|
||||
--let $query = UPDATE t1 SET a=a+1 WHERE a>10
|
||||
--let $select = SELECT a t1 FROM t1 WHERE a>10
|
||||
--source include/explain_utils.inc
|
||||
|
||||
--echo # used key is modified & Using filesort
|
||||
|
||||
--let $query = UPDATE t1 SET a=a+1 WHERE a>10 ORDER BY a+20
|
||||
--let $select = SELECT a t1 FROM t1 WHERE a>10 ORDER BY a+20
|
||||
--source include/explain_utils.inc
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug #12949629: CLIENT LOSES CONNECTION AFTER EXECUTING A PROCEDURE WITH
|
||||
--echo # EXPLAIN UPDATE/DEL/INS
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (i INT);
|
||||
CREATE TABLE t2 (i INT);
|
||||
|
||||
--delimiter |
|
||||
CREATE PROCEDURE p1() BEGIN EXPLAIN INSERT INTO t1 VALUES (1);END|
|
||||
CREATE PROCEDURE p2() BEGIN INSERT INTO t1 VALUES (1);END|
|
||||
CREATE PROCEDURE p3() BEGIN EXPLAIN INSERT INTO t1 SELECT 1;END|
|
||||
CREATE PROCEDURE p4() BEGIN INSERT INTO t1 SELECT 1;END|
|
||||
CREATE PROCEDURE p5() BEGIN EXPLAIN REPLACE INTO t1 VALUES (1);END|
|
||||
CREATE PROCEDURE p6() BEGIN REPLACE INTO t1 VALUES (1);END|
|
||||
CREATE PROCEDURE p7() BEGIN EXPLAIN REPLACE INTO t1 SELECT 1;END|
|
||||
CREATE PROCEDURE p8() BEGIN REPLACE INTO t1 SELECT 1;END|
|
||||
CREATE PROCEDURE p9() BEGIN EXPLAIN UPDATE t1 SET i = 10;END|
|
||||
CREATE PROCEDURE p10() BEGIN UPDATE t1 SET i = 10;END|
|
||||
CREATE PROCEDURE p11() BEGIN EXPLAIN UPDATE t1,t2 SET t1.i = 10 WHERE t1.i = t2.i ;END|
|
||||
CREATE PROCEDURE p12() BEGIN UPDATE t1,t2 SET t1.i = 10 WHERE t1.i = t2.i ;END|
|
||||
CREATE PROCEDURE p13() BEGIN EXPLAIN DELETE FROM t1;END|
|
||||
CREATE PROCEDURE p14() BEGIN DELETE FROM t1;END|
|
||||
CREATE PROCEDURE p15() BEGIN EXPLAIN DELETE FROM t1 USING t1;END|
|
||||
CREATE PROCEDURE p16() BEGIN DELETE FROM t1 USING t1;END|
|
||||
--delimiter ;
|
||||
|
||||
let $i=16;
|
||||
while($i) {
|
||||
eval CALL p$i();
|
||||
eval DROP PROCEDURE p$i;
|
||||
dec $i;
|
||||
}
|
||||
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #
|
||||
|
||||
-- disable_query_log
|
||||
-- disable_result_log
|
||||
# SET GLOBAL innodb_stats_persistent=default;
|
||||
-- enable_result_log
|
||||
-- enable_query_log
|
161
mysql-test/include/explain_utils.inc
Normal file
161
mysql-test/include/explain_utils.inc
Normal file
@ -0,0 +1,161 @@
|
||||
# This file is a collection of utility tests
|
||||
# for WL#4897: Add EXPLAIN INSERT/UPDATE/DELETE.
|
||||
#
|
||||
# Since MTR doesn't have functions, we use this file instead
|
||||
# including it many times.
|
||||
#
|
||||
# Parameters:
|
||||
#
|
||||
# $query: INSERT/REPLACE/UPDATE/DELETE query to explain
|
||||
# NOTE: this file resets this variable
|
||||
#
|
||||
# $select: may be empty; the SELECT query similar to $query
|
||||
# We use it to compare:
|
||||
# 1) table data before and after EXPLAIN $query evaluation;
|
||||
# 2) EXPLAIN $query and EXPLAIN $select output and
|
||||
# handler/filesort statistics
|
||||
# NOTE: this file resets this variable
|
||||
# $innodb: take $no_rows parameter into account if not 0;
|
||||
# $no_rows: filter out "rows" and "filtered" columns of EXPLAIN if not 0;
|
||||
# it may be necessary for InnoDB tables since InnoDB's table row
|
||||
# counter can't return precise and repeatable values;
|
||||
# NOTE: ANALYZE TABLE doesn't help
|
||||
# NOTE: this file resets this variable
|
||||
|
||||
--echo #
|
||||
--echo # query: $query
|
||||
--echo # select: $select
|
||||
--echo #
|
||||
|
||||
if ($select) {
|
||||
--disable_query_log
|
||||
--eval $select INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/before_explain.txt'
|
||||
--enable_query_log
|
||||
}
|
||||
|
||||
if ($innodb) {
|
||||
if ($no_rows) {
|
||||
--replace_column 9 X
|
||||
}
|
||||
}
|
||||
--eval EXPLAIN $query
|
||||
if (`SELECT ROW_COUNT() > 0`) {
|
||||
--echo # Erroneous query: EXPLAIN $query
|
||||
--die Unexpected ROW_COUNT() <> 0
|
||||
}
|
||||
|
||||
FLUSH STATUS;
|
||||
FLUSH TABLES;
|
||||
if ($innodb) {
|
||||
if ($no_rows) {
|
||||
--replace_column 9 X 10 X
|
||||
}
|
||||
}
|
||||
--eval EXPLAIN EXTENDED $query
|
||||
if (`SELECT ROW_COUNT() > 0`) {
|
||||
--echo # Erroneous query: EXPLAIN EXTENDED $query
|
||||
--die Unexpected ROW_COUNT() <> 0
|
||||
}
|
||||
--echo # Status of EXPLAIN EXTENDED query
|
||||
--disable_query_log
|
||||
SHOW STATUS WHERE (Variable_name LIKE 'Sort%' OR
|
||||
Variable_name LIKE 'Handler_read_%' OR
|
||||
Variable_name = 'Handler_write' OR
|
||||
Variable_name = 'Handler_update' OR
|
||||
Variable_name = 'Handler_delete') AND Value <> 0;
|
||||
--enable_query_log
|
||||
|
||||
if ($json) {
|
||||
if ($innodb) {
|
||||
if ($no_rows) {
|
||||
--replace_regex /"rows": [0-9]+/"rows": "X"/ /"filtered": [0-9.]+/"filtered": "X"/
|
||||
}
|
||||
}
|
||||
--eval EXPLAIN FORMAT=JSON $query;
|
||||
if ($validation) {
|
||||
--disable_query_log
|
||||
--replace_result $MASTER_MYSOCK MASTER_MYSOCK
|
||||
--exec $MYSQL -S $MASTER_MYSOCK -u root -r test -e "EXPLAIN FORMAT=JSON $query;" > $MYSQLTEST_VARDIR/tmp/explain.json
|
||||
--replace_regex /[-]*// /FILE.[\/\\:_\.0-9A-Za-z]*/Validation:/
|
||||
--exec python $MYSQL_TEST_DIR/suite/opt_trace/validate_json.py $MYSQLTEST_VARDIR/tmp/explain.json
|
||||
--remove_file '$MYSQLTEST_VARDIR/tmp/explain.json'
|
||||
--enable_query_log
|
||||
}
|
||||
}
|
||||
|
||||
if ($select) {
|
||||
FLUSH STATUS;
|
||||
FLUSH TABLES;
|
||||
if ($innodb) {
|
||||
if ($no_rows) {
|
||||
--replace_column 9 X 10 X
|
||||
}
|
||||
}
|
||||
--eval EXPLAIN EXTENDED $select
|
||||
--echo # Status of EXPLAIN EXTENDED "equivalent" SELECT query execution
|
||||
--disable_query_log
|
||||
SHOW STATUS WHERE (Variable_name LIKE 'Sort%' OR
|
||||
Variable_name LIKE 'Handler_read_%' OR
|
||||
Variable_name = 'Handler_write' OR
|
||||
Variable_name = 'Handler_update' OR
|
||||
Variable_name = 'Handler_delete') AND Value <> 0;
|
||||
--enable_query_log
|
||||
if ($json) {
|
||||
if ($innodb) {
|
||||
if ($no_rows) {
|
||||
--replace_regex /"rows": [0-9]+/"rows": "X"/ /"filtered": [0-9.]+/"filtered": "X"/
|
||||
}
|
||||
}
|
||||
--eval EXPLAIN FORMAT=JSON $select;
|
||||
if ($validation) {
|
||||
--disable_query_log
|
||||
--replace_result $MASTER_MYSOCK MASTER_MYSOCK
|
||||
--exec $MYSQL -S $MASTER_MYSOCK -u root -r test -e "EXPLAIN FORMAT=JSON $select;" > $MYSQLTEST_VARDIR/tmp/explain.json
|
||||
--replace_regex /[-]*// /FILE.[\/\\:_\.0-9A-Za-z]*/Validation:/
|
||||
--exec python $MYSQL_TEST_DIR/suite/opt_trace/validate_json.py $MYSQLTEST_VARDIR/tmp/explain.json
|
||||
--remove_file '$MYSQLTEST_VARDIR/tmp/explain.json'
|
||||
--enable_query_log
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
--disable_query_log
|
||||
|
||||
if ($select) {
|
||||
--eval $select INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/after_explain.txt'
|
||||
--diff_files '$MYSQLTEST_VARDIR/tmp/before_explain.txt' '$MYSQLTEST_VARDIR/tmp/after_explain.txt'
|
||||
--remove_file '$MYSQLTEST_VARDIR/tmp/before_explain.txt'
|
||||
--remove_file '$MYSQLTEST_VARDIR/tmp/after_explain.txt'
|
||||
}
|
||||
|
||||
FLUSH STATUS;
|
||||
FLUSH TABLES;
|
||||
if ($select) {
|
||||
--disable_result_log
|
||||
--eval $select
|
||||
--enable_result_log
|
||||
--echo # Status of "equivalent" SELECT query execution:
|
||||
SHOW STATUS WHERE (Variable_name LIKE 'Sort%' OR
|
||||
Variable_name LIKE 'Handler_read_%' OR
|
||||
Variable_name = 'Handler_write' OR
|
||||
Variable_name = 'Handler_update' OR
|
||||
Variable_name = 'Handler_delete') AND Value <> 0;
|
||||
}
|
||||
|
||||
FLUSH STATUS;
|
||||
FLUSH TABLES;
|
||||
--eval $query
|
||||
--echo # Status of testing query execution:
|
||||
SHOW STATUS WHERE (Variable_name LIKE 'Sort%' OR
|
||||
Variable_name LIKE 'Handler_read_%' OR
|
||||
Variable_name = 'Handler_write' OR
|
||||
Variable_name = 'Handler_update' OR
|
||||
Variable_name = 'Handler_delete') AND Value <> 0;
|
||||
|
||||
--let $query=
|
||||
--let $select=
|
||||
--let $no_rows=
|
||||
|
||||
--enable_query_log
|
||||
|
||||
--echo
|
2903
mysql-test/r/myisam_explain_non_select_all.result
Normal file
2903
mysql-test/r/myisam_explain_non_select_all.result
Normal file
File diff suppressed because it is too large
Load Diff
21
mysql-test/t/myisam_explain_non_select_all.test
Normal file
21
mysql-test/t/myisam_explain_non_select_all.test
Normal file
@ -0,0 +1,21 @@
|
||||
#
|
||||
# Run explain_non_select.inc on MyISAM with all of the so-called 6.0 features.
|
||||
#
|
||||
|
||||
#--source include/have_semijoin.inc
|
||||
#--source include/have_materialization.inc
|
||||
#--source include/have_firstmatch.inc
|
||||
#--source include/have_loosescan.inc
|
||||
#--source include/have_index_condition_pushdown.inc
|
||||
#--source include/have_mrr.inc
|
||||
|
||||
#set optimizer_switch='semijoin=on,materialization=on,firstmatch=on,loosescan=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=off';
|
||||
|
||||
set @save_storage_engine= @@session.default_storage_engine;
|
||||
set session default_storage_engine = MyISAM;
|
||||
--let $json = 0
|
||||
--let $validation = 0
|
||||
--source include/explain_non_select.inc
|
||||
set default_storage_engine= @save_storage_engine;
|
||||
|
||||
set optimizer_switch=default;
|
Loading…
x
Reference in New Issue
Block a user