• Gleb Shchepa's avatar
    Bug #37799: SELECT with a BIT column in WHERE clause · 54a59681
    Gleb Shchepa authored
                returns unexpected result
    
    If:
      1. a table has a not nullable BIT column c1 with a length
         shorter than 8 bits and some additional not nullable
         columns c2 etc, and
      2. the WHERE clause is like: (c1 = constant) AND c2 ...,
    the SELECT query returns unexpected result set.
    
    
    The server stores BIT columns in a tricky way to save disk
    space: if column's bit length is not divisible by 8, the
    server places reminder bits among the null bits at the start
    of a record. The rest bytes are stored in the record itself,
    and Field::ptr points to these rest bytes.
    
    However if a bit length of the whole column is less than 8,
    there are no remaining bytes, and there is nothing to store in
    the record at its regular place. In this case Field::ptr points
    to bytes actually occupied by the next column in a record.
    If both columns (BIT and the next column) are NOT NULL,
    the Field::eq function incorrectly deduces that this is the
    same column, so query transformation/equal item elimination
    code (see build_equal_items_for_cond) may mix these columns
    and damage conditions containing references to them.
    
    
    mysql-test/r/type_bit.result:
      Added test case for bug #37799.
    mysql-test/t/type_bit.test:
      Added test case for bug #37799.
    sql/field.h:
      1. The Field::eq function has been modified to take types of
      comparing columns into account to distinguish between BIT and
      not BIT columns referencing the same bytes in a record.
      
      2. Unnecessary type comparison has been removed from the
      Field_bit::eq function (moved to Field::eq).
    54a59681
field.h 64.3 KB