in pkg/datasource/sql/exec/at/insert_executor.go [461:513]
func (i *insertExecutor) getPkValuesByAuto(ctx context.Context, execCtx *types.ExecContext) (map[string][]interface{}, error) {
if !i.isAstStmtValid() {
return nil, nil
}
tableName, _ := i.parserCtx.GetTableName()
metaData, err := datasource.GetTableCache(types.DBTypeMySQL).GetTableMeta(ctx, i.execContext.DBName, tableName)
if err != nil {
return nil, err
}
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 := i.businesSQLResult.GetResult().RowsAffected()
if err != nil {
return nil, err
}
lastInsertId, err := i.businesSQLResult.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 i.autoGeneratePks(execCtx, autoColumnName, lastInsertId, updateCount)
}
if lastInsertId > 0 {
var pkValues []interface{}
pkValues = append(pkValues, lastInsertId)
pkValuesMap[autoColumnName] = pkValues
return pkValuesMap, nil
}
return nil, nil
}