summaryrefslogtreecommitdiff
path: root/sql/field.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/field.cc')
-rw-r--r--sql/field.cc23
1 files changed, 13 insertions, 10 deletions
diff --git a/sql/field.cc b/sql/field.cc
index 5a618a5a2a9..2418d692c72 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -2557,6 +2557,7 @@ Field *Field::make_new_field(MEM_ROOT *root, TABLE *new_table,
tmp->key_start.init(0);
tmp->part_of_key.init(0);
tmp->part_of_sortkey.init(0);
+ tmp->read_stats= NULL;
/*
TODO: it is not clear why this method needs to reset unireg_check.
Try not to reset it, or explain why it needs to be reset.
@@ -7622,7 +7623,8 @@ int Field_string::cmp(const uchar *a_ptr, const uchar *b_ptr) const
return field_charset()->coll->strnncollsp_nchars(field_charset(),
a_ptr, field_length,
b_ptr, field_length,
- Field_string::char_length());
+ Field_string::char_length(),
+ MY_STRNNCOLLSP_NCHARS_EMULATE_TRIMMED_TRAILING_SPACES);
}
@@ -8002,10 +8004,11 @@ int Field_varstring::cmp(const uchar *a_ptr, const uchar *b_ptr) const
int Field_varstring::cmp_prefix(const uchar *a_ptr, const uchar *b_ptr,
- size_t prefix_len) const
+ size_t prefix_char_len) const
{
- /* avoid expensive well_formed_char_length if possible */
- if (prefix_len == table->field[field_index]->field_length)
+ /* avoid more expensive strnncollsp_nchars() if possible */
+ if (prefix_char_len * field_charset()->mbmaxlen ==
+ table->field[field_index]->field_length)
return Field_varstring::cmp(a_ptr, b_ptr);
size_t a_length, b_length;
@@ -8025,8 +8028,8 @@ int Field_varstring::cmp_prefix(const uchar *a_ptr, const uchar *b_ptr,
a_length,
b_ptr + length_bytes,
b_length,
- prefix_len /
- field_charset()->mbmaxlen);
+ prefix_char_len,
+ 0);
}
@@ -8813,7 +8816,7 @@ int Field_blob::cmp(const uchar *a_ptr, const uchar *b_ptr) const
int Field_blob::cmp_prefix(const uchar *a_ptr, const uchar *b_ptr,
- size_t prefix_len) const
+ size_t prefix_char_len) const
{
uchar *blob1,*blob2;
memcpy(&blob1, a_ptr+packlength, sizeof(char*));
@@ -8822,8 +8825,8 @@ int Field_blob::cmp_prefix(const uchar *a_ptr, const uchar *b_ptr,
return field_charset()->coll->strnncollsp_nchars(field_charset(),
blob1, a_len,
blob2, b_len,
- prefix_len /
- field_charset()->mbmaxlen);
+ prefix_char_len,
+ 0);
}
@@ -10008,7 +10011,7 @@ my_decimal *Field_bit::val_decimal(my_decimal *deciaml_value)
(not the table->record[0] necessarily)
*/
int Field_bit::cmp_prefix(const uchar *a, const uchar *b,
- size_t prefix_len) const
+ size_t prefix_char_len) const
{
my_ptrdiff_t a_diff= a - ptr;
my_ptrdiff_t b_diff= b - ptr;