• unknown's avatar
    Fix LP BUG#715738 · ec239491
    unknown authored
    Analysis:
    A query with implicit grouping is one with aggregate functions and
    no GROUP BY clause. MariaDB inherits from MySQL an SQL extenstion
    that allows mixing aggregate functions with non-aggregate fields.
    If a query with such mixed select clause produces an empty result
    set, the meaning of aggregate functions is well defined - either
    NULL (MIN, MAX, etc.), or 0 (count(*)). However the non-aggregated
    fields must also have some value, and the only reasonable value in
    the case of empty result is NULL.
    
    The cause of the many wrong results was that if a field is declared
    as non-nullable (e.g. because it is a PK or NOT NULL), the semantic
    analysis and the optimization phases treat this field as non-nullable,
    and generate all related query plan elements based on this assumption.
    
    Later during execution, these incorrectly configured/generated query
    plan elements result in a wrong result because the selected fields
    are not null due to the not-null assumption during optimization.
    
    Solution:
    Detect before the context analysys phase that a query uses implicit
    grouping with mixed aggregates/non-aggregates, and set all fields
    as nullable. The parser already walks the SELECT clause, and
    already sets Item::with_sum_func for Items that reference aggreagate
    functions. The patch adds a symmetric Item::with_field so that all
    Items that reference an Item_field are marked during their
    construction at parse time in the same way as with aggregate function
    use.
    ec239491
item_func.cc 155 KB