summaryrefslogtreecommitdiff
path: root/sql/my_decimal.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/my_decimal.cc')
-rw-r--r--sql/my_decimal.cc52
1 files changed, 23 insertions, 29 deletions
diff --git a/sql/my_decimal.cc b/sql/my_decimal.cc
index d4f1ae19bc6..37d4dd25473 100644
--- a/sql/my_decimal.cc
+++ b/sql/my_decimal.cc
@@ -41,26 +41,29 @@
int decimal_operation_results(int result, const char *value, const char *type)
{
+ /* Avoid calling current_thd on default path */
+ if (likely(result == E_DEC_OK))
+ return(result);
+
+ THD *thd= current_thd;
switch (result) {
- case E_DEC_OK:
- break;
case E_DEC_TRUNCATED:
- push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN,
- ER_DATA_TRUNCATED, ER(ER_DATA_TRUNCATED),
+ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
+ ER_DATA_TRUNCATED, ER_THD(thd, ER_DATA_TRUNCATED),
value, type);
break;
case E_DEC_OVERFLOW:
- push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN,
- ER_DATA_OVERFLOW, ER(ER_DATA_OVERFLOW),
+ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
+ ER_DATA_OVERFLOW, ER_THD(thd, ER_DATA_OVERFLOW),
value, type);
break;
case E_DEC_DIV_ZERO:
- push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN,
- ER_DIVISION_BY_ZERO, ER(ER_DIVISION_BY_ZERO));
+ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
+ ER_DIVISION_BY_ZERO, ER_THD(thd, ER_DIVISION_BY_ZERO));
break;
case E_DEC_BAD_NUM:
- push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN,
- ER_BAD_DATA, ER(ER_BAD_DATA),
+ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
+ ER_BAD_DATA, ER_THD(thd, ER_BAD_DATA),
value, type);
break;
case E_DEC_OOM:
@@ -236,33 +239,24 @@ int my_decimal2binary(uint mask, const my_decimal *d, uchar *bin, int prec,
*/
int str2my_decimal(uint mask, const char *from, uint length,
- CHARSET_INFO *charset, my_decimal *decimal_value)
+ CHARSET_INFO *charset, my_decimal *decimal_value,
+ const char **end_ptr)
{
- char *end, *from_end;
int err;
- char buff[STRING_BUFFER_USUAL_SIZE];
- String tmp(buff, sizeof(buff), &my_charset_bin);
if (charset->mbminlen > 1)
{
+ StringBuffer<STRING_BUFFER_USUAL_SIZE> tmp;
uint dummy_errors;
tmp.copy(from, length, charset, &my_charset_latin1, &dummy_errors);
- from= tmp.ptr();
- length= tmp.length();
- charset= &my_charset_bin;
+ char *end= (char*) tmp.end();
+ err= string2decimal(tmp.ptr(), (decimal_t*) decimal_value, &end);
+ *end_ptr= from + charset->mbminlen * (size_t) (end - tmp.ptr());
}
- from_end= end= (char*) from+length;
- err= string2decimal((char *)from, (decimal_t*) decimal_value, &end);
- if (end != from_end && !err)
+ else
{
- /* Give warning if there is something other than end space */
- for ( ; end < from_end; end++)
- {
- if (!my_isspace(&my_charset_latin1, *end))
- {
- err= E_DEC_TRUNCATED;
- break;
- }
- }
+ char *end= (char*) from + length;
+ err= string2decimal(from, (decimal_t*) decimal_value, &end);
+ *end_ptr= end;
}
check_result_and_overflow(mask, err, decimal_value);
return err;