From 34eb10e4064a7f38fc7d41016a6bcc5443ebe0c3 Mon Sep 17 00:00:00 2001 From: Monty Date: Sat, 18 Jun 2016 14:28:34 +0300 Subject: 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 --- mysql-test/r/variables.result | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'mysql-test/r/variables.result') diff --git a/mysql-test/r/variables.result b/mysql-test/r/variables.result index a38cf57189c..1fb509d3936 100644 --- a/mysql-test/r/variables.result +++ b/mysql-test/r/variables.result @@ -731,7 +731,7 @@ show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `c1` bigint(20) DEFAULT NULL, - `c2` decimal(65,30) DEFAULT NULL, + `c2` decimal(65,38) DEFAULT NULL, `c3` longtext, `c4` double DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 @@ -1445,7 +1445,7 @@ Warnings: Warning 1292 Truncated incorrect auto_increment_offset value: '0' select @@default_storage_engine; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def @@default_storage_engine 253 6 6 Y 0 31 8 +def @@default_storage_engine 253 6 6 Y 0 39 8 @@default_storage_engine MyISAM SET @old_server_id = @@GLOBAL.server_id; -- cgit v1.2.1