Commit 968410b0 authored by unknown's avatar unknown
Browse files

BUG#9339 - Updating a column does not work if the table has a UTF-8 VARCHAR primary key

fixed my_charpos() call in Field_varstring::get_key_image


mysql-test/t/type_varchar.test:
  BUG#9339 - Updating a column does not work if the table has a UTF-8 VARCHAR primary key
mysql-test/r/type_varchar.result:
  BUG#9339 - Updating a column does not work if the table has a UTF-8 VARCHAR primary key
parent 8e23f5fe
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -376,3 +376,10 @@ explain select * from t1 where v like 'S%' order by v;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	t1	range	v	v	13	NULL	2	Using where; Using filesort
drop table t1;
create table t1 (pkcol varchar(16), othercol varchar(16), primary key (pkcol));
insert into t1 values ('test', 'something');
update t1 set othercol='somethingelse' where pkcol='test';
select * from t1;
pkcol	othercol
test	somethingelse
drop table t1;
+9 −0
Original line number Diff line number Diff line
@@ -97,3 +97,12 @@ explain select * from t1 where v like 'This is a test' order by v;
explain select * from t1 where v='This is a test' order by v;
explain select * from t1 where v like 'S%' order by v;
drop table t1;

#
# bug#9339 - meaningless Field_varstring::get_key_image
#
create table t1 (pkcol varchar(16), othercol varchar(16), primary key (pkcol));
insert into t1 values ('test', 'something');
update t1 set othercol='somethingelse' where pkcol='test';
select * from t1;
drop table t1;
+3 −3
Original line number Diff line number Diff line
@@ -5725,12 +5725,12 @@ void Field_varstring::get_key_image(char *buff, uint length, imagetype type)
{
  uint f_length=  length_bytes == 1 ? (uint) (uchar) *ptr : uint2korr(ptr);
  uint char_length= length / field_charset->mbmaxlen;
  char_length= my_charpos(field_charset, ptr, ptr + length_bytes,
                          char_length);
  char *pos= ptr+length_bytes;
  char_length= my_charpos(field_charset, pos, pos + f_length, char_length);
  set_if_smaller(f_length, char_length);
  /* Key is always stored with 2 bytes */
  int2store(buff,f_length);
  memcpy(buff+HA_KEY_BLOB_LENGTH, ptr+length_bytes, f_length);
  memcpy(buff+HA_KEY_BLOB_LENGTH, pos, f_length);
  if (f_length < length)
  {
    /*