Commit 8838c971 authored by unknown's avatar unknown

A fix (Bug #4980: union statement with () union () order by produces wrong explain).

parent b871ea38
...@@ -88,7 +88,6 @@ explain (select a,b from t1 limit 2) union all (select a,b from t2 order by a l ...@@ -88,7 +88,6 @@ explain (select a,b from t1 limit 2) union all (select a,b from t2 order by a l
table type possible_keys key key_len ref rows Extra table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 4 t1 ALL NULL NULL NULL NULL 4
t2 ALL NULL NULL NULL NULL 4 Using filesort t2 ALL NULL NULL NULL NULL 4 Using filesort
t1 ALL NULL NULL NULL NULL 4
(select sql_calc_found_rows a,b from t1 limit 2) union all (select a,b from t2 order by a) limit 2; (select sql_calc_found_rows a,b from t1 limit 2) union all (select a,b from t2 order by a) limit 2;
a b a b
1 a 1 a
...@@ -424,8 +423,16 @@ create table t1 select a from t1 union select a from t2; ...@@ -424,8 +423,16 @@ create table t1 select a from t1 union select a from t2;
INSERT TABLE 't1' isn't allowed in FROM table list INSERT TABLE 't1' isn't allowed in FROM table list
select a from t1 union select a from t2 order by t2.a; select a from t1 union select a from t2 order by t2.a;
Unknown column 't2.a' in 'ORDER BY' Unknown column 't2.a' in 'ORDER BY'
drop table t1;
drop table t1,t2; drop table t1,t2;
select length(version()) > 1 as `*` UNION select 2; select length(version()) > 1 as `*` UNION select 2;
* *
1 1
2 2
create table t1 (a int);
insert into t1 values (0), (3), (1), (2);
explain (select * from t1) union (select * from t1) order by a;
table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 4
t1 ALL NULL NULL NULL NULL 4
drop table t1;
...@@ -228,6 +228,7 @@ create temporary table t1 select a from t1 union select a from t2; ...@@ -228,6 +228,7 @@ create temporary table t1 select a from t1 union select a from t2;
create table t1 select a from t1 union select a from t2; create table t1 select a from t1 union select a from t2;
--error 1054 --error 1054
select a from t1 union select a from t2 order by t2.a; select a from t1 union select a from t2 order by t2.a;
drop table t1; # Drop temporary table
drop table t1,t2; drop table t1,t2;
# #
...@@ -236,3 +237,11 @@ drop table t1,t2; ...@@ -236,3 +237,11 @@ drop table t1,t2;
select length(version()) > 1 as `*` UNION select 2; select length(version()) > 1 as `*` UNION select 2;
#
# Bug #4980: problem with explain
#
create table t1 (a int);
insert into t1 values (0), (3), (1), (2);
explain (select * from t1) union (select * from t1) order by a;
drop table t1;
...@@ -148,6 +148,10 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) ...@@ -148,6 +148,10 @@ int mysql_union(THD *thd, LEX *lex,select_result *result)
{ {
ha_rows records_at_start; ha_rows records_at_start;
lex->select=sl; lex->select=sl;
#if MYSQL_VERSION_ID < 40100
if (describe && sl->linkage == NOT_A_SELECT)
break; // Skip extra item in case of 'explain'
#endif
/* Don't use offset for the last union if there is no braces */ /* Don't use offset for the last union if there is no braces */
if (sl != lex_sl) if (sl != lex_sl)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment