1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-10120: Wrong result of UNION .. ORDER BY GROUP_CONCAT()

Reject queries that have aggregate functions with UNION as these
are not allowed by standard.
This commit is contained in:
Varun Gupta
2020-07-09 14:01:06 +05:30
parent a759f9af51
commit 737c3025e9
5 changed files with 53 additions and 34 deletions

View File

@ -22709,10 +22709,13 @@ int setup_order(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables,
List<Item> &fields, List<Item> &all_fields, ORDER *order,
bool from_window_spec)
{
SELECT_LEX *select = thd->lex->current_select;
enum_parsing_place context_analysis_place=
thd->lex->current_select->context_analysis_place;
thd->where="order clause";
for (; order; order=order->next)
const bool for_union = select->master_unit()->is_union() &&
select == select->master_unit()->fake_select_lex;
for (uint number = 1; order; order=order->next, number++)
{
if (find_order_in_list(thd, ref_pointer_array, tables, order, fields,
all_fields, false, true, from_window_spec))
@ -22723,6 +22726,18 @@ int setup_order(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables,
my_error(ER_WINDOW_FUNCTION_IN_WINDOW_SPEC, MYF(0));
return 1;
}
/*
UNION queries cannot be used with an aggregate function in
an ORDER BY clause
*/
if (for_union && (*order->item)->with_sum_func)
{
my_error(ER_AGGREGATE_ORDER_FOR_UNION, MYF(0), number);
return 1;
}
if (from_window_spec && (*order->item)->with_sum_func &&
(*order->item)->type() != Item::SUM_FUNC_ITEM)
(*order->item)->split_sum_func(thd, ref_pointer_array,