summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordavi@endora.local <>2008-02-08 10:21:58 -0200
committerdavi@endora.local <>2008-02-08 10:21:58 -0200
commit31b22496f4ccd0326b7962e16ff5e316fef8ded7 (patch)
tree2393a53b7a4cb5bd426390b53b2e7eab540a6d03
parent24830674e816c47dfe1bf39842a57ca65a1922da (diff)
parent24b9abf36d85c117662693043833e5f46f534f51 (diff)
downloadmariadb-git-31b22496f4ccd0326b7962e16ff5e316fef8ded7.tar.gz
Merge mysql.com:/Users/davi/mysql/mysql-5.0-runtime
into mysql.com:/Users/davi/mysql/mysql-5.1-runtime
-rw-r--r--mysql-test/r/ps.result16
-rw-r--r--mysql-test/t/ps.test17
-rw-r--r--sql/item.cc6
3 files changed, 38 insertions, 1 deletions
diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result
index a6b07bfc127..75d3f79f4b0 100644
--- a/mysql-test/r/ps.result
+++ b/mysql-test/r/ps.result
@@ -1717,6 +1717,22 @@ t1 CREATE TABLE `t1` (
`?` decimal(2,1) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
+drop table if exists t1;
+create table t1 (a bigint unsigned, b bigint(20) unsigned);
+prepare stmt from "insert into t1 values (?,?)";
+set @a= 9999999999999999;
+set @b= 14632475938453979136;
+insert into t1 values (@a, @b);
+select * from t1 where a = @a and b = @b;
+a b
+9999999999999999 14632475938453979136
+execute stmt using @a, @b;
+select * from t1 where a = @a and b = @b;
+a b
+9999999999999999 14632475938453979136
+9999999999999999 14632475938453979136
+deallocate prepare stmt;
+drop table t1;
End of 5.0 tests.
create procedure proc_1() reset query cache;
call proc_1();
diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test
index b45d67d8485..a34d41a6dfb 100644
--- a/mysql-test/t/ps.test
+++ b/mysql-test/t/ps.test
@@ -1821,6 +1821,23 @@ execute stmt using @a;
show create table t1;
drop table t1;
+#
+# Bug#33798: prepared statements improperly handle large unsigned ints
+#
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a bigint unsigned, b bigint(20) unsigned);
+prepare stmt from "insert into t1 values (?,?)";
+set @a= 9999999999999999;
+set @b= 14632475938453979136;
+insert into t1 values (@a, @b);
+select * from t1 where a = @a and b = @b;
+execute stmt using @a, @b;
+select * from t1 where a = @a and b = @b;
+deallocate prepare stmt;
+drop table t1;
+
--echo End of 5.0 tests.
#
diff --git a/sql/item.cc b/sql/item.cc
index c546badd8e7..390e99fbde5 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -2628,6 +2628,7 @@ bool Item_param::set_from_user_var(THD *thd, const user_var_entry *entry)
if (entry && entry->value)
{
item_result_type= entry->type;
+ unsigned_flag= entry->unsigned_flag;
if (strict_type && required_result_type != item_result_type)
DBUG_RETURN(1);
switch (item_result_type) {
@@ -2925,7 +2926,10 @@ const String *Item_param::query_val_str(String* str) const
{
switch (state) {
case INT_VALUE:
- str->set(value.integer, &my_charset_bin);
+ if (unsigned_flag)
+ str->set((ulonglong) value.integer, &my_charset_bin);
+ else
+ str->set(value.integer, &my_charset_bin);
break;
case REAL_VALUE:
str->set_real(value.real, NOT_FIXED_DEC, &my_charset_bin);