• Sachin Setiya's avatar
    MDEV-14586 Assertion `0' failed in retrieve_auto_increment ... · 94da1cb4
    Sachin Setiya authored
    Problem:-
     If we create table using myisam/aria then this crashes the server.
      CREATE TABLE t1(a bit(1), b int auto_increment , index(a,b));
      insert into t1 values(1,1);
     Or this query
      CREATE TABLE t1 (b BIT(1), pk INTEGER AUTO_INCREMENT PRIMARY KEY);
      ALTER TABLE t1 ADD INDEX(b,pk);
      INSERT INTO t1 VALUES (1,b'1');
      ALTER TABLE t1 DROP PRIMARY KEY;
    
    Reason:-
     The reason for this is
     1st- find_ref_key() finds what key an auto_increment field belongs to by
      comparing key_part->offset and field->ptr. But BIT fields might have
      zero length in the record, so a key might have many key parts with the
      same offset. That is, comparing offsets cannot uniquely identify the
      correct key part.
     2nd- Since next_number_key_offset is zero it myisam/aria will think that
      auto_increment is in first part of key.
     3nd- myisam/aria will call retrieve_auto_key which will see first key_part
      field as a bit field and call assert(0)
    
    Solution:-
      Many key parts might have the same offset, but BIT fields do not
      support auto_increment. So, we can skip all key parts over BIT fields,
      and then comparing offsets will be unambiguous.
    94da1cb4
mdev_14586.test 1.08 KB