Commit 5d4e9d04 authored by mattiasj@witty.local's avatar mattiasj@witty.local

Bug#33379: valgrind error in parts/partition_bit_myisam

Problem was that Field_bit used Field::hash() function that did not
know about using null-byte for storing bits.
Resulting in wrong length, which was caught by valgrind.

Solution: created a Field_bit::hash() that uses Field_bit::val_int()
and my_charset_bin-collation function hash_sort.
Also use the store function for platform independs
parent f2040f48
drop table if exists t1; drop table if exists t1;
# test with not null
create table t1 (a bit not null) partition by key (a);
insert into t1 values (b'1');
select hex(a) from t1 where a = b'1';
hex(a)
1
drop table t1;
create table t1 (a tinyint not null) partition by key (a); create table t1 (a tinyint not null) partition by key (a);
insert into t1 values (2); insert into t1 values (2);
select * from t1 where a = 2; select * from t1 where a = 2;
...@@ -125,6 +132,13 @@ select * from t1 where a = 'y'; ...@@ -125,6 +132,13 @@ select * from t1 where a = 'y';
a a
y y
drop table t1; drop table t1;
# test with null allowed
create table t1 (a bit) partition by key (a);
insert into t1 values (b'1');
select hex(a) from t1 where a = b'1';
hex(a)
1
drop table t1;
create table t1 (a tinyint) partition by key (a); create table t1 (a tinyint) partition by key (a);
insert into t1 values (2); insert into t1 values (2);
select * from t1 where a = 2; select * from t1 where a = 2;
......
...@@ -11,11 +11,11 @@ ...@@ -11,11 +11,11 @@
drop table if exists t1; drop table if exists t1;
--enable_warnings --enable_warnings
# FIXME: disabled this test because of valgrind error -- echo # test with not null
#create table t1 (a bit not null) partition by key (a); create table t1 (a bit not null) partition by key (a);
#insert into t1 values (b'1'); insert into t1 values (b'1');
#select * from t1 where a = b'1'; select hex(a) from t1 where a = b'1';
#drop table t1; drop table t1;
create table t1 (a tinyint not null) partition by key (a); create table t1 (a tinyint not null) partition by key (a);
insert into t1 values (2); insert into t1 values (2);
select * from t1 where a = 2; select * from t1 where a = 2;
...@@ -100,11 +100,11 @@ create table t1 (a set('y','n') not null) partition by key (a); ...@@ -100,11 +100,11 @@ create table t1 (a set('y','n') not null) partition by key (a);
insert into t1 values ('y'); insert into t1 values ('y');
select * from t1 where a = 'y'; select * from t1 where a = 'y';
drop table t1; drop table t1;
# FIXME: disabled this test because of valgrind error -- echo # test with null allowed
#create table t1 (a bit) partition by key (a); create table t1 (a bit) partition by key (a);
#insert into t1 values (b'1'); insert into t1 values (b'1');
#select * from t1 where a = b'1'; select hex(a) from t1 where a = b'1';
#drop table t1; drop table t1;
create table t1 (a tinyint) partition by key (a); create table t1 (a tinyint) partition by key (a);
insert into t1 values (2); insert into t1 values (2);
select * from t1 where a = 2; select * from t1 where a = 2;
......
...@@ -8793,6 +8793,23 @@ Field_bit::Field_bit(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, ...@@ -8793,6 +8793,23 @@ Field_bit::Field_bit(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
} }
void Field_bit::hash(ulong *nr, ulong *nr2)
{
if (is_null())
{
*nr^= (*nr << 1) | 1;
}
else
{
CHARSET_INFO *cs= &my_charset_bin;
longlong value= Field_bit::val_int();
uchar tmp[8];
mi_int8store(tmp,value);
cs->coll->hash_sort(cs, tmp, 8, nr, nr2);
}
}
size_t size_t
Field_bit::do_last_null_byte() const Field_bit::do_last_null_byte() const
{ {
......
...@@ -1904,6 +1904,7 @@ public: ...@@ -1904,6 +1904,7 @@ public:
Field::move_field_offset(ptr_diff); Field::move_field_offset(ptr_diff);
bit_ptr= ADD_TO_PTR(bit_ptr, ptr_diff, uchar*); bit_ptr= ADD_TO_PTR(bit_ptr, ptr_diff, uchar*);
} }
void hash(ulong *nr, ulong *nr2);
private: private:
virtual size_t do_last_null_byte() const; virtual size_t do_last_null_byte() const;
......
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