• Monty's avatar
    MDEV-10138 Support for decimals up to 38 digits · 34eb10e4
    Monty authored
    Decimals with float, double and decimal now works the following way:
    
    - DECIMAL_NOT_SPECIFIED is used when declaring DECIMALS without a firm number
      of decimals.  It's only used in asserts and my_decimal_int_part.
    - FLOATING_POINT_DECIMALS (31) is used to mark that a FLOAT or DOUBLE
      was defined without decimals. This is regarded as a floating point value.
    - Max decimals allowed for FLOAT and DOUBLE is FLOATING_POINT_DECIMALS-1
    - Clients assumes that float and double with decimals >= NOT_FIXED_DEC are
      floating point values (no decimals)
    - In the .frm decimals=FLOATING_POINT_DECIMALS are used to define
      floating point for float and double (31, like before)
    
    To ensure compatibility with old clients we do:
    
    - When storing float and double, we change NOT_FIXED_DEC to
      FLOATING_POINT_DECIMALS.
    - When creating fields from .frm we change for float and double
      FLOATING_POINT_DEC to NOT_FIXED_DEC
    - When sending definition for a float/decimal field without decimals
      to the client as part of a result set we convert NOT_FIXED_DEC to
      FLOATING_POINT_DECIMALS.
    - variance() and std() has changed to limit the decimals to
      FLOATING_POINT_DECIMALS -1 to not get the double converted floating point.
      (This was to preserve compatiblity)
    - FLOAT and DOUBLE still have 30 as max number of decimals.
    
    Bugs fixed:
    
    variance() printed more decimals than we support for double values.
    
    New behaviour:
    - Strings now have 38 decimals instead of 30 when converted to decimal
    - CREATE ... SELECT with a decimal with > 30 decimals will create a column
      with a smaller range than before as we are trying to preserve the number of
      decimals.
    
    
    Other changes
    - We are now using the obsolete bit FIELDFLAG_LEFT_FULLSCREEN to specify
      decimals > 31
    - NOT_FIXED_DEC is now declared in one place
    - For clients, NOT_FIXED_DEC is always 31 (to ensure compatibility).
      On the server NOT_FIXED_DEC is DECIMAL_NOT_SPECIFIED (39)
    - AUTO_SEC_PART_DIGITS is taken from DECIMAL_NOT_SPECIFIED
    - DOUBLE conversion functions are now using DECIMAL_NOT_SPECIFIED instead of
      NOT_FIXED_DEC
    34eb10e4
sysvars_server_embedded.result 126 KB