• Narayanan V's avatar
    Bug#38338: REPLACE causes last_insert_id() to return an incorrect value · d714d290
    Narayanan V authored
                      
    Fix the write_record function to record auto increment
    values in a consistent way.
    
    mysql-test/r/auto_increment.result:
      Updated the test result file with the output of the
      new test case added to verify this bug.
    mysql-test/t/auto_increment.test:
      Added a new test case to verify this bug.
    sql/sql_insert.cc:
      The algorithm for the write_record function
      in sql_insert.cc is (more emphasis given to
      the parts that deal with the autogenerated values)
      
      1) If a write fails
      
         1.1) save the autogenerated value to avoid 
              thd->insert_id_for_cur_row to become 0.
      
         1.2) <logic to handle INSERT ON DUPLICATE KEY
              UPDATE and REPLACE>
      
      2) record the first successful insert id.
      
      explanation of the failure
      --------------------------
      
      As long as 1.1) was executed 2) worked fine.
      
      1.1) was always executed when REPLACE worked 
           with the last row update optimization, but
           in cases where 1.1) was not executed 2)
           would fail and would result in the autogenerated
           value not being saved.
      
      solution
      --------
      
      repeat a check for thd->insert_id_for_cur_row 
      being zero similar to 1.1) before 2) and ensure
      that the correct value is saved.
    d714d290
auto_increment.result 10.3 KB