summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.org>2015-07-16 16:28:06 +0400
committerAlexander Barkov <bar@mariadb.org>2015-07-16 16:28:06 +0400
commit12da27da853f4e3e69778beb2b8df4406685494f (patch)
tree3a7e46439375c5c94d965cfd2aec8ff40a53d419 /sql
parent94bc50650eb490e8d844acfc700f75992857509a (diff)
downloadmariadb-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.cc38
-rw-r--r--sql/field.h3
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,