diff options
author | Michael Widenius <monty@askmonty.org> | 2010-08-23 12:46:25 +0300 |
---|---|---|
committer | Michael Widenius <monty@askmonty.org> | 2010-08-23 12:46:25 +0300 |
commit | b6fe4713fe14c059c4bceca60ed1863a90b7e512 (patch) | |
tree | dde4fe858e152b2b411a5b8c1d750629cf228a35 /sql/item_sum.cc | |
parent | 096666fcbbf0329676cfd1d8623c1503613f1570 (diff) | |
download | mariadb-git-b6fe4713fe14c059c4bceca60ed1863a90b7e512.tar.gz |
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.
Diffstat (limited to 'sql/item_sum.cc')
-rw-r--r-- | sql/item_sum.cc | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 2f79fd65ff3..b3b07119066 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -1638,8 +1638,22 @@ void Item_sum_hybrid::cleanup() void Item_sum_hybrid::no_rows_in_result() { - was_values= FALSE; - clear(); + /* We may be called here twice in case of ref field in function */ + if (was_values) + { + was_values= FALSE; + was_null_value= value->null_value; + clear(); + } +} + +void Item_sum_hybrid::restore_to_before_no_rows_in_result() +{ + if (!was_values) + { + was_values= TRUE; + null_value= value->null_value= was_null_value; + } } |