Victoria Reznichenko writes:
> Hi!
> Sinisa, i tested the following example on 4.0.1 and got the same
> result. If I don't use ORDER BY in the SELECT statement all worked
> fine:
>
> mysql> SELECT u.gender AS gender, count(DISTINCT u.id) AS dist_count,
>(count(DISTINCT u.id)/5*100) AS percentage from users_table u, log_table l where
>l.user_id = u.id GROUP BY u.gender;
> +--------+------------+------------+
> | gender | dist_count | percentage |
> +--------+------------+------------+
> | F | 3 | 60.00 |
> | M | 1 | 20.00 |
> +--------+------------+------------+
> 2 rows in set (0.02 sec)
>
> But if I use ORDER BY ....
>
> mysql> SELECT u.gender AS gender, count(DISTINCT u.id) AS dist_count,
>(count(DISTINCT u.id)/5*100) AS percentage from users_table u, log_table l where
>l.user_id = u.id GROUP BY u.gender order by percentage;
> +--------+------------+------------+
> | gender | dist_count | percentage |
> +--------+------------+------------+
> | NULL | 1 | 20.00 |
> | NULL | 3 | 60.00 |
> +--------+------------+------------+
> 2 rows in set (0.01 sec)
>
Thank you for your bug report which helped us fix a bug. A fix will
appear in 4.0.2.
This is a temporary fix patch :
===== sql/sql_select.cc 1.169 vs edited =====
*** /tmp/sql_select.cc-1.169-6056 Sun May 26 16:11:27 2002
--- edited/sql/sql_select.cc Sat Jun 8 19:37:29 2002
***************
*** 135,141 ****
static void calc_group_buffer(JOIN *join,ORDER *group);
static bool alloc_group_fields(JOIN *join,ORDER *group);
static bool make_sum_func_list(JOIN *join,List<Item> &fields);
! static bool change_to_use_tmp_fields(List<Item> &func);
static bool change_refs_to_tmp_fields(THD *thd, List<Item> &func);
static void init_tmptable_sum_functions(Item_sum **func);
static void update_tmptable_sum_func(Item_sum **func,TABLE *tmp_table);
--- 135,141 ----
static void calc_group_buffer(JOIN *join,ORDER *group);
static bool alloc_group_fields(JOIN *join,ORDER *group);
static bool make_sum_func_list(JOIN *join,List<Item> &fields);
! static bool change_to_use_tmp_fields(List<Item> &func, bool change=false);
static bool change_refs_to_tmp_fields(THD *thd, List<Item> &func);
static void init_tmptable_sum_functions(Item_sum **func);
static void update_tmptable_sum_func(Item_sum **func,TABLE *tmp_table);
***************
*** 788,794 ****
tmp_table=tmp_table2;
join.join_tab[0].table=0; // Table is freed
! if (change_to_use_tmp_fields(all_fields)) // No sum funcs anymore
goto err;
join.tmp_table_param.field_count+=join.tmp_table_param.sum_func_count;
join.tmp_table_param.sum_func_count=0;
--- 788,794 ----
tmp_table=tmp_table2;
join.join_tab[0].table=0; // Table is freed
! if (change_to_use_tmp_fields(all_fields,true)) // No sum funcs anymore
goto err;
join.tmp_table_param.field_count+=join.tmp_table_param.sum_func_count;
join.tmp_table_param.sum_func_count=0;
***************
*** 6764,6770 ****
*/
static bool
! change_to_use_tmp_fields(List<Item> &items)
{
List_iterator<Item> it(items);
Item *item_field,*item;
--- 6764,6770 ----
*/
static bool
! change_to_use_tmp_fields(List<Item> &items, bool change)
{
List_iterator<Item> it(items);
Item *item_field,*item;
***************
*** 6776,6781 ****
--- 6776,6786 ----
continue;
if (item->type() == Item::FIELD_ITEM)
{
+ if (change)
+ {
+ ((Item_field*) item)->result_field->null_ptr=0;
+ item->maybe_null=0;
+ }
((Item_field*) item)->field=
((Item_field*) item)->result_field;
}
--
Regards,
__ ___ ___ ____ __
/ |/ /_ __/ __/ __ \/ / Mr. Sinisa Milivojevic <[EMAIL PROTECTED]>
/ /|_/ / // /\ \/ /_/ / /__ MySQL AB, Fulltime Developer
/_/ /_/\_, /___/\___\_\___/ Larnaca, Cyprus
<___/ www.mysql.com
---------------------------------------------------------------------
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php