mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
MDEV-22243 type_test.type_test_double fails with 'NUMERIC_SCALE NULL'
There where several reasons why the test failed: - Constructors for Field_double and Field_float changed an argument to the constructor instead of a the correct class variable. - gcc 7.5.0 produced wrong code when inlining Field_double constructor into Field_test_double constructor. Fixed by changing the correct class variable and make the constructors not inline to go around the gcc bug.
This commit is contained in:
@@ -290,7 +290,7 @@ DATA_TYPE test_double
|
|||||||
CHARACTER_MAXIMUM_LENGTH NULL
|
CHARACTER_MAXIMUM_LENGTH NULL
|
||||||
CHARACTER_OCTET_LENGTH NULL
|
CHARACTER_OCTET_LENGTH NULL
|
||||||
NUMERIC_PRECISION 22
|
NUMERIC_PRECISION 22
|
||||||
NUMERIC_SCALE 31
|
NUMERIC_SCALE NULL
|
||||||
DATETIME_PRECISION NULL
|
DATETIME_PRECISION NULL
|
||||||
CHARACTER_SET_NAME NULL
|
CHARACTER_SET_NAME NULL
|
||||||
COLLATION_NAME NULL
|
COLLATION_NAME NULL
|
||||||
|
54
sql/field.cc
54
sql/field.cc
@@ -4645,6 +4645,28 @@ bool Field_longlong::is_max()
|
|||||||
single precision float
|
single precision float
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
Field_float::Field_float(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
|
||||||
|
uchar null_bit_arg,
|
||||||
|
enum utype unireg_check_arg,
|
||||||
|
const LEX_CSTRING *field_name_arg,
|
||||||
|
uint8 dec_arg,bool zero_arg,bool unsigned_arg)
|
||||||
|
:Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
|
||||||
|
unireg_check_arg, field_name_arg,
|
||||||
|
(dec_arg >= FLOATING_POINT_DECIMALS ? NOT_FIXED_DEC : dec_arg),
|
||||||
|
zero_arg, unsigned_arg)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Field_float::Field_float(uint32 len_arg, bool maybe_null_arg,
|
||||||
|
const LEX_CSTRING *field_name_arg, uint8 dec_arg)
|
||||||
|
:Field_real((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0, (uint) 0,
|
||||||
|
NONE, field_name_arg,
|
||||||
|
(dec_arg >= FLOATING_POINT_DECIMALS ? NOT_FIXED_DEC : dec_arg),
|
||||||
|
0, 0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int Field_float::store(const char *from,size_t len,CHARSET_INFO *cs)
|
int Field_float::store(const char *from,size_t len,CHARSET_INFO *cs)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
@@ -4793,6 +4815,38 @@ Binlog_type_info Field_float::binlog_type_info() const
|
|||||||
double precision floating point numbers
|
double precision floating point numbers
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
Field_double::Field_double(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
|
||||||
|
uchar null_bit_arg,
|
||||||
|
enum utype unireg_check_arg,
|
||||||
|
const LEX_CSTRING *field_name_arg,
|
||||||
|
uint8 dec_arg,bool zero_arg,bool unsigned_arg)
|
||||||
|
:Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
|
||||||
|
unireg_check_arg, field_name_arg,
|
||||||
|
(dec_arg >= FLOATING_POINT_DECIMALS ? NOT_FIXED_DEC : dec_arg),
|
||||||
|
zero_arg, unsigned_arg)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Field_double::Field_double(uint32 len_arg, bool maybe_null_arg,
|
||||||
|
const LEX_CSTRING *field_name_arg, uint8 dec_arg)
|
||||||
|
:Field_real((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "" : 0, (uint) 0,
|
||||||
|
NONE, field_name_arg,
|
||||||
|
(dec_arg >= FLOATING_POINT_DECIMALS ? NOT_FIXED_DEC : dec_arg),
|
||||||
|
0, 0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Field_double::Field_double(uint32 len_arg, bool maybe_null_arg,
|
||||||
|
const LEX_CSTRING *field_name_arg,
|
||||||
|
uint8 dec_arg, bool not_fixed_arg)
|
||||||
|
:Field_real((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "" : 0, (uint) 0,
|
||||||
|
NONE, field_name_arg,
|
||||||
|
(dec_arg >= FLOATING_POINT_DECIMALS ? NOT_FIXED_DEC : dec_arg),
|
||||||
|
0, 0)
|
||||||
|
{
|
||||||
|
not_fixed= not_fixed_arg;
|
||||||
|
}
|
||||||
|
|
||||||
int Field_double::store(const char *from,size_t len,CHARSET_INFO *cs)
|
int Field_double::store(const char *from,size_t len,CHARSET_INFO *cs)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
43
sql/field.h
43
sql/field.h
@@ -2842,22 +2842,9 @@ public:
|
|||||||
Field_float(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
|
Field_float(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
|
||||||
uchar null_bit_arg,
|
uchar null_bit_arg,
|
||||||
enum utype unireg_check_arg, const LEX_CSTRING *field_name_arg,
|
enum utype unireg_check_arg, const LEX_CSTRING *field_name_arg,
|
||||||
uint8 dec_arg,bool zero_arg,bool unsigned_arg)
|
uint8 dec_arg,bool zero_arg,bool unsigned_arg);
|
||||||
:Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
|
|
||||||
unireg_check_arg, field_name_arg,
|
|
||||||
dec_arg, zero_arg, unsigned_arg)
|
|
||||||
{
|
|
||||||
if (dec_arg >= FLOATING_POINT_DECIMALS)
|
|
||||||
dec_arg= NOT_FIXED_DEC;
|
|
||||||
}
|
|
||||||
Field_float(uint32 len_arg, bool maybe_null_arg,
|
Field_float(uint32 len_arg, bool maybe_null_arg,
|
||||||
const LEX_CSTRING *field_name_arg, uint8 dec_arg)
|
const LEX_CSTRING *field_name_arg, uint8 dec_arg);
|
||||||
:Field_real((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0, (uint) 0,
|
|
||||||
NONE, field_name_arg, dec_arg, 0, 0)
|
|
||||||
{
|
|
||||||
if (dec_arg >= FLOATING_POINT_DECIMALS)
|
|
||||||
dec_arg= NOT_FIXED_DEC;
|
|
||||||
}
|
|
||||||
const Type_handler *type_handler() const override
|
const Type_handler *type_handler() const override
|
||||||
{ return &type_handler_float; }
|
{ return &type_handler_float; }
|
||||||
enum ha_base_keytype key_type() const override { return HA_KEYTYPE_FLOAT; }
|
enum ha_base_keytype key_type() const override { return HA_KEYTYPE_FLOAT; }
|
||||||
@@ -2890,32 +2877,12 @@ public:
|
|||||||
Field_double(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
|
Field_double(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
|
||||||
uchar null_bit_arg,
|
uchar null_bit_arg,
|
||||||
enum utype unireg_check_arg, const LEX_CSTRING *field_name_arg,
|
enum utype unireg_check_arg, const LEX_CSTRING *field_name_arg,
|
||||||
uint8 dec_arg,bool zero_arg,bool unsigned_arg)
|
uint8 dec_arg,bool zero_arg,bool unsigned_arg);
|
||||||
:Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
|
|
||||||
unireg_check_arg, field_name_arg,
|
|
||||||
dec_arg, zero_arg, unsigned_arg)
|
|
||||||
{
|
|
||||||
if (dec_arg >= FLOATING_POINT_DECIMALS)
|
|
||||||
dec_arg= NOT_FIXED_DEC;
|
|
||||||
}
|
|
||||||
Field_double(uint32 len_arg, bool maybe_null_arg,
|
Field_double(uint32 len_arg, bool maybe_null_arg,
|
||||||
const LEX_CSTRING *field_name_arg, uint8 dec_arg)
|
const LEX_CSTRING *field_name_arg, uint8 dec_arg);
|
||||||
:Field_real((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "" : 0, (uint) 0,
|
|
||||||
NONE, field_name_arg, dec_arg, 0, 0)
|
|
||||||
{
|
|
||||||
if (dec_arg >= FLOATING_POINT_DECIMALS)
|
|
||||||
dec_arg= NOT_FIXED_DEC;
|
|
||||||
}
|
|
||||||
Field_double(uint32 len_arg, bool maybe_null_arg,
|
Field_double(uint32 len_arg, bool maybe_null_arg,
|
||||||
const LEX_CSTRING *field_name_arg,
|
const LEX_CSTRING *field_name_arg,
|
||||||
uint8 dec_arg, bool not_fixed_arg)
|
uint8 dec_arg, bool not_fixed_arg);
|
||||||
:Field_real((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "" : 0, (uint) 0,
|
|
||||||
NONE, field_name_arg, dec_arg, 0, 0)
|
|
||||||
{
|
|
||||||
not_fixed= not_fixed_arg;
|
|
||||||
if (dec_arg >= FLOATING_POINT_DECIMALS)
|
|
||||||
dec_arg= NOT_FIXED_DEC;
|
|
||||||
}
|
|
||||||
void init_for_tmp_table(Field *org_field, TABLE *new_table) override
|
void init_for_tmp_table(Field *org_field, TABLE *new_table) override
|
||||||
{
|
{
|
||||||
Field::init_for_tmp_table(org_field, new_table);
|
Field::init_for_tmp_table(org_field, new_table);
|
||||||
|
Reference in New Issue
Block a user