Commit 00a275e5 authored by unknown's avatar unknown
Browse files

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

 ON UPDATE CASCADE


innobase/row/row0ins.c:
  Patch from Marko is applied
parent 5e8515d9
Loading
Loading
Loading
Loading
+39 −9
Original line number Diff line number Diff line
@@ -522,18 +522,48 @@ 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);

                                        /* 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),
					       dtype_get_fixed_size(type));
					ut_memcpy(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);
				}