• Galina Shalygina's avatar
    MDEV-7486: Condition pushdown from HAVING into WHERE · 7a77b221
    Galina Shalygina authored
    Condition can be pushed from the HAVING clause into the WHERE clause
    if it depends only on the fields that are used in the GROUP BY list
    or depends on the fields that are equal to grouping fields.
    Aggregate functions can't be pushed down.
    
    How the pushdown is performed on the example:
    
    SELECT t1.a,MAX(t1.b)
    FROM t1
    GROUP BY t1.a
    HAVING (t1.a>2) AND (MAX(c)>12);
    
    =>
    
    SELECT t1.a,MAX(t1.b)
    FROM t1
    WHERE (t1.a>2)
    GROUP BY t1.a
    HAVING (MAX(c)>12);
    
    The implementation scheme:
    
    1. Extract the most restrictive condition cond from the HAVING clause of
       the select that depends only on the fields that are used in the GROUP BY
       list of the select (directly or indirectly through equalities)
    2. Save cond as a condition that can be pushed into the WHERE clause
       of the select
    3. Remove cond from the HAVING clause if it is possible
    
    The optimization is implemented in the function
    st_select_lex::pushdown_from_having_into_where().
    
    New test file having_cond_pushdown.test is created.
    7a77b221
sql_class.h 222 KB