diff options
author | Monty <monty@mariadb.org> | 2016-06-18 14:28:34 +0300 |
---|---|---|
committer | Monty <monty@mariadb.org> | 2016-06-22 22:04:55 +0300 |
commit | 34eb10e4064a7f38fc7d41016a6bcc5443ebe0c3 (patch) | |
tree | 45f76f02034419697e5bff5f539b20eaac8f8c8d /strings | |
parent | e4062d4d203a6be596d3f61dfe4db1b4f91e24aa (diff) | |
download | mariadb-git-34eb10e4064a7f38fc7d41016a6bcc5443ebe0c3.tar.gz |
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
Diffstat (limited to 'strings')
-rw-r--r-- | strings/dtoa.c | 2 | ||||
-rw-r--r-- | strings/my_vsnprintf.c | 7 |
2 files changed, 4 insertions, 5 deletions
diff --git a/strings/dtoa.c b/strings/dtoa.c index c3ab347f94c..fdf7bceddfd 100644 --- a/strings/dtoa.c +++ b/strings/dtoa.c @@ -90,7 +90,7 @@ size_t my_fcvt(double x, int precision, char *to, my_bool *error) int decpt, sign, len, i; char *res, *src, *end, *dst= to; char buf[DTOA_BUFF_SIZE]; - DBUG_ASSERT(precision >= 0 && precision < NOT_FIXED_DEC && to != NULL); + DBUG_ASSERT(precision >= 0 && precision < DECIMAL_NOT_SPECIFIED && to != NULL); res= dtoa(x, 5, precision, &decpt, &sign, &end, buf, sizeof(buf)); diff --git a/strings/my_vsnprintf.c b/strings/my_vsnprintf.c index 75514a90925..3cc7a4e7ea8 100644 --- a/strings/my_vsnprintf.c +++ b/strings/my_vsnprintf.c @@ -16,11 +16,10 @@ #include "strings_def.h" #include <m_ctype.h> -#include <stdarg.h> #include <my_sys.h> #include <my_base.h> #include <my_handler_errors.h> - +#include <mysql_com.h> /* For FLOATING_POINT_DECIMALS */ #define MAX_ARGS 32 /* max positional args count*/ #define MAX_PRINT_INFO 32 /* max print position count */ @@ -240,8 +239,8 @@ static char *process_dbl_arg(char *to, char *end, size_t width, { if (width == MAX_WIDTH) width= FLT_DIG; /* width not set, use default */ - else if (width >= NOT_FIXED_DEC) - width= NOT_FIXED_DEC - 1; /* max.precision for my_fcvt() */ + else if (width >= FLOATING_POINT_DECIMALS) + width= FLOATING_POINT_DECIMALS - 1; /* max.precision for my_fcvt() */ width= MY_MIN(width, (size_t)(end-to) - 1); if (arg_type == 'f') |