summaryrefslogtreecommitdiff
path: root/sql/item.cc
diff options
context:
space:
mode:
authorGleb Shchepa <gshchepa@mysql.com>2010-02-25 23:13:11 +0400
committerGleb Shchepa <gshchepa@mysql.com>2010-02-25 23:13:11 +0400
commit936ed6ca86633a91976fd6fcd931683ec007f440 (patch)
tree8e7396a75464c957337d1786a24d322fe38555a0 /sql/item.cc
parent1935327e74abd298eaa7ddd8f51540ff81b4830c (diff)
downloadmariadb-git-936ed6ca86633a91976fd6fcd931683ec007f440.tar.gz
Bug #45360: wrong results
Propagation of a large unsigned numeric constant in the WHERE expression led to wrong result. For example, "WHERE a = CAST(0xFFFFFFFFFFFFFFFF AS USIGNED) AND FOO(a)", where a is an UNSIGNED BIGINT, and FOO() accepts strings, was transformed to "... AND FOO('-1')". That has been fixed. Also EXPLAIN EXTENDED printed incorrect numeric constants in transformed WHERE expressions like above. That has been fixed too. mysql-test/r/bigint.result: Added test case for bug #45360. mysql-test/t/bigint.test: Added test case for bug #45360. sql/item.cc: Bug #45360: wrong results As far as Item_int_with_ref (and underlaying Item_int) class accepts both signed and unsigned 64bit values, Item_int::val_str and Item_int::print methods have been modified to take into account unsigned_flag.
Diffstat (limited to 'sql/item.cc')
-rw-r--r--sql/item.cc4
1 files changed, 2 insertions, 2 deletions
diff --git a/sql/item.cc b/sql/item.cc
index f8cca3a0667..934e897f923 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -2209,14 +2209,14 @@ String *Item_int::val_str(String *str)
{
// following assert is redundant, because fixed=1 assigned in constructor
DBUG_ASSERT(fixed == 1);
- str->set(value, &my_charset_bin);
+ str->set_int(value, unsigned_flag, &my_charset_bin);
return str;
}
void Item_int::print(String *str, enum_query_type query_type)
{
// my_charset_bin is good enough for numbers
- str_value.set(value, &my_charset_bin);
+ str_value.set_int(value, unsigned_flag, &my_charset_bin);
str->append(str_value);
}