Commit c807cd2e authored by aivanov@mysql.com's avatar aivanov@mysql.com

Fix BUG#10511: Wrong padding of UCS2 CHAR columns in

 ON UPDATE CASCADE
parent 7a8bd252
...@@ -522,20 +522,50 @@ row_ins_cascade_calc_update_vec( ...@@ -522,20 +522,50 @@ row_ins_cascade_calc_update_vec(
&& ufield->new_val.len && ufield->new_val.len
< dtype_get_fixed_size(type)) { < dtype_get_fixed_size(type)) {
ulint cset;
ufield->new_val.data = ufield->new_val.data =
mem_heap_alloc(heap, mem_heap_alloc(heap,
dtype_get_fixed_size(type)); dtype_get_fixed_size(type));
ufield->new_val.len = ufield->new_val.len =
dtype_get_fixed_size(type); dtype_get_fixed_size(type);
ut_a(dtype_get_pad_char(type)
!= ULINT_UNDEFINED); /* Handle UCS2 strings differently.
As no new collations will be
memset(ufield->new_val.data, introduced in 4.1, we hardcode the
(byte)dtype_get_pad_char(type), charset-collation codes here.
dtype_get_fixed_size(type)); In 5.0, the logic is based on
ut_memcpy(ufield->new_val.data, mbminlen. */
parent_ufield->new_val.data, cset = dtype_get_charset_coll(
parent_ufield->new_val.len); dtype_get_prtype(type));
if (cset == 35/*ucs2_general_ci*/
|| cset == 90/*ucs2_bin*/
|| (cset >= 128/*ucs2_unicode_ci*/
&& cset <= 144
/*ucs2_persian_ci*/)) {
/* space=0x0020 */
ulint i;
for (i = 0;
i < ufield->new_val.len;
i += 2) {
mach_write_to_2(((byte*)
ufield->new_val.data)
+ i, 0x0020);
}
} else {
ut_a(dtype_get_pad_char(type)
!= ULINT_UNDEFINED);
memset(ufield->new_val.data,
(byte)dtype_get_pad_char(
type),
ufield->new_val.len);
}
memcpy(ufield->new_val.data,
parent_ufield->new_val.data,
parent_ufield->new_val.len);
} }
ufield->extern_storage = FALSE; ufield->extern_storage = FALSE;
......
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