List:Internals« Previous MessageNext Message »
From:Jim Winstead Date:December 6 2005 10:16pm
Subject:bk commit into 5.0 tree (jimw:1.1983)
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of jimw. When jimw 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
  1.1983 05/12/06 14:16:34 jimw@stripped +3 -0
  Merge mysql.com:/home/jimw/my/mysql-5.0-14299
  into  mysql.com:/home/jimw/my/mysql-5.0-clean

  mysql-test/t/type_binary.test
    1.3 05/12/06 14:16:30 jimw@stripped +4 -4
    Resolve conflicts

  mysql-test/r/type_binary.result
    1.3 05/12/06 14:16:30 jimw@stripped +4 -3
    Resolve conflicts

  sql/field.cc
    1.294 05/12/06 14:14:35 jimw@stripped +0 -0
    Auto merged

# 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:	jimw
# Host:	rama.(none)
# Root:	/home/jimw/my/mysql-5.0-clean/RESYNC

--- 1.293/sql/field.cc	2005-11-29 06:06:42 -08:00
+++ 1.294/sql/field.cc	2005-12-06 14:14:35 -08:00
@@ -5855,44 +5855,52 @@
   char buff[STRING_BUFFER_USUAL_SIZE];
   String tmpstr(buff,sizeof(buff), &my_charset_bin);
   uint copy_length;
-  
+
   /* See the comment for Field_long::store(long long) */
   DBUG_ASSERT(table->in_use == current_thd);
-  
+
   /* Convert character set if necessary */
   if (String::needs_conversion(length, cs, field_charset, &not_used))
-  { 
+  {
     uint conv_errors;
     tmpstr.copy(from, length, cs, field_charset, &conv_errors);
     from= tmpstr.ptr();
-    length=  tmpstr.length();
+    length= tmpstr.length();
     if (conv_errors)
       error= 2;
   }
 
-  /* 
-    Make sure we don't break a multibyte sequence
-    as well as don't copy a malformed data.
-  */
+  /* Make sure we don't break a multibyte sequence or copy malformed data. */
   copy_length= field_charset->cset->well_formed_len(field_charset,
                                                     from,from+length,
                                                     field_length/
                                                     field_charset->mbmaxlen,
                                                     &well_formed_error);
   memcpy(ptr,from,copy_length);
-  if (copy_length < field_length)	// Append spaces if shorter
+
+  /* Append spaces if the string was shorter than the field. */
+  if (copy_length < field_length)
     field_charset->cset->fill(field_charset,ptr+copy_length,
-			      field_length-copy_length,
+                              field_length-copy_length,
                               field_charset->pad_char);
-  
+
+  /*
+    Check if we lost any important data (anything in a binary string,
+    or any non-space in others).
+  */
   if ((copy_length < length) && table->in_use->count_cuted_fields)
-  {					// Check if we loosed some info
-    const char *end=from+length;
-    from+= copy_length;
-    from+= field_charset->cset->scan(field_charset, from, end,
-				     MY_SEQ_SPACES);
-    if (from != end)
+  {
+    if (binary())
       error= 2;
+    else
+    {
+      const char *end=from+length;
+      from+= copy_length;
+      from+= field_charset->cset->scan(field_charset, from, end,
+                                       MY_SEQ_SPACES);
+      if (from != end)
+        error= 2;
+    }
   }
   if (error)
   {
@@ -6271,12 +6279,15 @@
   if ((copy_length < length) && table->in_use->count_cuted_fields &&
       !error_code)
   {
-    const char *end= from + length;
-    from+= copy_length;
-    from+= field_charset->cset->scan(field_charset, from, end, MY_SEQ_SPACES);
-    /* If we lost only spaces then produce a NOTE, not a WARNING */
-    if (from == end)
-      level= MYSQL_ERROR::WARN_LEVEL_NOTE;
+    if (!binary())
+    {
+      const char *end= from + length;
+      from+= copy_length;
+      from+= field_charset->cset->scan(field_charset, from, end, MY_SEQ_SPACES);
+      /* If we lost only spaces then produce a NOTE, not a WARNING */
+      if (from == end)
+        level= MYSQL_ERROR::WARN_LEVEL_NOTE;
+    }
     error_code= WARN_DATA_TRUNCATED;
   }
   if (error_code)

--- 1.2/mysql-test/r/type_binary.result	2005-10-25 03:35:54 -07:00
+++ 1.3/mysql-test/r/type_binary.result	2005-12-06 14:16:30 -08:00
@@ -114,3 +114,26 @@
 select hex(cast(0x10 as binary(2)));
 hex(cast(0x10 as binary(2)))
 1000
+create table t1 (b binary(2), vb varbinary(2));
+insert into t1 values(0x4120, 0x4120);
+insert into t1 values(0x412020, 0x412020);
+Warnings:
+Warning	1265	Data truncated for column 'b' at row 1
+Warning	1265	Data truncated for column 'vb' at row 1
+drop table t1;
+create table t1 (c char(2), vc varchar(2));
+insert into t1 values(0x4120, 0x4120);
+insert into t1 values(0x412020, 0x412020);
+Warnings:
+Note	1265	Data truncated for column 'vc' at row 1
+drop table t1;
+set @old_sql_mode= @@sql_mode, sql_mode= 'traditional';
+create table t1 (b binary(2), vb varbinary(2));
+insert into t1 values(0x4120, 0x4120);
+insert into t1 values(0x412020, NULL);
+ERROR 22001: Data too long for column 'b' at row 1
+insert into t1 values(NULL, 0x412020);
+ERROR 22001: Data too long for column 'vb' at row 1
+drop table t1;
+set @@sql_mode= @old_sql_mode;
+End of 5.0 tests

--- 1.2/mysql-test/t/type_binary.test	2005-10-25 03:35:49 -07:00
+++ 1.3/mysql-test/t/type_binary.test	2005-12-06 14:16:30 -08:00
@@ -68,3 +68,27 @@
 
 # check that cast appends trailing zeros
 select hex(cast(0x10 as binary(2)));
+
+#
+# Bug #14299: BINARY space truncation should cause warning or error
+# 
+create table t1 (b binary(2), vb varbinary(2));
+insert into t1 values(0x4120, 0x4120);
+insert into t1 values(0x412020, 0x412020);
+drop table t1;
+create table t1 (c char(2), vc varchar(2));
+insert into t1 values(0x4120, 0x4120);
+insert into t1 values(0x412020, 0x412020);
+drop table t1;
+
+set @old_sql_mode= @@sql_mode, sql_mode= 'traditional';
+create table t1 (b binary(2), vb varbinary(2));
+insert into t1 values(0x4120, 0x4120);
+--error ER_DATA_TOO_LONG
+insert into t1 values(0x412020, NULL);
+--error ER_DATA_TOO_LONG
+insert into t1 values(NULL, 0x412020);
+drop table t1;
+set @@sql_mode= @old_sql_mode;
+
+--echo End of 5.0 tests
Thread
bk commit into 5.0 tree (jimw:1.1983)Jim Winstead6 Dec