field_conv.cc:

Bug#11591
  CHAR column with utf8 does not work properly
  (more chars than expected)
  do_cut_string didn't call well_formed_length,
  and copied all data, which was wrong in the
  case of multibyte character set.
ctype_utf8.result, ctype_utf8.test:
  adding test case


sql/field_conv.cc:
  Bug#11591
  CHAR column with utf8 does not work properly
  (more chars than expected)
  do_cut_string didn't call well_formed_length,
  and copied all data, which was wrong in the
  case of multibyte character set.
mysql-test/t/ctype_utf8.test:
  adding test case
mysql-test/r/ctype_utf8.result:
  adding test caser
This commit is contained in:
unknown 2005-07-11 13:20:07 +05:00
commit dce0304a42
3 changed files with 41 additions and 13 deletions

View file

@ -326,21 +326,28 @@ static void do_field_real(Copy_field *copy)
static void do_cut_string(Copy_field *copy)
{ // Shorter string field
memcpy(copy->to_ptr,copy->from_ptr,copy->to_length);
int well_formed_error;
CHARSET_INFO *cs= copy->from_field->charset();
const char *from_end= copy->from_ptr + copy->from_length;
uint copy_length= cs->cset->well_formed_len(cs, copy->from_ptr, from_end,
copy->to_length / cs->mbmaxlen,
&well_formed_error);
if (copy->to_length < copy_length)
copy_length= copy->to_length;
memcpy(copy->to_ptr, copy->from_ptr, copy_length);
/* Check if we loosed any important characters */
char *ptr,*end;
for (ptr=copy->from_ptr+copy->to_length,end=copy->from_ptr+copy->from_length ;
ptr != end ;
ptr++)
/* Check if we lost any important characters */
if (well_formed_error ||
cs->cset->scan(cs, copy->from_ptr + copy_length, from_end,
MY_SEQ_SPACES) < (copy->from_length - copy_length))
{
if (!my_isspace(system_charset_info, *ptr)) // QQ: ucs incompatible
{
copy->to_field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
ER_WARN_DATA_TRUNCATED, 1);
break;
}
copy->to_field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
ER_WARN_DATA_TRUNCATED, 1);
}
if (copy_length < copy->to_length)
cs->cset->fill(cs, copy->to_ptr + copy_length,
copy->to_length - copy_length, ' ');
}