diff options
author | Alexander Barkov <bar@mariadb.org> | 2015-07-16 16:28:06 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.org> | 2015-07-16 16:28:06 +0400 |
commit | 12da27da853f4e3e69778beb2b8df4406685494f (patch) | |
tree | 3a7e46439375c5c94d965cfd2aec8ff40a53d419 /sql | |
parent | 94bc50650eb490e8d844acfc700f75992857509a (diff) | |
download | mariadb-git-12da27da853f4e3e69778beb2b8df4406685494f.tar.gz |
MDEV-8472 BINARY, VARBINARY and BLOB return different warnings on CAST to DECIMAL
Diffstat (limited to 'sql')
-rw-r--r-- | sql/field.cc | 38 | ||||
-rw-r--r-- | sql/field.h | 3 |
2 files changed, 21 insertions, 20 deletions
diff --git a/sql/field.cc b/sql/field.cc index c5319ae0b72..582926cb563 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -6500,24 +6500,32 @@ String *Field_string::val_str(String *val_buffer __attribute__((unused)), } -my_decimal *Field_string::val_decimal(my_decimal *decimal_value) +my_decimal *Field_longstr::val_decimal_from_str(const char *str, + uint length, + CHARSET_INFO *cs, + my_decimal *decimal_value) { - ASSERT_COLUMN_MARKED_FOR_READ; - int err= str2my_decimal(E_DEC_FATAL_ERROR, (char*) ptr, field_length, - charset(), decimal_value); + int err= str2my_decimal(E_DEC_FATAL_ERROR, str, length, cs, decimal_value); if (!get_thd()->no_errors && err) { - ErrConvString errmsg((char*) ptr, field_length, charset()); + ErrConvString errmsg(str, length, cs); push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN, ER_TRUNCATED_WRONG_VALUE, ER(ER_TRUNCATED_WRONG_VALUE), "DECIMAL", errmsg.ptr()); } - return decimal_value; } +my_decimal *Field_string::val_decimal(my_decimal *decimal_value) +{ + ASSERT_COLUMN_MARKED_FOR_READ; + return val_decimal_from_str((const char *) ptr, field_length, + Field_string::charset(), decimal_value); +} + + struct Check_field_param { Field *field; }; @@ -6942,18 +6950,9 @@ String *Field_varstring::val_str(String *val_buffer __attribute__((unused)), my_decimal *Field_varstring::val_decimal(my_decimal *decimal_value) { ASSERT_COLUMN_MARKED_FOR_READ; - CHARSET_INFO *cs= charset(); uint length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr); - int error= str2my_decimal(E_DEC_FATAL_ERROR, (char*) ptr+length_bytes, length, - cs, decimal_value); - - if (!get_thd()->no_errors && error) - { - push_numerical_conversion_warning(current_thd, (char*)ptr+length_bytes, - length, cs, "DECIMAL", - ER_TRUNCATED_WRONG_VALUE); - } - return decimal_value; + return val_decimal_from_str((const char *) ptr + length_bytes, length, + Field_varstring::charset(), decimal_value); } @@ -7474,9 +7473,8 @@ my_decimal *Field_blob::val_decimal(my_decimal *decimal_value) else length= get_length(ptr); - str2my_decimal(E_DEC_FATAL_ERROR, blob, length, charset(), - decimal_value); - return decimal_value; + return val_decimal_from_str(blob, length, + Field_blob::charset(), decimal_value); } diff --git a/sql/field.h b/sql/field.h index a40e2ef9913..4e3a9f4c7b1 100644 --- a/sql/field.h +++ b/sql/field.h @@ -1161,6 +1161,9 @@ protected: const char *cannot_convert_error_pos, const char *end, CHARSET_INFO *cs); + my_decimal *val_decimal_from_str(const char *str, uint length, + CHARSET_INFO *cs, + my_decimal *decimal_value); public: Field_longstr(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, utype unireg_check_arg, |