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, ¬_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 Winstead | 6 Dec |