2014-08-09 06:37:56 +04:00
|
|
|
#
|
|
|
|
# EXPLAIN FORMAT=JSON tests. These are tests developed for MariaDB.
|
|
|
|
#
|
|
|
|
--disable_warnings
|
2014-12-06 19:27:42 +03:00
|
|
|
drop table if exists t0,t1,t2;
|
2014-08-09 06:37:56 +04:00
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
create table t0(a int);
|
|
|
|
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
|
|
|
|
|
|
explain format=json select * from t0;
|
|
|
|
|
|
|
|
explain format=json select * from t0 where 1>2;
|
|
|
|
|
|
|
|
explain format=json select * from t0 where a<3;
|
|
|
|
|
2014-08-14 01:12:05 +04:00
|
|
|
--echo # Try a basic join
|
2014-08-12 15:02:09 +04:00
|
|
|
create table t1 (a int, b int, filler char(32), key(a));
|
|
|
|
insert into t1
|
|
|
|
select
|
2014-08-14 01:12:05 +04:00
|
|
|
a.a + b.a* 10 + c.a * 100,
|
|
|
|
a.a + b.a* 10 + c.a * 100,
|
2014-08-12 15:02:09 +04:00
|
|
|
'filler'
|
2014-08-14 01:12:05 +04:00
|
|
|
from t0 a, t0 b, t0 c;
|
2014-08-12 15:02:09 +04:00
|
|
|
|
|
|
|
explain format=json select * from t0,t1 where t1.a=t0.a;
|
2014-08-09 06:37:56 +04:00
|
|
|
|
2014-08-14 01:12:05 +04:00
|
|
|
--echo # Try range and index_merge
|
|
|
|
create table t2 (a1 int, a2 int, b1 int, b2 int, key(a1,a2), key(b1,b2));
|
|
|
|
insert into t2 select a,a,a,a from t1;
|
|
|
|
|
|
|
|
explain format=json select * from t2 where a1<5;
|
|
|
|
|
|
|
|
explain format=json select * from t2 where a1=1 or b1=2;
|
|
|
|
explain format=json select * from t2 where a1=1 or (b1=2 and b2=3);
|
|
|
|
|
2015-02-17 18:43:22 +03:00
|
|
|
explain format=json select * from t2 where (a1=1 and a2=1) or
|
|
|
|
(b1=2 and b2=1);
|
|
|
|
|
2014-08-14 01:12:05 +04:00
|
|
|
--echo # Try ref access on two key components
|
|
|
|
|
|
|
|
explain format=json select * from t0,t2 where t2.b1=t0.a and t2.b2=4;
|
|
|
|
|
2014-11-21 21:44:06 +03:00
|
|
|
drop table t1,t2;
|
2014-11-27 19:32:48 +03:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Try a UNION
|
|
|
|
--echo #
|
|
|
|
explain format=json select * from t0 A union select * from t0 B;
|
|
|
|
explain format=json select * from t0 A union all select * from t0 B;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Subqueries
|
|
|
|
--echo #
|
|
|
|
create table t1 (a int, b int);
|
|
|
|
insert into t1 select a,a from t0;
|
|
|
|
explain format=json select a, a > (select max(b) from t1 where t1.b=t0.a) from t0;
|
|
|
|
|
|
|
|
explain format=json
|
|
|
|
select * from t0 where
|
|
|
|
a > (select max(b) from t1 where t1.b=t0.a) or a < 3 ;
|
|
|
|
|
|
|
|
drop table t1;
|
2014-11-27 23:10:44 +03:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Join buffering
|
|
|
|
--echo #
|
|
|
|
create table t1 (a int, b int);
|
2014-11-28 16:46:05 +03:00
|
|
|
insert into t1 select tbl1.a+10*tbl2.a, tbl1.a+10*tbl2.a from t0 tbl1, t0 tbl2;
|
2014-11-27 23:10:44 +03:00
|
|
|
|
|
|
|
explain format=json
|
2014-11-28 16:46:05 +03:00
|
|
|
select * from t1 tbl1, t1 tbl2 where tbl1.a=tbl2.a and tbl1.b < 3 and tbl2.b < 5;
|
2014-11-27 23:10:44 +03:00
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
2014-11-28 02:36:31 +03:00
|
|
|
--echo #
|
2014-11-29 03:28:46 +03:00
|
|
|
--echo # Single-table UPDATE/DELETE, INSERT
|
2014-11-28 02:36:31 +03:00
|
|
|
--echo #
|
|
|
|
explain format=json delete from t0;
|
|
|
|
explain format=json delete from t0 where 1 > 2;
|
|
|
|
|
|
|
|
explain format=json delete from t0 where a < 3;
|
|
|
|
|
|
|
|
explain format=json update t0 set a=3 where a in (2,3,4);
|
|
|
|
|
2014-11-29 03:28:46 +03:00
|
|
|
explain format=json insert into t0 values (1);
|
|
|
|
|
|
|
|
create table t1 like t0;
|
|
|
|
explain format=json insert into t1 values ((select max(a) from t0));
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
2014-11-28 22:23:29 +03:00
|
|
|
--echo #
|
|
|
|
--echo # A derived table
|
|
|
|
--echo #
|
|
|
|
create table t1 (a int, b int);
|
|
|
|
insert into t1 select a,a from t0;
|
|
|
|
explain format=json
|
|
|
|
select * from (select a, count(*) as cnt from t1 group by a) as tbl
|
|
|
|
where cnt>0;
|
|
|
|
|
|
|
|
explain format=json
|
|
|
|
select * from (select a, count(*) as cnt from t1 group by a) as tbl1, t1 as
|
|
|
|
tbl2 where cnt=tbl2.a;
|
|
|
|
|
2014-11-29 01:08:18 +03:00
|
|
|
--echo #
|
|
|
|
--echo # Non-merged semi-join (aka JTBM)
|
|
|
|
--echo #
|
|
|
|
explain format=json
|
|
|
|
select * from t1 where a in (select max(a) from t1 group by b);
|
2014-12-01 21:35:31 +03:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Semi-join Materialization
|
|
|
|
--echo #
|
|
|
|
create table t2 like t1;
|
|
|
|
insert into t2 select * from t1;
|
|
|
|
explain format=json
|
|
|
|
select * from t1,t2 where t1.a in ( select a from t0);
|
|
|
|
|
2014-12-02 01:40:10 +03:00
|
|
|
--echo #
|
|
|
|
--echo # First-Match
|
|
|
|
--echo #
|
|
|
|
explain
|
|
|
|
select * from t2 where t2.a in ( select a from t1 where t1.b=t2.b);
|
|
|
|
explain format=json
|
|
|
|
select * from t2 where t2.a in ( select a from t1 where t1.b=t2.b);
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Duplicate Weedout
|
|
|
|
--echo #
|
|
|
|
set @tmp= @@optimizer_switch;
|
|
|
|
set optimizer_switch='firstmatch=off';
|
|
|
|
explain
|
|
|
|
select * from t2 where t2.a in ( select a from t1 where t1.b=t2.b);
|
|
|
|
explain format=json
|
|
|
|
select * from t2 where t2.a in ( select a from t1 where t1.b=t2.b);
|
|
|
|
set optimizer_switch=@tmp;
|
|
|
|
|
2014-12-01 21:35:31 +03:00
|
|
|
drop table t1,t2;
|
2014-12-06 01:11:22 +03:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # MRR for range access (no BKA, just MRR)
|
|
|
|
--echo #
|
|
|
|
create table t1 (a int, b int, key(a));
|
|
|
|
insert into t1 select tbl1.a+10*tbl2.a, 12345 from t0 tbl1, t0 tbl2;
|
|
|
|
set @tmp= @@optimizer_switch;
|
|
|
|
set optimizer_switch='mrr=on,mrr_sort_keys=on';
|
|
|
|
|
|
|
|
explain format=json select * from t1 where a < 3;
|
|
|
|
|
2014-12-06 02:23:37 +03:00
|
|
|
--echo # 'Range checked for each record'
|
|
|
|
set optimizer_switch=@tmp;
|
|
|
|
explain format=json
|
|
|
|
select * from t1 tbl1, t1 tbl2 where tbl2.a < tbl1.b;
|
|
|
|
|
2014-12-06 01:11:22 +03:00
|
|
|
drop table t1;
|
2014-08-09 06:37:56 +04:00
|
|
|
drop table t0;
|
2014-11-27 19:32:48 +03:00
|
|
|
|
2014-12-06 03:11:03 +03:00
|
|
|
--echo #
|
|
|
|
--echo # MDEV-7265: "Full scan on NULL key", the join case
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
CREATE TABLE t1 (a INT, KEY(a));
|
|
|
|
INSERT INTO t1 VALUES (1),(2);
|
|
|
|
|
|
|
|
CREATE TABLE t2 (b INT);
|
|
|
|
INSERT INTO t2 VALUES (3),(4);
|
|
|
|
|
|
|
|
EXPLAIN FORMAT=JSON SELECT * FROM t1 AS outer_t1 WHERE a <> ALL ( SELECT a FROM t1, t2 WHERE b <> outer_t1.a );
|
|
|
|
|
|
|
|
DROP TABLE t1,t2;
|
|
|
|
|
2014-12-06 19:27:42 +03:00
|
|
|
--echo #
|
|
|
|
--echo # Join's constant expression
|
|
|
|
--echo #
|
|
|
|
create table t0(a int);
|
|
|
|
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
|
|
|
|
|
|
create table t1(a int, b int);
|
|
|
|
insert into t1 select tbl1.a+10*tbl2.a, 1234 from t0 tbl1, t0 tbl2;
|
|
|
|
|
|
|
|
explain format=json
|
|
|
|
select * from t0
|
|
|
|
where
|
|
|
|
20000 > all (select max(tbl1.a + tbl2.a)
|
|
|
|
from t1 tbl1, t1 tbl2 where tbl1.b=tbl2.b);
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
drop table t0;
|
|
|
|
|
2014-12-06 04:02:30 +03:00
|
|
|
--echo #
|
|
|
|
--echo # MDEV-7264: Assertion `0' failed in subselect_engine::get_identifier() on EXPLAIN JSON
|
|
|
|
--echo #
|
|
|
|
CREATE TABLE t1 (a INT);
|
|
|
|
INSERT INTO t1 VALUES (1),(2);
|
|
|
|
|
|
|
|
CREATE TABLE t2 (b INT);
|
|
|
|
INSERT INTO t2 VALUES (3),(4);
|
|
|
|
|
|
|
|
EXPLAIN FORMAT=JSON SELECT * FROM t1 WHERE a <> ALL ( SELECT b FROM t2 );
|
|
|
|
DROP TABLE t1, t2;
|
|
|
|
|