summaryrefslogtreecommitdiff
path: root/sql/field_conv.cc
diff options
context:
space:
mode:
authorbar@bar.intranet.mysql.r18.ru <>2006-10-03 16:00:09 +0500
committerbar@bar.intranet.mysql.r18.ru <>2006-10-03 16:00:09 +0500
commit3cfbe36adc3f4b20612ec5c7475b585c4b5d1fd9 (patch)
treec5a7e46139bbb959fb88b34de786ab54fa761ac3 /sql/field_conv.cc
parent9b17d0d332c7758a053e6159537a5f31822306f7 (diff)
parent40bcedf4e3dc03b63064ab278218764cc4829bdf (diff)
downloadmariadb-git-3cfbe36adc3f4b20612ec5c7475b585c4b5d1fd9.tar.gz
After merge fix
Diffstat (limited to 'sql/field_conv.cc')
-rw-r--r--sql/field_conv.cc18
1 files changed, 17 insertions, 1 deletions
diff --git a/sql/field_conv.cc b/sql/field_conv.cc
index 20d1e372a2c..7bc6c432d1c 100644
--- a/sql/field_conv.cc
+++ b/sql/field_conv.cc
@@ -427,6 +427,21 @@ static void do_varstring2(Copy_field *copy)
length);
}
+
+static void do_varstring2_mb(Copy_field *copy)
+{
+ int well_formed_error;
+ CHARSET_INFO *cs= copy->from_field->charset();
+ uint char_length= (copy->to_length - HA_KEY_BLOB_LENGTH) / cs->mbmaxlen;
+ uint from_length= uint2korr(copy->from_ptr);
+ const char *from_beg= copy->from_ptr + HA_KEY_BLOB_LENGTH;
+ uint length= cs->cset->well_formed_len(cs, from_beg, from_beg + from_length,
+ char_length, &well_formed_error);
+ int2store(copy->to_ptr, length);
+ memcpy(copy->to_ptr+HA_KEY_BLOB_LENGTH, from_beg, length);
+}
+
+
/***************************************************************************
** The different functions that fills in a Copy_field class
***************************************************************************/
@@ -586,7 +601,8 @@ void (*Copy_field::get_copy_func(Field *to,Field *from))(Copy_field*)
return do_field_string;
if (to_length != from_length)
return (((Field_varstring*) to)->length_bytes == 1 ?
- do_varstring1 : do_varstring2);
+ do_varstring1 : (from->charset()->mbmaxlen == 1 ?
+ do_varstring2 : do_varstring2_mb));
}
else if (to_length < from_length)
return (from->charset()->mbmaxlen == 1 ?