mirror of
https://github.com/MariaDB/server.git
synced 2026-05-11 17:40:11 +02: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:
parent
e4062d4d20
commit
34eb10e406
58 changed files with 1631 additions and 1426 deletions
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue