• Davi Arnaut's avatar
    Bug#45261: Crash, stored procedure + decimal · fc394595
    Davi Arnaut authored
    The problem was that creating a DECIMAL column from a decimal
    value could lead to a failed assertion as decimal values can
    have a higher precision than those attached to a table. The
    assert could be triggered by creating a table from a decimal
    with a large (> 30) scale. Also, there was a problem in
    calculating the number of digits in the integral and fractional
    parts if both exceeded the maximum number of digits permitted
    by the new decimal type.
    
    The solution is to ensure that truncation procedure is executed
    when deducing a DECIMAL column from a decimal value of higher
    precision. If the integer part is equal to or bigger than the
    maximum precision for the DECIMAL type (65), the integer part
    is truncated to fit and the fractional becomes zero. Otherwise,
    the fractional part is truncated to fit into the space left
    after the integer part is copied.
    
    This patch borrows code and ideas from Martin Hansson's patch.
    
    mysql-test/r/type_newdecimal.result:
      Add test case result for Bug#45261. Also, update test case to
      reflect that an additive operation increases the precision of
      the resulting type by 1.
    mysql-test/t/type_newdecimal.test:
      Add test case for Bug#45261
    sql/field.cc:
      Added DBUG_ASSERT to ensure object's invariant is maintained.
      Implement method to create a field to hold a decimal value
      from an item.
    sql/field.h:
      Explain member variable. Add method to create a new decimal field.
    sql/item.cc:
      The precision should only be capped when storing the value
      on a table. Also, this makes it impossible to calculate the
      integer part if Item::decimals (the scale) is larger than the
      precision.
    sql/item.h:
      Simplify calculation of integer part.
    sql/item_cmpfunc.cc:
      Do not limit the precision. It will be capped later.
    sql/item_func.cc:
      Use new method for allocating a new decimal field.
      Add a specialized method for retrieving the precision
      of a user variable item.
    sql/item_func.h:
      Add method to return the precision of a user variable.
    sql/item_sum.cc:
      Use new method for allocating a new decimal field.
    sql/my_decimal.h:
      The integer part could be improperly calculated for a decimal
      with 31 digits in the fractional part.
    sql/sql_select.cc:
      Use new method which truncates the integer or decimal parts
      as needed.
    fc394595
field.h 80.3 KB