Fixed unique prefix key bug for multibyte character sets (BUG #4521) for

InnoDB. This fixes also a second part of the same problem with prefix keys
on a multibyte string column for InnoDB.


innobase/btr/btr0btr.c:
  Multibyte character set prefix indexes are not any more fixed size. Therefore,
  we have to chect that length of the index field in not greater than
  prefix length.
innobase/rem/rem0cmp.c:
  Remove unnecessary changes.
innobase/row/row0ins.c:
  Fixed unique prefix key or prefix key using multibyte character set bugs for
  InnoDB (BUG #4521). For prefix keys we have to get the storage length
  for the prefix length of characters in the key.
innobase/row/row0row.c:
  Fixed unique prefix key or prefix key using multibyte character set bugs for
  InnoDB (BUG #4521). For prefix keys we have to get the storage length
  for the prefix length of characters in the key.
innobase/row/row0sel.c:
  Fixed unique prefix key or prefix key using multibyte character set bugs for
  InnoDB (BUG #4521). For prefix keys we have to get the storage length
  for the prefix length of characters in the key.
innobase/row/row0upd.c:
  Fixed unique prefix key or prefix key using multibyte character set bugs for
  InnoDB (BUG #4521). For prefix keys we have to get the storage length
  for the prefix length of characters in the key.
mysql-test/r/ctype_utf8.result:
  Added utf8 character test cases for InnoDB.
mysql-test/t/ctype_utf8.test:
  Added utf8 character expected test results for InnoDB.
sql/ha_innodb.cc:
  Added function innobase_get_at_most_n_mbchars to return position of
  the nth character in the multibyte character string.
sql/ha_innodb.h:
  Remove unnecessary changes.
This commit is contained in:
unknown 2004-09-03 15:26:29 +03:00
commit bbd402dc4f
10 changed files with 271 additions and 55 deletions

View file

@ -1999,6 +1999,7 @@ row_ins_index_entry_set_vals(
dfield_t* row_field;
ulint n_fields;
ulint i;
dtype_t* cur_type;
ut_ad(entry && row);
@ -2012,10 +2013,18 @@ row_ins_index_entry_set_vals(
/* Check column prefix indexes */
if (ind_field->prefix_len > 0
&& dfield_get_len(row_field) != UNIV_SQL_NULL
&& dfield_get_len(row_field) > ind_field->prefix_len) {
field->len = ind_field->prefix_len;
&& dfield_get_len(row_field) != UNIV_SQL_NULL) {
/* For prefix keys get the storage length
for the prefix_len characters. */
cur_type = dict_col_get_type(
dict_field_get_col(ind_field));
field->len = innobase_get_at_most_n_mbchars(
dtype_get_charset_coll(cur_type->prtype),
ind_field->prefix_len,
dfield_get_len(field),row_field->data);
} else {
field->len = row_field->len;
}

View file

@ -113,6 +113,8 @@ row_build_index_entry(
dfield_t* dfield2;
dict_col_t* col;
ulint i;
ulint storage_len;
dtype_t* cur_type;
ut_ad(row && index && heap);
ut_ad(dtuple_check_typed(row));
@ -139,10 +141,20 @@ row_build_index_entry(
/* If a column prefix index, take only the prefix */
if (ind_field->prefix_len > 0
&& dfield_get_len(dfield2) != UNIV_SQL_NULL
&& dfield_get_len(dfield2) > ind_field->prefix_len) {
&& dfield_get_len(dfield2) != UNIV_SQL_NULL) {
dfield_set_len(dfield, ind_field->prefix_len);
/* For prefix keys get the storage length
for the prefix_len characters. */
cur_type = dict_col_get_type(
dict_field_get_col(ind_field));
storage_len = innobase_get_at_most_n_mbchars(
dtype_get_charset_coll(cur_type->prtype),
ind_field->prefix_len,
dfield_get_len(dfield2),dfield2->data);
dfield_set_len(dfield,storage_len);
}
}
@ -460,6 +472,7 @@ row_build_row_ref_from_row(
dict_col_t* col;
ulint ref_len;
ulint i;
dtype_t* cur_type;
ut_ad(ref && table && row);
@ -481,10 +494,18 @@ row_build_row_ref_from_row(
dfield_copy(dfield, dfield2);
if (field->prefix_len > 0
&& dfield->len != UNIV_SQL_NULL
&& dfield->len > field->prefix_len) {
&& dfield->len != UNIV_SQL_NULL) {
dfield->len = field->prefix_len;
/* For prefix keys get the storage length
for the prefix_len characters. */
cur_type = dict_col_get_type(
dict_field_get_col(field));
dfield->len = innobase_get_at_most_n_mbchars(
dtype_get_charset_coll(cur_type->prtype),
field->prefix_len,
dfield->len,dfield->data);
}
}

View file

@ -76,6 +76,7 @@ row_sel_sec_rec_is_for_clust_rec(
ulint clust_len;
ulint n;
ulint i;
dtype_t* cur_type;
UT_NOT_USED(clust_index);
@ -91,10 +92,18 @@ row_sel_sec_rec_is_for_clust_rec(
sec_field = rec_get_nth_field(sec_rec, i, &sec_len);
if (ifield->prefix_len > 0
&& clust_len != UNIV_SQL_NULL
&& clust_len > ifield->prefix_len) {
&& clust_len != UNIV_SQL_NULL) {
clust_len = ifield->prefix_len;
/* For prefix keys get the storage length
for the prefix_len characters. */
cur_type = dict_col_get_type(
dict_field_get_col(ifield));
clust_len = innobase_get_at_most_n_mbchars(
dtype_get_charset_coll(cur_type->prtype),
ifield->prefix_len,
clust_len,clust_field);
}
if (0 != cmp_data_data(dict_col_get_type(col),

View file

@ -842,6 +842,7 @@ row_upd_index_replace_new_col_vals_index_pos(
dfield_t* new_val;
ulint j;
ulint i;
dtype_t* cur_type;
ut_ad(index);
@ -871,10 +872,19 @@ row_upd_index_replace_new_col_vals_index_pos(
}
if (field->prefix_len > 0
&& new_val->len != UNIV_SQL_NULL
&& new_val->len > field->prefix_len) {
&& new_val->len != UNIV_SQL_NULL) {
dfield->len = field->prefix_len;
/* For prefix keys get the storage length
for the prefix_len characters. */
cur_type = dict_col_get_type(
dict_field_get_col(field));
dfield->len =
innobase_get_at_most_n_mbchars(
dtype_get_charset_coll(cur_type->prtype),
field->prefix_len,
new_val->len,new_val->data);
}
}
}
@ -904,6 +914,7 @@ row_upd_index_replace_new_col_vals(
dfield_t* new_val;
ulint j;
ulint i;
dtype_t* cur_type;
ut_ad(index);
@ -933,10 +944,19 @@ row_upd_index_replace_new_col_vals(
}
if (field->prefix_len > 0
&& new_val->len != UNIV_SQL_NULL
&& new_val->len > field->prefix_len) {
&& new_val->len != UNIV_SQL_NULL) {
dfield->len = field->prefix_len;
/* For prefix keys get the storage length
for the prefix_len characters. */
cur_type = dict_col_get_type(
dict_field_get_col(field));
dfield->len =
innobase_get_at_most_n_mbchars(
dtype_get_charset_coll(cur_type->prtype),
field->prefix_len,
new_val->len,new_val->data);
}
}
}