MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
explain_json.inc
1 # This file is a collection of regression and coverage tests
2 # for WL#5855: Print EXPLAIN in JSON format
3 
4 --source include/have_innodb.inc
5 
6 set @save_storage_engine= @@default_storage_engine;
7 set default_storage_engine=MyISAM;
8 set end_markers_in_json=on;
9 
10 --echo # new "FORMAT" keyword doesn't conflict with the FORMAT() function name:
11 
12 SELECT FORMAT(1, 2), FORMAT(1, 2, 3);
13 
14 --echo # new "FORMAT" keyword is a valid identifier:
15 
16 SET @FORMAT=10;
17 SELECT @FORMAT;
18 
19 CREATE TABLE t1 (format INT);
20 SELECT format FROM t1;
21 DROP TABLE t1;
22 
23 --echo # different ways of format name writing:
24 
25 EXPLAIN FORMAT=traditional SELECT 1;
26 EXPLAIN FORMAT='TrAdItIoNaL' SELECT 1;
27 EXPLAIN FORMAT=JSON SELECT 1;
28 
29 --error ER_UNKNOWN_EXPLAIN_FORMAT
30 EXPLAIN FORMAT=foo SELECT 1;
31 
32 --echo # various EXPLAIN output
33 
34 CREATE TABLE t1 (i INT);
35 CREATE TABLE t2 (i INT);
36 CREATE TABLE t3 (i INT);
37 CREATE TABLE t4 (i INT);
38 
39 --echo # no end markers in JSON:
40 
41 set end_markers_in_json=off;
42 EXPLAIN FORMAT=JSON SELECT * FROM t1;
43 set end_markers_in_json=on;
44 
45 EXPLAIN INSERT INTO t1 VALUES (10);
46 EXPLAIN FORMAT=JSON INSERT INTO t1 VALUES (10);
47 
48  EXPLAIN SELECT * FROM t1;
49 PREPARE stmt FROM 'EXPLAIN FORMAT=JSON SELECT * FROM t1';
50 EXECUTE stmt;
51 EXECUTE stmt;
52 
53 INSERT INTO t1 VALUES (1), (2), (3), (4), (5), (6), (7);
54 INSERT INTO t2 VALUES (1), (2);
55 
56 EXPLAIN
57 SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT a1.i FROM (SELECT * FROM t1) a1, t2) a2) a3) a4;
58 EXPLAIN FORMAT=JSON
59 SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT a1.i FROM (SELECT * FROM t1) a1, t2) a2) a3) a4;
60 
61 --echo # subquery in WHERE
62 EXPLAIN SELECT * FROM t1 WHERE i IN (SELECT i FROM t2 WHERE t1.i = 10 ORDER BY RAND());
63 EXPLAIN FORMAT=JSON SELECT * FROM t1 WHERE i IN (SELECT i FROM t2 WHERE t1.i = 10 ORDER BY RAND());
64 
65 --echo # two subqueries in WHERE
66 EXPLAIN SELECT * FROM t1
67  WHERE i IN (SELECT i FROM t2 WHERE t1.i = 10 ORDER BY RAND())
68  OR i IN (SELECT i FROM t4 ORDER BY RAND());
69 EXPLAIN FORMAT=JSON SELECT * FROM t1
70  WHERE i IN (SELECT i FROM t2 WHERE t1.i = 10 ORDER BY RAND())
71  OR i IN (SELECT i FROM t4 ORDER BY RAND());
72 
73 --echo # simple UNION
74 
75 EXPLAIN SELECT * FROM t1 UNION SELECT * FROM t2 UNION SELECT * FROM t3;
76 EXPLAIN FORMAT=JSON SELECT * FROM t1 UNION SELECT * FROM t2 UNION SELECT * FROM t3;
77 
78 --echo # more complex UNION
79 
80 EXPLAIN (SELECT t1.i FROM t1 JOIN t2) UNION ALL (SELECT * FROM t3 WHERE i IN (SELECT i FROM t4 ORDER BY RAND()));
81 EXPLAIN FORMAT=JSON (SELECT t1.i FROM t1 JOIN t2) UNION ALL (SELECT * FROM t3 WHERE i IN (SELECT i FROM t4 ORDER BY RAND()));
82 
83 --echo # UNION with subquery in outer ORDER BY
84 
85 EXPLAIN (SELECT * FROM t1) UNION (SELECT * FROM t2) ORDER BY (SELECT i LIMIT 1);
86 EXPLAIN FORMAT=JSON (SELECT * FROM t1) UNION (SELECT * FROM t2) ORDER BY (SELECT i LIMIT 1);
87 
88 --echo # optimizer-time subquery
89 
90 --let $query=SELECT * FROM t1 ORDER BY (SELECT LENGTH(1) FROM t2 LIMIT 1)
91 --eval EXPLAIN $query
92 --eval EXPLAIN FORMAT=JSON $query
93 
94 --echo # subquery in the HAVING clause
95 
96 --let $query=SELECT * FROM t1 HAVING i > ALL (SELECT i FROM t2) OR i < ALL (SELECT i FROM t2);
97 --eval EXPLAIN $query
98 --eval EXPLAIN FORMAT=JSON $query
99 
100 --echo # subquery in the GROUP BY clause
101 
102 --let $query=SELECT * FROM t1 GROUP BY i > ALL (SELECT i FROM t2) OR i < ALL (SELECT i FROM t2);
103 --eval EXPLAIN $query
104 --eval EXPLAIN FORMAT=JSON $query
105 
106 --echo # subquery in the SELECT list
107 
108 --let $query=SELECT (SELECT i + 1 FROM t1 ORDER BY RAND() LIMIT 1), i FROM t1;
109 --eval EXPLAIN $query
110 --eval EXPLAIN FORMAT=JSON $query
111 
112 DROP TABLE t1, t2, t3, t4;
113 
114 --echo # derived table that is optimized out
115 
116 CREATE TABLE t1 (i INT);
117 EXPLAIN SELECT 1 FROM (SELECT 1 AS x FROM t1) tt WHERE x;
118 EXPLAIN FORMAT= JSON SELECT 1 FROM (SELECT 1 AS x FROM t1) tt WHERE x;
119 DROP TABLE t1;
120 
121 --echo # complex subqueries
122 
123 CREATE TABLE t1 (a INT, b INT);
124 CREATE TABLE t2 (c INT, d INT);
125 CREATE TABLE t3 (e INT);
126 CREATE TABLE t4 (f INT, g INT);
127 INSERT INTO t1 VALUES (1,10), (2,10);
128 INSERT INTO t2 VALUES (2,10), (2,20);
129 INSERT INTO t3 VALUES (10), (30);
130 INSERT INTO t4 VALUES (2,10), (2,10);
131 
132 --let $query = SELECT * FROM t1 WHERE t1.a IN (SELECT c FROM t2 WHERE (SELECT e FROM t3) < SOME(SELECT e FROM t3 WHERE t1.b));
133 --eval EXPLAIN $query
134 --eval EXPLAIN FORMAT=JSON $query
135 
136 DROP TABLE t1, t2, t3, t4;
137 
138 --echo # semi-join materialization (if enabled)
139 
140 CREATE TABLE t1 (a INT);
141 INSERT INTO t1 VALUES (1), (1), (1);
142 CREATE TABLE t2 (a INT) SELECT * FROM t1;
143 CREATE TABLE t3 (a INT) SELECT * FROM t1;
144 CREATE TABLE t4 (a INT) SELECT * FROM t1;
145 
146 EXPLAIN FORMAT=JSON
147 SELECT * FROM t1
148 WHERE t1.a IN (SELECT t2.a FROM t2 WHERE t2.a > 0) AND
149  t1.a IN (SELECT t3.a FROM t3 WHERE t3.a IN
150  (SELECT t4.a FROM t4 WHERE a > 0));
151 
152 DROP TABLE t1, t2, t3, t4;
153 
154 --echo # the same subquery is associated with two different JOIN_TABs
155 
156 CREATE TABLE t1 (
157  i1 INTEGER NOT NULL,
158  c1 VARCHAR(1) NOT NULL
159 ) ENGINE=InnoDB;
160 
161 INSERT INTO t1 VALUES (2,'w');
162 
163 CREATE TABLE t2 (
164  i1 INTEGER NOT NULL,
165  c1 VARCHAR(1) NOT NULL,
166  c2 VARCHAR(1) NOT NULL,
167  KEY (c1, i1)
168 ) ENGINE=InnoDB;
169 
170 INSERT INTO t2 VALUES (8,'d','d');
171 INSERT INTO t2 VALUES (4,'v','v');
172 
173 CREATE TABLE t3 (
174  c1 VARCHAR(1) NOT NULL
175 ) ENGINE=InnoDB;
176 
177 INSERT INTO t3 VALUES ('v');
178 
179 EXPLAIN FORMAT=json
180 SELECT i1
181 FROM t1
182 WHERE EXISTS (SELECT t2.c1
183  FROM (t2 INNER JOIN t3 ON (t3.c1 = t2.c1))
184  WHERE t2.c2 != t1.c1 AND t2.c2 = (SELECT MIN(t3.c1)
185  FROM t3));
186 
187 DROP TABLE t1, t2, t3;
188 
189 --echo # multiple materialization groups
190 
191 CREATE TABLE t1 (c_key INT, KEY c_key (c_key));
192 INSERT INTO t1 VALUES (1), (2), (3);
193 CREATE TABLE t2 (c INT, c_key INT);
194 INSERT INTO t2 VALUES (8,5),(4,5),(8,1);
195 CREATE TABLE t3 LIKE t1;
196 INSERT INTO t3 SELECT * FROM t1;
197 CREATE TABLE t4 LIKE t2;
198 INSERT INTO t4 SELECT * FROM t2;
199 CREATE TABLE t5 (c INT);
200 INSERT INTO t5 VALUES (1), (2), (3);
201 
202 --echo # This should show two materialization groups where applicable
203 
204 let $query=SELECT * FROM t5
205  WHERE c IN (SELECT t2.c FROM t1 JOIN t2 ON t2.c_key = t1.c_key)
206  AND c IN (SELECT t4.c FROM t3 JOIN t4 ON t4.c_key = t3.c_key);
207 --eval EXPLAIN $query
208 --eval EXPLAIN FORMAT=JSON $query
209 
210 DROP TABLE t1, t2, t3, t4, t5;
211 
212 CREATE TABLE t1 (i INT);
213 CREATE TABLE t2 (i INT);
214 CREATE TABLE t3 (i INT);
215 
216 INSERT INTO t1 VALUES (1);
217 INSERT INTO t2 VALUES (1);
218 INSERT INTO t3 VALUES (1);
219 
220 --echo # Subqueries in UPDATE values list
221 
222 let $query=UPDATE t1 SET i=(SELECT i FROM t2);
223 --eval EXPLAIN $query
224 --eval EXPLAIN FORMAT=JSON $query
225 let $query=UPDATE t1, t2 SET t1.i=(SELECT i FROM t3);
226 --eval EXPLAIN $query
227 --eval EXPLAIN FORMAT=JSON $query
228 
229 --echo # INSERT ... ON DUPLICATE KEY UPDATE x=(SELECT ...) value list
230 
231 let $query=INSERT INTO t1 (i)
232  SELECT i FROM t2 ON DUPLICATE KEY UPDATE i=(SELECT i FROM t2);
233 --eval EXPLAIN $query
234 --eval EXPLAIN FORMAT=JSON $query
235 
236 let $query=INSERT INTO t1 VALUES (1)
237  ON DUPLICATE KEY UPDATE i = (SELECT i FROM t2);
238 --eval EXPLAIN $query
239 --eval EXPLAIN FORMAT=JSON $query
240 
241 --echo # Subqueries in INSERT VALUES tuples:
242 
243 let $query=INSERT INTO t3 VALUES((SELECT i FROM t1)), ((SELECT i FROM t2));
244 --eval EXPLAIN $query
245 --eval EXPLAIN FORMAT=JSON $query
246 
247 DROP TABLE t1, t2, t3;
248 
249 --echo # Various queries
250 
251 let $query=
252  SELECT a, b FROM
253  (SELECT 1 AS a, 2 AS b
254  UNION ALL
255  SELECT 1 AS a, 2 AS b) t1
256  GROUP BY a
257  ORDER BY b DESC;
258 --eval EXPLAIN $query
259 --eval EXPLAIN FORMAT=JSON $query
260 
261 --echo #
262 
263 CREATE TABLE t1(a INT, b INT);
264 INSERT INTO t1 VALUES (), ();
265 let $query=SELECT 1 FROM t1 GROUP BY GREATEST(t1.a, (SELECT 1 FROM (SELECT t1.b FROM t1, t1 t2 ORDER BY t1.a, t1.a LIMIT 1) AS d));
266 --eval EXPLAIN $query
267 --eval EXPLAIN FORMAT=JSON $query
268 DROP TABLE t1;
269 
270 --echo #
271 
272 CREATE TABLE t1(f1 INT);
273 INSERT INTO t1 VALUES (1),(1);
274 let $query=SELECT 1 FROM t1 WHERE (SELECT (SELECT 1 FROM t1 GROUP BY f1));
275 --eval EXPLAIN $query
276 --eval EXPLAIN FORMAT=JSON $query
277 DROP TABLE t1;
278 
279 --echo #
280 
281 CREATE TABLE t1 (i INT);
282 CREATE TABLE t2 (i INT, j INT);
283 INSERT INTO t1 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
284 INSERT INTO t2 SELECT i, i * 10 FROM t1;
285 let $query=SELECT * FROM t1 ORDER BY (SELECT t2.j FROM t2 WHERE t2.i = t1.i);
286 --eval EXPLAIN $query
287 --eval EXPLAIN FORMAT=JSON $query
288 let $query=SELECT * FROM t1 GROUP BY (SELECT t2.j FROM t2 WHERE t2.i = t1.i);
289 --eval EXPLAIN $query
290 --eval EXPLAIN FORMAT=JSON $query
291 DROP TABLE t1, t2;
292 
293 CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL, PRIMARY KEY(a, b));
294 INSERT INTO t1 VALUES (10,1),(10,2),(10,3),(20,4),(20,5),(20,6),
295  (30,7),(30,8),(30,9),(40,10),(40,11),(40,12),(40,13);
296 
297 EXPLAIN FORMAT=JSON SELECT a, MIN(b) AS b FROM t1 GROUP BY a ORDER BY b;
298 
299 DROP TABLE t1;
300 
301 --echo #
302 
303 CREATE TABLE t1 (a INT NOT NULL, b CHAR(3) NOT NULL, PRIMARY KEY (a));
304 INSERT INTO t1 VALUES (1,'ABC'), (2,'EFG'), (3,'HIJ');
305 CREATE TABLE t2 (a INT NOT NULL,b CHAR(3) NOT NULL,PRIMARY KEY (a, b));
306 INSERT INTO t2 VALUES (1,'a'),(1,'b'),(3,'F');
307 
308 EXPLAIN FORMAT=JSON SELECT t1.a, GROUP_CONCAT(t2.b) AS b FROM t1 LEFT JOIN t2 ON t1.a=t2.a GROUP BY t1.a ORDER BY t1.b;
309 
310 DROP TABLE t1;
311 DROP TABLE t2;
312 
313 --echo #
314 
315 CREATE TABLE t1 (a INT, b INT);
316 
317 INSERT INTO t1 VALUES
318  (1,4),
319  (2,2), (2,2),
320  (4,1), (4,1), (4,1), (4,1),
321  (2,1), (2,1);
322 
323 EXPLAIN FORMAT=JSON SELECT SUM(b) FROM t1 GROUP BY a WITH ROLLUP;
324 
325 DROP TABLE t1;
326 
327 --echo # Composition of DISTINCT, GROUP BY and ORDER BY
328 
329 CREATE TABLE t1 (a INT, b INT);
330 INSERT INTO t1 VALUES (1, 1), (1, 2), (2, 1), (2, 2), (3, 1);
331 
332 let $query=SELECT DISTINCT SUM(b) s FROM t1 GROUP BY a ORDER BY s;
333 --eval EXPLAIN FORMAT=JSON $query
334 FLUSH STATUS;
335 --eval $query
336 SHOW SESSION STATUS WHERE (Variable_name LIKE 'Sort_%' OR Variable_name LIKE 'Created_%_tables') AND Value > 0;
337 
338 DROP TABLE t1;
339 
340 --echo # "buffer_result" node
341 
342 CREATE TABLE t1 (a INT NOT NULL);
343 CREATE TABLE t2 (a INT NOT NULL, PRIMARY KEY (a));
344 INSERT INTO t1 VALUES (1);
345 INSERT INTO t2 VALUES (1),(2);
346 EXPLAIN FORMAT=JSON SELECT SQL_BIG_RESULT DISTINCT t1.a FROM t1,t2 ORDER BY t2.a;
347 DROP TABLE t1, t2;
348 
349 --echo #
350 
351 CREATE TABLE t1 (a INT NOT NULL, b INT, PRIMARY KEY (a));
352 CREATE TABLE t2 (a INT NOT NULL, PRIMARY KEY (a));
353 INSERT INTO t1 VALUES (1,10), (2,20), (3,30), (4,40);
354 INSERT INTO t2 VALUES (2), (3), (4), (5);
355 EXPLAIN FORMAT=JSON SELECT * FROM t2 WHERE t2.a IN (SELECT a FROM t1 WHERE t1.b <> 30);
356 DROP TABLE t1, t2;
357 
358 set default_storage_engine= @save_storage_engine;