diff options
author | unknown <bar@mysql.com> | 2006-03-29 19:31:16 +0500 |
---|---|---|
committer | unknown <bar@mysql.com> | 2006-03-29 19:31:16 +0500 |
commit | fa65771ed82e820822efeeb9678e8bca9a4bf095 (patch) | |
tree | eb9c60ce0d1a5aadf52ed97fe4e42b15e76d13ea /sql/field.cc | |
parent | dfe5769a04d07c26234940118f8af623dc70ab1a (diff) | |
download | mariadb-git-fa65771ed82e820822efeeb9678e8bca9a4bf095.tar.gz |
Additional 5.0 fix for
Bug#15098: CAST(column double TO signed int), wrong result
which was fixed originally in 4.1.
mysql-test/r/cast.result:
Fixing test results
sql/field.cc:
Adding a "truncated value" warning.
Diffstat (limited to 'sql/field.cc')
-rw-r--r-- | sql/field.cc | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/sql/field.cc b/sql/field.cc index 6cd5147648f..617d34e89a8 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -4232,6 +4232,7 @@ double Field_double::val_real(void) longlong Field_double::val_int(void) { double j; + longlong res; #ifdef WORDS_BIGENDIAN if (table->s->db_low_byte_first) { @@ -4242,10 +4243,28 @@ longlong Field_double::val_int(void) doubleget(j,ptr); /* Check whether we fit into longlong range */ if (j <= (double) LONGLONG_MIN) - return (longlong) LONGLONG_MIN; + { + res= (longlong) LONGLONG_MIN; + goto warn; + } if (j >= (double) (ulonglong) LONGLONG_MAX) - return (longlong) LONGLONG_MAX; + { + res= (longlong) LONGLONG_MAX; + goto warn; + } return (longlong) rint(j); + +warn: + { + char buf[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE]; + String tmp(buf, sizeof(buf), &my_charset_latin1), *str; + str= val_str(&tmp, 0); + push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_TRUNCATED_WRONG_VALUE, + ER(ER_TRUNCATED_WRONG_VALUE), "INTEGER", + str->c_ptr()); + } + return res; } |