mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
Fix for BUG#14920 Ordering aggregated result sets corrupts resultset.
The cause of the bug was the use of end_write_group instead of end_write
in the case when ORDER BY required a temporary table, which didn't take
into account the fact that loose index scan already computes the result
of MIN/MAX aggregate functions (and performs grouping).
The solution is to call end_write instead of end_write_group and to add
the MIN/MAX functions to the list of regular functions so that their
values are inserted into the temporary table.
mysql-test/r/group_min_max.result:
Test for BUG#14920
mysql-test/t/group_min_max.test:
Test for BUG#14920
sql/sql_class.cc:
Added new member to TMP_TABLE_PARAM.
sql/sql_class.h:
Added new member to TMP_TABLE_PARAM.
sql/sql_select.cc:
Enable result rows generated by loose index scan being written into
a temporary table. The change is necessary because loose index
scan already computes the result of GROUP BY and the MIN/MAX aggregate
functions. This is realized by three changes:
- create_tmp_table allocates space for aggregate functions in the
list of regular functions,
- use end_write instead of end_write group,
- copy the pointers to the MIN/MAX aggregate functions to the list
of regular functions TMP_TABLE_PARAM::items_to_copy.
sql/sql_select.h:
New parameter to create_tmp_table.
This commit is contained in:
@@ -1802,6 +1802,7 @@ void TMP_TABLE_PARAM::init()
|
||||
group_parts= group_length= group_null_parts= 0;
|
||||
quick_group= 1;
|
||||
table_charset= 0;
|
||||
precomputed_group_by= 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user