Commit c882c261 authored by unknown's avatar unknown

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
...@@ -798,4 +798,8 @@ insert into t1 values(1,'foo'),(2,'foobar'); ...@@ -798,4 +798,8 @@ insert into t1 values(1,'foo'),(2,'foobar');
select * from t1 where b like 'foob%'; select * from t1 where b like 'foob%';
a b a b
2 foobar 2 foobar
alter table t1 engine=bdb;
select * from t1 where b like 'foob%';
a b
2 foobar
drop table t1; drop table t1;
...@@ -643,4 +643,8 @@ create table t1 ( ...@@ -643,4 +643,8 @@ create table t1 (
--enable_warnings --enable_warnings
insert into t1 values(1,'foo'),(2,'foobar'); insert into t1 values(1,'foo'),(2,'foobar');
select * from t1 where b like 'foob%'; 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; drop table t1;
...@@ -4425,23 +4425,7 @@ void Field_string::sql_type(String &res) const ...@@ -4425,23 +4425,7 @@ void Field_string::sql_type(String &res) const
res.length(length); res.length(length);
} }
char *Field_string::pack(char *to, const char *from, uint max_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 length= min(field_length,max_length);
uint char_length= max_length/field_charset->mbmaxlen; uint char_length= max_length/field_charset->mbmaxlen;
......
...@@ -927,7 +927,6 @@ class Field_string :public Field_str { ...@@ -927,7 +927,6 @@ class Field_string :public Field_str {
void sort_string(char *buff,uint length); void sort_string(char *buff,uint length);
void sql_type(String &str) const; void sql_type(String &str) const;
char *pack(char *to, const char *from, uint max_length=~(uint) 0); 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); 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 *a,const char *b,uint key_length);
int pack_cmp(const char *b,uint key_length); int pack_cmp(const char *b,uint key_length);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment