@@ -6675,8 +6675,9 @@ wsrep_store_key_val_for_row(
66756675 *key_is_null = true;
66766676
66776677 for (; key_part != end; key_part++) {
6678- uchar sorted[REC_VERSION_56_MAX_INDEX_COL_LEN] = {'\0'} ;
6678+ uchar sorted[REC_VERSION_56_MAX_INDEX_COL_LEN];
66796679 bool part_is_null = false;
6680+ memset(sorted, 0, sizeof(sorted));
66806681
66816682 if (key_part->null_bit) {
66826683 if (buff_space > 0) {
@@ -6755,13 +6756,17 @@ wsrep_store_key_val_for_row(
67556756 /* cannot exceed max column lenght either, we may need to truncate
67566757 the stored value: */
67576758 if (true_len > sizeof(sorted)) {
6758- true_len = sizeof(sorted);
6759+ true_len = sizeof(sorted);
67596760 }
67606761
6761- memcpy(sorted, data, true_len);
6762- true_len = wsrep_innobase_mysql_sort(
6763- mysql_type, cs->number, sorted, true_len,
6764- REC_VERSION_56_MAX_INDEX_COL_LEN);
6762+ ut_ad(data || (data == nullptr && true_len == 0));
6763+ if (data) {
6764+ memcpy(sorted, data, true_len);
6765+
6766+ true_len = wsrep_innobase_mysql_sort(
6767+ mysql_type, cs->number, sorted, true_len,
6768+ REC_VERSION_56_MAX_INDEX_COL_LEN);
6769+ }
67656770 if (wsrep_protocol_version > 1) {
67666771 /* Note that we always reserve the maximum possible
67676772 length of the true VARCHAR in the key value, though
@@ -6774,7 +6779,7 @@ wsrep_store_key_val_for_row(
67746779 wsrep_thd_query(thd));
67756780 true_len = buff_space;
67766781 }
6777- memcpy(buff, sorted, true_len);
6782+ memcpy(buff, sorted, true_len);
67786783 buff += true_len;
67796784 buff_space -= true_len;
67806785 } else {
@@ -6846,11 +6851,14 @@ wsrep_store_key_val_for_row(
68466851 true_len = key_len;
68476852 }
68486853
6849- memcpy(sorted, blob_data, true_len);
6850- true_len = wsrep_innobase_mysql_sort(
6851- mysql_type, cs->number, sorted, true_len,
6852- REC_VERSION_56_MAX_INDEX_COL_LEN);
6853-
6854+ ut_ad(blob_data || (blob_data == nullptr && true_len == 0));
6855+ if (blob_data) {
6856+ memcpy(sorted, blob_data, true_len);
6857+
6858+ true_len = wsrep_innobase_mysql_sort(
6859+ mysql_type, cs->number, sorted, true_len,
6860+ REC_VERSION_56_MAX_INDEX_COL_LEN);
6861+ }
68546862
68556863 /* Note that we always reserve the maximum possible
68566864 length of the BLOB prefix in the key value. */
@@ -6926,10 +6934,15 @@ wsrep_store_key_val_for_row(
69266934 cs->mbmaxlen),
69276935 &error);
69286936 }
6929- memcpy(sorted, src_start, true_len);
6930- true_len = wsrep_innobase_mysql_sort(
6931- mysql_type, cs->number, sorted, true_len,
6932- REC_VERSION_56_MAX_INDEX_COL_LEN);
6937+
6938+ ut_ad(src_start || (src_start == nullptr && true_len == 0));
6939+ if (src_start) {
6940+ memcpy(sorted, src_start, true_len);
6941+
6942+ true_len = wsrep_innobase_mysql_sort(
6943+ mysql_type, cs->number, sorted, true_len,
6944+ REC_VERSION_56_MAX_INDEX_COL_LEN);
6945+ }
69336946
69346947 if (true_len > buff_space) {
69356948 fprintf (stderr,
@@ -6939,7 +6952,10 @@ wsrep_store_key_val_for_row(
69396952 }
69406953 memcpy(buff, sorted, true_len);
69416954 } else {
6942- memcpy(buff, src_start, true_len);
6955+ ut_ad(src_start || (src_start == nullptr && true_len == 0));
6956+ if (src_start) {
6957+ memcpy(buff, src_start, true_len);
6958+ }
69436959 }
69446960 buff += true_len;
69456961 buff_space -= true_len;
0 commit comments