summaryrefslogtreecommitdiff
path: root/sql/sql_select.h
diff options
context:
space:
mode:
authorunknown <gkodinov/kgeorge@magare.gmz>2007-06-29 10:39:17 +0300
committerunknown <gkodinov/kgeorge@magare.gmz>2007-06-29 10:39:17 +0300
commit7d6c4d8da3b602a41b510b1eac4386147a98c6fc (patch)
treed3ed38e7e41e1f719e4a866004003c2244ea12ac /sql/sql_select.h
parentea771d527b296351f977fb3828fb78be15323615 (diff)
downloadmariadb-git-7d6c4d8da3b602a41b510b1eac4386147a98c6fc.tar.gz
Bug#27333: subquery grouped for aggregate of outer
query / no aggregate of subquery The optimizer counts the aggregate functions that appear as top level expressions (in all_fields) in the current subquery. Later it makes a list of these that it uses to actually execute the aggregates in end_send_group(). That count is used in several places as a flag whether there are aggregates functions. While collecting the above info it must not consider aggregates that are not aggregated in the current context. It must treat them as normal expressions instead. Not doing that leads to incorrect data about the query, e.g. running a query that actually has no aggregate functions as if it has some (and hence is expected to return only one row). Fixed by ignoring the aggregates that are not aggregated in the current context. One other smaller omission discovered and fixed in the process : the place of aggregation was not calculated for user defined functions. Fixed by calling Item_sum::init_sum_func_check() and Item_sum::check_sum_func() as it's done for the rest of the aggregate functions. mysql-test/r/subselect.result: Bug #27333: test case mysql-test/t/subselect.test: Bug #27333: test case sql/item_subselect.cc: Bug#27333: need select_lex to filter out aggregates that are not aggregated in the current select. sql/item_sum.cc: Bug#27333: need select_lex to filter out aggregates that are not aggregated in the current select. sql/item_sum.h: Bug#27333: calculate the place of aggregation for user defined functions. sql/sql_select.cc: Bug#27333: When counting the aggregated functions and collecting a list of them we must not consider the aggregates that are not aggregated in the local context as "local" : i.e. we must treat them as normal functions and not add them to the aggregate functions list. sql/sql_select.h: Bug#27333: need select_lex to filter out aggregates that are not aggregated in the current select.
Diffstat (limited to 'sql/sql_select.h')
-rw-r--r--sql/sql_select.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/sql/sql_select.h b/sql/sql_select.h
index 3cdd265df9a..4f9f6e9ed48 100644
--- a/sql/sql_select.h
+++ b/sql/sql_select.h
@@ -470,8 +470,8 @@ TABLE *create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
ulonglong select_options, ha_rows rows_limit,
char* alias);
void free_tmp_table(THD *thd, TABLE *entry);
-void count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields,
- bool reset_with_sum_func);
+void count_field_types(SELECT_LEX *select_lex, TMP_TABLE_PARAM *param,
+ List<Item> &fields, bool reset_with_sum_func);
bool setup_copy_fields(THD *thd, TMP_TABLE_PARAM *param,
Item **ref_pointer_array,
List<Item> &new_list1, List<Item> &new_list2,