summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--innobase/rem/rem0cmp.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/innobase/rem/rem0cmp.c b/innobase/rem/rem0cmp.c
index 6e8f3d82ef3..f6c82102839 100644
--- a/innobase/rem/rem0cmp.c
+++ b/innobase/rem/rem0cmp.c
@@ -14,6 +14,9 @@ Created 7/1/1994 Heikki Tuuri
#include "srv0srv.h"
+#include <m_ctype.h>
+#include <my_sys.h>
+
/* ALPHABETICAL ORDER
==================
@@ -453,6 +456,8 @@ cmp_dtuple_rec_with_match(
in current field */
int ret = 3333; /* return value */
+ CHARSET_INFO* charset; /* charset used in the field */
+
ut_ad(dtuple && rec && matched_fields && matched_bytes);
ut_ad(dtuple_check_typed(dtuple));
@@ -541,6 +546,32 @@ cmp_dtuple_rec_with_match(
&& dtype_get_charset_coll(cur_type->prtype) !=
data_mysql_latin1_swedish_charset_coll)) {
+ /* If character set is not latin1_swedish
+ we have to devide character length by the
+ maximum bytes needed for that character
+ set. For example if we have unique prefix
+ index for 1 utf8 character then we have
+ actually 3 bytes allocated in the index.
+ Therefore, we have to divide that with
+ maximum bytes needed for utf8 character i.e.
+ 3 byges.*/
+
+ if ( dtuple_f_len > 0) {
+ charset = get_charset(
+ dtype_get_charset_coll(cur_type->prtype),
+ MYF(MY_WME));
+
+ ut_ad(charset);
+ ut_ad(charset->mbmaxlen);
+
+ dtuple_f_len = dtuple_f_len / charset->mbmaxlen;
+
+ if ( dtuple_f_len == 0)
+ dtuple_f_len = 1;
+
+ rec_f_len = dtuple_f_len;
+ }
+
ret = cmp_whole_field(cur_type,
dfield_get_data(dtuple_field), dtuple_f_len,
rec_b_ptr, rec_f_len);