• unknown's avatar
    Fix bug lp:782305 · c9e23682
    unknown authored
    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.
    c9e23682
item_subselect.cc 161 KB