Fix for a bug with EXPLAIN and (....) UNION (....) order by
This commit is contained in:
parent
2f7a8c0f04
commit
b98a84a19f
@ -84,6 +84,11 @@ a b
|
|||||||
3 c
|
3 c
|
||||||
2 b
|
2 b
|
||||||
1 a
|
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;
|
explain select a,b from t1 union all select a,b from t2;
|
||||||
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
|
||||||
|
@ -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 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);
|
||||||
(select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc;
|
(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
|
# Test some error conditions with UNION
|
||||||
explain select a,b from t1 union all select a,b from t2;
|
explain select a,b from t1 union all select a,b from t2;
|
||||||
|
@ -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 describe=(lex->select_lex.options & SELECT_DESCRIBE) ? 1 : 0;
|
||||||
int res;
|
int res;
|
||||||
TABLE_LIST result_table_list;
|
TABLE_LIST result_table_list;
|
||||||
|
TABLE_LIST *first_table=(TABLE_LIST *)lex->select_lex.table_list.first;
|
||||||
TMP_TABLE_PARAM tmp_table_param;
|
TMP_TABLE_PARAM tmp_table_param;
|
||||||
select_union *union_result;
|
select_union *union_result;
|
||||||
DBUG_ENTER("mysql_union");
|
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
|
the ORDER BY and LIMIT parameter for the whole UNION
|
||||||
*/
|
*/
|
||||||
lex_sl= sl;
|
lex_sl= sl;
|
||||||
last_sl->next=0; // Remove this extra element
|
|
||||||
order= (ORDER *) lex_sl->order_list.first;
|
order= (ORDER *) lex_sl->order_list.first;
|
||||||
|
if (!order || !describe)
|
||||||
|
last_sl->next=0; // Remove this extra element
|
||||||
}
|
}
|
||||||
else if (!last_sl->braces)
|
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)
|
if (thd->select_limit == HA_POS_ERROR)
|
||||||
sl->options&= ~OPTION_FOUND_ROWS;
|
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->item_list,
|
||||||
sl->where,
|
sl->where,
|
||||||
(sl->braces) ? (ORDER *)sl->order_list.first : (ORDER *) 0,
|
(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)
|
if (describe)
|
||||||
thd->select_limit= HA_POS_ERROR; // no limit
|
thd->select_limit= HA_POS_ERROR; // no limit
|
||||||
res=mysql_select(thd,&result_table_list,
|
res=mysql_select(thd,&result_table_list,
|
||||||
item_list, NULL, /*ftfunc_list,*/ order,
|
item_list, NULL, (describe) ? 0 : order,
|
||||||
(ORDER*) NULL, NULL, (ORDER*) NULL,
|
(ORDER*) NULL, NULL, (ORDER*) NULL,
|
||||||
thd->options, result);
|
thd->options, result);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user