MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:ramil Date:December 6 2006 12:32pm
Subject:bk commit into 4.1 tree (ramil:1.2558) BUG#22533
View as plain text  
Below is the list of changes that have just been committed into a local
4.1 repository of ram. When ram does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2006-12-06 16:32:12+04:00, ramil@stripped +4 -0
  Fix for bug #22533: Traditional: Too-long bit value not rejected.
  
  Problem: storing >=8 byte hexadecimal values we don't check data.
  Fix: check if the data fits the {u}longlong range.

  mysql-test/r/select.result@stripped, 2006-12-06 16:32:08+04:00, ramil@stripped +17 -0
    Fix for bug #22533: Traditional: Too-long bit value not rejected.
      - test result.

  mysql-test/t/range.test@stripped, 2006-12-06 16:32:08+04:00, ramil@stripped +2 -2
    Fix for bug #22533: Traditional: Too-long bit value not rejected.
      - adjusted.

  mysql-test/t/select.test@stripped, 2006-12-06 16:32:08+04:00, ramil@stripped +12 -1
    Fix for bug #22533: Traditional: Too-long bit value not rejected.
      - test case.

  sql/item.cc@stripped, 2006-12-06 16:32:08+04:00, ramil@stripped +19 -6
    Fix for bug #22533: Traditional: Too-long bit value not rejected.
      - limit storing value to {U}LONGLONG_MAX in numeric context.

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	ramil
# Host:	myoffice.izhnet.ru
# Root:	/usr/home/ram/work/bug22533/my41-bug22533

--- 1.233/sql/item.cc	2006-12-06 16:32:17 +04:00
+++ 1.234/sql/item.cc	2006-12-06 16:32:17 +04:00
@@ -2340,18 +2340,31 @@ longlong Item_varbinary::val_int()
 
 int Item_varbinary::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);
+    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;
 }
 
 

--- 1.77/mysql-test/r/select.result	2006-12-06 16:32:17 +04:00
+++ 1.78/mysql-test/r/select.result	2006-12-06 16:32:17 +04:00
@@ -2819,3 +2819,20 @@ select min(key1) from t1 where key1 >= 0
 min(key1)
 0.37619999051094
 DROP TABLE t1,t2;
+create table t1(a bigint unsigned, b bigint);
+insert into t1 values (0xfffffffffffffffff, 0xfffffffffffffffff), 
+(0x10000000000000000, 0x10000000000000000), 
+(0x8fffffffffffffff, 0x8fffffffffffffff);
+Warnings:
+Warning	1264	Data truncated; out of range for column 'a' at row 1
+Warning	1264	Data truncated; out of range for column 'b' at row 1
+Warning	1264	Data truncated; out of range for column 'a' at row 2
+Warning	1264	Data truncated; out of range for column 'b' at row 2
+Warning	1264	Data truncated; out of range for column 'b' at row 3
+select hex(a), hex(b) from t1;
+hex(a)	hex(b)
+FFFFFFFFFFFFFFFF	7FFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFF	7FFFFFFFFFFFFFFF
+8FFFFFFFFFFFFFFF	7FFFFFFFFFFFFFFF
+drop table t1;
+End of 4.1 tests

--- 1.32/mysql-test/t/range.test	2006-12-06 16:32:17 +04:00
+++ 1.33/mysql-test/t/range.test	2006-12-06 16:32:17 +04:00
@@ -400,8 +400,8 @@ select count(*) from t1 where x = 184467
 
 
 create table t2 (x bigint not null);
-insert into t2(x) values (0xfffffffffffffff0);
-insert into t2(x) values (0xfffffffffffffff1);
+insert into t2(x) values (-16);
+insert into t2(x) values (-15);
 select * from t2;
 select count(*) from t2 where x>0;
 select count(*) from t2 where x=0;

--- 1.60/mysql-test/t/select.test	2006-12-06 16:32:17 +04:00
+++ 1.61/mysql-test/t/select.test	2006-12-06 16:32:17 +04:00
@@ -2342,4 +2342,15 @@ select min(key1) from t1 where key1 >= 0
 DROP TABLE t1,t2;
 --enable_ps_protocol
 
-# End of 4.1 tests
+#
+# Bug #22533: storing large hex strings
+#
+
+create table t1(a bigint unsigned, b bigint);
+insert into t1 values (0xfffffffffffffffff, 0xfffffffffffffffff), 
+  (0x10000000000000000, 0x10000000000000000), 
+  (0x8fffffffffffffff, 0x8fffffffffffffff);
+select hex(a), hex(b) from t1;
+drop table t1;
+
+--echo End of 4.1 tests
Thread
bk commit into 4.1 tree (ramil:1.2558) BUG#22533ramil6 Dec