summaryrefslogtreecommitdiff
path: root/sql/item.cc
diff options
context:
space:
mode:
authorramil/ram@mysql.com/myoffice.izhnet.ru <>2007-01-18 09:39:47 +0400
committerramil/ram@mysql.com/myoffice.izhnet.ru <>2007-01-18 09:39:47 +0400
commite8968822dc1c4c6d4d31fdebabe23f85d1e7c9d4 (patch)
treea9198331c9962c279bc2fc4b05565d29c98fa1b8 /sql/item.cc
parent45ea756c5fae0ffe6c2e5f32ad42ba956f37abec (diff)
parent0b5696b82b8c60ebdb70fd267f32479d0bb96ab5 (diff)
downloadmariadb-git-e8968822dc1c4c6d4d31fdebabe23f85d1e7c9d4.tar.gz
Merge mysql.com:/usr/home/ram/work/bug22533/my41-bug22533
into mysql.com:/usr/home/ram/work/bug22533/my50-bug22533
Diffstat (limited to 'sql/item.cc')
-rw-r--r--sql/item.cc25
1 files changed, 19 insertions, 6 deletions
diff --git a/sql/item.cc b/sql/item.cc
index d181edb4ecd..e5a888842ac 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -4460,18 +4460,31 @@ my_decimal *Item_hex_string::val_decimal(my_decimal *decimal_value)
int Item_hex_string::save_in_field(Field *field, bool no_conversions)
{
- int error;
field->set_notnull();
if (field->result_type() == STRING_RESULT)
+ return field->store(str_value.ptr(), str_value.length(),
+ collation.collation);
+
+ ulonglong nr;
+ uint32 length= str_value.length();
+ if (length > 8)
{
- error=field->store(str_value.ptr(),str_value.length(),collation.collation);
+ nr= field->flags & UNSIGNED_FLAG ? ULONGLONG_MAX : LONGLONG_MAX;
+ goto warn;
}
- else
+ nr= (ulonglong) val_int();
+ if ((length == 8) && !(field->flags & UNSIGNED_FLAG) && (nr > LONGLONG_MAX))
{
- longlong nr=val_int();
- error=field->store(nr, TRUE); // Assume hex numbers are unsigned
+ nr= LONGLONG_MAX;
+ goto warn;
}
- return error;
+ return field->store((longlong) nr);
+
+warn:
+ if (!field->store((longlong) nr))
+ field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE,
+ 1);
+ return 1;
}