diff --git a/src/main/scala/slick/migration/api/Dialect.scala b/src/main/scala/slick/migration/api/Dialect.scala index 280a0eb4..1895120b 100644 --- a/src/main/scala/slick/migration/api/Dialect.scala +++ b/src/main/scala/slick/migration/api/Dialect.scala @@ -154,8 +154,10 @@ class Dialect[-P <: JdbcProfile] extends AstHelpers { case RenameTableFrom(from) :: rest => renameTable(table.copy(tableName = from), table.tableName) :: loop(rest) case AddColumn(info) :: rest => addColumn(table, info) :: loop(rest) case AddColumnAndSetInitialValue(info, expr) :: rest => addColumnWithInitialValue(table, info, expr) ::: loop(rest) - case DropColumn(info) :: rest => dropColumn(table, info.name) ::: loop(rest) - case DropColumnOfName(name) :: rest => dropColumn(table, name) ::: loop(rest) + case DropColumn(info) :: rest => + (if (rest contains DropTable) Nil else dropColumn(table, info.name)) ::: loop(rest) + case DropColumnOfName(name) :: rest => + (if (rest contains DropTable) Nil else dropColumn(table, name)) ::: loop(rest) case RenameColumnTo(originalInfo, to) :: rest => renameColumn(table, originalInfo, to) :: loop(rest) case RenameColumnFrom(currentInfo, from) :: rest => renameColumn(table, from, currentInfo.name) :: loop(rest) case AlterColumnDefault(info) :: rest => alterColumnDefault(table, info) :: loop(rest) diff --git a/src/main/scala/slick/migration/api/TableMigration.scala b/src/main/scala/slick/migration/api/TableMigration.scala index de1a1d47..5fd393e2 100644 --- a/src/main/scala/slick/migration/api/TableMigration.scala +++ b/src/main/scala/slick/migration/api/TableMigration.scala @@ -10,27 +10,27 @@ object TableMigration { object Action { sealed abstract class Reversible(sort: Int) extends Action(sort) - case object DropTable extends Action(0) - case object CreateTable extends Reversible(1) - case class RenameTableTo(to: String) extends Reversible(2) - case class RenameTableFrom(from: String) extends Reversible(2) - case class AddColumn(info: ColumnInfo) extends Reversible(3) - case class AddColumnAndSetInitialValue(info: ColumnInfo, rawSqlExpr: String) extends Reversible(3) - case class DropColumn(info: ColumnInfo) extends Reversible(4) - case class DropColumnOfName(name: String) extends Action(4) - case class RenameColumnTo(originalInfo: ColumnInfo, to: String) extends Reversible(5) - case class RenameColumnFrom(currentInfo: ColumnInfo, from: String) extends Reversible(5) - case class AlterColumnType(info: ColumnInfo) extends Action(6) - case class AlterColumnDefault(info: ColumnInfo) extends Action(6) - case class AlterColumnNullable(info: ColumnInfo) extends Action(6) - case class DropPrimaryKey(info: PrimaryKeyInfo) extends Reversible(7) - case class DropForeignKey(fk: ForeignKey) extends Reversible(7) + case object CreateTable extends Reversible(0) + case class RenameTableTo(to: String) extends Reversible(1) + case class AddColumn(info: ColumnInfo) extends Reversible(2) + case class AddColumnAndSetInitialValue(info: ColumnInfo, rawSqlExpr: String) extends Reversible(2) + case class RenameColumnTo(originalInfo: ColumnInfo, to: String) extends Reversible(2) + case class AlterColumnType(info: ColumnInfo) extends Action(3) + case class AlterColumnDefault(info: ColumnInfo) extends Action(3) + case class AlterColumnNullable(info: ColumnInfo) extends Action(3) + case class AddPrimaryKey(info: PrimaryKeyInfo) extends Reversible(4) + case class AddForeignKey(fk: ForeignKey) extends Reversible(4) + case class CreateIndex(info: IndexInfo) extends Reversible(5) + case class RenameIndexTo(originalInfo: IndexInfo, to: String) extends Reversible(5) + case class DropPrimaryKey(info: PrimaryKeyInfo) extends Reversible(6) + case class DropForeignKey(fk: ForeignKey) extends Reversible(6) case class DropIndex(info: IndexInfo) extends Reversible(7) - case class AddPrimaryKey(info: PrimaryKeyInfo) extends Reversible(8) - case class AddForeignKey(fk: ForeignKey) extends Reversible(8) - case class CreateIndex(info: IndexInfo) extends Reversible(8) - case class RenameIndexTo(originalInfo: IndexInfo, to: String) extends Reversible(9) - case class RenameIndexFrom(currentInfo: IndexInfo, from: String) extends Reversible(9) + case class RenameColumnFrom(currentInfo: ColumnInfo, from: String) extends Reversible(8) + case class RenameIndexFrom(currentInfo: IndexInfo, from: String) extends Reversible(8) + case class RenameTableFrom(from: String) extends Reversible(8) + case class DropColumnOfName(name: String) extends Action(9) + case class DropColumn(info: ColumnInfo) extends Reversible(9) + case object DropTable extends Action(10) } sealed trait WithActions[A <: Action] { diff --git a/src/test/scala/slick/migration/api/DbTest.scala b/src/test/scala/slick/migration/api/DbTest.scala index 0fb4ae58..8fba77fb 100644 --- a/src/test/scala/slick/migration/api/DbTest.scala +++ b/src/test/scala/slick/migration/api/DbTest.scala @@ -245,6 +245,26 @@ abstract class DbTest[P <: JdbcProfile](val tdb: JdbcTestDB {val profile: P}) runMigration(tm.drop) } } + + test("reverse") { + val tm = TableMigration(TestTable) + val createTable = tm.create.addColumns(_.id, _.strWithDefault) + + assert(createTable.sql.size === 1) + assert(createTable.sql.head.contains("create table")) + + runMigration(createTable) + + val reversed = createTable.reverse + + assert(reversed.sql.size === 1) + assert(reversed.sql.head.contains("drop table")) + + withBeforeAndAfter(reversed)(getTables) { (before, after) => + assert(before.map(_.name.name).contains("TEST_TABLE")) + assert(!after.map(_.name.name).contains("TEST_TABLE")) + } + } } trait CompleteDbTest { this: DbTest[_ <: JdbcProfile] =>