diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result index ef82b414420..76f09d6b330 100644 --- a/mysql-test/r/union.result +++ b/mysql-test/r/union.result @@ -84,6 +84,11 @@ a b 3 c 2 b 1 a +explain (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc; +table type possible_keys key key_len ref rows Extra +t1 ALL NULL NULL NULL NULL 4 +t2 ALL NULL NULL NULL NULL 4 Using filesort +t1 ALL NULL NULL NULL NULL 4 explain select a,b from t1 union all select a,b from t2; table type possible_keys key key_len ref rows Extra t1 ALL NULL NULL NULL NULL 4 diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test index 086351e9da1..e62ca6d2700 100644 --- a/mysql-test/t/union.test +++ b/mysql-test/t/union.test @@ -20,6 +20,7 @@ select 't1',b,count(*) from t1 group by b UNION select 't2',b,count(*) from t2 g (select a,b from t1 limit 2) union all (select a,b from t2 order by a) limit 4; (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1); (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc; +explain (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc; # Test some error conditions with UNION explain select a,b from t1 union all select a,b from t2; diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 1658fa701c5..541b2383e8d 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -34,6 +34,7 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) int describe=(lex->select_lex.options & SELECT_DESCRIBE) ? 1 : 0; int res; TABLE_LIST result_table_list; + TABLE_LIST *first_table=(TABLE_LIST *)lex->select_lex.table_list.first; TMP_TABLE_PARAM tmp_table_param; select_union *union_result; DBUG_ENTER("mysql_union"); @@ -58,8 +59,9 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) the ORDER BY and LIMIT parameter for the whole UNION */ lex_sl= sl; - last_sl->next=0; // Remove this extra element order= (ORDER *) lex_sl->order_list.first; + if (!order || !describe) + last_sl->next=0; // Remove this extra element } else if (!last_sl->braces) { @@ -136,7 +138,7 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) if (thd->select_limit == HA_POS_ERROR) sl->options&= ~OPTION_FOUND_ROWS; - res=mysql_select(thd, (TABLE_LIST*) sl->table_list.first, + res=mysql_select(thd, (describe && sl->linkage==NOT_A_SELECT) ? first_table : (TABLE_LIST*) sl->table_list.first, sl->item_list, sl->where, (sl->braces) ? (ORDER *)sl->order_list.first : (ORDER *) 0, @@ -193,7 +195,7 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) if (describe) thd->select_limit= HA_POS_ERROR; // no limit res=mysql_select(thd,&result_table_list, - item_list, NULL, /*ftfunc_list,*/ order, + item_list, NULL, (describe) ? 0 : order, (ORDER*) NULL, NULL, (ORDER*) NULL, thd->options, result); }