mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fix for LP#612894 Some aggregate functions (such as MIN MAX) work incorrectly in subqueries after getting NULL value
mysql-test/r/group_by.result: Added test that showed problems that no_rows_in_results() didn't work for expressions mysql-test/r/subselect4.result: Test case for LP#612894 mysql-test/t/group_by.test: Added test that showed problems that no_rows_in_results() didn't work for expressions mysql-test/t/subselect4.test: Test case for LP#612894 sql/item.h: Added restore_to_before_no_rows_in_result() Added function processor for no_rows_in_results() and restore_to_before_no_rows_in_results() to ensure it works with functions Fix that above functions are handled by Item_ref() sql/item_func.h: Ensure that no_rows_in_results() and restore_to_before_no_rows_in_result() are called for all function arguments sql/item_sum.cc: Added restore_to_before_no_rows_in_result() to restore settings after Item_sum_hybrid::no_rows_in_result() was called. This is needed to handle the case where we have made 'make_const()' on the item in opt_sum(), but the item will be reused again in a sub query. Ignore multiple calls to no_rows_in_result() as Item_ref is calling it twice. sql/item_sum.h: Added restore_to_before_no_rows_in_result(); sql/sql_select.cc: Added reset of no_rows_in_result() for JOIN::reinit() sql/sql_select.h: Added marker if no_rows_in_result() is called.
This commit is contained in:
@ -1688,6 +1688,16 @@ JOIN::reinit()
|
||||
func->clear();
|
||||
}
|
||||
|
||||
if (no_rows_in_result_called)
|
||||
{
|
||||
/* Reset effect of possible no_rows_in_result() */
|
||||
List_iterator_fast<Item> it(fields_list);
|
||||
Item *item;
|
||||
|
||||
no_rows_in_result_called= 0;
|
||||
while ((item= it++))
|
||||
item->restore_to_before_no_rows_in_result();
|
||||
}
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
@ -12681,8 +12691,11 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
|
||||
{
|
||||
List_iterator_fast<Item> it(*join->fields);
|
||||
Item *item;
|
||||
DBUG_PRINT("info", ("no matching rows"));
|
||||
|
||||
/* No matching rows for group function */
|
||||
join->clear();
|
||||
join->no_rows_in_result_called= 1;
|
||||
|
||||
while ((item= it++))
|
||||
item->no_rows_in_result();
|
||||
|
Reference in New Issue
Block a user