1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-10138 Support for decimals up to 38 digits

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
This commit is contained in:
Monty
2016-06-18 14:28:34 +03:00
parent e4062d4d20
commit 34eb10e406
58 changed files with 1631 additions and 1426 deletions

View File

@ -65,18 +65,18 @@ SELECT @@session.div_precision_increment;
@@session.div_precision_increment
30
'#------------------FN_DYNVARS_027_05-----------------------#'
SET @@global.div_precision_increment = 31;
SET @@global.div_precision_increment = 39;
Warnings:
Warning 1292 Truncated incorrect div_precision_increment value: '31'
Warning 1292 Truncated incorrect div_precision_increment value: '39'
SELECT @@global.div_precision_increment;
@@global.div_precision_increment
30
SET @@global.div_precision_increment = 40;
38
SET @@global.div_precision_increment = 50;
Warnings:
Warning 1292 Truncated incorrect div_precision_increment value: '40'
Warning 1292 Truncated incorrect div_precision_increment value: '50'
SELECT @@global.div_precision_increment;
@@global.div_precision_increment
30
38
SET @@global.div_precision_increment = -1024;
Warnings:
Warning 1292 Truncated incorrect div_precision_increment value: '-1024'
@ -88,19 +88,17 @@ Warnings:
Warning 1292 Truncated incorrect div_precision_increment value: '65536'
SELECT @@global.div_precision_increment;
@@global.div_precision_increment
30
SET @@session.div_precision_increment = 40;
38
SET @@session.div_precision_increment = 50;
Warnings:
Warning 1292 Truncated incorrect div_precision_increment value: '40'
Warning 1292 Truncated incorrect div_precision_increment value: '50'
SELECT @@session.div_precision_increment;
@@session.div_precision_increment
30
SET @@session.div_precision_increment = 31;
Warnings:
Warning 1292 Truncated incorrect div_precision_increment value: '31'
38
SET @@session.div_precision_increment = 37;
SELECT @@session.div_precision_increment;
@@session.div_precision_increment
30
37
SET @@session.div_precision_increment = -2;
Warnings:
Warning 1292 Truncated incorrect div_precision_increment value: '-2'
@ -112,27 +110,27 @@ Warnings:
Warning 1292 Truncated incorrect div_precision_increment value: '65550'
SELECT @@session.div_precision_increment;
@@session.div_precision_increment
30
38
SET @@global.div_precision_increment = 65530.30;
ERROR 42000: Incorrect argument type to variable 'div_precision_increment'
SELECT @@global.div_precision_increment;
@@global.div_precision_increment
30
38
SET @@global.div_precision_increment = OFF;
ERROR 42000: Incorrect argument type to variable 'div_precision_increment'
SELECT @@global.div_precision_increment;
@@global.div_precision_increment
30
38
SET @@session.div_precision_increment = ON;
ERROR 42000: Incorrect argument type to variable 'div_precision_increment'
SELECT @@session.div_precision_increment;
@@session.div_precision_increment
30
38
SET @@session.div_precision_increment = 65530.30;
ERROR 42000: Incorrect argument type to variable 'div_precision_increment'
SELECT @@session.div_precision_increment;
@@session.div_precision_increment
30
38
'#------------------FN_DYNVARS_027_06-----------------------#'
SELECT @@global.div_precision_increment = VARIABLE_VALUE
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES