Skip to content

Commit

Permalink
Merge pull request #25 from ken39arg/hotfix/diff-nochange-foreign-key
Browse files Browse the repository at this point in the history
Hotfix/diff nochange foreign key
  • Loading branch information
soh335 committed Feb 17, 2017
2 parents 1acd6f7 + d8a270f commit 6ee98d3
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 19 deletions.
19 changes: 16 additions & 3 deletions diff/diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ func dropTableIndexes(ctx *alterCtx, dst io.Writer) (int64, error) {
continue
}

if !indexStmt.HasName() {
if !indexStmt.HasName() && !indexStmt.HasSymbol() {
return 0, errors.Errorf("can not drop index without name: %s", indexStmt.ID())
}

Expand All @@ -422,8 +422,21 @@ func dropTableIndexes(ctx *alterCtx, dst io.Writer) (int64, error) {
}
buf.WriteString("ALTER TABLE `")
buf.WriteString(ctx.from.Name())
buf.WriteString("` DROP INDEX `")
buf.WriteString(indexStmt.Name())
if indexStmt.IsForeginKey() {
buf.WriteString("` DROP FOREIGN KEY `")
if indexStmt.HasSymbol() {
buf.WriteString(indexStmt.Symbol())
} else {
buf.WriteString(indexStmt.Name())
}
} else {
buf.WriteString("` DROP INDEX `")
if !indexStmt.HasName() {
buf.WriteString(indexStmt.Symbol())
} else {
buf.WriteString(indexStmt.Name())
}
}
buf.WriteString("`;")
}

Expand Down
18 changes: 18 additions & 0 deletions diff/diff_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,24 @@ func TestDiff(t *testing.T) {
After: "CREATE TABLE `fuga` ( `id` INTEGER NOT NULL AUTO_INCREMENT, CONSTRAINT `symbol` UNIQUE KEY `uniq_id` USING BTREE (`id`) );",
Expect: "",
},
// not change FOREIGN KEY
{
Before: "CREATE TABLE `fuga` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `fid` INTEGER NOT NULL, FOREIGN KEY fk (fid) REFERENCES f (id) );",
After: "CREATE TABLE `fuga` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `fid` INTEGER NOT NULL, FOREIGN KEY fk (fid) REFERENCES f (id) );",
Expect: "",
},
// change CONSTRAINT symbol naml
{
Before: "CREATE TABLE `fuga` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `fid` INTEGER NOT NULL, CONSTRAINT `fsym` FOREIGN KEY (fid) REFERENCES f (id) );",
After: "CREATE TABLE `fuga` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `fid` INTEGER NOT NULL, CONSTRAINT `ksym` FOREIGN KEY (fid) REFERENCES f (id) );",
Expect: "ALTER TABLE `fuga` DROP FOREIGN KEY `fsym`;\nALTER TABLE `fuga` ADD CONSTRAINT `ksym` FOREIGN KEY (`fid`) REFERENCES `f` (`id`);",
},
// remove FOREIGN KEY
{
Before: "CREATE TABLE `fuga` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `fid` INTEGER NOT NULL, FOREIGN KEY fk (fid) REFERENCES f (id) );",
After: "CREATE TABLE `fuga` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `fid` INTEGER NOT NULL, INDEX fid (fid) );",
Expect: "ALTER TABLE `fuga` DROP FOREIGN KEY `fk`;\nALTER TABLE `fuga` ADD INDEX `fid` (`fid`);",
},
// multi modify
{
Before: "CREATE TABLE `fuga` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `aid` INTEGER NOT NULL, `bid` INTEGER NOT NULL, INDEX `ab` (`aid`, `bid`) );",
Expand Down
2 changes: 1 addition & 1 deletion format/format_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ func TestFormat(t *testing.T) {
opt := model.NewTableOption("ENGINE", "InnoDB", false)
table.AddOption(opt)

index := model.NewIndex(model.IndexKindPrimaryKey)
index := model.NewIndex(model.IndexKindPrimaryKey, table.ID())
index.SetName("hoge_pk")
index.AddColumns("fuga")
table.AddIndex(index)
Expand Down
21 changes: 16 additions & 5 deletions model/index.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,37 @@ package model
import (
"crypto/sha256"
"fmt"
"io"
)

// NewIndex creates a new index with the given index kind.
func NewIndex(kind IndexKind) Index {
func NewIndex(kind IndexKind, table string) Index {
return &index{
kind: kind,
kind: kind,
table: table,
}
}

func (stmt *index) ID() string {
// This is tricky. and index may or may not have a name. It would
// have been so much easier if we did, but we don't, so we'll fake
// something
// something.
//
// In case we don't have a name, we need to know the table, the kind,
// the type, // the column(s), and the reference(s).
name := "index"
if stmt.HasName() {
name = name + "#" + stmt.Name()
}
h := sha256.New()
io.WriteString(h, fmt.Sprintf("%v", stmt))
fmt.Fprintf(h,
"%s.%s,%s.%s.%v.%s",
stmt.table,
stmt.Symbol(),
stmt.kind,
stmt.typ,
stmt.columns,
stmt.reference,
)
return fmt.Sprintf("%s#%x", name, h.Sum(nil))
}

Expand Down
1 change: 1 addition & 0 deletions model/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ type index struct {
kind IndexKind
name maybeString
typ IndexType
table string
columns []string
// TODO Options.
reference Reference
Expand Down
2 changes: 1 addition & 1 deletion model/model_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ func TestStatement(t *testing.T) {
stmts = append(stmts, model.NewDatabase("test"))
stmts = append(stmts, model.NewTable("test"))
stmts = append(stmts, model.NewTableColumn("test"))
stmts = append(stmts, model.NewIndex(model.IndexKindPrimaryKey))
stmts = append(stmts, model.NewIndex(model.IndexKindPrimaryKey, stmts[1].ID()))
}
18 changes: 9 additions & 9 deletions parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -360,17 +360,17 @@ func (p *Parser) parseTableConstraint(ctx *parseCtx, table model.Table) error {
var index model.Index
switch t := ctx.peek(); t.Type {
case PRIMARY:
index = model.NewIndex(model.IndexKindPrimaryKey)
index = model.NewIndex(model.IndexKindPrimaryKey, table.ID())
if err := p.parseColumnIndexPrimaryKey(ctx, index); err != nil {
return err
}
case UNIQUE:
index = model.NewIndex(model.IndexKindUnique)
index = model.NewIndex(model.IndexKindUnique, table.ID())
if err := p.parseColumnIndexUniqueKey(ctx, index); err != nil {
return err
}
case FOREIGN:
index = model.NewIndex(model.IndexKindForeignKey)
index = model.NewIndex(model.IndexKindForeignKey, table.ID())
if err := p.parseColumnIndexForeignKey(ctx, index); err != nil {
return err
}
Expand All @@ -387,7 +387,7 @@ func (p *Parser) parseTableConstraint(ctx *parseCtx, table model.Table) error {
}

func (p *Parser) parseTablePrimaryKey(ctx *parseCtx, table model.Table) error {
index := model.NewIndex(model.IndexKindPrimaryKey)
index := model.NewIndex(model.IndexKindPrimaryKey, table.ID())
if err := p.parseColumnIndexPrimaryKey(ctx, index); err != nil {
return err
}
Expand All @@ -396,7 +396,7 @@ func (p *Parser) parseTablePrimaryKey(ctx *parseCtx, table model.Table) error {
}

func (p *Parser) parseTableUniqueKey(ctx *parseCtx, table model.Table) error {
index := model.NewIndex(model.IndexKindUnique)
index := model.NewIndex(model.IndexKindUnique, table.ID())
if err := p.parseColumnIndexUniqueKey(ctx, index); err != nil {
return err
}
Expand All @@ -405,7 +405,7 @@ func (p *Parser) parseTableUniqueKey(ctx *parseCtx, table model.Table) error {
}

func (p *Parser) parseTableIndex(ctx *parseCtx, table model.Table) error {
index := model.NewIndex(model.IndexKindNormal)
index := model.NewIndex(model.IndexKindNormal, table.ID())
if err := p.parseColumnIndexKey(ctx, index); err != nil {
return err
}
Expand All @@ -414,7 +414,7 @@ func (p *Parser) parseTableIndex(ctx *parseCtx, table model.Table) error {
}

func (p *Parser) parseTableFulltextIndex(ctx *parseCtx, table model.Table) error {
index := model.NewIndex(model.IndexKindFullText)
index := model.NewIndex(model.IndexKindFullText, table.ID())
if err := p.parseColumnIndexFullTextKey(ctx, index); err != nil {
return err
}
Expand All @@ -423,7 +423,7 @@ func (p *Parser) parseTableFulltextIndex(ctx *parseCtx, table model.Table) error
}

func (p *Parser) parseTableSpatialIndex(ctx *parseCtx, table model.Table) error {
index := model.NewIndex(model.IndexKindSpatial)
index := model.NewIndex(model.IndexKindSpatial, table.ID())
if err := p.parseColumnIndexSpatialKey(ctx, index); err != nil {
return err
}
Expand All @@ -432,7 +432,7 @@ func (p *Parser) parseTableSpatialIndex(ctx *parseCtx, table model.Table) error
}

func (p *Parser) parseTableForeignKey(ctx *parseCtx, table model.Table) error {
index := model.NewIndex(model.IndexKindForeignKey)
index := model.NewIndex(model.IndexKindForeignKey, table.ID())
if err := p.parseColumnIndexForeignKey(ctx, index); err != nil {
return err
}
Expand Down

0 comments on commit 6ee98d3

Please sign in to comment.