diff options
author | Igor Babaev <igor@askmonty.org> | 2011-07-20 21:55:55 -0700 |
---|---|---|
committer | Igor Babaev <igor@askmonty.org> | 2011-07-20 21:55:55 -0700 |
commit | 2e8542f4620fd64e65eb6e41122bbe166c242a01 (patch) | |
tree | 1b19d7e54e2415fd9aba043b07c1b5d698d6bc3c /sql | |
parent | 6dc1cdc2057121d8a10782fc5261e4ea9650a7ab (diff) | |
download | mariadb-git-2e8542f4620fd64e65eb6e41122bbe166c242a01.tar.gz |
Fixed LP bug #791761.
An aggregating query over an empty set of a join of two tables
with a rejecting HAVING clause erroneously could return a row.
It could happen in the cases when the optimizer made a conclusion
that the aggregating set was empty.
Wrong results were produced because the server missed initial
setting for aggregation functions in the mentioned cases.
Diffstat (limited to 'sql')
-rw-r--r-- | sql/item.h | 1 | ||||
-rw-r--r-- | sql/item_sum.h | 1 | ||||
-rw-r--r-- | sql/sql_select.cc | 4 |
3 files changed, 5 insertions, 1 deletions
diff --git a/sql/item.h b/sql/item.h index f2e7a2587da..8a453f31c7e 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1020,6 +1020,7 @@ public: virtual bool set_fake_select_as_master_processor(uchar *arg) { return 0; } virtual bool view_used_tables_processor(uchar *arg) { return 0; } virtual bool eval_not_null_tables(uchar *opt_arg) { return 0; } + virtual bool clear_sum_processor(uchar *opt_arg) { return 0; } /* To call bool function for all arguments */ struct bool_func_call_args diff --git a/sql/item_sum.h b/sql/item_sum.h index 7b6bdbabf7f..0d557a030d8 100644 --- a/sql/item_sum.h +++ b/sql/item_sum.h @@ -388,6 +388,7 @@ public: { return trace_unsupported_by_check_vcol_func_processor(func_name()); } + bool clear_sum_processor(uchar *arg) { clear(); return 0; } }; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index c4f03cf2c4f..eacebcb498a 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -10146,7 +10146,9 @@ return_zero_rows(JOIN *join, select_result *result, List<TABLE_LIST> &tables, TABLE_LIST *table; while ((table= ti++)) mark_as_null_row(table->table); // All fields are NULL - if (having && having->val_int() == 0) + if (having && + !having->walk(&Item::clear_sum_processor, FALSE, NULL) && + having->val_int() == 0) send_row=0; } if (!(result->send_fields(fields, |