mirror of
https://github.com/MariaDB/server.git
synced 2026-05-06 15:15:34 +02:00
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:
parent
3e3981b558
commit
bbd402dc4f
10 changed files with 271 additions and 55 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue