test
diff --git a/src/main/java/io/ebean/config/PlatformConfig.java b/src/main/java/io/ebean/config/PlatformConfig.java
index d06868d1b..f891b3d47 100644
--- a/src/main/java/io/ebean/config/PlatformConfig.java
+++ b/src/main/java/io/ebean/config/PlatformConfig.java
@@ -54,6 +54,8 @@ public class PlatformConfig {
private boolean caseSensitiveCollation = true;
+ private boolean useMigrationStoredProcedures;
+
/**
* Modify the default mapping of standard types such as default precision for DECIMAL etc.
*/
@@ -76,6 +78,7 @@ public class PlatformConfig {
this.idType = platformConfig.idType;
this.geometrySRID = platformConfig.geometrySRID;
this.dbUuid = platformConfig.dbUuid;
+ this.useMigrationStoredProcedures = platformConfig.useMigrationStoredProcedures;
this.caseSensitiveCollation = platformConfig.caseSensitiveCollation;
this.allQuotedIdentifiers = platformConfig.allQuotedIdentifiers;
this.databaseInetAddressVarchar = platformConfig.databaseInetAddressVarchar;
@@ -110,6 +113,20 @@ public class PlatformConfig {
this.caseSensitiveCollation = caseSensitiveCollation;
}
+ /**
+ * Return true if force use of helper stored procedures for migrations.
+ */
+ public boolean isUseMigrationStoredProcedures() {
+ return useMigrationStoredProcedures;
+ }
+
+ /**
+ * Set true to force use of helper stored procedures for migrations.
+ */
+ public void setUseMigrationStoredProcedures(boolean useMigrationStoredProcedures) {
+ this.useMigrationStoredProcedures = useMigrationStoredProcedures;
+ }
+
/**
* Return a value used to represent TRUE in the database.
*
@@ -276,6 +293,7 @@ public class PlatformConfig {
databaseBooleanFalse = p.get("databaseBooleanFalse", databaseBooleanFalse);
databaseInetAddressVarchar = p.getBoolean("databaseInetAddressVarchar", databaseInetAddressVarchar);
caseSensitiveCollation = p.getBoolean("caseSensitiveCollation", caseSensitiveCollation);
+ useMigrationStoredProcedures = p.getBoolean("useMigrationStoredProcedures", useMigrationStoredProcedures);;
DbUuid dbUuid = p.getEnum(DbUuid.class, "dbuuid", null);
if (dbUuid != null) {
diff --git a/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java b/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java
index 43396fab9..c3d699f7a 100644
--- a/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java
+++ b/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java
@@ -53,6 +53,8 @@ public class DatabasePlatform {
protected boolean supportsSavepointId = true;
+ protected boolean useMigrationStoredProcedures = true;
+
/**
* The behaviour used when ending a read only transaction at read committed isolation level.
*/
@@ -233,6 +235,9 @@ public class DatabasePlatform {
public void configure(PlatformConfig config) {
this.sequenceBatchSize = config.getDatabaseSequenceBatchSize();
this.caseSensitiveCollation = config.isCaseSensitiveCollation();
+ if (config.isUseMigrationStoredProcedures()) {
+ useMigrationStoredProcedures = true;
+ }
configureIdType(config.getIdType());
configure(config, config.isAllQuotedIdentifiers());
}
@@ -339,6 +344,13 @@ public class DatabasePlatform {
return supportsSavepointId;
}
+ /**
+ * Return true if migrations should use stored procedures.
+ */
+ public boolean isUseMigrationStoredProcedures() {
+ return useMigrationStoredProcedures;
+ }
+
/**
* Return the maximum table name length.
*
diff --git a/src/main/java/io/ebean/config/dbplatform/mysql/MySql55Platform.java b/src/main/java/io/ebean/config/dbplatform/mysql/MySql55Platform.java
new file mode 100644
index 000000000..f1d24b768
--- /dev/null
+++ b/src/main/java/io/ebean/config/dbplatform/mysql/MySql55Platform.java
@@ -0,0 +1,14 @@
+package io.ebean.config.dbplatform.mysql;
+
+import io.ebean.annotation.Platform;
+import io.ebean.config.dbplatform.DbPlatformType;
+import io.ebean.config.dbplatform.DbType;
+
+public class MySql55Platform extends MySqlPlatform {
+
+ public MySql55Platform() {
+ super();
+ this.platform = Platform.MYSQL55;
+ dbTypeMap.put(DbType.TIMESTAMP, new DbPlatformType("datetime"));
+ }
+}
diff --git a/src/main/java/io/ebean/config/dbplatform/mysql/MySqlPlatform.java b/src/main/java/io/ebean/config/dbplatform/mysql/MySqlPlatform.java
index 83d509da4..761c9425a 100644
--- a/src/main/java/io/ebean/config/dbplatform/mysql/MySqlPlatform.java
+++ b/src/main/java/io/ebean/config/dbplatform/mysql/MySqlPlatform.java
@@ -28,6 +28,7 @@ public class MySqlPlatform extends DatabasePlatform {
this.useExtraTransactionOnIterateSecondaryQueries = true;
this.selectCountWithAlias = true;
this.supportsSavepointId = false;
+ this.useMigrationStoredProcedures = false;
this.dbEncrypt = new MySqlDbEncrypt();
this.historySupport = new MySqlHistorySupport();
this.columnAliasPrefix = null;
diff --git a/src/main/java/io/ebeaninternal/dbmigration/DdlGenerator.java b/src/main/java/io/ebeaninternal/dbmigration/DdlGenerator.java
index 45282cd2d..01001d9d0 100644
--- a/src/main/java/io/ebeaninternal/dbmigration/DdlGenerator.java
+++ b/src/main/java/io/ebeaninternal/dbmigration/DdlGenerator.java
@@ -47,6 +47,7 @@ public class DdlGenerator {
private final boolean ddlAutoCommit;
private final String dbSchema;
private final ScriptTransform scriptTransform;
+ private final boolean useMigrationStoredProcedures;
private CurrentModel currentModel;
private String dropAllContent;
@@ -64,9 +65,11 @@ public class DdlGenerator {
log.warn("DDL can't be run on startup with TenantMode " + serverConfig.getTenantMode());
this.runDdl = false;
this.ddlAutoCommit = false;
+ this.useMigrationStoredProcedures = false;
} else {
this.runDdl = serverConfig.isDdlRun();
this.ddlAutoCommit = server.getDatabasePlatform().isDdlAutoCommit();
+ this.useMigrationStoredProcedures = server.getDatabasePlatform().isUseMigrationStoredProcedures();
}
this.scriptTransform = createScriptTransform(serverConfig.getMigrationConfig());
this.baseDir = initBaseDir();
@@ -179,7 +182,7 @@ public class DdlGenerator {
protected void runDropSql(Connection connection) throws IOException {
if (!createOnly) {
- if (extraDdl && jaxbPresent) {
+ if (extraDdl && jaxbPresent && useMigrationStoredProcedures) {
String extraApply = ExtraDdlXmlReader.buildExtra(server.getDatabasePlatform().getName(), true);
if (extraApply != null) {
runScript(connection, false, extraApply, "extra-ddl");
@@ -199,7 +202,7 @@ public class DdlGenerator {
}
runScript(connection, false, createAllContent, getCreateFileName());
- if (extraDdl && jaxbPresent) {
+ if (extraDdl && jaxbPresent && useMigrationStoredProcedures) {
if (currentModel().isTablePartitioning()) {
String extraPartitioning = ExtraDdlXmlReader.buildPartitioning(server.getDatabasePlatform().getName());
if (extraPartitioning != null && !extraPartitioning.isEmpty()) {
diff --git a/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java b/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java
index d886c7433..671e9f844 100644
--- a/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java
+++ b/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java
@@ -14,6 +14,7 @@ import io.ebean.config.dbplatform.db2.DB2Platform;
import io.ebean.config.dbplatform.h2.H2Platform;
import io.ebean.config.dbplatform.hana.HanaPlatform;
import io.ebean.config.dbplatform.hsqldb.HsqldbPlatform;
+import io.ebean.config.dbplatform.mysql.MySql55Platform;
import io.ebean.config.dbplatform.mysql.MySqlPlatform;
import io.ebean.config.dbplatform.nuodb.NuoDbPlatform;
import io.ebean.config.dbplatform.oracle.OraclePlatform;
@@ -787,6 +788,8 @@ public class DefaultDbMigration implements DbMigration {
return new HsqldbPlatform();
case POSTGRES:
return new PostgresPlatform();
+ case MYSQL55:
+ return new MySql55Platform();
case MYSQL:
return new MySqlPlatform();
case ORACLE:
diff --git a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/MySqlDdl.java b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/MySqlDdl.java
index b4793a172..afb88c712 100644
--- a/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/MySqlDdl.java
+++ b/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/MySqlDdl.java
@@ -18,12 +18,15 @@ public class MySqlDdl extends PlatformDdl {
// this flag is for compatibility. Use it with care.
private static final boolean USE_CHECK_CONSTRAINT = Boolean.getBoolean("ebean.mysql.useCheckConstraint");
+ private final boolean useMigrationStoredProcedures;
+
public MySqlDdl(DatabasePlatform platform) {
super(platform);
this.alterColumn = "modify";
this.dropUniqueConstraint = "drop index";
this.historyDdl = new MySqlHistoryDdl();
this.inlineComments = true;
+ this.useMigrationStoredProcedures = platform.isUseMigrationStoredProcedures();
}
/**
@@ -49,7 +52,12 @@ public class MySqlDdl extends PlatformDdl {
@Override
public void alterTableDropColumn(DdlBuffer buffer, String tableName, String columnName) throws IOException {
- buffer.append("CALL usp_ebean_drop_column('").append(tableName).append("', '").append(columnName).append("')").endOfStatement();
+ if (useMigrationStoredProcedures) {
+ buffer.append("CALL usp_ebean_drop_column('").append(tableName).append("', '").append(columnName).append("')").endOfStatement();
+ } else {
+ buffer.append("alter table ").append(tableName).append(" ").append(dropColumn).append(" ").append(columnName)
+ .append(dropColumnSuffix).endOfStatement();
+ }
}
@Override
@@ -60,6 +68,7 @@ public class MySqlDdl extends PlatformDdl {
return null;
}
}
+
@Override
public String alterTableAddCheckConstraint(String tableName, String checkConstraintName, String checkConstraint) {
if (USE_CHECK_CONSTRAINT) {
@@ -96,17 +105,13 @@ public class MySqlDdl extends PlatformDdl {
@Override
public String alterColumnNotnull(String tableName, String columnName, boolean notnull) {
-
// can't alter itself - done in alterColumnBaseAttributes()
return null;
}
@Override
public String alterColumnDefaultValue(String tableName, String columnName, String defaultValue) {
-
String suffix = DdlHelp.isDropDefault(defaultValue) ? columnDropDefault : columnSetDefault + " " + convertDefaultValue(defaultValue);
-
- // use alter
return "alter table " + tableName + " alter " + columnName + " " + suffix;
}
@@ -124,7 +129,6 @@ public class MySqlDdl extends PlatformDdl {
boolean notnull = (alter.isNotnull() != null) ? alter.isNotnull() : Boolean.TRUE.equals(alter.isCurrentNotnull());
String notnullClause = notnull ? " not null" : "";
- // use modify
return "alter table " + tableName + " modify " + columnName + " " + type + notnullClause;
}
@@ -161,7 +165,7 @@ public class MySqlDdl extends PlatformDdl {
}
@Override
- public void addColumnComment(DdlBuffer apply, String table, String column, String comment) throws IOException {
+ public void addColumnComment(DdlBuffer apply, String table, String column, String comment) {
// alter comment currently not supported as it requires to repeat whole column definition
}
@@ -182,7 +186,6 @@ public class MySqlDdl extends PlatformDdl {
i++;
}
buffer.endOfStatement();
-
}
}
diff --git a/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java b/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java
index 0854ae4f3..88c172875 100644
--- a/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java
+++ b/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java
@@ -8,6 +8,7 @@ import io.ebean.config.dbplatform.db2.DB2Platform;
import io.ebean.config.dbplatform.h2.H2Platform;
import io.ebean.config.dbplatform.hana.HanaPlatform;
import io.ebean.config.dbplatform.hsqldb.HsqldbPlatform;
+import io.ebean.config.dbplatform.mysql.MySql55Platform;
import io.ebean.config.dbplatform.mysql.MySqlPlatform;
import io.ebean.config.dbplatform.nuodb.NuoDbPlatform;
import io.ebean.config.dbplatform.oracle.OraclePlatform;
@@ -82,6 +83,9 @@ public class DatabasePlatformFactory {
if (dbName.equals("mysql")) {
return new MySqlPlatform();
}
+ if (dbName.equals("mysql55")) {
+ return new MySql55Platform();
+ }
if (dbName.equals("postgres") || dbName.equals("postgres9")) {
return new PostgresPlatform();
}
@@ -147,15 +151,16 @@ public class DatabasePlatformFactory {
*/
private DatabasePlatform byDatabaseMeta(DatabaseMetaData metaData, Connection connection) throws SQLException {
- String dbProductName = metaData.getDatabaseProductName();
- dbProductName = dbProductName.toLowerCase();
+ String dbProductName = metaData.getDatabaseProductName().toLowerCase();
+ final int majorVersion = metaData.getDatabaseMajorVersion();
+ final int minorVersion = metaData.getDatabaseMinorVersion();
if (dbProductName.contains("oracle")) {
return new OraclePlatform();
} else if (dbProductName.contains("microsoft")) {
throw new IllegalArgumentException("For SqlServer please explicitly choose either sqlserver16 or sqlserver17 as the platform via ServerConfig.setDatabasePlatformName. Refer to issue #1340 for more details");
} else if (dbProductName.contains("mysql")) {
- return new MySqlPlatform();
+ return mysqlVersion(majorVersion, minorVersion);
} else if (dbProductName.contains("h2")) {
return new H2Platform();
} else if (dbProductName.contains("hsql database engine")) {
@@ -180,6 +185,13 @@ public class DatabasePlatformFactory {
return new DatabasePlatform();
}
+ private DatabasePlatform mysqlVersion(int majorVersion, int minorVersion) {
+ if (majorVersion <= 5 && minorVersion <= 5) {
+ return new MySql55Platform();
+ }
+ return new MySqlPlatform();
+ }
+
/**
* Use a select version() query as it could be Postgres or CockroachDB.
*/
diff --git a/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java b/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java
index b755e8c3d..b6b034f57 100644
--- a/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java
+++ b/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java
@@ -514,7 +514,7 @@ public class InternalConfiguration {
String tz = serverConfig.getDataTimeZone();
if (tz == null) {
- if (getPlatform() == Platform.MYSQL) {
+ if (isMySql(getPlatform())) {
return new LocalDataTimeZone();
}
return new NoDataTimeZone();
@@ -526,6 +526,10 @@ public class InternalConfiguration {
}
}
+ private boolean isMySql(Platform platform) {
+ return platform == Platform.MYSQL || platform == Platform.MYSQL55;
+ }
+
public DataTimeZone getDataTimeZone() {
return dataTimeZone;
}
diff --git a/src/main/java/io/ebeaninternal/server/core/PlatformDdlBuilder.java b/src/main/java/io/ebeaninternal/server/core/PlatformDdlBuilder.java
index bacee903e..f6aadfa83 100644
--- a/src/main/java/io/ebeaninternal/server/core/PlatformDdlBuilder.java
+++ b/src/main/java/io/ebeaninternal/server/core/PlatformDdlBuilder.java
@@ -30,6 +30,7 @@ public class PlatformDdlBuilder {
return new H2Ddl(platform);
case DB2:
return new DB2Ddl(platform);
+ case MYSQL55:
case MYSQL:
return new MySqlDdl(platform);
case HSQLDB:
diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java
index de4bf14e6..8e43f8099 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java
@@ -66,7 +66,6 @@ import io.ebeaninternal.server.el.ElPropertyChainBuilder;
import io.ebeaninternal.server.el.ElPropertyDeploy;
import io.ebeaninternal.server.el.ElPropertyValue;
import io.ebeaninternal.server.persist.DeleteMode;
-import io.ebeaninternal.server.persist.DmlUtil;
import io.ebeaninternal.server.query.CQueryPlan;
import io.ebeaninternal.server.query.ExtraJoin;
import io.ebeaninternal.server.query.STreeProperty;
@@ -77,6 +76,7 @@ import io.ebeaninternal.server.query.STreeType;
import io.ebeaninternal.server.query.SqlBeanLoad;
import io.ebeaninternal.server.querydefn.DefaultOrmQuery;
import io.ebeaninternal.server.querydefn.OrmQueryDetail;
+import io.ebeaninternal.server.querydefn.OrmQueryProperties;
import io.ebeaninternal.server.rawsql.SpiRawSql;
import io.ebeaninternal.server.type.DataBind;
import io.ebeaninternal.server.type.ScalarType;
@@ -333,6 +333,7 @@ public class BeanDescriptor implements BeanType, STreeType {
* list of properties that are Lists/Sets/Maps (Derived).
*/
private final BeanProperty[] propertiesNonMany;
+ private final BeanProperty[] propertiesAggregate;
private final BeanPropertyAssocMany>[] propertiesMany;
private final BeanPropertyAssocMany>[] propertiesManySave;
private final BeanPropertyAssocMany>[] propertiesManyDelete;
@@ -515,6 +516,7 @@ public class BeanDescriptor implements BeanType, STreeType {
this.propertiesMany = listHelper.getMany();
this.propertiesNonMany = listHelper.getNonMany();
+ this.propertiesAggregate = listHelper.getAggregates();
this.propertiesManySave = listHelper.getManySave();
this.propertiesManyDelete = listHelper.getManyDelete();
this.propertiesManyToMany = listHelper.getManyToMany();
@@ -3169,6 +3171,25 @@ public class BeanDescriptor implements BeanType, STreeType {
return propertiesEmbedded;
}
+ /**
+ * Return true if the query detail includes an aggregation property.
+ */
+ public boolean includesAggregation(OrmQueryDetail detail) {
+ return detail != null && propertiesAggregate.length > 0 && includesAggregation(detail.getChunk(null, false));
+ }
+
+ private boolean includesAggregation(OrmQueryProperties rootProps) {
+ if (rootProps != null) {
+ final Set included = rootProps.getIncluded();
+ for (BeanProperty property : propertiesAggregate) {
+ if (included.contains(property.getName())) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
/**
* Set all properties to be loaded (recurse to embedded beans).
*/
diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java b/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java
index 5fe365346..4f03e8507 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java
@@ -835,6 +835,13 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty {
return scalarType.format(value);
}
+ /**
+ * Return the value from String format into Object value.
+ */
+ public Object parse(String value) {
+ return scalarType.parse(value);
+ }
+
/**
* Read the value for this property from L2 cache entry and set it to the bean.
*
diff --git a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java
index f1a93dfbb..599a8a97e 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java
@@ -263,11 +263,9 @@ public final class IdBinderEmbedded implements IdBinder {
public Object convertIdFromJson(Object value) {
Map map = (Map) value;
-
EntityBean idValue = idDesc.createEntityBean();
for (BeanProperty prop : props) {
- Object val = map.get(prop.getName());
- prop.setValue(idValue, val);
+ prop.setValue(idValue, map.get(prop.getName()));
}
return idValue;
}
@@ -465,7 +463,14 @@ public final class IdBinderEmbedded implements IdBinder {
@Override
public Object convertId(Object idValue) {
- // can not cast/convert if it is embedded
+ if (idValue instanceof String) {
+ final EntityBean embId = idDesc.createEntityBean();
+ final String[] rawVals = ((String)idValue).split("\\|");
+ for (int i = 0; i < props.length; i++) {
+ props[i].setValue(embId, props[i].parse(rawVals[i]));
+ }
+ return embId;
+ }
return idValue;
}
diff --git a/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyLists.java b/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyLists.java
index 276e9821c..f6280b260 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyLists.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanPropertyLists.java
@@ -10,7 +10,6 @@ import io.ebeaninternal.server.deploy.BeanPropertyIdClass;
import io.ebeaninternal.server.deploy.BeanPropertyOrderColumn;
import io.ebeaninternal.server.deploy.BeanPropertySimpleCollection;
import io.ebeaninternal.server.deploy.InheritInfo;
-import io.ebeaninternal.server.deploy.TableJoin;
import io.ebeaninternal.server.deploy.generatedproperty.GeneratedProperty;
import io.ebeaninternal.server.properties.BeanPropertySetter;
import io.ebeaninternal.server.type.ScalarTypeString;
@@ -54,6 +53,8 @@ public class DeployBeanPropertyLists {
private final List nonManys = new ArrayList<>();
+ private final List aggs = new ArrayList<>();
+
private final List> ones = new ArrayList<>();
private final List> onesImported = new ArrayList<>();
@@ -232,6 +233,9 @@ public class DeployBeanPropertyLists {
} else {
nonManys.add(prop);
+ if (prop.isAggregation()) {
+ aggs.add(prop);
+ }
if (prop.isTenantId()) {
tenant = prop;
}
@@ -331,6 +335,10 @@ public class DeployBeanPropertyLists {
return nonManys.toArray(new BeanProperty[0]);
}
+ public BeanProperty[] getAggregates() {
+ return aggs.toArray(new BeanProperty[0]);
+ }
+
public BeanPropertyAssocMany>[] getMany() {
return manys.toArray(new BeanPropertyAssocMany[0]);
}
diff --git a/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandlerFactory.java b/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandlerFactory.java
index 1bebb5e96..14bcb1e95 100644
--- a/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandlerFactory.java
+++ b/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandlerFactory.java
@@ -17,6 +17,7 @@ public class DbExpressionHandlerFactory {
return new H2DbExpression();
case POSTGRES:
return new PostgresDbExpression();
+ case MYSQL55:
case MYSQL:
return new MySqlDbExpression();
case ORACLE:
diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java b/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java
index f6e3620a9..b75ea391e 100644
--- a/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java
+++ b/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java
@@ -14,7 +14,6 @@ import io.ebean.event.readaudit.ReadAuditQueryPlan;
import io.ebean.text.PathProperties;
import io.ebean.util.SplitName;
import io.ebean.util.StringHelper;
-import io.ebeaninternal.api.ManyWhereJoins;
import io.ebeaninternal.api.SpiQuery;
import io.ebeaninternal.server.core.OrmQueryRequest;
import io.ebeaninternal.server.deploy.BeanDescriptor;
@@ -44,9 +43,6 @@ import java.util.List;
*/
class CQueryBuilder {
- private static final String DELETE = "Delete";
- private static final String UPDATE = "Update";
-
final String tableAliasPlaceHolder;
final String columnAliasPrefix;
@@ -104,7 +100,6 @@ class CQueryBuilder {
*/
CQueryUpdate buildUpdateQuery(boolean deleteRequest, OrmQueryRequest request) {
- String type = (deleteRequest) ? DELETE : UPDATE;
SpiQuery query = request.getQuery();
String rootTableAlias = query.getAlias();
query.setDelete();
@@ -141,7 +136,7 @@ class CQueryBuilder {
if (dbPlatform.isSupportsDeleteTableAlias()) {
// delete from table ...
return aliasReplace(buildSql("delete", request, predicates, sqlTree).getSql(), alias);
- } else if (dbPlatform.getPlatform() == Platform.MYSQL) {
+ } else if (isMySql(dbPlatform.getPlatform())) {
return aliasReplace(buildSql("delete " + alias, request, predicates, sqlTree).getSql(), alias);
} else {
// simple - delete from table ...
@@ -155,6 +150,10 @@ class CQueryBuilder {
return sql;
}
+ private boolean isMySql(Platform platform) {
+ return platform == Platform.MYSQL || platform == Platform.MYSQL55;
+ }
+
private String alias(String rootTableAlias) {
return (rootTableAlias == null) ? "t0" : rootTableAlias;
}
@@ -259,12 +258,14 @@ class CQueryBuilder {
query.setFirstRow(0);
query.setMaxRows(0);
- ManyWhereJoins manyWhereJoins = query.getManyWhereJoins();
-
boolean countDistinct = query.isDistinct();
+ boolean withAgg = false;
if (!countDistinct) {
- // minimise select clause for standard count
- query.setSelectId();
+ withAgg = includesAggregation(request, query);
+ if (!withAgg) {
+ // minimise select clause for standard count
+ query.setSelectId();
+ }
}
CQueryPredicates predicates = new CQueryPredicates(binder, request);
@@ -282,14 +283,14 @@ class CQueryBuilder {
sqlTree.addSoftDeletePredicate(query);
}
- boolean hasMany = sqlTree.hasMany();
+ boolean wrap = sqlTree.hasMany() || withAgg;
String sqlSelect = null;
if (countDistinct) {
if (sqlTree.isSingleProperty()) {
request.setInlineCountDistinct();
}
- } else if (!hasMany) {
+ } else if (!wrap) {
sqlSelect = "select count(*)";
}
@@ -300,7 +301,7 @@ class CQueryBuilder {
if (countDistinct) {
sql = wrapSelectCount(sql);
- } else if (hasMany || query.isRawSql()) {
+ } else if (wrap || query.isRawSql()) {
// remove order by - mssql does not accept order by in subqueries
int pos = sql.lastIndexOf(" order by ");
if (pos != -1) {
@@ -317,6 +318,13 @@ class CQueryBuilder {
return new CQueryRowCount(queryPlan, request, predicates);
}
+ /**
+ * Return true if the query includes an aggregation property.
+ */
+ private boolean includesAggregation(OrmQueryRequest request, SpiQuery query) {
+ return request.getBeanDescriptor().includesAggregation(query.getDetail());
+ }
+
private String wrapSelectCount(String sql) {
sql = "select count(*) from ( " + sql + ")";
if (selectCountWithAlias) {
diff --git a/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayList.java b/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayList.java
index f3d6ea4c7..df0d669be 100644
--- a/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayList.java
+++ b/src/main/java/io/ebeaninternal/server/type/ScalarTypeArrayList.java
@@ -104,8 +104,11 @@ public class ScalarTypeArrayList extends ScalarTypeArrayBase implements Sc
protected List fromArray(Object[] array1) {
List list = new ArrayList(array1.length);
for (Object element : array1) {
- if(element == null ) list.add(null);
- else list.add(converter.toElement(element));
+ if (element == null) {
+ list.add(null);
+ } else {
+ list.add(converter.toElement(element));
+ }
}
return new ModifyAwareList(list);
}
diff --git a/src/test/java/io/ebean/BaseTestCase.java b/src/test/java/io/ebean/BaseTestCase.java
index c9fe57ba1..581dfa0aa 100644
--- a/src/test/java/io/ebean/BaseTestCase.java
+++ b/src/test/java/io/ebean/BaseTestCase.java
@@ -183,7 +183,7 @@ public abstract class BaseTestCase {
}
public boolean isMySql() {
- return Platform.MYSQL == platform();
+ return Platform.MYSQL == platform() || Platform.MYSQL55 == platform();
}
public boolean isHana() {
diff --git a/src/test/java/io/ebeaninternal/dbmigration/DbMigrationGenerateTest.java b/src/test/java/io/ebeaninternal/dbmigration/DbMigrationGenerateTest.java
index 27fda6d25..8b655b2dc 100644
--- a/src/test/java/io/ebeaninternal/dbmigration/DbMigrationGenerateTest.java
+++ b/src/test/java/io/ebeaninternal/dbmigration/DbMigrationGenerateTest.java
@@ -49,6 +49,7 @@ public class DbMigrationGenerateTest {
migration.addPlatform(Platform.H2, "h2");
migration.addPlatform(Platform.HSQLDB, "hsqldb");
migration.addPlatform(Platform.MYSQL, "mysql");
+ migration.addPlatform(Platform.MYSQL55, "mysql55");
migration.addPlatform(Platform.POSTGRES, "postgres");
migration.addPlatform(Platform.ORACLE, "oracle");
migration.addPlatform(Platform.SQLITE, "sqlite");
diff --git a/src/test/java/org/tests/cache/TestCacheEmbeddedId.java b/src/test/java/org/tests/cache/TestCacheEmbeddedId.java
new file mode 100644
index 000000000..ccc65f820
--- /dev/null
+++ b/src/test/java/org/tests/cache/TestCacheEmbeddedId.java
@@ -0,0 +1,32 @@
+package org.tests.cache;
+
+import io.ebean.BaseTestCase;
+import io.ebean.DB;
+import org.junit.Test;
+import org.tests.model.basic.CKeyParent;
+import org.tests.model.basic.CKeyParentId;
+
+import static org.junit.Assert.assertNotNull;
+
+public class TestCacheEmbeddedId extends BaseTestCase {
+
+ @Test
+ public void test() {
+
+ CKeyParentId id = new CKeyParentId(100, "testEmbedded");
+
+ CKeyParent p = new CKeyParent();
+ p.setId(id);
+ p.setName("testCache");
+
+ DB.save(p);
+
+ CKeyParent cKeyParent = DB.find(CKeyParent.class, id);
+ assertNotNull(cKeyParent);
+
+ // find for second time
+ // causes java.lang.ClassCastException: class java.lang.String cannot be cast to class org.tests.model.basic.CKeyParentId
+ cKeyParent = DB.find(CKeyParent.class, id);
+ assertNotNull(cKeyParent);
+ }
+}
diff --git a/src/test/java/org/tests/iud/TestCarWheelIud.java b/src/test/java/org/tests/iud/TestCarWheelIud.java
index 621260342..442d96ba8 100644
--- a/src/test/java/org/tests/iud/TestCarWheelIud.java
+++ b/src/test/java/org/tests/iud/TestCarWheelIud.java
@@ -1,15 +1,21 @@
package org.tests.iud;
import io.ebean.BaseTestCase;
+import io.ebean.DB;
import io.ebean.Ebean;
+import io.ebean.PagedList;
+import org.ebeantest.LoggedSqlCollector;
+import org.junit.Test;
import org.tests.model.carwheel.Car;
import org.tests.model.carwheel.Tire;
import org.tests.model.carwheel.Wheel;
-import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
+import static java.util.Arrays.asList;
+import static org.assertj.core.api.Assertions.assertThat;
+
public class TestCarWheelIud extends BaseTestCase {
@Test
@@ -53,4 +59,44 @@ public class TestCarWheelIud extends BaseTestCase {
Ebean.delete(car2);
}
+
+ @Test
+ public void aggregatePaging() {
+
+ DB.find(Car.class).delete();
+
+ final Car car0 = createCar("Ford", 40);
+ final Car car1 = createCar("Ford", 50);
+ final Car car2 = createCar("Mazda", 12);
+
+ DB.saveAll(asList(car0, car1, car2));
+
+ LoggedSqlCollector.start();
+
+ final PagedList pagedList = DB.find(Car.class)
+ .select("brand, totalSold")
+ .setMaxRows(10)
+ .findPagedList();
+
+ final List list = pagedList.getList();
+ final int count = pagedList.getTotalCount();
+
+ assertThat(list).hasSize(2);
+ assertThat(count).isEqualTo(2);
+
+ final List sql = LoggedSqlCollector.stop();
+ assertThat(sql).hasSize(2);
+ if (isH2() || isPostgres()) {
+ assertThat(sql.get(0)).contains("select t0.brand, sum(t0.sold) from sa_car t0 group by t0.brand limit 10");
+ assertThat(sql.get(1)).contains("select count(*) from ( select t0.brand, sum(t0.sold) from sa_car t0 group by t0.brand)");
+ }
+
+ }
+
+ private Car createCar(String brand, int sold) {
+ Car car0 = new Car();
+ car0.setBrand(brand);
+ car0.setSold(sold);
+ return car0;
+ }
}
diff --git a/src/test/java/org/tests/model/aggregation/TestAggregationTopLevel.java b/src/test/java/org/tests/model/aggregation/TestAggregationTopLevel.java
index 946ea750b..2039caa15 100644
--- a/src/test/java/org/tests/model/aggregation/TestAggregationTopLevel.java
+++ b/src/test/java/org/tests/model/aggregation/TestAggregationTopLevel.java
@@ -33,6 +33,28 @@ public class TestAggregationTopLevel extends BaseTestCase {
assertThat(result).isNotEmpty();
}
+ @Test
+ public void query_count() {
+
+ Query query = DB.find(DMachineStatsAgg.class)
+ .select("date, totalKms")
+ .setMaxRows(10)
+ .having().gt("totalKms", 1)
+ .query();
+
+ LoggedSqlCollector.start();
+ query.findCount();
+ query.findList();
+
+ List sql = LoggedSqlCollector.stop();
+ assertThat(sql).hasSize(2);
+
+ if (isH2() || isPostgres()) {
+ assertThat(sql.get(0)).contains("select count(*) from ( select t0.date, sum(t0.total_kms) from d_machine_stats t0 group by t0.date having sum(t0.total_kms) > ?)");
+ assertThat(sql.get(1)).contains("select t0.date, sum(t0.total_kms) from d_machine_stats t0 group by t0.date having sum(t0.total_kms) > ? limit 10");
+ }
+ }
+
@Test
public void query_machineTotalKms_withHaving() {
diff --git a/src/test/java/org/tests/model/carwheel/Car.java b/src/test/java/org/tests/model/carwheel/Car.java
index 2288639bc..65981f46b 100644
--- a/src/test/java/org/tests/model/carwheel/Car.java
+++ b/src/test/java/org/tests/model/carwheel/Car.java
@@ -1,5 +1,7 @@
package org.tests.model.carwheel;
+import io.ebean.annotation.Aggregation;
+
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
@@ -21,6 +23,13 @@ public class Car {
@Version
private int version;
+ private String brand;
+
+ private int sold;
+
+ @Aggregation("sum(sold)")
+ private int totalSold;
+
@OneToMany(mappedBy = "car", cascade = CascadeType.ALL)
private List wheels;
@@ -40,6 +49,30 @@ public class Car {
this.version = version;
}
+ public String getBrand() {
+ return brand;
+ }
+
+ public void setBrand(String brand) {
+ this.brand = brand;
+ }
+
+ public int getSold() {
+ return sold;
+ }
+
+ public void setSold(int sold) {
+ this.sold = sold;
+ }
+
+ public int getTotalSold() {
+ return totalSold;
+ }
+
+ public void setTotalSold(int totalSold) {
+ this.totalSold = totalSold;
+ }
+
public List getWheels() {
return wheels;
}
diff --git a/src/test/resources/dbmigration/migrationtest/mysql/1.2__dropsFor_1.1.sql b/src/test/resources/dbmigration/migrationtest/mysql/1.2__dropsFor_1.1.sql
index a22adf90b..b3317f701 100644
--- a/src/test/resources/dbmigration/migrationtest/mysql/1.2__dropsFor_1.1.sql
+++ b/src/test/resources/dbmigration/migrationtest/mysql/1.2__dropsFor_1.1.sql
@@ -3,17 +3,17 @@
drop view if exists migtest_e_history2_with_history;
-- apply changes
-CALL usp_ebean_drop_column('migtest_e_basic', 'old_boolean');
+alter table migtest_e_basic drop column old_boolean;
-CALL usp_ebean_drop_column('migtest_e_basic', 'old_boolean2');
+alter table migtest_e_basic drop column old_boolean2;
-CALL usp_ebean_drop_column('migtest_e_basic', 'eref_id');
+alter table migtest_e_basic drop column eref_id;
-CALL usp_ebean_drop_column('migtest_e_history2', 'obsolete_string1');
-CALL usp_ebean_drop_column('migtest_e_history2_history', 'obsolete_string1');
+alter table migtest_e_history2 drop column obsolete_string1;
+alter table migtest_e_history2_history drop column obsolete_string1;
-CALL usp_ebean_drop_column('migtest_e_history2', 'obsolete_string2');
-CALL usp_ebean_drop_column('migtest_e_history2_history', 'obsolete_string2');
+alter table migtest_e_history2 drop column obsolete_string2;
+alter table migtest_e_history2_history drop column obsolete_string2;
drop table if exists migtest_e_ref;
create view migtest_e_history2_with_history as select * from migtest_e_history2 union all select * from migtest_e_history2_history;
diff --git a/src/test/resources/dbmigration/migrationtest/mysql/1.4__dropsFor_1.3.sql b/src/test/resources/dbmigration/migrationtest/mysql/1.4__dropsFor_1.3.sql
index efa0bbc8a..ff8fa50d0 100644
--- a/src/test/resources/dbmigration/migrationtest/mysql/1.4__dropsFor_1.3.sql
+++ b/src/test/resources/dbmigration/migrationtest/mysql/1.4__dropsFor_1.3.sql
@@ -3,45 +3,45 @@
drop trigger migtest_e_history_history_upd;
drop trigger migtest_e_history_history_del;
drop view migtest_e_history_with_history;
-CALL usp_ebean_drop_column('migtest_e_history', 'sys_period_start');
-CALL usp_ebean_drop_column('migtest_e_history', 'sys_period_end');
+alter table migtest_e_history drop column sys_period_start;
+alter table migtest_e_history drop column sys_period_end;
drop table migtest_e_history_history;
drop view if exists migtest_e_history2_with_history;
drop view if exists migtest_e_history5_with_history;
-- apply changes
-CALL usp_ebean_drop_column('migtest_ckey_detail', 'one_key');
+alter table migtest_ckey_detail drop column one_key;
-CALL usp_ebean_drop_column('migtest_ckey_detail', 'two_key');
+alter table migtest_ckey_detail drop column two_key;
-CALL usp_ebean_drop_column('migtest_ckey_parent', 'assoc_id');
+alter table migtest_ckey_parent drop column assoc_id;
-CALL usp_ebean_drop_column('migtest_e_basic', 'new_string_field');
+alter table migtest_e_basic drop column new_string_field;
-CALL usp_ebean_drop_column('migtest_e_basic', 'new_boolean_field');
+alter table migtest_e_basic drop column new_boolean_field;
-CALL usp_ebean_drop_column('migtest_e_basic', 'new_boolean_field2');
+alter table migtest_e_basic drop column new_boolean_field2;
-CALL usp_ebean_drop_column('migtest_e_basic', 'progress');
+alter table migtest_e_basic drop column progress;
-CALL usp_ebean_drop_column('migtest_e_basic', 'new_integer');
+alter table migtest_e_basic drop column new_integer;
-CALL usp_ebean_drop_column('migtest_e_history2', 'test_string2');
-CALL usp_ebean_drop_column('migtest_e_history2_history', 'test_string2');
+alter table migtest_e_history2 drop column test_string2;
+alter table migtest_e_history2_history drop column test_string2;
-CALL usp_ebean_drop_column('migtest_e_history2', 'test_string3');
-CALL usp_ebean_drop_column('migtest_e_history2_history', 'test_string3');
+alter table migtest_e_history2 drop column test_string3;
+alter table migtest_e_history2_history drop column test_string3;
-CALL usp_ebean_drop_column('migtest_e_history2', 'new_column');
-CALL usp_ebean_drop_column('migtest_e_history2_history', 'new_column');
+alter table migtest_e_history2 drop column new_column;
+alter table migtest_e_history2_history drop column new_column;
-CALL usp_ebean_drop_column('migtest_e_history5', 'test_boolean');
-CALL usp_ebean_drop_column('migtest_e_history5_history', 'test_boolean');
+alter table migtest_e_history5 drop column test_boolean;
+alter table migtest_e_history5_history drop column test_boolean;
-CALL usp_ebean_drop_column('migtest_e_softdelete', 'deleted');
+alter table migtest_e_softdelete drop column deleted;
-CALL usp_ebean_drop_column('migtest_oto_child', 'master_id');
+alter table migtest_oto_child drop column master_id;
drop table if exists migtest_e_user;
drop table if exists migtest_mtm_c_migtest_mtm_m;
diff --git a/src/test/resources/dbmigration/migrationtest/mysql55/1.0__initial.sql b/src/test/resources/dbmigration/migrationtest/mysql55/1.0__initial.sql
new file mode 100644
index 000000000..aba5c29eb
--- /dev/null
+++ b/src/test/resources/dbmigration/migrationtest/mysql55/1.0__initial.sql
@@ -0,0 +1,269 @@
+-- Migrationscripts for ebean unittest
+-- apply changes
+create table migtest_ckey_assoc (
+ id integer auto_increment not null,
+ assoc_one varchar(255),
+ constraint pk_migtest_ckey_assoc primary key (id)
+);
+
+create table migtest_ckey_detail (
+ id integer auto_increment not null,
+ something varchar(255),
+ constraint pk_migtest_ckey_detail primary key (id)
+);
+
+create table migtest_ckey_parent (
+ one_key integer not null,
+ two_key varchar(127) not null,
+ name varchar(255),
+ version integer not null,
+ constraint pk_migtest_ckey_parent primary key (one_key,two_key)
+);
+
+create table migtest_fk_cascade (
+ id bigint auto_increment not null,
+ one_id bigint,
+ constraint pk_migtest_fk_cascade primary key (id)
+);
+
+create table migtest_fk_cascade_one (
+ id bigint auto_increment not null,
+ constraint pk_migtest_fk_cascade_one primary key (id)
+);
+
+create table migtest_fk_none (
+ id bigint auto_increment not null,
+ one_id bigint,
+ constraint pk_migtest_fk_none primary key (id)
+);
+
+create table migtest_fk_none_via_join (
+ id bigint auto_increment not null,
+ one_id bigint,
+ constraint pk_migtest_fk_none_via_join primary key (id)
+);
+
+create table migtest_fk_one (
+ id bigint auto_increment not null,
+ constraint pk_migtest_fk_one primary key (id)
+);
+
+create table migtest_fk_set_null (
+ id bigint auto_increment not null,
+ one_id bigint,
+ constraint pk_migtest_fk_set_null primary key (id)
+);
+
+create table migtest_e_basic (
+ id integer auto_increment not null,
+ status varchar(1),
+ status2 varchar(1) default 'N' not null,
+ name varchar(127),
+ description varchar(127),
+ some_date datetime,
+ old_boolean tinyint(1) default 0 not null,
+ old_boolean2 tinyint(1),
+ eref_id integer,
+ indextest1 varchar(127),
+ indextest2 varchar(127),
+ indextest3 varchar(127),
+ indextest4 varchar(127),
+ indextest5 varchar(127),
+ indextest6 varchar(127),
+ user_id integer not null,
+ constraint uq_migtest_e_basic_indextest2 unique (indextest2),
+ constraint uq_migtest_e_basic_indextest6 unique (indextest6),
+ constraint pk_migtest_e_basic primary key (id)
+);
+
+create table migtest_e_enum (
+ id integer auto_increment not null,
+ test_status varchar(1),
+ constraint pk_migtest_e_enum primary key (id)
+);
+
+create table migtest_e_history (
+ id integer auto_increment not null,
+ test_string varchar(255),
+ constraint pk_migtest_e_history primary key (id)
+);
+
+create table migtest_e_history2 (
+ id integer auto_increment not null,
+ test_string varchar(255),
+ obsolete_string1 varchar(255),
+ obsolete_string2 varchar(255),
+ constraint pk_migtest_e_history2 primary key (id)
+);
+
+create table migtest_e_history3 (
+ id integer auto_increment not null,
+ test_string varchar(255),
+ constraint pk_migtest_e_history3 primary key (id)
+);
+
+create table migtest_e_history4 (
+ id integer auto_increment not null,
+ test_number integer,
+ constraint pk_migtest_e_history4 primary key (id)
+);
+
+create table migtest_e_history5 (
+ id integer auto_increment not null,
+ test_number integer,
+ constraint pk_migtest_e_history5 primary key (id)
+);
+
+create table migtest_e_history6 (
+ id integer auto_increment not null,
+ test_number1 integer,
+ test_number2 integer not null,
+ constraint pk_migtest_e_history6 primary key (id)
+);
+
+create table migtest_e_ref (
+ id integer auto_increment not null,
+ name varchar(127) not null,
+ constraint uq_migtest_e_ref_name unique (name),
+ constraint pk_migtest_e_ref primary key (id)
+);
+
+create table migtest_e_softdelete (
+ id integer auto_increment not null,
+ test_string varchar(255),
+ constraint pk_migtest_e_softdelete primary key (id)
+);
+
+create table migtest_mtm_c (
+ id integer auto_increment not null,
+ name varchar(255),
+ constraint pk_migtest_mtm_c primary key (id)
+);
+
+create table migtest_mtm_m (
+ id bigint auto_increment not null,
+ name varchar(255),
+ constraint pk_migtest_mtm_m primary key (id)
+);
+
+create table migtest_oto_child (
+ id integer auto_increment not null,
+ name varchar(255),
+ constraint pk_migtest_oto_child primary key (id)
+);
+
+create table migtest_oto_master (
+ id bigint auto_increment not null,
+ name varchar(255),
+ constraint pk_migtest_oto_master primary key (id)
+);
+
+create index ix_migtest_e_basic_indextest1 on migtest_e_basic (indextest1);
+create index ix_migtest_e_basic_indextest5 on migtest_e_basic (indextest5);
+create index ix_migtest_fk_cascade_one_id on migtest_fk_cascade (one_id);
+alter table migtest_fk_cascade add constraint fk_migtest_fk_cascade_one_id foreign key (one_id) references migtest_fk_cascade_one (id) on delete cascade on update cascade;
+
+create index ix_migtest_fk_set_null_one_id on migtest_fk_set_null (one_id);
+alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete set null on update set null;
+
+create index ix_migtest_e_basic_eref_id on migtest_e_basic (eref_id);
+alter table migtest_e_basic add constraint fk_migtest_e_basic_eref_id foreign key (eref_id) references migtest_e_ref (id) on delete restrict on update restrict;
+
+alter table migtest_e_history2 add column sys_period_start datetime(6) default now(6);
+alter table migtest_e_history2 add column sys_period_end datetime(6);
+create table migtest_e_history2_history(
+ id integer,
+ test_string varchar(255),
+ obsolete_string1 varchar(255),
+ obsolete_string2 varchar(255),
+ sys_period_start datetime(6),
+ sys_period_end datetime(6)
+);
+create view migtest_e_history2_with_history as select * from migtest_e_history2 union all select * from migtest_e_history2_history;
+
+alter table migtest_e_history3 add column sys_period_start datetime(6) default now(6);
+alter table migtest_e_history3 add column sys_period_end datetime(6);
+create table migtest_e_history3_history(
+ id integer,
+ test_string varchar(255),
+ sys_period_start datetime(6),
+ sys_period_end datetime(6)
+);
+create view migtest_e_history3_with_history as select * from migtest_e_history3 union all select * from migtest_e_history3_history;
+
+alter table migtest_e_history4 add column sys_period_start datetime(6) default now(6);
+alter table migtest_e_history4 add column sys_period_end datetime(6);
+create table migtest_e_history4_history(
+ id integer,
+ test_number integer,
+ sys_period_start datetime(6),
+ sys_period_end datetime(6)
+);
+create view migtest_e_history4_with_history as select * from migtest_e_history4 union all select * from migtest_e_history4_history;
+
+alter table migtest_e_history5 add column sys_period_start datetime(6) default now(6);
+alter table migtest_e_history5 add column sys_period_end datetime(6);
+create table migtest_e_history5_history(
+ id integer,
+ test_number integer,
+ sys_period_start datetime(6),
+ sys_period_end datetime(6)
+);
+create view migtest_e_history5_with_history as select * from migtest_e_history5 union all select * from migtest_e_history5_history;
+
+alter table migtest_e_history6 add column sys_period_start datetime(6) default now(6);
+alter table migtest_e_history6 add column sys_period_end datetime(6);
+create table migtest_e_history6_history(
+ id integer,
+ test_number1 integer,
+ test_number2 integer,
+ sys_period_start datetime(6),
+ sys_period_end datetime(6)
+);
+create view migtest_e_history6_with_history as select * from migtest_e_history6 union all select * from migtest_e_history6_history;
+
+delimiter $$
+create trigger migtest_e_history2_history_upd before update on migtest_e_history2 for each row begin
+ insert into migtest_e_history2_history (sys_period_start,sys_period_end,id, test_string, obsolete_string2) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string, OLD.obsolete_string2);
+ set NEW.sys_period_start = now(6);
+end$$
+delimiter $$
+create trigger migtest_e_history2_history_del before delete on migtest_e_history2 for each row begin
+ insert into migtest_e_history2_history (sys_period_start,sys_period_end,id, test_string, obsolete_string2) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string, OLD.obsolete_string2);
+end$$
+delimiter $$
+create trigger migtest_e_history3_history_upd before update on migtest_e_history3 for each row begin
+ insert into migtest_e_history3_history (sys_period_start,sys_period_end,id, test_string) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string);
+ set NEW.sys_period_start = now(6);
+end$$
+delimiter $$
+create trigger migtest_e_history3_history_del before delete on migtest_e_history3 for each row begin
+ insert into migtest_e_history3_history (sys_period_start,sys_period_end,id, test_string) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string);
+end$$
+delimiter $$
+create trigger migtest_e_history4_history_upd before update on migtest_e_history4 for each row begin
+ insert into migtest_e_history4_history (sys_period_start,sys_period_end,id, test_number) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number);
+ set NEW.sys_period_start = now(6);
+end$$
+delimiter $$
+create trigger migtest_e_history4_history_del before delete on migtest_e_history4 for each row begin
+ insert into migtest_e_history4_history (sys_period_start,sys_period_end,id, test_number) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number);
+end$$
+delimiter $$
+create trigger migtest_e_history5_history_upd before update on migtest_e_history5 for each row begin
+ insert into migtest_e_history5_history (sys_period_start,sys_period_end,id, test_number) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number);
+ set NEW.sys_period_start = now(6);
+end$$
+delimiter $$
+create trigger migtest_e_history5_history_del before delete on migtest_e_history5 for each row begin
+ insert into migtest_e_history5_history (sys_period_start,sys_period_end,id, test_number) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number);
+end$$
+delimiter $$
+create trigger migtest_e_history6_history_upd before update on migtest_e_history6 for each row begin
+ insert into migtest_e_history6_history (sys_period_start,sys_period_end,id, test_number1, test_number2) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number1, OLD.test_number2);
+ set NEW.sys_period_start = now(6);
+end$$
+delimiter $$
+create trigger migtest_e_history6_history_del before delete on migtest_e_history6 for each row begin
+ insert into migtest_e_history6_history (sys_period_start,sys_period_end,id, test_number1, test_number2) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number1, OLD.test_number2);
+end$$
diff --git a/src/test/resources/dbmigration/migrationtest/mysql55/1.1.sql b/src/test/resources/dbmigration/migrationtest/mysql55/1.1.sql
new file mode 100644
index 000000000..e3e5bf26a
--- /dev/null
+++ b/src/test/resources/dbmigration/migrationtest/mysql55/1.1.sql
@@ -0,0 +1,191 @@
+-- Migrationscripts for ebean unittest
+-- drop dependencies
+drop view if exists migtest_e_history2_with_history;
+drop view if exists migtest_e_history3_with_history;
+drop view if exists migtest_e_history4_with_history;
+drop view if exists migtest_e_history5_with_history;
+
+-- apply changes
+create table migtest_e_user (
+ id integer auto_increment not null,
+ constraint pk_migtest_e_user primary key (id)
+);
+
+create table migtest_mtm_c_migtest_mtm_m (
+ migtest_mtm_c_id integer not null,
+ migtest_mtm_m_id bigint not null,
+ constraint pk_migtest_mtm_c_migtest_mtm_m primary key (migtest_mtm_c_id,migtest_mtm_m_id)
+);
+
+create table migtest_mtm_m_migtest_mtm_c (
+ migtest_mtm_m_id bigint not null,
+ migtest_mtm_c_id integer not null,
+ constraint pk_migtest_mtm_m_migtest_mtm_c primary key (migtest_mtm_m_id,migtest_mtm_c_id)
+);
+
+alter table migtest_ckey_detail add column one_key integer;
+alter table migtest_ckey_detail add column two_key varchar(127);
+
+alter table migtest_ckey_detail add constraint fk_migtest_ckey_detail_parent foreign key (one_key,two_key) references migtest_ckey_parent (one_key,two_key) on delete restrict on update restrict;
+alter table migtest_ckey_parent add column assoc_id integer;
+
+alter table migtest_fk_cascade drop foreign key fk_migtest_fk_cascade_one_id;
+alter table migtest_fk_cascade add constraint fk_migtest_fk_cascade_one_id foreign key (one_id) references migtest_fk_cascade_one (id) on delete restrict on update restrict;
+alter table migtest_fk_none add constraint fk_migtest_fk_none_one_id foreign key (one_id) references migtest_fk_one (id) on delete restrict on update restrict;
+alter table migtest_fk_none_via_join add constraint fk_migtest_fk_none_via_join_one_id foreign key (one_id) references migtest_fk_one (id) on delete restrict on update restrict;
+alter table migtest_fk_set_null drop foreign key fk_migtest_fk_set_null_one_id;
+alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete restrict on update restrict;
+
+update migtest_e_basic set status = 'A' where status is null;
+alter table migtest_e_basic alter status set default 'A';
+alter table migtest_e_basic modify status varchar(1) not null;
+alter table migtest_e_basic alter status2 drop default;
+alter table migtest_e_basic modify status2 varchar(127);
+
+-- rename all collisions;
+alter table migtest_e_basic add constraint uq_migtest_e_basic_description unique (description);
+
+insert into migtest_e_user (id) select distinct user_id from migtest_e_basic;
+alter table migtest_e_basic add constraint fk_migtest_e_basic_user_id foreign key (user_id) references migtest_e_user (id) on delete restrict on update restrict;
+alter table migtest_e_basic modify user_id integer;
+alter table migtest_e_basic add column new_string_field varchar(255) default 'foo''bar' not null;
+alter table migtest_e_basic add column new_boolean_field tinyint(1) default 1 not null;
+update migtest_e_basic set new_boolean_field = old_boolean;
+
+alter table migtest_e_basic add column new_boolean_field2 tinyint(1) default 1 not null;
+alter table migtest_e_basic add column progress integer default 0 not null;
+alter table migtest_e_basic add column new_integer integer default 42 not null;
+
+alter table migtest_e_basic drop index uq_migtest_e_basic_indextest2;
+alter table migtest_e_basic drop index uq_migtest_e_basic_indextest6;
+alter table migtest_e_basic add constraint uq_migtest_e_basic_status_indextest1 unique (status,indextest1);
+alter table migtest_e_basic add constraint uq_migtest_e_basic_name unique (name);
+alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest4 unique (indextest4);
+alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest5 unique (indextest5);
+alter table migtest_e_history modify test_string bigint;
+alter table migtest_e_history comment = 'We have history now';
+
+-- NOTE: table has @History - special migration may be necessary
+update migtest_e_history2 set test_string = 'unknown' where test_string is null;
+alter table migtest_e_history2 alter test_string set default 'unknown';
+alter table migtest_e_history2 modify test_string varchar(255) not null;
+alter table migtest_e_history2 add column test_string2 varchar(255);
+alter table migtest_e_history2 add column test_string3 varchar(255) default 'unknown' not null;
+alter table migtest_e_history2 add column new_column varchar(20);
+alter table migtest_e_history2_history add column test_string2 varchar(255);
+alter table migtest_e_history2_history add column test_string3 varchar(255) default 'unknown';
+alter table migtest_e_history2_history add column new_column varchar(20);
+
+alter table migtest_e_history4 modify test_number bigint;
+alter table migtest_e_history4_history modify test_number bigint;
+alter table migtest_e_history5 add column test_boolean tinyint(1) default 0 not null;
+alter table migtest_e_history5_history add column test_boolean tinyint(1) default 0;
+
+
+-- NOTE: table has @History - special migration may be necessary
+update migtest_e_history6 set test_number1 = 42 where test_number1 is null;
+alter table migtest_e_history6 alter test_number1 set default 42;
+alter table migtest_e_history6 modify test_number1 integer not null;
+alter table migtest_e_history6 modify test_number2 integer;
+alter table migtest_e_softdelete add column deleted tinyint(1) default 0 not null;
+
+alter table migtest_oto_child add column master_id bigint;
+
+create index ix_migtest_e_basic_indextest3 on migtest_e_basic (indextest3);
+create index ix_migtest_e_basic_indextest6 on migtest_e_basic (indextest6);
+drop index ix_migtest_e_basic_indextest1 on migtest_e_basic;
+drop index ix_migtest_e_basic_indextest5 on migtest_e_basic;
+create index ix_migtest_mtm_c_migtest_mtm_m_migtest_mtm_c on migtest_mtm_c_migtest_mtm_m (migtest_mtm_c_id);
+alter table migtest_mtm_c_migtest_mtm_m add constraint fk_migtest_mtm_c_migtest_mtm_m_migtest_mtm_c foreign key (migtest_mtm_c_id) references migtest_mtm_c (id) on delete restrict on update restrict;
+
+create index ix_migtest_mtm_c_migtest_mtm_m_migtest_mtm_m on migtest_mtm_c_migtest_mtm_m (migtest_mtm_m_id);
+alter table migtest_mtm_c_migtest_mtm_m add constraint fk_migtest_mtm_c_migtest_mtm_m_migtest_mtm_m foreign key (migtest_mtm_m_id) references migtest_mtm_m (id) on delete restrict on update restrict;
+
+create index ix_migtest_mtm_m_migtest_mtm_c_migtest_mtm_m on migtest_mtm_m_migtest_mtm_c (migtest_mtm_m_id);
+alter table migtest_mtm_m_migtest_mtm_c add constraint fk_migtest_mtm_m_migtest_mtm_c_migtest_mtm_m foreign key (migtest_mtm_m_id) references migtest_mtm_m (id) on delete restrict on update restrict;
+
+create index ix_migtest_mtm_m_migtest_mtm_c_migtest_mtm_c on migtest_mtm_m_migtest_mtm_c (migtest_mtm_c_id);
+alter table migtest_mtm_m_migtest_mtm_c add constraint fk_migtest_mtm_m_migtest_mtm_c_migtest_mtm_c foreign key (migtest_mtm_c_id) references migtest_mtm_c (id) on delete restrict on update restrict;
+
+create index ix_migtest_ckey_parent_assoc_id on migtest_ckey_parent (assoc_id);
+alter table migtest_ckey_parent add constraint fk_migtest_ckey_parent_assoc_id foreign key (assoc_id) references migtest_ckey_assoc (id) on delete restrict on update restrict;
+
+alter table migtest_oto_child add constraint fk_migtest_oto_child_master_id foreign key (master_id) references migtest_oto_master (id) on delete restrict on update restrict;
+
+alter table migtest_e_history add column sys_period_start datetime(6) default now(6);
+alter table migtest_e_history add column sys_period_end datetime(6);
+create table migtest_e_history_history(
+ id integer,
+ test_string bigint,
+ sys_period_start datetime(6),
+ sys_period_end datetime(6)
+);
+create view migtest_e_history_with_history as select * from migtest_e_history union all select * from migtest_e_history_history;
+
+create view migtest_e_history2_with_history as select * from migtest_e_history2 union all select * from migtest_e_history2_history;
+
+create view migtest_e_history3_with_history as select * from migtest_e_history3 union all select * from migtest_e_history3_history;
+
+create view migtest_e_history4_with_history as select * from migtest_e_history4 union all select * from migtest_e_history4_history;
+
+create view migtest_e_history5_with_history as select * from migtest_e_history5 union all select * from migtest_e_history5_history;
+
+delimiter $$
+create trigger migtest_e_history_history_upd before update on migtest_e_history for each row begin
+ insert into migtest_e_history_history (sys_period_start,sys_period_end,id, test_string) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string);
+ set NEW.sys_period_start = now(6);
+end$$
+delimiter $$
+create trigger migtest_e_history_history_del before delete on migtest_e_history for each row begin
+ insert into migtest_e_history_history (sys_period_start,sys_period_end,id, test_string) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string);
+end$$
+lock tables migtest_e_history2 write, migtest_e_history3 write, migtest_e_history4 write, migtest_e_history5 write;
+-- changes: [add test_string2, add test_string3, add new_column]
+drop trigger migtest_e_history2_history_upd;
+drop trigger migtest_e_history2_history_del;
+delimiter $$
+create trigger migtest_e_history2_history_upd before update on migtest_e_history2 for each row begin
+ insert into migtest_e_history2_history (sys_period_start,sys_period_end,id, test_string, test_string3, new_column, obsolete_string1, obsolete_string2) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string, OLD.test_string3, OLD.new_column, OLD.obsolete_string1, OLD.obsolete_string2);
+ set NEW.sys_period_start = now(6);
+end$$
+delimiter $$
+create trigger migtest_e_history2_history_del before delete on migtest_e_history2 for each row begin
+ insert into migtest_e_history2_history (sys_period_start,sys_period_end,id, test_string, test_string3, new_column, obsolete_string1, obsolete_string2) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string, OLD.test_string3, OLD.new_column, OLD.obsolete_string1, OLD.obsolete_string2);
+end$$
+-- changes: [exclude test_string]
+drop trigger migtest_e_history3_history_upd;
+drop trigger migtest_e_history3_history_del;
+delimiter $$
+create trigger migtest_e_history3_history_upd before update on migtest_e_history3 for each row begin
+ insert into migtest_e_history3_history (sys_period_start,sys_period_end,id) values (OLD.sys_period_start, now(6),OLD.id);
+ set NEW.sys_period_start = now(6);
+end$$
+delimiter $$
+create trigger migtest_e_history3_history_del before delete on migtest_e_history3 for each row begin
+ insert into migtest_e_history3_history (sys_period_start,sys_period_end,id) values (OLD.sys_period_start, now(6),OLD.id);
+end$$
+-- changes: [alter test_number]
+drop trigger migtest_e_history4_history_upd;
+drop trigger migtest_e_history4_history_del;
+delimiter $$
+create trigger migtest_e_history4_history_upd before update on migtest_e_history4 for each row begin
+ insert into migtest_e_history4_history (sys_period_start,sys_period_end,id, test_number) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number);
+ set NEW.sys_period_start = now(6);
+end$$
+delimiter $$
+create trigger migtest_e_history4_history_del before delete on migtest_e_history4 for each row begin
+ insert into migtest_e_history4_history (sys_period_start,sys_period_end,id, test_number) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number);
+end$$
+-- changes: [add test_boolean]
+drop trigger migtest_e_history5_history_upd;
+drop trigger migtest_e_history5_history_del;
+delimiter $$
+create trigger migtest_e_history5_history_upd before update on migtest_e_history5 for each row begin
+ insert into migtest_e_history5_history (sys_period_start,sys_period_end,id, test_number, test_boolean) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number, OLD.test_boolean);
+ set NEW.sys_period_start = now(6);
+end$$
+delimiter $$
+create trigger migtest_e_history5_history_del before delete on migtest_e_history5 for each row begin
+ insert into migtest_e_history5_history (sys_period_start,sys_period_end,id, test_number, test_boolean) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number, OLD.test_boolean);
+end$$
+unlock tables;
diff --git a/src/test/resources/dbmigration/migrationtest/mysql55/1.2__dropsFor_1.1.sql b/src/test/resources/dbmigration/migrationtest/mysql55/1.2__dropsFor_1.1.sql
new file mode 100644
index 000000000..b3317f701
--- /dev/null
+++ b/src/test/resources/dbmigration/migrationtest/mysql55/1.2__dropsFor_1.1.sql
@@ -0,0 +1,34 @@
+-- Migrationscripts for ebean unittest
+-- drop dependencies
+drop view if exists migtest_e_history2_with_history;
+
+-- apply changes
+alter table migtest_e_basic drop column old_boolean;
+
+alter table migtest_e_basic drop column old_boolean2;
+
+alter table migtest_e_basic drop column eref_id;
+
+alter table migtest_e_history2 drop column obsolete_string1;
+alter table migtest_e_history2_history drop column obsolete_string1;
+
+alter table migtest_e_history2 drop column obsolete_string2;
+alter table migtest_e_history2_history drop column obsolete_string2;
+
+drop table if exists migtest_e_ref;
+create view migtest_e_history2_with_history as select * from migtest_e_history2 union all select * from migtest_e_history2_history;
+
+lock tables migtest_e_history2 write;
+-- changes: [drop obsolete_string1, drop obsolete_string2]
+drop trigger migtest_e_history2_history_upd;
+drop trigger migtest_e_history2_history_del;
+delimiter $$
+create trigger migtest_e_history2_history_upd before update on migtest_e_history2 for each row begin
+ insert into migtest_e_history2_history (sys_period_start,sys_period_end,id, test_string, test_string3, new_column) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string, OLD.test_string3, OLD.new_column);
+ set NEW.sys_period_start = now(6);
+end$$
+delimiter $$
+create trigger migtest_e_history2_history_del before delete on migtest_e_history2 for each row begin
+ insert into migtest_e_history2_history (sys_period_start,sys_period_end,id, test_string, test_string3, new_column) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string, OLD.test_string3, OLD.new_column);
+end$$
+unlock tables;
diff --git a/src/test/resources/dbmigration/migrationtest/mysql55/1.3.sql b/src/test/resources/dbmigration/migrationtest/mysql55/1.3.sql
new file mode 100644
index 000000000..057cec8bd
--- /dev/null
+++ b/src/test/resources/dbmigration/migrationtest/mysql55/1.3.sql
@@ -0,0 +1,111 @@
+-- Migrationscripts for ebean unittest
+-- drop dependencies
+drop view if exists migtest_e_history2_with_history;
+drop view if exists migtest_e_history3_with_history;
+drop view if exists migtest_e_history4_with_history;
+
+-- apply changes
+create table migtest_e_ref (
+ id integer auto_increment not null,
+ name varchar(127) not null,
+ constraint uq_migtest_e_ref_name unique (name),
+ constraint pk_migtest_e_ref primary key (id)
+);
+
+alter table migtest_ckey_detail drop foreign key fk_migtest_ckey_detail_parent;
+alter table migtest_fk_cascade drop foreign key fk_migtest_fk_cascade_one_id;
+alter table migtest_fk_cascade add constraint fk_migtest_fk_cascade_one_id foreign key (one_id) references migtest_fk_cascade_one (id) on delete cascade on update cascade;
+alter table migtest_fk_none drop foreign key fk_migtest_fk_none_one_id;
+alter table migtest_fk_none_via_join drop foreign key fk_migtest_fk_none_via_join_one_id;
+alter table migtest_fk_set_null drop foreign key fk_migtest_fk_set_null_one_id;
+alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete set null on update set null;
+alter table migtest_e_basic alter status drop default;
+alter table migtest_e_basic modify status varchar(1);
+
+update migtest_e_basic set status2 = 'N' where status2 is null;
+alter table migtest_e_basic alter status2 set default 'N';
+alter table migtest_e_basic modify status2 varchar(1) not null;
+alter table migtest_e_basic drop index uq_migtest_e_basic_description;
+
+update migtest_e_basic set user_id = 23 where user_id is null;
+alter table migtest_e_basic drop foreign key fk_migtest_e_basic_user_id;
+alter table migtest_e_basic alter user_id set default 23;
+alter table migtest_e_basic modify user_id integer not null;
+alter table migtest_e_basic add column old_boolean tinyint(1) default 0 not null;
+alter table migtest_e_basic add column old_boolean2 tinyint(1);
+alter table migtest_e_basic add column eref_id integer;
+
+alter table migtest_e_basic drop index uq_migtest_e_basic_status_indextest1;
+alter table migtest_e_basic drop index uq_migtest_e_basic_name;
+alter table migtest_e_basic drop index uq_migtest_e_basic_indextest4;
+alter table migtest_e_basic drop index uq_migtest_e_basic_indextest5;
+alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest2 unique (indextest2);
+alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest6 unique (indextest6);
+alter table migtest_e_history comment = '';
+alter table migtest_e_history2 alter test_string drop default;
+alter table migtest_e_history2 modify test_string varchar(255);
+alter table migtest_e_history2 add column obsolete_string1 varchar(255);
+alter table migtest_e_history2 add column obsolete_string2 varchar(255);
+alter table migtest_e_history2_history add column obsolete_string1 varchar(255);
+alter table migtest_e_history2_history add column obsolete_string2 varchar(255);
+
+alter table migtest_e_history4 modify test_number integer;
+alter table migtest_e_history4_history modify test_number integer;
+alter table migtest_e_history6 alter test_number1 drop default;
+alter table migtest_e_history6 modify test_number1 integer;
+
+-- NOTE: table has @History - special migration may be necessary
+update migtest_e_history6 set test_number2 = 7 where test_number2 is null;
+alter table migtest_e_history6 alter test_number2 set default 7;
+alter table migtest_e_history6 modify test_number2 integer not null;
+create index ix_migtest_e_basic_indextest1 on migtest_e_basic (indextest1);
+create index ix_migtest_e_basic_indextest5 on migtest_e_basic (indextest5);
+drop index ix_migtest_e_basic_indextest3 on migtest_e_basic;
+drop index ix_migtest_e_basic_indextest6 on migtest_e_basic;
+create index ix_migtest_e_basic_eref_id on migtest_e_basic (eref_id);
+alter table migtest_e_basic add constraint fk_migtest_e_basic_eref_id foreign key (eref_id) references migtest_e_ref (id) on delete restrict on update restrict;
+
+create view migtest_e_history2_with_history as select * from migtest_e_history2 union all select * from migtest_e_history2_history;
+
+create view migtest_e_history3_with_history as select * from migtest_e_history3 union all select * from migtest_e_history3_history;
+
+create view migtest_e_history4_with_history as select * from migtest_e_history4 union all select * from migtest_e_history4_history;
+
+lock tables migtest_e_history2 write, migtest_e_history3 write, migtest_e_history4 write;
+-- changes: [add obsolete_string1, add obsolete_string2]
+drop trigger migtest_e_history2_history_upd;
+drop trigger migtest_e_history2_history_del;
+delimiter $$
+create trigger migtest_e_history2_history_upd before update on migtest_e_history2 for each row begin
+ insert into migtest_e_history2_history (sys_period_start,sys_period_end,id, test_string, obsolete_string2, test_string2, test_string3, new_column) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string, OLD.obsolete_string2, OLD.test_string2, OLD.test_string3, OLD.new_column);
+ set NEW.sys_period_start = now(6);
+end$$
+delimiter $$
+create trigger migtest_e_history2_history_del before delete on migtest_e_history2 for each row begin
+ insert into migtest_e_history2_history (sys_period_start,sys_period_end,id, test_string, obsolete_string2, test_string2, test_string3, new_column) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string, OLD.obsolete_string2, OLD.test_string2, OLD.test_string3, OLD.new_column);
+end$$
+-- changes: [include test_string]
+drop trigger migtest_e_history3_history_upd;
+drop trigger migtest_e_history3_history_del;
+delimiter $$
+create trigger migtest_e_history3_history_upd before update on migtest_e_history3 for each row begin
+ insert into migtest_e_history3_history (sys_period_start,sys_period_end,id, test_string) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string);
+ set NEW.sys_period_start = now(6);
+end$$
+delimiter $$
+create trigger migtest_e_history3_history_del before delete on migtest_e_history3 for each row begin
+ insert into migtest_e_history3_history (sys_period_start,sys_period_end,id, test_string) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string);
+end$$
+-- changes: [alter test_number]
+drop trigger migtest_e_history4_history_upd;
+drop trigger migtest_e_history4_history_del;
+delimiter $$
+create trigger migtest_e_history4_history_upd before update on migtest_e_history4 for each row begin
+ insert into migtest_e_history4_history (sys_period_start,sys_period_end,id, test_number) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number);
+ set NEW.sys_period_start = now(6);
+end$$
+delimiter $$
+create trigger migtest_e_history4_history_del before delete on migtest_e_history4 for each row begin
+ insert into migtest_e_history4_history (sys_period_start,sys_period_end,id, test_number) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number);
+end$$
+unlock tables;
diff --git a/src/test/resources/dbmigration/migrationtest/mysql55/1.4__dropsFor_1.3.sql b/src/test/resources/dbmigration/migrationtest/mysql55/1.4__dropsFor_1.3.sql
new file mode 100644
index 000000000..ff8fa50d0
--- /dev/null
+++ b/src/test/resources/dbmigration/migrationtest/mysql55/1.4__dropsFor_1.3.sql
@@ -0,0 +1,78 @@
+-- Migrationscripts for ebean unittest
+-- drop dependencies
+drop trigger migtest_e_history_history_upd;
+drop trigger migtest_e_history_history_del;
+drop view migtest_e_history_with_history;
+alter table migtest_e_history drop column sys_period_start;
+alter table migtest_e_history drop column sys_period_end;
+drop table migtest_e_history_history;
+
+drop view if exists migtest_e_history2_with_history;
+drop view if exists migtest_e_history5_with_history;
+
+-- apply changes
+alter table migtest_ckey_detail drop column one_key;
+
+alter table migtest_ckey_detail drop column two_key;
+
+alter table migtest_ckey_parent drop column assoc_id;
+
+alter table migtest_e_basic drop column new_string_field;
+
+alter table migtest_e_basic drop column new_boolean_field;
+
+alter table migtest_e_basic drop column new_boolean_field2;
+
+alter table migtest_e_basic drop column progress;
+
+alter table migtest_e_basic drop column new_integer;
+
+alter table migtest_e_history2 drop column test_string2;
+alter table migtest_e_history2_history drop column test_string2;
+
+alter table migtest_e_history2 drop column test_string3;
+alter table migtest_e_history2_history drop column test_string3;
+
+alter table migtest_e_history2 drop column new_column;
+alter table migtest_e_history2_history drop column new_column;
+
+alter table migtest_e_history5 drop column test_boolean;
+alter table migtest_e_history5_history drop column test_boolean;
+
+alter table migtest_e_softdelete drop column deleted;
+
+alter table migtest_oto_child drop column master_id;
+
+drop table if exists migtest_e_user;
+drop table if exists migtest_mtm_c_migtest_mtm_m;
+drop table if exists migtest_mtm_m_migtest_mtm_c;
+create view migtest_e_history2_with_history as select * from migtest_e_history2 union all select * from migtest_e_history2_history;
+
+create view migtest_e_history5_with_history as select * from migtest_e_history5 union all select * from migtest_e_history5_history;
+
+lock tables migtest_e_history2 write, migtest_e_history5 write;
+-- changes: [drop test_string2, drop test_string3, drop new_column]
+drop trigger migtest_e_history2_history_upd;
+drop trigger migtest_e_history2_history_del;
+delimiter $$
+create trigger migtest_e_history2_history_upd before update on migtest_e_history2 for each row begin
+ insert into migtest_e_history2_history (sys_period_start,sys_period_end,id, test_string, obsolete_string2) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string, OLD.obsolete_string2);
+ set NEW.sys_period_start = now(6);
+end$$
+delimiter $$
+create trigger migtest_e_history2_history_del before delete on migtest_e_history2 for each row begin
+ insert into migtest_e_history2_history (sys_period_start,sys_period_end,id, test_string, obsolete_string2) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_string, OLD.obsolete_string2);
+end$$
+-- changes: [drop test_boolean]
+drop trigger migtest_e_history5_history_upd;
+drop trigger migtest_e_history5_history_del;
+delimiter $$
+create trigger migtest_e_history5_history_upd before update on migtest_e_history5 for each row begin
+ insert into migtest_e_history5_history (sys_period_start,sys_period_end,id, test_number) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number);
+ set NEW.sys_period_start = now(6);
+end$$
+delimiter $$
+create trigger migtest_e_history5_history_del before delete on migtest_e_history5 for each row begin
+ insert into migtest_e_history5_history (sys_period_start,sys_period_end,id, test_number) values (OLD.sys_period_start, now(6),OLD.id, OLD.test_number);
+end$$
+unlock tables;