mirror of
https://github.com/MariaDB/server.git
synced 2026-05-07 15:45:33 +02:00
Bug #13444084:PRIMARY KEY OR UNIQUE KEY >453 BYTES FAILS FOR
COUNT DISTINCT GROUP BY PROBLEM: To calculate the final result of the count(distinct(select 1)) we call 'end_send' function instead of 'end_send_group'. 'end_send' cannot be called if we have aggregate functions that need to be evaluated. ANALYSIS: While evaluating for a possible loose_index_scan option for the query, the variable 'is_agg_distinct' is set to 'false' as the item in the distinct clause is not a field. But, we choose loose_index_scan by not taking this into consideration. So, while setting the final 'select_function' to evaluate the result, 'precomputed_group_by' is set to TRUE as in this case loose_index_scan is chosen and we do not have agg_distinct in the query (which is clearly wrong as we have one). As a result, 'end_send' function is chosen as the final select_function instead of 'end_send_group'. The difference between the two being, 'end_send_group' evaluates the aggregates while 'end_send' does not. Hence the wrong result. FIX: The variable 'is_agg_distinct' always represents if 'loose_idnex_scan' can be chosen for aggregate_distinct functions present in the select. So, we check for this variable to continue with loose_index_scan option. sql/opt_range.cc: Do not continue if is_agg_distinct is not set in case of agg_distinct functions.
This commit is contained in:
parent
6fe6288d83
commit
fc74e2e08f
1 changed files with 4 additions and 3 deletions
|
|
@ -9463,9 +9463,10 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree, double read_time)
|
|||
have_min= TRUE;
|
||||
else if (min_max_item->sum_func() == Item_sum::MAX_FUNC)
|
||||
have_max= TRUE;
|
||||
else if (min_max_item->sum_func() == Item_sum::COUNT_DISTINCT_FUNC ||
|
||||
min_max_item->sum_func() == Item_sum::SUM_DISTINCT_FUNC ||
|
||||
min_max_item->sum_func() == Item_sum::AVG_DISTINCT_FUNC)
|
||||
else if (is_agg_distinct &&
|
||||
(min_max_item->sum_func() == Item_sum::COUNT_DISTINCT_FUNC ||
|
||||
min_max_item->sum_func() == Item_sum::SUM_DISTINCT_FUNC ||
|
||||
min_max_item->sum_func() == Item_sum::AVG_DISTINCT_FUNC))
|
||||
continue;
|
||||
else
|
||||
DBUG_RETURN(NULL);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue