in pkg/datasource/sql/undo/builder/mysql_insert_undo_log_builder.go [398:445]
func (u *MySQLInsertUndoLogBuilder) getPkValuesByAuto(execCtx *types.ExecContext) (map[string][]interface{}, error) {
if execCtx == nil || execCtx.ParseContext == nil || execCtx.ParseContext.InsertStmt == nil {
return nil, nil
}
tableName := execCtx.ParseContext.InsertStmt.Table.TableRefs.Left.(*ast.TableSource).Source.(*ast.TableName).Name.O
metaData := execCtx.MetaDataMap[tableName]
pkValuesMap := make(map[string][]interface{})
pkMetaMap := metaData.GetPrimaryKeyMap()
if len(pkMetaMap) == 0 {
return nil, fmt.Errorf("pk map is empty")
}
var autoColumnName string
for _, columnMeta := range pkMetaMap {
tmpColumnMeta := columnMeta
if tmpColumnMeta.Autoincrement {
autoColumnName = tmpColumnMeta.ColumnName
break
}
}
if len(autoColumnName) == 0 {
return nil, fmt.Errorf("auto increment column not exist")
}
updateCount, err := u.InsertResult.GetResult().RowsAffected()
if err != nil {
return nil, err
}
lastInsertId, err := u.InsertResult.GetResult().LastInsertId()
if err != nil {
return nil, err
}
// If there is batch insert
// do auto increment base LAST_INSERT_ID and variable `auto_increment_increment`
if lastInsertId > 0 && updateCount > 1 && canAutoIncrement(pkMetaMap) {
return u.autoGeneratePks(execCtx, autoColumnName, lastInsertId, updateCount)
}
if lastInsertId > 0 {
var pkValues []interface{}
pkValues = append(pkValues, lastInsertId)
pkValuesMap[autoColumnName] = pkValues
return pkValuesMap, nil
}
return nil, nil
}