• Michael Widenius's avatar
    This fix+comments was originally made by Alexey Kopytov · af4eeaf5
    Michael Widenius authored
    LP bug #1035225 / MySQL bug #66301: INSERT ... ON DUPLICATE KEY UPDATE +
    innodb_autoinc_lock_mode=1 is broken
    
    The problem was that when certain INSERT ... ON DUPLICATE KEY UPDATE
    were executed concurrently on a table containing an AUTO_INCREMENT
    column as a primary key, InnoDB would correctly reserve non-overlapping
    AUTO_INCREMENT intervals for each statement, but when the server
    encountered the first duplicate key error on the secondary key in one of
    the statements and performed an UPDATE, it also updated the internal
    AUTO_INCREMENT value to the one from the existing row that caused a
    duplicate key error, even though the AUTO_INCREMENT value was not
    specified explicitly in the UPDATE clause. It would then proceed with
    using AUTO_INCREMENT values the range reserved previously by another
    statement, causing duplicate key errors on the AUTO_INCREMENT column.
    
    Fixed by changing write_record() to ensure that in case of a duplicate
    key error the internal AUTO_INCREMENT counter is only updated when the
    AUTO_INCREMENT value was explicitly updated by the UPDATE
    clause. Otherwise it is restored to what it was before the duplicate key
    error, as that value is unused and can be reused for subsequent
    successfully inserted rows.
    
    sql/sql_insert.cc:
      Don't update next_insert_id to the value of a row found during ON DUPLICATE KEY UPDATE.
    sql/sql_parse.cc:
      Added DBUG_SYNC
    sql/table.h:
      Added next_number_field_updated flag to detect changing of auto increment fields.
      Moved fields a bit to get bool fields after each other (better alignment)
    af4eeaf5
table.h 80 KB