From 860aad11ce59adb80162509bb62ccc7d416dc7c4 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Fri, 17 Dec 2021 23:22:25 +1300 Subject: [PATCH] WIP h2database v2 --- ebean-api/pom.xml | 2 +- .../java/io/ebean/config/dbplatform/h2/H2Platform.java | 1 + .../ebean/config/dbplatform/h2/H2SequenceIdGenerator.java | 3 +-- ebean-core/pom.xml | 2 +- .../ebeaninternal/server/deploy/parse/DeployInherit.java | 8 ++++++-- .../ebeaninternal/server/type/ScalarTypeEnumStandard.java | 7 ++++++- .../dbmigration/ddlgeneration/platform/H2Ddl.java | 8 +++++++- .../dbmigration/ddlgeneration/BaseDdlHandlerTest.java | 4 ++-- .../platform/PlatformDdl_AlterColumnTest.java | 8 ++++---- .../ddlgeneration/platform/PlatformTypeConverterTest.java | 2 +- ebean-test/pom.xml | 6 +++--- .../org/tests/inheritance/abstrakt/AbstractBaseBlock.java | 2 +- ebean-test/src/test/resources/ebean.properties | 2 +- pom.xml | 4 ++-- 14 files changed, 37 insertions(+), 22 deletions(-) diff --git a/ebean-api/pom.xml b/ebean-api/pom.xml index a27749023..b681c1a70 100644 --- a/ebean-api/pom.xml +++ b/ebean-api/pom.xml @@ -85,7 +85,7 @@ com.h2database h2 - 1.4.199 + 2.0.202 true diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/h2/H2Platform.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/h2/H2Platform.java index cdc923824..4f81f4eb2 100644 --- a/ebean-api/src/main/java/io/ebean/config/dbplatform/h2/H2Platform.java +++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/h2/H2Platform.java @@ -39,6 +39,7 @@ public class H2Platform extends DatabasePlatform { this.dbIdentity.setSupportsIdentity(true); dbTypeMap.put(DbType.UUID, new DbPlatformType("uuid", false)); + dbTypeMap.put(DbType.INTEGER, new DbPlatformType("integer", false)); } /** diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/h2/H2SequenceIdGenerator.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/h2/H2SequenceIdGenerator.java index b4e875511..5ef08c059 100644 --- a/ebean-api/src/main/java/io/ebean/config/dbplatform/h2/H2SequenceIdGenerator.java +++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/h2/H2SequenceIdGenerator.java @@ -18,13 +18,12 @@ public class H2SequenceIdGenerator extends SequenceBatchIdGenerator { */ public H2SequenceIdGenerator(BackgroundExecutor be, DataSource ds, String seqName, int batchSize) { super(be, ds, seqName, batchSize); - this.baseSql = "select " + seqName + ".nextval"; + this.baseSql = "select nextval('" + seqName + "')"; this.unionBaseSql = " union " + baseSql; } @Override public String getSql(int batchSize) { - StringBuilder sb = new StringBuilder(); sb.append(baseSql); for (int i = 1; i < batchSize; i++) { diff --git a/ebean-core/pom.xml b/ebean-core/pom.xml index 08752f040..af55c2c6a 100644 --- a/ebean-core/pom.xml +++ b/ebean-core/pom.xml @@ -78,7 +78,7 @@ com.h2database h2 - 1.4.199 + 2.0.202 provided diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInherit.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInherit.java index 2dd13f993..4eb2fa640 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInherit.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInherit.java @@ -6,6 +6,7 @@ import io.ebeaninternal.server.deploy.InheritInfo; import io.ebeaninternal.server.deploy.meta.DeployBeanDescriptor; import javax.persistence.DiscriminatorColumn; +import javax.persistence.DiscriminatorType; import javax.persistence.DiscriminatorValue; import javax.persistence.Inheritance; import java.util.LinkedHashMap; @@ -105,8 +106,11 @@ public final class DeployInherit { if (da != null) { // lowercase the discriminator column for RawSql and JSON info.setColumnName(da.name().toLowerCase()); - info.setColumnType(da.discriminatorType()); - info.setColumnLength(da.length()); + DiscriminatorType discriminatorType = da.discriminatorType(); + info.setColumnType(discriminatorType); + if (discriminatorType == DiscriminatorType.STRING) { + info.setColumnLength(da.length()); + } info.setColumnDefn(da.columnDefinition()); } if (!info.isAbstract()) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEnumStandard.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEnumStandard.java index 8545bc9a7..969bfd016 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEnumStandard.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeEnumStandard.java @@ -189,7 +189,12 @@ final class ScalarTypeEnumStandard { if (dbValue == null || dbValue instanceof Enum) { return dbValue; } - int ordinal = (Integer) dbValue; + int ordinal; + if (dbValue instanceof Integer) { + ordinal = (Integer) dbValue; + } else { + ordinal = Integer.parseInt(dbValue.toString()); + } if (ordinal < 0 || ordinal >= enumArray.length) { String m = "Unexpected ordinal [" + ordinal + "] out of range [" + enumArray.length + "]"; throw new IllegalStateException(m); diff --git a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/H2Ddl.java b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/H2Ddl.java index 13298faeb..542bc695a 100644 --- a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/H2Ddl.java +++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/H2Ddl.java @@ -22,6 +22,12 @@ public class H2Ddl extends PlatformDdl { @Override protected String convertArrayType(String logicalArrayType) { - return "array"; + int pos = logicalArrayType.indexOf('['); + if (pos == -1) { + return logicalArrayType; + } else { + // trim of the fallback varchar length + return logicalArrayType.substring(0, pos) + " array"; + } } } diff --git a/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/BaseDdlHandlerTest.java b/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/BaseDdlHandlerTest.java index 8de6ac22b..87c48bb85 100644 --- a/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/BaseDdlHandlerTest.java +++ b/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/BaseDdlHandlerTest.java @@ -107,7 +107,7 @@ public class BaseDdlHandlerTest extends BaseTestCase { write = new DdlWrite(); h2Handler().generate(write, Helper.getAlterTableAddDbArrayColumnWithLength()); - assertThat(write.apply().getBuffer()).isEqualTo("alter table foo add column dbarray_ninety array;\n\n"); + assertThat(write.apply().getBuffer()).isEqualTo("alter table foo add column dbarray_ninety varchar array;\n\n"); write = new DdlWrite(); sqlserverHandler().generate(write, Helper.getAlterTableAddDbArrayColumnWithLength()); @@ -127,7 +127,7 @@ public class BaseDdlHandlerTest extends BaseTestCase { write = new DdlWrite(); h2Handler().generate(write, Helper.getAlterTableAddDbArrayColumnIntegerWithLength()); - assertThat(write.apply().getBuffer()).isEqualTo("alter table foo add column dbarray_integer array;\n\n"); + assertThat(write.apply().getBuffer()).isEqualTo("alter table foo add column dbarray_integer integer array;\n\n"); write = new DdlWrite(); sqlserverHandler().generate(write, Helper.getAlterTableAddDbArrayColumnIntegerWithLength()); diff --git a/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl_AlterColumnTest.java b/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl_AlterColumnTest.java index 5da1a25a8..3141eef74 100644 --- a/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl_AlterColumnTest.java +++ b/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformDdl_AlterColumnTest.java @@ -57,10 +57,10 @@ public class PlatformDdl_AlterColumnTest { @Test public void convertArrayType_h2() { - assertThat(h2Ddl.convertArrayType("varchar[](90)")).isEqualTo("array"); - assertThat(h2Ddl.convertArrayType("integer[](60)")).isEqualTo("array"); - assertThat(h2Ddl.convertArrayType("varchar[]")).isEqualTo("array"); - assertThat(h2Ddl.convertArrayType("integer[]")).isEqualTo("array"); + assertThat(h2Ddl.convertArrayType("varchar[](90)")).isEqualTo("varchar array"); + assertThat(h2Ddl.convertArrayType("integer[](60)")).isEqualTo("integer array"); + assertThat(h2Ddl.convertArrayType("varchar[]")).isEqualTo("varchar array"); + assertThat(h2Ddl.convertArrayType("integer[]")).isEqualTo("integer array"); } @Test diff --git a/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformTypeConverterTest.java b/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformTypeConverterTest.java index 45dbd60b6..25a4621d5 100644 --- a/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformTypeConverterTest.java +++ b/ebean-ddl-generator/src/test/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/PlatformTypeConverterTest.java @@ -61,7 +61,7 @@ public class PlatformTypeConverterTest { assertThat(converter.convert("clob")).isEqualTo("clob"); assertThat(converter.convert("blob")).isEqualTo("blob"); assertThat(converter.convert("tinyint")).isEqualTo("tinyint"); - assertThat(converter.convert("integer(8)")).isEqualTo("integer(8)"); + assertThat(converter.convert("integer(8)")).isEqualTo("integer"); assertThat(converter.convert("funky")).isEqualTo("funky"); // unknown } diff --git a/ebean-test/pom.xml b/ebean-test/pom.xml index c91ff68b9..f0fb26900 100644 --- a/ebean-test/pom.xml +++ b/ebean-test/pom.xml @@ -16,7 +16,7 @@ org.slf4j slf4j-api - 1.7.30 + 1.7.32 provided @@ -187,8 +187,8 @@ com.oracle.database.jdbc - ojdbc8 19.12.0.0 diff --git a/ebean-test/src/test/java/org/tests/inheritance/abstrakt/AbstractBaseBlock.java b/ebean-test/src/test/java/org/tests/inheritance/abstrakt/AbstractBaseBlock.java index c4c3d0202..ecd0c2e39 100644 --- a/ebean-test/src/test/java/org/tests/inheritance/abstrakt/AbstractBaseBlock.java +++ b/ebean-test/src/test/java/org/tests/inheritance/abstrakt/AbstractBaseBlock.java @@ -3,7 +3,7 @@ package org.tests.inheritance.abstrakt; import javax.persistence.*; @Entity -@Table(name = "block") +@Table(name = "blockt") @Inheritance @DiscriminatorColumn(name = "case_type", discriminatorType = DiscriminatorType.INTEGER) public abstract class AbstractBaseBlock { diff --git a/ebean-test/src/test/resources/ebean.properties b/ebean-test/src/test/resources/ebean.properties index 402facaab..d7e1debae 100644 --- a/ebean-test/src/test/resources/ebean.properties +++ b/ebean-test/src/test/resources/ebean.properties @@ -72,7 +72,7 @@ datasource.db.databaseDriver=org.h2.Driver datasource.h2.username=sa datasource.h2.password= -datasource.h2.url=jdbc:h2:mem:testsMem;DB_CLOSE_ON_EXIT=FALSE +datasource.h2.url=jdbc:h2:mem:testsMem;DB_CLOSE_ON_EXIT=FALSE;NON_KEYWORDS=KEY,VALUE datasource.h2.poolListener=org.tests.basic.MyTestDataSourcePoolListener #datasource.h2.minConnections=1 #datasource.h2.maxConnections=25 diff --git a/pom.xml b/pom.xml index 1b48a5474..fc3905d89 100644 --- a/pom.xml +++ b/pom.xml @@ -61,14 +61,14 @@ ch.qos.logback logback-classic - 1.2.3 + 1.2.8 test com.h2database h2 - 1.4.199 + 2.0.202 test