Skip to content

Commit

Permalink
sql: allow customize column diffing change (#3179)
Browse files Browse the repository at this point in the history
  • Loading branch information
a8m authored Oct 7, 2024
1 parent 22f2cea commit 3ab701a
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 23 deletions.
14 changes: 7 additions & 7 deletions sql/internal/sqlx/diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ import (
"ariga.io/atlas/sql/schema"
)

// NoChange can be returned by DiffDriver methods
// to indicate that no change is needed.
var NoChange = schema.Change(nil)

type (
// A Diff provides a generic schema.Differ for diffing schema elements.
//
Expand Down Expand Up @@ -48,7 +52,7 @@ type (
ViewAttrChanged(from, to *schema.View) bool

// ColumnChange returns the schema changes (if any) for migrating one column to the other.
ColumnChange(fromT *schema.Table, from, to *schema.Column) (schema.ChangeKind, error)
ColumnChange(fromT *schema.Table, from, to *schema.Column) (schema.Change, error)

// IndexAttrChanged reports if the index attributes were changed.
// For example, an index type or predicate (for partial indexes).
Expand Down Expand Up @@ -393,12 +397,8 @@ func (d *Diff) columnDiff(from, to *schema.Table, opts *schema.DiffOptions) ([]s
if err != nil {
return nil, err
}
if change != schema.NoChange {
all = append(all, &schema.ModifyColumn{
From: c1,
To: c2,
Change: change,
})
if change != NoChange {
all = append(all, change)
}
}
// Add columns.
Expand Down
21 changes: 14 additions & 7 deletions sql/mysql/diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,43 +112,50 @@ func (d *diff) TableAttrDiff(from, to *schema.Table) ([]schema.Change, error) {
}

// ColumnChange returns the schema changes (if any) for migrating one column to the other.
func (d *diff) ColumnChange(fromT *schema.Table, from, to *schema.Column) (schema.ChangeKind, error) {
func (d *diff) ColumnChange(fromT *schema.Table, from, to *schema.Column) (schema.Change, error) {
change := sqlx.CommentChange(from.Attrs, to.Attrs)
if from.Type.Null != to.Type.Null {
change |= schema.ChangeNull
}
changed, err := d.typeChanged(from, to)
if err != nil {
return schema.NoChange, err
return sqlx.NoChange, err
}
if changed {
change |= schema.ChangeType
}
if changed, err = d.defaultChanged(from, to); err != nil {
return schema.NoChange, err
return sqlx.NoChange, err
}
if changed {
change |= schema.ChangeDefault
}
if changed, err = d.generatedChanged(from, to); err != nil {
return schema.NoChange, err
return sqlx.NoChange, err
}
if changed {
change |= schema.ChangeGenerated
}
if changed, err = d.columnCharsetChanged(fromT, from, to); err != nil {
return schema.NoChange, err
return sqlx.NoChange, err
}
if changed {
change |= schema.ChangeCharset
}
if changed, err = d.columnCollateChanged(fromT, from, to); err != nil {
return schema.NoChange, err
return sqlx.NoChange, err
}
if changed {
change |= schema.ChangeCollate
}
return change, nil
if change.Is(schema.NoChange) {
return sqlx.NoChange, nil
}
return &schema.ModifyColumn{
Change: change,
From: from,
To: to,
}, nil
}

// IsGeneratedIndexName reports if the index name was generated by the database.
Expand Down
2 changes: 1 addition & 1 deletion sql/postgres/crdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func (cd *crdbDiff) Normalize(from, to *schema.Table, _ *schema.DiffOptions) err
return nil
}

func (cd *crdbDiff) ColumnChange(fromT *schema.Table, from, to *schema.Column) (schema.ChangeKind, error) {
func (cd *crdbDiff) ColumnChange(fromT *schema.Table, from, to *schema.Column) (schema.Change, error) {
// All serial types in Cockroach are implemented as bigint.
// See: https://www.cockroachlabs.com/docs/stable/serial.html#generated-values-for-mode-sql_sequence-and-sql_sequence_cached.
for _, c := range []*schema.Column{from, to} {
Expand Down
17 changes: 12 additions & 5 deletions sql/postgres/diff_oss.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,20 +76,20 @@ func (d *diff) TableAttrDiff(from, to *schema.Table) ([]schema.Change, error) {
}

// ColumnChange returns the schema changes (if any) for migrating one column to the other.
func (d *diff) ColumnChange(_ *schema.Table, from, to *schema.Column) (schema.ChangeKind, error) {
func (d *diff) ColumnChange(_ *schema.Table, from, to *schema.Column) (schema.Change, error) {
change := sqlx.CommentChange(from.Attrs, to.Attrs)
if from.Type.Null != to.Type.Null {
change |= schema.ChangeNull
}
changed, err := d.typeChanged(from, to)
if err != nil {
return schema.NoChange, err
return sqlx.NoChange, err
}
if changed {
change |= schema.ChangeType
}
if changed, err = d.defaultChanged(from, to); err != nil {
return schema.NoChange, err
return sqlx.NoChange, err
}
if changed {
change |= schema.ChangeDefault
Expand All @@ -98,12 +98,19 @@ func (d *diff) ColumnChange(_ *schema.Table, from, to *schema.Column) (schema.Ch
change |= schema.ChangeAttr
}
if changed, err = d.generatedChanged(from, to); err != nil {
return schema.NoChange, err
return sqlx.NoChange, err
}
if changed {
change |= schema.ChangeGenerated
}
return change, nil
if change.Is(schema.NoChange) {
return sqlx.NoChange, nil
}
return &schema.ModifyColumn{
Change: change,
From: from,
To: to,
}, nil
}

// defaultChanged reports if the default value of a column was changed.
Expand Down
13 changes: 10 additions & 3 deletions sql/sqlite/diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,14 @@ func (d *diff) ViewAttrChanged(_, _ *schema.View) bool {

// ColumnChange returns the schema changes (if any) for migrating one column to the other.
// Note that column comments are ignored as SQLite does not support it.
func (d *diff) ColumnChange(_ *schema.Table, from, to *schema.Column) (schema.ChangeKind, error) {
func (d *diff) ColumnChange(_ *schema.Table, from, to *schema.Column) (schema.Change, error) {
var change schema.ChangeKind
if from.Type.Null != to.Type.Null {
change |= schema.ChangeNull
}
changed, err := d.typeChanged(from, to)
if err != nil {
return schema.NoChange, err
return sqlx.NoChange, err
}
if changed {
change |= schema.ChangeType
Expand All @@ -82,7 +82,14 @@ func (d *diff) ColumnChange(_ *schema.Table, from, to *schema.Column) (schema.Ch
if d.generatedChanged(from, to) {
change |= schema.ChangeGenerated
}
return change, nil
if change.Is(schema.NoChange) {
return sqlx.NoChange, nil
}
return &schema.ModifyColumn{
Change: change,
From: from,
To: to,
}, nil
}

// typeChanged reports if the column type was changed.
Expand Down

0 comments on commit 3ab701a

Please sign in to comment.