• Mats Kindahl's avatar
    BUG#49618: Field length stored incorrectly in binary log · 2c5f439d
    Mats Kindahl authored
               for InnoDB
                
    The class Field_bit_as_char stores the metadata for the
    field incorrecly because bytes_in_rec and bit_len are set
    to (field_length + 7 ) / 8 and 0 respectively, while
    Field_bit has the correct values field_length / 8 and
    field_length % 8.
                
    Solved the problem by re-computing the values for the
    metadata based on the field_length instead of using the
    bytes_in_rec and bit_len variables.
                
    To handle compatibility with old server, a table map
    flag was added to indicate that the bit computation is
    exact. If the flag is clear, the slave computes the
    number of bytes required to store the bit field and
    compares that instead, effectively allowing replication
    *without conversion* from any field length that require
    the same number of bytes to store.
    
    
    mysql-test/suite/rpl/t/rpl_typeconv_innodb.test:
      Adding test to check compatibility for bit field
      replication when using InnoDB
    sql/field.cc:
      Extending compatible_field_size() with flags from
      table map to allow fields to check master info.
    sql/field.h:
      Extending compatible_field_size() with flags from
      table map to allow fields to check master info.
    sql/log.cc:
      Removing table map flags since they are not used
      outside table map class.
    sql/log_event.cc:
      Removing flags parameter from table map constructor
      since it is not used and does not have to be exposed.
    sql/log_event.h:
      Adding flag to denote that bit length for bit field type
      is exact and not potentially rounded to even bytes.
    sql/rpl_utility.cc:
      Adding fields to table_def to store table map flags.
    sql/rpl_utility.h:
      Removing obsolete comment and adding flags to store
      table map flags from master.
    2c5f439d
field.cc 288 KB