package mysql import ( "errors" "fmt" "testing" mysqldrv "github.com/go-sql-driver/mysql" ) // 只有「对方已经建好了」这类冲突才重试;其余错误(权限、语法、连接断开)照旧直接返回。 func TestIsConcurrentDDLConflict(t *testing.T) { cases := map[error]bool{ &mysqldrv.MySQLError{Number: 1060, Message: "Duplicate column name 'computeuser'"}: true, &mysqldrv.MySQLError{Number: 1050, Message: "Table already exists"}: true, &mysqldrv.MySQLError{Number: 1061, Message: "Duplicate key name"}: true, fmt.Errorf("wrap: %w", &mysqldrv.MySQLError{Number: 1060}): true, &mysqldrv.MySQLError{Number: 1142, Message: "ALTER command denied"}: false, errors.New("driver: bad connection"): false, } for err, want := range cases { if got := isConcurrentDDLConflict(err); got != want { t.Errorf("%v → %v, want %v", err, got, want) } } }