bug#15682 - ndb

  incorrect handling of varchar in position/rnd_pos

  Commit for 5.0.17 release clone
parent fa5f8027
...@@ -677,3 +677,19 @@ select * from atablewithareallylongandirritatingname; ...@@ -677,3 +677,19 @@ select * from atablewithareallylongandirritatingname;
a a
2 2
drop table atablewithareallylongandirritatingname; drop table atablewithareallylongandirritatingname;
create table t1 (f1 varchar(50), f2 text,f3 int, primary key(f1)) engine=NDB;
insert into t1 (f1,f2,f3)VALUES("111111","aaaaaa",1);
insert into t1 (f1,f2,f3)VALUES("222222","bbbbbb",2);
select * from t1 order by f1;
f1 f2 f3
111111 aaaaaa 1
222222 bbbbbb 2
select * from t1 order by f2;
f1 f2 f3
111111 aaaaaa 1
222222 bbbbbb 2
select * from t1 order by f3;
f1 f2 f3
111111 aaaaaa 1
222222 bbbbbb 2
drop table t1;
...@@ -623,3 +623,14 @@ create table atablewithareallylongandirritatingname (a int); ...@@ -623,3 +623,14 @@ create table atablewithareallylongandirritatingname (a int);
insert into atablewithareallylongandirritatingname values (2); insert into atablewithareallylongandirritatingname values (2);
select * from atablewithareallylongandirritatingname; select * from atablewithareallylongandirritatingname;
drop table atablewithareallylongandirritatingname; drop table atablewithareallylongandirritatingname;
#
# Bug#15682
#
create table t1 (f1 varchar(50), f2 text,f3 int, primary key(f1)) engine=NDB;
insert into t1 (f1,f2,f3)VALUES("111111","aaaaaa",1);
insert into t1 (f1,f2,f3)VALUES("222222","bbbbbb",2);
select * from t1 order by f1;
select * from t1 order by f2;
select * from t1 order by f3;
drop table t1;
...@@ -2812,8 +2812,25 @@ void ha_ndbcluster::position(const byte *record) ...@@ -2812,8 +2812,25 @@ void ha_ndbcluster::position(const byte *record)
} }
*buff++= 0; *buff++= 0;
} }
memcpy(buff, record + key_part->offset, key_part->length); size_t len = key_part->length;
buff += key_part->length; const byte * ptr = record + key_part->offset;
Field *field = key_part->field;
if ((field->type() == MYSQL_TYPE_VARCHAR) &&
((Field_varstring*)field)->length_bytes == 1)
{
/**
* Keys always use 2 bytes length
*/
buff[0] = ptr[0];
buff[1] = 0;
memcpy(buff+2, ptr + 1, len);
len += 2;
}
else
{
memcpy(buff, ptr, len);
}
buff += len;
} }
} }
else else
......
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