Skip to content

Commit

Permalink
*every change is now in a separate transaction as per the cockroach d…
Browse files Browse the repository at this point in the history
…ev's suggestion (cockroachdb/cockroach#21032). It's ugly as sin, but works perfectly
  • Loading branch information
mclark4386 authored and markbates committed Jan 9, 2018
1 parent 9d6e9a7 commit da6a949
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 33 deletions.
30 changes: 15 additions & 15 deletions fizz/translators/cockroach.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func (p *Cockroach) CreateTable(t fizz.Table) (string, error) {
}
cols = append(cols, s)
}
s = fmt.Sprintf("CREATE TABLE \"%s\" (\n%s\n);", t.Name, strings.Join(cols, ",\n"))
s = fmt.Sprintf("CREATE TABLE \"%s\" (\n%s\n);COMMIT TRANSACTION;BEGIN TRANSACTION;", t.Name, strings.Join(cols, ",\n"))
sql = append(sql, s)

for _, i := range t.Indexes {
Expand All @@ -64,7 +64,7 @@ func (p *Cockroach) CreateTable(t fizz.Table) (string, error) {

func (p *Cockroach) DropTable(t fizz.Table) (string, error) {
p.Schema.Delete(t.Name)
return fmt.Sprintf("DROP TABLE \"%s\";", t.Name), nil
return fmt.Sprintf("DROP TABLE \"%s\";COMMIT TRANSACTION;BEGIN TRANSACTION;", t.Name), nil
}

func (p *Cockroach) RenameTable(t []fizz.Table) (string, error) {
Expand All @@ -79,7 +79,7 @@ func (p *Cockroach) RenameTable(t []fizz.Table) (string, error) {
}
tableInfo.Name = newName

return fmt.Sprintf("ALTER TABLE \"%s\" RENAME TO \"%s\";", oldName, newName), nil
return fmt.Sprintf("ALTER TABLE \"%s\" RENAME TO \"%s\";COMMIT TRANSACTION;BEGIN TRANSACTION;", oldName, newName), nil
}

func (p *Cockroach) ChangeColumn(t fizz.Table) (string, error) {
Expand Down Expand Up @@ -109,8 +109,8 @@ func (p *Cockroach) ChangeColumn(t fizz.Table) (string, error) {
return "", err1
}

createColumnSQL := fmt.Sprintf("ALTER TABLE \"%s\" ADD COLUMN %s;", table.Name, p.buildAddColumn(newCol))
ins := fmt.Sprintf("UPDATE \"%s\" SET \"%s\" = \"%s\";", t.Name, c.Name, tempCol)
createColumnSQL := fmt.Sprintf("ALTER TABLE \"%s\" ADD COLUMN %s;COMMIT TRANSACTION;BEGIN TRANSACTION;", table.Name, p.buildAddColumn(newCol))
ins := fmt.Sprintf("UPDATE \"%s\" SET \"%s\" = \"%s\";COMMIT TRANSACTION;BEGIN TRANSACTION;", t.Name, c.Name, tempCol)
return strings.Join([]string{createColumnSQL, ins}, "\n"), nil
})

Expand All @@ -128,7 +128,7 @@ func (p *Cockroach) AddColumn(t fizz.Table) (string, error) {
return "", errors.New("Not enough columns supplied!")
}
c := t.Columns[0]
s := fmt.Sprintf("ALTER TABLE \"%s\" ADD COLUMN %s;", t.Name, p.buildAddColumn(c))
s := fmt.Sprintf("ALTER TABLE \"%s\" ADD COLUMN %s;COMMIT TRANSACTION;BEGIN TRANSACTION;", t.Name, p.buildAddColumn(c))

//Update schema cache if we can
tableInfo, err := p.Schema.TableInfo(t.Name)
Expand All @@ -154,7 +154,7 @@ func (p *Cockroach) DropColumn(t fizz.Table) (string, error) {
}
c := t.Columns[0]
p.Schema.DeleteColumn(t.Name, c.Name)
return fmt.Sprintf("ALTER TABLE \"%s\" DROP COLUMN \"%s\";", t.Name, c.Name), nil
return fmt.Sprintf("ALTER TABLE \"%s\" DROP COLUMN \"%s\";COMMIT TRANSACTION;BEGIN TRANSACTION;", t.Name, c.Name), nil
}

func (p *Cockroach) RenameColumn(t fizz.Table) (string, error) {
Expand All @@ -176,7 +176,7 @@ func (p *Cockroach) RenameColumn(t fizz.Table) (string, error) {
}
}

s := fmt.Sprintf("ALTER TABLE \"%s\" RENAME COLUMN \"%s\" TO \"%s\";", t.Name, oc.Name, nc.Name)
s := fmt.Sprintf("ALTER TABLE \"%s\" RENAME COLUMN \"%s\" TO \"%s\";COMMIT TRANSACTION;BEGIN TRANSACTION;", t.Name, oc.Name, nc.Name)
return s, nil
}

Expand All @@ -185,7 +185,7 @@ func (p *Cockroach) AddIndex(t fizz.Table) (string, error) {
return "", errors.New("Not enough indexes supplied!")
}
i := t.Indexes[0]
s := fmt.Sprintf("CREATE INDEX \"%s\" ON \"%s\" (%s);", i.Name, t.Name, strings.Join(i.Columns, ", "))
s := fmt.Sprintf("CREATE INDEX \"%s\" ON \"%s\" (%s);COMMIT TRANSACTION;BEGIN TRANSACTION;", i.Name, t.Name, strings.Join(i.Columns, ", "))
if i.Unique {
s = strings.Replace(s, "CREATE", "CREATE UNIQUE", 1)
}
Expand Down Expand Up @@ -218,7 +218,7 @@ func (p *Cockroach) DropIndex(t fizz.Table) (string, error) {
}
tableInfo.Indexes = newIndexes

return fmt.Sprintf("DROP INDEX IF EXISTS \"%s\";", i.Name), nil
return fmt.Sprintf("DROP INDEX IF EXISTS \"%s\";COMMIT TRANSACTION;BEGIN TRANSACTION;", i.Name), nil
}

func (p *Cockroach) RenameIndex(t fizz.Table) (string, error) {
Expand All @@ -240,7 +240,7 @@ func (p *Cockroach) RenameIndex(t fizz.Table) (string, error) {
}
}

return fmt.Sprintf("ALTER INDEX \"%s\"@\"%s\" RENAME TO \"%s\";", t.Name, oi.Name, ni.Name), nil
return fmt.Sprintf("ALTER INDEX \"%s\"@\"%s\" RENAME TO \"%s\";COMMIT TRANSACTION;BEGIN TRANSACTION;", t.Name, oi.Name, ni.Name), nil
}

func (p *Cockroach) buildAddColumn(c fizz.Column) string {
Expand Down Expand Up @@ -283,12 +283,12 @@ func (p *Cockroach) buildChangeColumn(oldCol fizz.Column, c fizz.Column) fizz.Co
func (p *Cockroach) withTempTable(table string, fn func(fizz.Table) (string, error)) (string, error) {
tempTable := fizz.Table{Name: fmt.Sprintf("_%s_tmp", table)}

sql := []string{fmt.Sprintf("ALTER TABLE \"%s\" RENAME TO \"%s\";", table, tempTable.Name)}
sql := []string{fmt.Sprintf("ALTER TABLE \"%s\" RENAME TO \"%s\";COMMIT TRANSACTION;BEGIN TRANSACTION;", table, tempTable.Name)}
s, err := fn(tempTable)
if err != nil {
return "", err
}
sql = append(sql, s, fmt.Sprintf("DROP TABLE \"%s\";", tempTable.Name))
sql = append(sql, s, fmt.Sprintf("DROP TABLE \"%s\";COMMIT TRANSACTION;BEGIN TRANSACTION;", tempTable.Name))

return strings.Join(sql, "\n"), nil
}
Expand All @@ -305,13 +305,13 @@ func (p *Cockroach) withTempColumn(tableName string, column string, fn func(fizz

tempCol := fmt.Sprintf("_%s_tmp", column)

sql := []string{fmt.Sprintf("ALTER TABLE \"%s\" RENAME COLUMN \"%s\" TO \"%s\";", tableName, column, tempCol)}
sql := []string{fmt.Sprintf("ALTER TABLE \"%s\" RENAME COLUMN \"%s\" TO \"%s\";COMMIT TRANSACTION;BEGIN TRANSACTION;", tableName, column, tempCol)}

s, err := fn(*table, *col, tempCol)
if err != nil {
return "", err
}
sql = append(sql, s, fmt.Sprintf("ALTER TABLE \"%s\" DROP COLUMN \"%s\";", tableName, tempCol))
sql = append(sql, s, fmt.Sprintf("ALTER TABLE \"%s\" DROP COLUMN \"%s\";COMMIT TRANSACTION;BEGIN TRANSACTION;", tableName, tempCol))

return strings.Join(sql, "\n"), nil
}
Expand Down
34 changes: 17 additions & 17 deletions fizz/translators/cockroach_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func (p *CockroachSuite) Test_Cockroach_CreateTable() {
"company_id" UUID NOT NULL DEFAULT uuid_generate_v1(),
"created_at" timestamp NOT NULL,
"updated_at" timestamp NOT NULL
);`
);COMMIT TRANSACTION;BEGIN TRANSACTION;`

res, _ := fizz.AString(`
create_table("users", func(t) {
Expand All @@ -66,7 +66,7 @@ func (p *CockroachSuite) Test_Cockroach_CreateTable_UUID() {
"uuid" UUID PRIMARY KEY,
"created_at" timestamp NOT NULL,
"updated_at" timestamp NOT NULL
);`
);COMMIT TRANSACTION;BEGIN TRANSACTION;`

res, _ := fizz.AString(`
create_table("users", func(t) {
Expand All @@ -84,7 +84,7 @@ func (p *CockroachSuite) Test_Cockroach_CreateTable_UUID() {
func (p *CockroachSuite) Test_Cockroach_DropTable() {
r := p.Require()

ddl := `DROP TABLE "users";`
ddl := `DROP TABLE "users";COMMIT TRANSACTION;BEGIN TRANSACTION;`

res, _ := fizz.AString(`drop_table("users")`, p.crdbt())
r.Equal(ddl, res)
Expand All @@ -93,7 +93,7 @@ func (p *CockroachSuite) Test_Cockroach_DropTable() {
func (p *CockroachSuite) Test_Cockroach_RenameTable() {
r := p.Require()

ddl := `ALTER TABLE "users" RENAME TO "people";`
ddl := `ALTER TABLE "users" RENAME TO "people";COMMIT TRANSACTION;BEGIN TRANSACTION;`

res, _ := fizz.AString(`rename_table("users", "people")`, p.crdbt())
r.Equal(ddl, res)
Expand All @@ -108,10 +108,10 @@ func (p *CockroachSuite) Test_Cockroach_RenameTable_NotEnoughValues() {

func (p *CockroachSuite) Test_Cockroach_ChangeColumn() {
r := p.Require()
ddl := `ALTER TABLE "mytable" RENAME COLUMN "mycolumn" TO "_mycolumn_tmp";
ALTER TABLE "mytable" ADD COLUMN "mycolumn" VARCHAR (50) NOT NULL DEFAULT 'foo';
UPDATE "mytable" SET "mycolumn" = "_mycolumn_tmp";
ALTER TABLE "mytable" DROP COLUMN "_mycolumn_tmp";`
ddl := `ALTER TABLE "mytable" RENAME COLUMN "mycolumn" TO "_mycolumn_tmp";COMMIT TRANSACTION;BEGIN TRANSACTION;
ALTER TABLE "mytable" ADD COLUMN "mycolumn" VARCHAR (50) NOT NULL DEFAULT 'foo';COMMIT TRANSACTION;BEGIN TRANSACTION;
UPDATE "mytable" SET "mycolumn" = "_mycolumn_tmp";COMMIT TRANSACTION;BEGIN TRANSACTION;
ALTER TABLE "mytable" DROP COLUMN "_mycolumn_tmp";COMMIT TRANSACTION;BEGIN TRANSACTION;`

res, _ := fizz.AString(`change_column("mytable", "mycolumn", "string", {"default": "foo", "size": 50})`, p.crdbt())

Expand All @@ -120,7 +120,7 @@ ALTER TABLE "mytable" DROP COLUMN "_mycolumn_tmp";`

func (p *CockroachSuite) Test_Cockroach_AddColumn() {
r := p.Require()
ddl := `ALTER TABLE "mytable" ADD COLUMN "mycolumn" VARCHAR (50) NOT NULL DEFAULT 'foo';`
ddl := `ALTER TABLE "mytable" ADD COLUMN "mycolumn" VARCHAR (50) NOT NULL DEFAULT 'foo';COMMIT TRANSACTION;BEGIN TRANSACTION;`

res, _ := fizz.AString(`add_column("mytable", "mycolumn", "string", {"default": "foo", "size": 50})`, p.crdbt())

Expand All @@ -129,7 +129,7 @@ func (p *CockroachSuite) Test_Cockroach_AddColumn() {

func (p *CockroachSuite) Test_Cockroach_DropColumn() {
r := p.Require()
ddl := `ALTER TABLE "table_name" DROP COLUMN "column_name";`
ddl := `ALTER TABLE "table_name" DROP COLUMN "column_name";COMMIT TRANSACTION;BEGIN TRANSACTION;`

res, _ := fizz.AString(`drop_column("table_name", "column_name")`, p.crdbt())

Expand All @@ -138,47 +138,47 @@ func (p *CockroachSuite) Test_Cockroach_DropColumn() {

func (p *CockroachSuite) Test_Cockroach_RenameColumn() {
r := p.Require()
ddl := `ALTER TABLE "table_name" RENAME COLUMN "old_column" TO "new_column";`
ddl := `ALTER TABLE "table_name" RENAME COLUMN "old_column" TO "new_column";COMMIT TRANSACTION;BEGIN TRANSACTION;`

res, _ := fizz.AString(`rename_column("table_name", "old_column", "new_column")`, p.crdbt())
r.Equal(ddl, res)
}

func (p *CockroachSuite) Test_Cockroach_AddIndex() {
r := p.Require()
ddl := `CREATE INDEX "table_name_column_name_idx" ON "table_name" (column_name);`
ddl := `CREATE INDEX "table_name_column_name_idx" ON "table_name" (column_name);COMMIT TRANSACTION;BEGIN TRANSACTION;`

res, _ := fizz.AString(`add_index("table_name", "column_name", {})`, p.crdbt())
r.Equal(ddl, res)
}

func (p *CockroachSuite) Test_Cockroach_AddIndex_Unique() {
r := p.Require()
ddl := `CREATE UNIQUE INDEX "table_name_column_name_idx" ON "table_name" (column_name);`
ddl := `CREATE UNIQUE INDEX "table_name_column_name_idx" ON "table_name" (column_name);COMMIT TRANSACTION;BEGIN TRANSACTION;`

res, _ := fizz.AString(`add_index("table_name", "column_name", {"unique": true})`, p.crdbt())
r.Equal(ddl, res)
}

func (p *CockroachSuite) Test_Cockroach_AddIndex_MultiColumn() {
r := p.Require()
ddl := `CREATE INDEX "table_name_col1_col2_col3_idx" ON "table_name" (col1, col2, col3);`
ddl := `CREATE INDEX "table_name_col1_col2_col3_idx" ON "table_name" (col1, col2, col3);COMMIT TRANSACTION;BEGIN TRANSACTION;`

res, _ := fizz.AString(`add_index("table_name", ["col1", "col2", "col3"], {})`, p.crdbt())
r.Equal(ddl, res)
}

func (p *CockroachSuite) Test_Cockroach_AddIndex_CustomName() {
r := p.Require()
ddl := `CREATE INDEX "custom_name" ON "table_name" (column_name);`
ddl := `CREATE INDEX "custom_name" ON "table_name" (column_name);COMMIT TRANSACTION;BEGIN TRANSACTION;`

res, _ := fizz.AString(`add_index("table_name", "column_name", {"name": "custom_name"})`, p.crdbt())
r.Equal(ddl, res)
}

func (p *CockroachSuite) Test_Cockroach_DropIndex() {
r := p.Require()
ddl := `DROP INDEX IF EXISTS "my_idx";`
ddl := `DROP INDEX IF EXISTS "my_idx";COMMIT TRANSACTION;BEGIN TRANSACTION;`

res, _ := fizz.AString(`drop_index("users", "my_idx")`, p.crdbt())
r.Equal(ddl, res)
Expand All @@ -187,7 +187,7 @@ func (p *CockroachSuite) Test_Cockroach_DropIndex() {
func (p *CockroachSuite) Test_Cockroach_RenameIndex() {
r := p.Require()

ddl := `ALTER INDEX "table"@"old_ix" RENAME TO "new_ix";`
ddl := `ALTER INDEX "table"@"old_ix" RENAME TO "new_ix";COMMIT TRANSACTION;BEGIN TRANSACTION;`

res, _ := fizz.AString(`rename_index("table", "old_ix", "new_ix")`, p.crdbt())
r.Equal(ddl, res)
Expand Down
2 changes: 1 addition & 1 deletion migrations/20160808213310_setup_tests2.up.fizz
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ create_table("cakes", func(t) {
{{ end }}

add_column("books", "description", "string", {"default": ""})
#change_column("books", "description", "string", {"default": "test", "size": 100})
change_column("books", "description", "string", {"default": "test", "size": 100})
add_index("books","description",{})
rename_index("books","books_description_idx","books_description_index")

0 comments on commit da6a949

Please sign in to comment.