mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
make JOIN::prepare, JOIN::optimize only once for EXPLAIN of derived table
(BUG#2120 sfter merge) mysql-test/r/derived.result: correct results of derived tble EXPLAIN test of "Using Index" with derived tables mysql-test/t/derived.test: test of "Using Index" with derived tables sql/mysql_priv.h: way to force derived table save JOIN after execution sql/sql_derived.cc: way to force derived table save JOIN after execution sql/sql_lex.h: way to force derived table save JOIN after execution sql/sql_select.cc: make JOIN::prepare, JOIN::optimize only once for EXPLAIN of derived table
This commit is contained in:
parent
00b2168b8c
commit
1f739ca45e
6 changed files with 47 additions and 16 deletions
|
@ -141,7 +141,7 @@ a t
|
||||||
explain select count(*) from t1 as tt1, (select * from t1) as tt2;
|
explain select count(*) from t1 as tt1, (select * from t1) as tt2;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
2 DERIVED t1 index NULL a 4 NULL 10000 Using index
|
2 DERIVED t1 ALL NULL NULL NULL NULL 10000
|
||||||
drop table t1;
|
drop table t1;
|
||||||
SELECT * FROM (SELECT (SELECT * FROM (SELECT 1 as a) as a )) as b;
|
SELECT * FROM (SELECT (SELECT * FROM (SELECT 1 as a) as a )) as b;
|
||||||
(SELECT * FROM (SELECT 1 as a) as a )
|
(SELECT * FROM (SELECT 1 as a) as a )
|
||||||
|
@ -189,13 +189,13 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 PRIMARY m2 ALL NULL NULL NULL NULL 9
|
1 PRIMARY m2 ALL NULL NULL NULL NULL 9
|
||||||
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 6 Using where
|
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 6 Using where
|
||||||
2 DERIVED mp ALL NULL NULL NULL NULL 9 Using temporary; Using filesort
|
2 DERIVED mp ALL NULL NULL NULL NULL 9 Using temporary; Using filesort
|
||||||
2 DERIVED m1 index NULL PRIMARY 3 NULL 9 Using index
|
2 DERIVED m1 eq_ref PRIMARY PRIMARY 3 test.mp.mat_id 1
|
||||||
explain SELECT STRAIGHT_JOIN d.pla_id, m2.test FROM t1 m2 INNER JOIN (SELECT mp.pla_id, MIN(m1.matintnum) AS matintnum FROM t2 mp INNER JOIN t1 m1 ON mp.mat_id=m1.mat_id GROUP BY mp.pla_id) d ON d.matintnum=m2.matintnum;
|
explain SELECT STRAIGHT_JOIN d.pla_id, m2.test FROM t1 m2 INNER JOIN (SELECT mp.pla_id, MIN(m1.matintnum) AS matintnum FROM t2 mp INNER JOIN t1 m1 ON mp.mat_id=m1.mat_id GROUP BY mp.pla_id) d ON d.matintnum=m2.matintnum;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 PRIMARY m2 ALL NULL NULL NULL NULL 9
|
1 PRIMARY m2 ALL NULL NULL NULL NULL 9
|
||||||
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 6 Using where
|
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 6 Using where
|
||||||
2 DERIVED mp ALL NULL NULL NULL NULL 9 Using temporary; Using filesort
|
2 DERIVED mp ALL NULL NULL NULL NULL 9 Using temporary; Using filesort
|
||||||
2 DERIVED m1 index NULL PRIMARY 3 NULL 9 Using index
|
2 DERIVED m1 eq_ref PRIMARY PRIMARY 3 test.mp.mat_id 1
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
SELECT a.x FROM (SELECT 1 AS x) AS a HAVING a.x = 1;
|
SELECT a.x FROM (SELECT 1 AS x) AS a HAVING a.x = 1;
|
||||||
x
|
x
|
||||||
|
@ -229,8 +229,8 @@ explain select count(*) from t1 INNER JOIN (SELECT A.E1, A.E2, A.E3 FROM t1 AS A
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 2
|
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 2
|
||||||
1 PRIMARY t1 eq_ref PRIMARY PRIMARY 4 THEMAX.E2 1 Using where
|
1 PRIMARY t1 eq_ref PRIMARY PRIMARY 4 THEMAX.E2 1 Using where
|
||||||
2 DERIVED A index NULL PRIMARY 4 NULL 2 Using where; Using index
|
2 DERIVED A ALL NULL NULL NULL NULL 2 Using where
|
||||||
3 DEPENDENT SUBQUERY B index NULL PRIMARY 4 NULL 2 Using where; Using index
|
3 DEPENDENT SUBQUERY B ALL NULL NULL NULL NULL 2 Using where
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (a int);
|
create table t1 (a int);
|
||||||
insert into t1 values (1),(2);
|
insert into t1 values (1),(2);
|
||||||
|
@ -309,3 +309,14 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 3 Using temporary; Using filesort
|
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 3 Using temporary; Using filesort
|
||||||
2 DERIVED x ALL NULL NULL NULL NULL 17 Using temporary; Using filesort
|
2 DERIVED x ALL NULL NULL NULL NULL 17 Using temporary; Using filesort
|
||||||
2 DERIVED y ALL NULL NULL NULL NULL 17 Using where
|
2 DERIVED y ALL NULL NULL NULL NULL 17 Using where
|
||||||
|
drop table t1;
|
||||||
|
create table t2 (a int, b int, primary key (a));
|
||||||
|
insert into t2 values (1,7),(2,7);
|
||||||
|
explain select a from t2 where a>1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t2 range PRIMARY PRIMARY 4 NULL 2 Using where; Using index
|
||||||
|
explain select a from (select a from t2 where a>1) tt;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY <derived2> system NULL NULL NULL NULL 1
|
||||||
|
2 DERIVED t2 range PRIMARY PRIMARY 4 NULL 2 Using where; Using index
|
||||||
|
drop table t2;
|
||||||
|
|
|
@ -192,3 +192,13 @@ CREATE TABLE t1 (name char(1) default NULL, val int(5) default NULL);
|
||||||
INSERT INTO t1 VALUES ('a',1), ('a',2), ('a',2), ('a',2), ('a',3), ('a',6), ('a',7), ('a',11), ('a',11), ('a',12), ('a',13), ('a',13), ('a',20), ('b',2), ('b',3), ('b',4), ('b',5);
|
INSERT INTO t1 VALUES ('a',1), ('a',2), ('a',2), ('a',2), ('a',3), ('a',6), ('a',7), ('a',11), ('a',11), ('a',12), ('a',13), ('a',13), ('a',20), ('b',2), ('b',3), ('b',4), ('b',5);
|
||||||
SELECT s.name, AVG(s.val) AS median FROM (SELECT x.name, x.val FROM t1 x, t1 y WHERE x.name=y.name GROUP BY x.name, x.val HAVING SUM(y.val <= x.val) >= COUNT(*)/2 AND SUM(y.val >= x.val) >= COUNT(*)/2) AS s GROUP BY s.name;
|
SELECT s.name, AVG(s.val) AS median FROM (SELECT x.name, x.val FROM t1 x, t1 y WHERE x.name=y.name GROUP BY x.name, x.val HAVING SUM(y.val <= x.val) >= COUNT(*)/2 AND SUM(y.val >= x.val) >= COUNT(*)/2) AS s GROUP BY s.name;
|
||||||
explain SELECT s.name, AVG(s.val) AS median FROM (SELECT x.name, x.val FROM t1 x, t1 y WHERE x.name=y.name GROUP BY x.name, x.val HAVING SUM(y.val <= x.val) >= COUNT(*)/2 AND SUM(y.val >= x.val) >= COUNT(*)/2) AS s GROUP BY s.name;
|
explain SELECT s.name, AVG(s.val) AS median FROM (SELECT x.name, x.val FROM t1 x, t1 y WHERE x.name=y.name GROUP BY x.name, x.val HAVING SUM(y.val <= x.val) >= COUNT(*)/2 AND SUM(y.val >= x.val) >= COUNT(*)/2) AS s GROUP BY s.name;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# "Using index" in explain
|
||||||
|
#
|
||||||
|
create table t2 (a int, b int, primary key (a));
|
||||||
|
insert into t2 values (1,7),(2,7);
|
||||||
|
explain select a from t2 where a>1;
|
||||||
|
explain select a from (select a from t2 where a>1) tt;
|
||||||
|
drop table t2;
|
||||||
|
|
|
@ -247,7 +247,9 @@ extern CHARSET_INFO *national_charset_info, *table_alias_charset;
|
||||||
// uncachable cause
|
// uncachable cause
|
||||||
#define UNCACHEABLE_DEPENDENT 1
|
#define UNCACHEABLE_DEPENDENT 1
|
||||||
#define UNCACHEABLE_RAND 2
|
#define UNCACHEABLE_RAND 2
|
||||||
#define UNCACHEABLE_SIDEEFFECT 4
|
#define UNCACHEABLE_SIDEEFFECT 4
|
||||||
|
// forcing to save JOIN for explain
|
||||||
|
#define UNCACHEABLE_EXPLAIN 8
|
||||||
|
|
||||||
#ifdef EXTRA_DEBUG
|
#ifdef EXTRA_DEBUG
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -62,6 +62,15 @@ mysql_handle_derived(LEX *lex)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (lex->describe)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Force join->join_tmp creation, because we will use this JOIN
|
||||||
|
twice for EXPLAIN and we have to have unchanged join for EXPLAINing
|
||||||
|
*/
|
||||||
|
sl->uncacheable|= UNCACHEABLE_EXPLAIN;
|
||||||
|
sl->master_unit()->uncacheable|= UNCACHEABLE_EXPLAIN;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -232,6 +232,7 @@ public:
|
||||||
UNCACHEABLE_DEPENDENT
|
UNCACHEABLE_DEPENDENT
|
||||||
UNCACHEABLE_RAND
|
UNCACHEABLE_RAND
|
||||||
UNCACHEABLE_SIDEEFFECT
|
UNCACHEABLE_SIDEEFFECT
|
||||||
|
UNCACHEABLE_EXPLAIN
|
||||||
*/
|
*/
|
||||||
uint8 uncacheable;
|
uint8 uncacheable;
|
||||||
enum sub_select_type linkage;
|
enum sub_select_type linkage;
|
||||||
|
|
|
@ -1579,8 +1579,8 @@ mysql_select(THD *thd, Item ***rref_pointer_array,
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free_join= 0;
|
|
||||||
}
|
}
|
||||||
|
free_join= 0;
|
||||||
join->select_options= select_options;
|
join->select_options= select_options;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -3769,11 +3769,6 @@ JOIN::join_free(bool full)
|
||||||
{
|
{
|
||||||
if (tab->table)
|
if (tab->table)
|
||||||
{
|
{
|
||||||
if (tab->table->key_read)
|
|
||||||
{
|
|
||||||
tab->table->key_read= 0;
|
|
||||||
tab->table->file->extra(HA_EXTRA_NO_KEYREAD);
|
|
||||||
}
|
|
||||||
/* Don't free index if we are using read_record */
|
/* Don't free index if we are using read_record */
|
||||||
if (!tab->read_record.table)
|
if (!tab->read_record.table)
|
||||||
tab->table->file->index_end();
|
tab->table->file->index_end();
|
||||||
|
@ -9128,6 +9123,9 @@ int mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result)
|
||||||
sl;
|
sl;
|
||||||
sl= sl->next_select())
|
sl= sl->next_select())
|
||||||
{
|
{
|
||||||
|
// drop UNCACHEABLE_EXPLAIN, because it is for internal usage only
|
||||||
|
uint8 uncacheable= (sl->uncacheable & ~UNCACHEABLE_EXPLAIN);
|
||||||
|
|
||||||
res= mysql_explain_select(thd, sl,
|
res= mysql_explain_select(thd, sl,
|
||||||
(((&thd->lex->select_lex)==sl)?
|
(((&thd->lex->select_lex)==sl)?
|
||||||
((thd->lex->all_selects_list != sl) ?
|
((thd->lex->all_selects_list != sl) ?
|
||||||
|
@ -9135,13 +9133,13 @@ int mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result)
|
||||||
((sl == first)?
|
((sl == first)?
|
||||||
((sl->linkage == DERIVED_TABLE_TYPE) ?
|
((sl->linkage == DERIVED_TABLE_TYPE) ?
|
||||||
"DERIVED":
|
"DERIVED":
|
||||||
((sl->uncacheable & UNCACHEABLE_DEPENDENT) ?
|
((uncacheable & UNCACHEABLE_DEPENDENT) ?
|
||||||
"DEPENDENT SUBQUERY":
|
"DEPENDENT SUBQUERY":
|
||||||
(sl->uncacheable?"UNCACHEABLE SUBQUERY":
|
(uncacheable?"UNCACHEABLE SUBQUERY":
|
||||||
"SUBQUERY"))):
|
"SUBQUERY"))):
|
||||||
((sl->uncacheable & UNCACHEABLE_DEPENDENT) ?
|
((uncacheable & UNCACHEABLE_DEPENDENT) ?
|
||||||
"DEPENDENT UNION":
|
"DEPENDENT UNION":
|
||||||
sl->uncacheable?"UNCACHEABLE UNION":
|
uncacheable?"UNCACHEABLE UNION":
|
||||||
"UNION"))),
|
"UNION"))),
|
||||||
result);
|
result);
|
||||||
if (res)
|
if (res)
|
||||||
|
|
Loading…
Reference in a new issue