mirror of
https://github.com/MariaDB/server.git
synced 2025-07-26 07:02:12 +03:00
BUG#12911710 - VALGRIND FAILURE IN ROW-DEBUG:PERFSCHEMA.SOCKET_SUMMARY_BY_INSTANCE_FUNC
Converting the number zero to binary and back yielded the number zero, but with no digits, i.e. zero precision. This made the multiply algorithm go haywire in various ways.
This commit is contained in:
@ -21,6 +21,15 @@ typedef enum
|
|||||||
decimal_round_mode;
|
decimal_round_mode;
|
||||||
typedef int32 decimal_digit_t;
|
typedef int32 decimal_digit_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
intg is the number of *decimal* digits (NOT number of decimal_digit_t's !)
|
||||||
|
before the point
|
||||||
|
frac is the number of decimal digits after the point
|
||||||
|
len is the length of buf (length of allocated space) in decimal_digit_t's,
|
||||||
|
not in bytes
|
||||||
|
sign false means positive, true means negative
|
||||||
|
buf is an array of decimal_digit_t's
|
||||||
|
*/
|
||||||
typedef struct st_decimal_t {
|
typedef struct st_decimal_t {
|
||||||
int intg, frac, len;
|
int intg, frac, len;
|
||||||
my_bool sign;
|
my_bool sign;
|
||||||
|
@ -1927,3 +1927,14 @@ f1
|
|||||||
0.000000000000000000000000
|
0.000000000000000000000000
|
||||||
DROP TABLE IF EXISTS t1;
|
DROP TABLE IF EXISTS t1;
|
||||||
End of 5.1 tests
|
End of 5.1 tests
|
||||||
|
#
|
||||||
|
# BUG#12911710 - VALGRIND FAILURE IN
|
||||||
|
# ROW-DEBUG:PERFSCHEMA.SOCKET_SUMMARY_BY_INSTANCE_FUNC
|
||||||
|
#
|
||||||
|
CREATE TABLE t1(d1 DECIMAL(60,0) NOT NULL,
|
||||||
|
d2 DECIMAL(60,0) NOT NULL);
|
||||||
|
INSERT INTO t1 (d1, d2) VALUES(0.0, 0.0);
|
||||||
|
SELECT d1 * d2 FROM t1;
|
||||||
|
d1 * d2
|
||||||
|
0
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -1526,3 +1526,17 @@ DROP TABLE IF EXISTS t1;
|
|||||||
|
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # BUG#12911710 - VALGRIND FAILURE IN
|
||||||
|
--echo # ROW-DEBUG:PERFSCHEMA.SOCKET_SUMMARY_BY_INSTANCE_FUNC
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1(d1 DECIMAL(60,0) NOT NULL,
|
||||||
|
d2 DECIMAL(60,0) NOT NULL);
|
||||||
|
|
||||||
|
INSERT INTO t1 (d1, d2) VALUES(0.0, 0.0);
|
||||||
|
SELECT d1 * d2 FROM t1;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
@ -101,12 +101,8 @@ public:
|
|||||||
{
|
{
|
||||||
len= DECIMAL_BUFF_LENGTH;
|
len= DECIMAL_BUFF_LENGTH;
|
||||||
buf= buffer;
|
buf= buffer;
|
||||||
#if !defined (HAVE_purify) && !defined(DBUG_OFF)
|
|
||||||
/* Set buffer to 'random' value to find wrong buffer usage */
|
|
||||||
for (uint i= 0; i < DECIMAL_BUFF_LENGTH; i++)
|
|
||||||
buffer[i]= i;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
my_decimal()
|
my_decimal()
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
|
@ -1423,11 +1423,18 @@ int bin2decimal(const uchar *from, decimal_t *to, int precision, int scale)
|
|||||||
buf++;
|
buf++;
|
||||||
}
|
}
|
||||||
my_afree(d_copy);
|
my_afree(d_copy);
|
||||||
|
|
||||||
|
/*
|
||||||
|
No digits? We have read the number zero, of unspecified precision.
|
||||||
|
Make it a proper zero, with non-zero precision.
|
||||||
|
*/
|
||||||
|
if (to->intg == 0 && to->frac == 0)
|
||||||
|
decimal_make_zero(to);
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
my_afree(d_copy);
|
my_afree(d_copy);
|
||||||
decimal_make_zero(((decimal_t*) to));
|
decimal_make_zero(to);
|
||||||
return(E_DEC_BAD_NUM);
|
return(E_DEC_BAD_NUM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user