summaryrefslogtreecommitdiff
path: root/sql/field.cc
diff options
context:
space:
mode:
authorunknown <bar@mysql.com>2006-03-29 19:31:16 +0500
committerunknown <bar@mysql.com>2006-03-29 19:31:16 +0500
commitfa65771ed82e820822efeeb9678e8bca9a4bf095 (patch)
treeeb9c60ce0d1a5aadf52ed97fe4e42b15e76d13ea /sql/field.cc
parentdfe5769a04d07c26234940118f8af623dc70ab1a (diff)
downloadmariadb-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.cc23
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;
}