Commit 38acf43e authored by unknown's avatar unknown
Browse files

Bug#25376: Incomplete setup of ORDER BY clause results in a wrong result.

Functions over sum functions wasn't set up correctly for the ORDER BY clause
which leads to a wrong order of the result set.

The split_sum_func() function is called now for each ORDER BY item that
contains a sum function to set it up correctly.


mysql-test/t/order_by.test:
  Added a test case for bug#25376: Incomplete setup of ORDER BY clause results in a wrong result.
mysql-test/r/order_by.result:
  Added a test case for bug#25376: Incomplete setup of ORDER BY clause results in a wrong result.
sql/sql_select.cc:
  Bug#25376: Incomplete setup of ORDER BY clause results in a wrong result.
  The split_sum_func() function is called now for each ORDER BY item that
  contains a sum function to set it up correctly.
parent 476f91b5
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -926,3 +926,11 @@ NULL
2
3
DROP TABLE t1,t2,t3,t4;
create table t1 (a int, b int, c int);
insert into t1 values (1,2,3), (9,8,3), (19,4,3), (1,4,9);
select a,(sum(b)/sum(c)) as ratio from t1 group by a order by sum(b)/sum(c) asc;
a	ratio
1	0.5000
19	1.3333
9	2.6667
drop table t1;
+8 −0
Original line number Diff line number Diff line
@@ -640,3 +640,11 @@ SELECT t2.b FROM t1 LEFT JOIN (t2, t3 LEFT JOIN t4 ON t3.a=t4.a)
ON (t1.a=t2.a AND t1.b=t3.b) order by t2.b;

DROP TABLE t1,t2,t3,t4;

#
# Bug#25376: Incomplete setup of ORDER BY clause results in a wrong result.
#
create table t1 (a int, b int, c int);
insert into t1 values (1,2,3), (9,8,3), (19,4,3), (1,4,9);
select a,(sum(b)/sum(c)) as ratio from t1 group by a order by sum(b)/sum(c) asc;
drop table t1;
+11 −0
Original line number Diff line number Diff line
@@ -455,6 +455,17 @@ JOIN::prepare(Item ***rref_pointer_array,

  select_lex->fix_prepare_information(thd, &conds, &having);

  if (order)
  {
    ORDER *ord;
    for (ord= order; ord; ord= ord->next)
    {
      Item *item= *ord->item;
      if (item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM)
        item->split_sum_func(thd, ref_pointer_array, all_fields);
    }
  }

  if (having && having->with_sum_func)
    having->split_sum_func2(thd, ref_pointer_array, all_fields,
                            &having, TRUE);