summaryrefslogtreecommitdiff
path: root/innobase
diff options
context:
space:
mode:
authorunknown <aivanov@mysql.com>2005-10-28 17:16:22 +0400
committerunknown <aivanov@mysql.com>2005-10-28 17:16:22 +0400
commit00a275e53ccf0fd38fa159ef3e172faf52ffbf38 (patch)
treeaff8045fa42a82984e38391d92673ce8c93a6808 /innobase
parent5e8515d9f2ccada3e19b109196fb5654e7c9db92 (diff)
downloadmariadb-git-00a275e53ccf0fd38fa159ef3e172faf52ffbf38.tar.gz
Fix BUG#10511: Wrong padding of UCS2 CHAR columns in
ON UPDATE CASCADE innobase/row/row0ins.c: Patch from Marko is applied
Diffstat (limited to 'innobase')
-rw-r--r--innobase/row/row0ins.c48
1 files changed, 39 insertions, 9 deletions
diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c
index 5ca1ee51cbd..456bb51d424 100644
--- a/innobase/row/row0ins.c
+++ b/innobase/row/row0ins.c
@@ -522,20 +522,50 @@ row_ins_cascade_calc_update_vec(
&& ufield->new_val.len
< dtype_get_fixed_size(type)) {
+ ulint cset;
+
ufield->new_val.data =
mem_heap_alloc(heap,
dtype_get_fixed_size(type));
ufield->new_val.len =
dtype_get_fixed_size(type);
- ut_a(dtype_get_pad_char(type)
- != ULINT_UNDEFINED);
-
- memset(ufield->new_val.data,
- (byte)dtype_get_pad_char(type),
- dtype_get_fixed_size(type));
- ut_memcpy(ufield->new_val.data,
- parent_ufield->new_val.data,
- parent_ufield->new_val.len);
+
+ /* Handle UCS2 strings differently.
+ As no new collations will be
+ introduced in 4.1, we hardcode the
+ charset-collation codes here.
+ In 5.0, the logic is based on
+ mbminlen. */
+ cset = dtype_get_charset_coll(
+ 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;