mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +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:
@ -731,7 +731,7 @@ t1 CREATE TABLE `t1` (
|
||||
`conv(130,16,10)` varchar(64) DEFAULT NULL,
|
||||
`hex(130)` varchar(6) NOT NULL,
|
||||
`char(130)` varbinary(4) NOT NULL,
|
||||
`format(130,10)` varchar(37) NOT NULL,
|
||||
`format(130,10)` varchar(45) NOT NULL,
|
||||
`left(_latin2'a',1)` varchar(1) CHARACTER SET latin2 NOT NULL,
|
||||
`right(_latin2'a',1)` varchar(1) CHARACTER SET latin2 NOT NULL,
|
||||
`lcase(_latin2'a')` varchar(1) CHARACTER SET latin2 NOT NULL,
|
||||
@ -1237,13 +1237,13 @@ create table t1 (i int);
|
||||
insert into t1 values (1000000000),(1);
|
||||
select lpad(i, 7, ' ') as t from t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def t 253 7 7 Y 0 31 8
|
||||
def t 253 7 7 Y 0 39 8
|
||||
t
|
||||
1000000
|
||||
1
|
||||
select rpad(i, 7, ' ') as t from t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def t 253 7 7 Y 0 31 8
|
||||
def t 253 7 7 Y 0 39 8
|
||||
t
|
||||
1000000
|
||||
1
|
||||
@ -2527,7 +2527,7 @@ create table t1(a float);
|
||||
insert into t1 values (1.33);
|
||||
select format(a, 2) from t1;
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def format(a, 2) 253 49 4 Y 0 31 8
|
||||
def format(a, 2) 253 57 4 Y 0 39 8
|
||||
format(a, 2)
|
||||
1.33
|
||||
drop table t1;
|
||||
@ -2855,7 +2855,7 @@ CREATE TABLE t1 AS SELECT format(123,2,'no_NO');
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`format(123,2,'no_NO')` varchar(37) NOT NULL
|
||||
`format(123,2,'no_NO')` varchar(45) NOT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
SELECT * FROM t1;
|
||||
format(123,2,'no_NO')
|
||||
|
Reference in New Issue
Block a user