mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +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:
@ -1543,13 +1543,13 @@ SHOW FUNCTION STATUS LIKE 'fn1';
|
||||
Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
|
||||
db_storedproc fn1 FUNCTION root@localhost <modified> <created> INVOKER this is simple latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
DROP FUNCTION IF EXISTS fn1;
|
||||
CREATE FUNCTION fn1( f1 DECIMAL(63, 31) ) RETURNS DECIMAL(63, 31)
|
||||
CREATE FUNCTION fn1( f1 DECIMAL(63, 61) ) RETURNS DECIMAL(63, 61)
|
||||
LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY INVOKER COMMENT 'this is simple'
|
||||
BEGIN
|
||||
SET f1 = 1000000 + f1;
|
||||
RETURN f1;
|
||||
END//
|
||||
ERROR 42000: Too big scale 31 specified for 'f1'. Maximum is 30.
|
||||
ERROR 42000: Too big scale 61 specified for 'f1'. Maximum is 38.
|
||||
SELECT fn1( 1.3326e+8 );
|
||||
ERROR 42000: FUNCTION db_storedproc.fn1 does not exist
|
||||
CREATE FUNCTION fn1( f1 DECIMAL(63, 30) ) RETURNS DECIMAL(63, 30)
|
||||
@ -5839,7 +5839,7 @@ fetch cur1 into e;
|
||||
SELECT x, y, z, a, b, c, d, e;
|
||||
close cur1;
|
||||
END//
|
||||
ERROR 42000: Too big scale 255 specified for 'b'. Maximum is 30.
|
||||
ERROR 42000: Too big scale 255 specified for 'b'. Maximum is 38.
|
||||
CALL sp6();
|
||||
ERROR 42000: PROCEDURE db_storedproc.sp6 does not exist
|
||||
DROP PROCEDURE IF EXISTS sp6;
|
||||
|
Reference in New Issue
Block a user