Commit 8de1783a authored by unknown's avatar unknown
Browse files

BUG#22550 (Replication of BIT column failing):

Using move_field_offset() to move field pointer to other record before
calling pack()/unpack().


sql/log_event.cc:
  Using move_field_offset() to move the field pointer. It is necessary
  for unpack() and pack() of BIT fields to operate correctly.
  Adding debug printouts.
sql/sql_class.cc:
  Using move_field_offset() to move the field pointer. It is necessary
  for unpack() and pack() of BIT fields to operate correctly.
  Adding debug printouts to packing of update rows event.
parent 21263710
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -5375,7 +5375,9 @@ unpack_row(RELAY_LOG_INFO *rli,

    if (bitmap_is_set(cols, field_ptr -  begin_ptr))
    {
      ptr= f->unpack(f->ptr + offset, ptr);
      f->move_field_offset(offset);
      ptr= f->unpack(f->ptr, ptr);
      f->move_field_offset(-offset);
      /* Field...::unpack() cannot return 0 */
      DBUG_ASSERT(ptr != NULL);
    }
@@ -6675,6 +6677,7 @@ static int find_and_fetch_row(TABLE *table, byte *key)
        table->s->null_bytes > 0 ? table->s->null_bytes - 1 : 0;
      table->record[1][pos]= 0xFF;
      error= table->file->rnd_next(table->record[1]);

      switch (error)
      {
      case 0:
@@ -6956,6 +6959,10 @@ int Update_rows_log_event::do_prepare_row(THD *thd, RELAY_LOG_INFO *rli,
                    row_start, &m_cols, row_end, &m_master_reclength,
                    table->write_set, UPDATE_ROWS_EVENT);

  DBUG_DUMP("record[0]", table->record[0], table->s->reclength);
  DBUG_DUMP("m_after_image", m_after_image, table->s->reclength);


  /*
    If we will access rows using the random access method, m_key will
    be set to NULL, so we do not need to make a key copy in that case.
+11 −2
Original line number Diff line number Diff line
@@ -2529,7 +2529,9 @@ my_size_t THD::pack_row(TABLE *table, MY_BITMAP const* cols, byte *row_data,
    {
      my_ptrdiff_t const offset=
        field->is_null(rec_offset) ? def_offset : rec_offset;
      ptr= (byte*)field->pack((char *) ptr, field->ptr + offset);
      field->move_field_offset(offset);
      ptr= (byte*)field->pack((char *) ptr, field->ptr);
      field->move_field_offset(-offset);
    }
  }
  return (static_cast<my_size_t>(ptr - row_data));
@@ -2614,12 +2616,19 @@ int THD::binlog_update_row(TABLE* table, bool is_trans,
  my_size_t const after_size= pack_row(table, cols, after_row, 
                                       after_record);
  
  DBUG_DUMP("before_record", before_record, table->s->reclength);
  DBUG_DUMP("after_record", after_record, table->s->reclength);
  DBUG_DUMP("before_row", before_row, before_size);
  DBUG_DUMP("after_row", after_row, after_size);

  Rows_log_event* const ev=
    binlog_prepare_pending_rows_event(table, server_id, cols, colcnt,
				      before_size + after_size, is_trans,
				      static_cast<Update_rows_log_event*>(0));

  error= (unlikely(!ev)) || ev->add_row_data(before_row, before_size) ||
  error=
    unlikely(!ev) ||
    ev->add_row_data(before_row, before_size) ||
    ev->add_row_data(after_row, after_size);

  if (!table->write_row_record)