mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
Fix bug lp:782305
Analysis: Both the wrong result and the valgrind warning were a result of incomplete cleanup of the MIN/MAX subquery rewrite. At the first execution of the query, the non-aggregate subquery is transformed into an aggregate MIN/MAX subquery. During the fix_fields phase of the MIN/MAX function, it sets the property st_select_lex::with_sum_func to true. The second execution of the query finds this flag to be ON. When optimization reaches the same MIN/MAX subquery transformation, it tests if the subquery is an aggregate or not. Since select_lex->with_sum_func == true from the previous execution, the transformation executes the second branch that handles aggregate subqueries. This substitutes the subquery Item into a Item_maxmin_subselect. At the same time elsewhere it is assumed that the subquery Item is of type Item_allany_subselect. Ultimately this results in casting the actual object to the wrong class, and calling the wrong any_value() method from empty_underlying_subquery(). Solution: Cleanup the st_select_lex::with_sum_func property in the case when the MIN/MAX transformation was performed for a non-aggregate subquery, so that the transformation can be repeated.
This commit is contained in:
@@ -466,7 +466,7 @@ int check_and_do_in_subquery_rewrites(JOIN *join)
|
||||
/* Check if max/min optimization applicable */
|
||||
if (allany_subs)
|
||||
allany_subs->in_strategy|= (allany_subs->is_maxmin_applicable(join) ?
|
||||
SUBS_MAXMIN :
|
||||
(SUBS_MAXMIN_INJECTED | SUBS_MAXMIN_ENGINE) :
|
||||
SUBS_IN_TO_EXISTS);
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user