diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/oracle/OracleDatabase.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/oracle/OracleDatabase.java index a226d9c90f..fa6546b42f 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/oracle/OracleDatabase.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/oracle/OracleDatabase.java @@ -116,6 +116,12 @@ public String getRawCreateScript(Table table, boolean baseline) { "CREATE INDEX \"" + table.getSchema().getName() + "\".\"" + table.getName() + "_s_idx\" ON " + table + " (\"success\");\n"; } + @Override + public boolean supportsEmptyMigrationDescription() { + // Oracle will convert the empty string to NULL implicitly, and throw an exception as the column is NOT NULL + return false; + } + @Override protected String doGetCurrentUser() throws SQLException { return getMainConnection().getJdbcTemplate().queryForString("SELECT USER FROM DUAL"); diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/sybasease/SybaseASEDatabase.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/sybasease/SybaseASEDatabase.java index acec496601..d49a3882be 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/sybasease/SybaseASEDatabase.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/sybasease/SybaseASEDatabase.java @@ -89,6 +89,13 @@ public String getRawCreateScript(Table table, boolean baseline) { "go\n"; } + @Override + public boolean supportsEmptyMigrationDescription() { + // Sybase will convert the empty string to a single space implicitly, which won't error on updating the + // history table but will subsequently fail validation of the history table against the file name. + return false; + } + @Override public Delimiter getDefaultDelimiter() { return Delimiter.GO; diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/info/MigrationInfoImpl.java b/flyway-core/src/main/java/org/flywaydb/core/internal/info/MigrationInfoImpl.java index 972adbc2f5..56afc4570d 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/info/MigrationInfoImpl.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/info/MigrationInfoImpl.java @@ -22,6 +22,7 @@ import org.flywaydb.core.api.resolver.ResolvedMigration; import org.flywaydb.core.internal.resolver.ResolvedMigrationImpl; import org.flywaydb.core.internal.schemahistory.AppliedMigration; +import org.flywaydb.core.internal.schemahistory.SchemaHistory; import org.flywaydb.core.internal.util.AbbreviationUtils; import java.util.Date; @@ -319,8 +320,7 @@ public String validate() { appliedMigration.getChecksum(), resolvedMigration.getChecksum()); } } - if (!AbbreviationUtils.abbreviateDescription(resolvedMigration.getDescription()) - .equals(appliedMigration.getDescription())) { + if (descriptionMismatch(resolvedMigration, appliedMigration)) { return createMismatchMessage("description", migrationIdentifier, appliedMigration.getDescription(), resolvedMigration.getDescription()); } @@ -337,6 +337,16 @@ public String validate() { return null; } + private boolean descriptionMismatch(ResolvedMigration resolvedMigration, AppliedMigration appliedMigration) { + // For some databases, we can't put an empty description into the history table + if (SchemaHistory.NO_DESCRIPTION_MARKER.equals(appliedMigration.getDescription())) { + return !"".equals(resolvedMigration.getDescription()); + } + // The default + return (!AbbreviationUtils.abbreviateDescription(resolvedMigration.getDescription()) + .equals(appliedMigration.getDescription())); + } + /** * Creates a message for a mismatch. * diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/schemahistory/JdbcTableSchemaHistory.java b/flyway-core/src/main/java/org/flywaydb/core/internal/schemahistory/JdbcTableSchemaHistory.java index fcfea10aad..a6a230c946 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/schemahistory/JdbcTableSchemaHistory.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/schemahistory/JdbcTableSchemaHistory.java @@ -155,6 +155,10 @@ protected void doAddAppliedMigration(int installedRank, MigrationVersion version try { String versionStr = version == null ? null : version.toString(); + if (!database.supportsEmptyMigrationDescription() && "".equals(description)) { + description = NO_DESCRIPTION_MARKER; + } + jdbcTemplate.update(database.getInsertStatement(table), installedRank, versionStr, description, type.name(), script, checksum, database.getInstalledBy(), executionTime, success); diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/schemahistory/SchemaHistory.java b/flyway-core/src/main/java/org/flywaydb/core/internal/schemahistory/SchemaHistory.java index 55f876676b..1393ae2221 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/schemahistory/SchemaHistory.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/schemahistory/SchemaHistory.java @@ -30,6 +30,8 @@ * The schema history used to track all applied migrations. */ public abstract class SchemaHistory { + public static final String NO_DESCRIPTION_MARKER = "<< no description >>"; + /** * The schema history table used by Flyway. * Non-final due to the table name fallback mechanism. Will be made final in Flyway 6.0.