diff --git a/pom.xml b/pom.xml index 2b1fc0bc7..b9ae3f3e7 100644 --- a/pom.xml +++ b/pom.xml @@ -118,7 +118,7 @@ io.ebean ebean-annotation - 4.12 + 4.13 @@ -330,7 +330,7 @@ io.ebean ebean-maven-plugin - 11.44.1 + 11.45.1 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;