Skip to content

Commit

Permalink
sql/mysql: detect CHANGE COLUMN changes (#2719)
Browse files Browse the repository at this point in the history
  • Loading branch information
a8m committed Apr 25, 2024
1 parent 13b0850 commit 7d858b5
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 11 deletions.
7 changes: 6 additions & 1 deletion sql/mysql/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -398,7 +398,12 @@ func (s *state) alterTable(t *schema.Table, changes []schema.Change) error {
if err := checkChangeGenerated(change.From, change.To); err != nil {
return err
}
b.P("MODIFY COLUMN")
// In case the column was both modified and renamed.
if change.To.Name != change.From.Name {
b.P("CHANGE COLUMN").Ident(change.From.Name)
} else {
b.P("MODIFY COLUMN")
}
if err := s.column(b, t, change.To); err != nil {
return err
}
Expand Down
14 changes: 11 additions & 3 deletions sql/mysql/migrate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -959,22 +959,30 @@ func TestPlanChanges(t *testing.T) {
changes: []schema.Change{
&schema.ModifyTable{
T: schema.NewTable("users").
AddColumns(schema.NewIntColumn("c", "int").SetGeneratedExpr(&schema.GeneratedExpr{Expr: "1", Type: "STORED"})),
AddColumns(
schema.NewIntColumn("c", "int").SetGeneratedExpr(&schema.GeneratedExpr{Expr: "1", Type: "STORED"}),
schema.NewIntColumn("c1", "int").SetGeneratedExpr(&schema.GeneratedExpr{Expr: "1", Type: "STORED"}),
),
Changes: []schema.Change{
&schema.ModifyColumn{
Change: schema.ChangeGenerated,
From: schema.NewIntColumn("c", "int"),
To: schema.NewIntColumn("c", "int").SetGeneratedExpr(&schema.GeneratedExpr{Expr: "1", Type: "STORED"}),
},
&schema.ModifyColumn{
Change: schema.ChangeGenerated,
From: schema.NewIntColumn("c0", "int"),
To: schema.NewIntColumn("c1", "int").SetGeneratedExpr(&schema.GeneratedExpr{Expr: "1", Type: "STORED"}),
},
},
},
},
wantPlan: &migrate.Plan{
Reversible: true,
Changes: []*migrate.Change{
{
Cmd: "ALTER TABLE `users` MODIFY COLUMN `c` int AS (1) STORED NOT NULL",
Reverse: "ALTER TABLE `users` MODIFY COLUMN `c` int NOT NULL",
Cmd: "ALTER TABLE `users` MODIFY COLUMN `c` int AS (1) STORED NOT NULL, CHANGE COLUMN `c0` `c1` int AS (1) STORED NOT NULL",
Reverse: "ALTER TABLE `users` CHANGE COLUMN `c1` `c0` int NOT NULL, MODIFY COLUMN `c` int NOT NULL",
},
},
},
Expand Down
24 changes: 17 additions & 7 deletions sql/sqlcheck/incompatible/incompatible.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,23 @@ func (a *Analyzer) Analyze(_ context.Context, p *sqlcheck.Pass) error {
}
case *schema.ModifyTable:
for j := range c.Changes {
r, ok := c.Changes[j].(*schema.RenameColumn)
if ok && p.File.TableSpan(c.T)&sqlcheck.SpanAdded == 0 && !wasAddedBack(p.File.Changes[i:], r.From) {
diags = append(diags, sqlcheck.Diagnostic{
Code: codeRenameC,
Pos: sc.Stmt.Pos,
Text: fmt.Sprintf("Renaming column %q to %q", r.From.Name, r.To.Name),
})
switch mc := c.Changes[j].(type) {
case *schema.RenameColumn:
if p.File.TableSpan(c.T)&sqlcheck.SpanAdded == 0 && !wasAddedBack(p.File.Changes[i:], mc.From) {
diags = append(diags, sqlcheck.Diagnostic{
Code: codeRenameC,
Pos: sc.Stmt.Pos,
Text: fmt.Sprintf("Renaming column %q to %q", mc.From.Name, mc.To.Name),
})
}
case *schema.ModifyColumn:
if p.File.TableSpan(c.T)&sqlcheck.SpanAdded == 0 && mc.From.Name != mc.To.Name && !wasAddedBack(p.File.Changes[i:], mc.From) {
diags = append(diags, sqlcheck.Diagnostic{
Code: codeRenameC,
Pos: sc.Stmt.Pos,
Text: fmt.Sprintf("Renaming column %q to %q", mc.From.Name, mc.To.Name),
})
}
}
}
}
Expand Down

0 comments on commit 7d858b5

Please sign in to comment.