• Alexey Kopytov's avatar
    Bug #45262: Bad effects with CREATE TABLE and DECIMAL · 096c12b2
    Alexey Kopytov authored
     
    Using DECIMAL constants with more than 65 digits in CREATE 
    TABLE ... SELECT led to bogus errors in release builds or 
    assertion failures in debug builds. 
     
    The problem was in inconsistency in how DECIMAL constants and 
    fields are handled internally. We allow arbitrarily long 
    DECIMAL constants, whereas DECIMAL(M,D) columns are limited to 
    M<=65 and D<=30. my_decimal_precision_to_length() was used in 
    both Item and Field code and truncated precision to 
    DECIMAL_MAX_PRECISION when calculating value length without 
    adjusting precision and decimals. As a result, a DECIMAL 
    constant with more than 65 digits ended up having length less 
    than precision or decimals which led to assertion failures. 
     
    Fixed by modifying my_decimal_precision_to_length() so that 
    precision is truncated to DECIMAL_MAX_PRECISION only for Field 
    object which is indicated by the new 'truncate' parameter. 
     
    Another inconsistency fixed by this patch is how DECIMAL 
    constants and expressions are handled for CREATE ... SELECT. 
    create_tmp_field_from_item() (which is used for constants) was 
    changed as a part of the bugfix for bug #24907 to handle long 
    DECIMAL constants gracefully. Item_func::tmp_table_field() 
    (which is used for expressions) on the other hand was still 
    using a simplistic approach when creating a Field_new_decimal 
    from a DECIMAL expression. 
    
    mysql-test/r/type_newdecimal.result:
      Added a test case for bug #45262.
    mysql-test/t/type_newdecimal.test:
      Added a test case for bug #45262.
    sql/item.cc:
      Use the new 'truncate' parameter in 
      my_decimal_precision_to_length().
    sql/item_cmpfunc.cc:
      Use the new 'truncate' parameter in 
      my_decimal_precision_to_length().
    sql/item_func.cc:
      1. Use the new 'truncate' parameter in 
      my_decimal_precision_to_length().
      
      2. Do not truncate decimal precision to DECIMAL_MAX_PRECISION
      for additive expressions involving long DECIMAL constants.
      
      3. Fixed an incosistency in how DECIMAL constants and 
      expressions are handled for CREATE ... SELECT.
    sql/item_func.h:
      Use the new 'truncate' parameter in 
      my_decimal_precision_to_length().
    sql/item_sum.cc:
      Use the new 'truncate' parameter in 
      my_decimal_precision_to_length().
    sql/my_decimal.h:
      Do not truncate precision to DECIMAL_MAX_PRECISION
      when calculating length in 
      my_decimal_precision_to_length() if 'truncate' parameter
      is FALSE.
    sql/sql_select.cc:
      1. Use the new 'truncate' parameter in 
      my_decimal_precision_to_length().
      
      2. Use a more correct logic when adjusting value's length.
    096c12b2
item_func.cc 141 KB