• Daniel Black's avatar
    MDEV-32018 Allow the setting of Auto_increment on FK referenced columns · 1182451a
    Daniel Black authored
    In MDEV-31086, SET FOREIGN_KEY_CHECKS=0 cannot bypass checks that
    make column types of foreign keys incompatible. An unfortunate
    consequence is that adding an AUTO_INCREMENT is considered
    incompatible in Field_{num,decimal}::is_equal and for the purpose
    of FK checks this isn't relevant.
    
    innodb.foreign_key - pragmaticly left wait_until_count_sessions.inc at
    end of test to match the second line of test.
    
    Reporter: horrockss@github - https://github.com/MariaDB/mariadb-docker/issues/528
    Co-Author: Marko Mäkelä <marko.makela@mariadb.com>
    Reviewer: Nikita Malyavin
    
    For the future reader this was attempted:
    
    Removing AUTO_INCREMENT checks from Field_{num,decimal}::is_equals
    failed in the following locations (noted for future fixing):
    * MyISAM and Aria (not InnoDB) don't adjust AUTO_INCREMENT next number
      correctly, hence added a test to main.auto_increment to catch
      the next person that attempts this fix.
    * InnoDB must perform an ALGORITHM=COPY to populate NULL values of
      an original table (MDEV-19190 mtr test period.copy), this requires
      ALTER_STORED_COLUMN_TYPE to be set in fill_alter_inplace_info
      which doesn't get hit because field->is_equal is true.
    * InnoDB must not perform the change inplace (below patch)
    * innodb.innodb-alter-timestamp main.partition_innodb test would
      also need futher investigation.
    
    InnoDB ha_innobase::check_if_supported_inplace_alter to support the
    removal of Field_{num,decimal}::is_equal AUTO_INCREMENT checks would need the following change
    
    diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc
    index a5ccb1957f3..9d778e2d39a 100644
    --- a/storage/innobase/handler/handler0alter.cc
    +++ b/storage/innobase/handler/handler0alter.cc
    @@ -2455,10 +2455,15 @@ ha_innobase::check_if_supported_inplace_alter(
                            /* An AUTO_INCREMENT attribute can only
                            be added to an existing column by ALGORITHM=COPY,
                            but we can remove the attribute. */
    -                       ut_ad((MTYP_TYPENR((*af)->unireg_check)
    -                              != Field::NEXT_NUMBER)
    -                             || (MTYP_TYPENR(f->unireg_check)
    -                                 == Field::NEXT_NUMBER));
    +                       if ((MTYP_TYPENR((*af)->unireg_check)
    +                              == Field::NEXT_NUMBER)
    +                             && (MTYP_TYPENR(f->unireg_check)
    +                                 != Field::NEXT_NUMBER))
    +                       {
    +                               ha_alter_info->unsupported_reason = my_get_err_msg(
    +                                       ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC);
    +                               DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED);
    +                       }
    
    With this change the main.auto_increment test for bug #14573, under
    innodb, will pass without the 2 --error ER_DUP_ENTRY entries.
    
    The function header comment was updated to reflect the MDEV-31086
    changes.
    1182451a
foreign_key.result 30.2 KB