Commit c882c261 authored by unknown's avatar unknown
Browse files

Bug #6019 - SELECT tries to use too short prefix index on utf8 data

Field_string::pack should respect max_length as Field_string::pack_key does

parent 28db20e4
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -798,4 +798,8 @@ insert into t1 values(1,'foo'),(2,'foobar');
select * from t1 where b like 'foob%';
a	b
2	foobar
alter table t1 engine=bdb;
select * from t1 where b like 'foob%';
a	b
2	foobar
drop table t1;
+4 −0
Original line number Diff line number Diff line
@@ -643,4 +643,8 @@ create table t1 (
--enable_warnings
insert into t1 values(1,'foo'),(2,'foobar');
select * from t1 where b like 'foob%';
--disable_warnings
alter table t1 engine=bdb;
select * from t1 where b like 'foob%';
--enable_warnings
drop table t1;
+0 −16
Original line number Diff line number Diff line
@@ -4425,23 +4425,7 @@ void Field_string::sql_type(String &res) const
  res.length(length);
}


char *Field_string::pack(char *to, const char *from, uint max_length)
{
  const char *end=from+min(field_length,max_length);
  uint length;
  while (end > from && end[-1] == ' ')
    end--;
  length= (end-from);
  *to++= (char) (uchar) length;
  if (field_length > 255)
    *to++= (char) (uchar) (length >> 8);
  memcpy(to, from, (int) length);
  return to+length;
}


char *Field_string::pack_key(char *to, const char *from, uint max_length)
{
  uint length=      min(field_length,max_length);
  uint char_length= max_length/field_charset->mbmaxlen;
+0 −1
Original line number Diff line number Diff line
@@ -927,7 +927,6 @@ class Field_string :public Field_str {
  void sort_string(char *buff,uint length);
  void sql_type(String &str) const;
  char *pack(char *to, const char *from, uint max_length=~(uint) 0);
  char *pack_key(char *to, const char *from, uint max_length);
  const char *unpack(char* to, const char *from);
  int pack_cmp(const char *a,const char *b,uint key_length);
  int pack_cmp(const char *b,uint key_length);