Commit c672c119 authored by cmiller@zippy.(none)'s avatar cmiller@zippy.(none)

Expanding a binary field should result in 0x00-filled positions, not 0x20

(ASCII space).  For Bug#16857.
parent d85e9295
...@@ -141,3 +141,22 @@ t1 CREATE TABLE `t1` ( ...@@ -141,3 +141,22 @@ t1 CREATE TABLE `t1` (
`a` binary(1) default NULL `a` binary(1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
create table t1 (col1 binary(4));
insert into t1 values ('a'),('a ');
select hex(col1) from t1;
hex(col1)
61000000
61200000
alter table t1 modify col1 binary(10);
select hex(col1) from t1;
hex(col1)
61000000000000000000
61200000000000000000
insert into t1 values ('b'),('b ');
select hex(col1) from t1;
hex(col1)
61000000000000000000
61200000000000000000
62000000000000000000
62200000000000000000
drop table t1;
...@@ -89,3 +89,15 @@ show create table t1; ...@@ -89,3 +89,15 @@ show create table t1;
drop table t1; drop table t1;
# End of 4.1 tests # End of 4.1 tests
#
# Bug#16857
#
create table t1 (col1 binary(4));
insert into t1 values ('a'),('a ');
select hex(col1) from t1;
alter table t1 modify col1 binary(10);
select hex(col1) from t1;
insert into t1 values ('b'),('b ');
select hex(col1) from t1;
drop table t1;
...@@ -379,6 +379,16 @@ static void do_cut_string_complex(Copy_field *copy) ...@@ -379,6 +379,16 @@ static void do_cut_string_complex(Copy_field *copy)
static void do_expand_binary(Copy_field *copy)
{
CHARSET_INFO *cs= copy->from_field->charset();
memcpy(copy->to_ptr,copy->from_ptr,copy->from_length);
cs->cset->fill(cs, copy->to_ptr+copy->from_length,
copy->to_length-copy->from_length, '\0');
}
static void do_expand_string(Copy_field *copy) static void do_expand_string(Copy_field *copy)
{ {
CHARSET_INFO *cs= copy->from_field->charset(); CHARSET_INFO *cs= copy->from_field->charset();
...@@ -583,7 +593,13 @@ void (*Copy_field::get_copy_func(Field *to,Field *from))(Copy_field*) ...@@ -583,7 +593,13 @@ void (*Copy_field::get_copy_func(Field *to,Field *from))(Copy_field*)
return (from->charset()->mbmaxlen == 1 ? return (from->charset()->mbmaxlen == 1 ?
do_cut_string : do_cut_string_complex); do_cut_string : do_cut_string_complex);
else if (to_length > from_length) else if (to_length > from_length)
return do_expand_string; {
if ((to->flags & BINARY_FLAG) != 0)
return do_expand_binary;
else
return do_expand_string;
}
} }
else if (to->real_type() != from->real_type() || else if (to->real_type() != from->real_type() ||
to_length != from_length || to_length != from_length ||
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment