• mhansson/martin@linux-st28.site's avatar
    Bug #24791: Union with AVG-groups generates wrong results · 50077b6d
    mhansson/martin@linux-st28.site authored
    The problem in this bug is when we create temporary tables. When
    temporary tables are created for unions, there is some 
    inferrence being carried out regarding the type of the column.
    Whenever this column type is inferred to be REAL (i.e. FLOAT or
    DOUBLE), MySQL will always try to maintain exact precision, and
    if that is not possible (there are hardware limits, since FLOAT
    and DOUBLE are stored as approximate values) will switch to
    using approximate values. The problem here is that at this point
    the information about number of significant digits is not 
    available. Furthermore, the number of significant digits should
    be increased for the AVG function, however, this was not properly 
    handled. There are 4 parts to the problem:
    
    #1: DOUBLE and FLOAT fields don't display their proper display 
    lengths in max_display_length(). This is hard-coded as 53 for 
    DOUBLE and 24 for FLOAT. Now changed to instead return the 
    field_length.
    
    #2: Type holders for temporary tables do not preserve the 
    max_length of the Item's from which they are created, and is 
    instead reverted to the 53 and 24 from above. This causes 
    *all* fields to get non-fixed significant digits.
    
    #3: AVG function does not update max_length (display length)
    when updating number of decimals.
    
    #4: The function that switches to non-fixed number of 
    significant digits should use DBL_DIG + 2 or FLT_DIG + 2 as 
    cut-off values (Since fixed precision does not use the 'e' 
    notation)
    
    Of these points, #1 is the controversial one, but this 
    change is preferred and has been cleared with Monty. The 
    function causes quite a few unit tests to blow up and they had
    to b changed, but each one is annotated and motivated. We 
    frequently see the magical 53 and 24 give way to more relevant
    numbers.
    50077b6d
temp_table.test 4.91 KB