BUG#26238 - inserted delayed always inserts 0 for BIT columns

INSERT DELAYED inserts garbage for BIT columns.

When delayed thread clones TABLE object, it didn't adjusted bit_ptr
to newly created record (though it correctly adjusts ptr and null_ptr).

This is fixed by correctly adjusting bit_ptr when performing a clone.
With this fix BIT values are stored correctly by INSERT DELAYED.
parent 37cedb7e
...@@ -243,3 +243,10 @@ SET @@session.auto_increment_offset= ...@@ -243,3 +243,10 @@ SET @@session.auto_increment_offset=
@bug20830_old_session_auto_increment_offset; @bug20830_old_session_auto_increment_offset;
SET @@session.auto_increment_increment= SET @@session.auto_increment_increment=
@bug20830_old_session_auto_increment_increment; @bug20830_old_session_auto_increment_increment;
CREATE TABLE t1(a BIT);
INSERT DELAYED INTO t1 VALUES(1);
FLUSH TABLE t1;
SELECT HEX(a) FROM t1;
HEX(a)
1
DROP TABLE t1;
...@@ -234,3 +234,11 @@ SET @@session.auto_increment_offset= ...@@ -234,3 +234,11 @@ SET @@session.auto_increment_offset=
SET @@session.auto_increment_increment= SET @@session.auto_increment_increment=
@bug20830_old_session_auto_increment_increment; @bug20830_old_session_auto_increment_increment;
#
# BUG#26238 - inserted delayed always inserts 0 for BIT columns
#
CREATE TABLE t1(a BIT);
INSERT DELAYED INTO t1 VALUES(1);
FLUSH TABLE t1;
SELECT HEX(a) FROM t1;
DROP TABLE t1;
...@@ -225,7 +225,7 @@ public: ...@@ -225,7 +225,7 @@ public:
ptr=ptr_arg; null_ptr=null_ptr_arg; null_bit=null_bit_arg; ptr=ptr_arg; null_ptr=null_ptr_arg; null_bit=null_bit_arg;
} }
inline void move_field(char *ptr_arg) { ptr=ptr_arg; } inline void move_field(char *ptr_arg) { ptr=ptr_arg; }
inline void move_field(my_ptrdiff_t ptr_diff) virtual inline void move_field(my_ptrdiff_t ptr_diff)
{ {
ptr=ADD_TO_PTR(ptr,ptr_diff,char*); ptr=ADD_TO_PTR(ptr,ptr_diff,char*);
if (null_ptr) if (null_ptr)
...@@ -1407,6 +1407,11 @@ public: ...@@ -1407,6 +1407,11 @@ public:
Field *new_key_field(MEM_ROOT *root, struct st_table *new_table, Field *new_key_field(MEM_ROOT *root, struct st_table *new_table,
char *new_ptr, uchar *new_null_ptr, char *new_ptr, uchar *new_null_ptr,
uint new_null_bit); uint new_null_bit);
inline void move_field(my_ptrdiff_t ptr_diff)
{
Field::move_field(ptr_diff);
bit_ptr= ADD_TO_PTR(bit_ptr, ptr_diff, uchar*);
}
void set_bit_ptr(uchar *bit_ptr_arg, uchar bit_ofs_arg) void set_bit_ptr(uchar *bit_ptr_arg, uchar bit_ofs_arg)
{ {
bit_ptr= bit_ptr_arg; bit_ptr= bit_ptr_arg;
......
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