Commit af44be2d authored by unknown's avatar unknown
Browse files

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.


mysql-test/r/delayed.result:
  A test case for BUG#26238.
mysql-test/t/delayed.test:
  A test case for BUG#26238.
sql/field.h:
  Added move_field() to Field_bit class. When moving a field, adjust
  bit_ptr also, which is specific to Field_bit class.
parent c5beed03
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -243,3 +243,10 @@ SET @@session.auto_increment_offset=
@bug20830_old_session_auto_increment_offset;
SET             @@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;
+8 −0
Original line number Diff line number Diff line
@@ -234,3 +234,11 @@ SET @@session.auto_increment_offset=
SET             @@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;
+6 −1
Original line number Diff line number Diff line
@@ -225,7 +225,7 @@ class Field
    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(my_ptrdiff_t ptr_diff)
  virtual inline void move_field(my_ptrdiff_t ptr_diff)
  {
    ptr=ADD_TO_PTR(ptr,ptr_diff,char*);
    if (null_ptr)
@@ -1407,6 +1407,11 @@ class Field_bit :public Field {
  Field *new_key_field(MEM_ROOT *root, struct st_table *new_table,
                       char *new_ptr, uchar *new_null_ptr,
                       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)
  {
    bit_ptr= bit_ptr_arg;