From 9da7c9468e945f943cbd50bf71a1db483abc2e3a Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Wed, 15 May 2019 16:19:12 +1200 Subject: [PATCH] #1695 Add caseSensitiveCollation configuration option This is really only to use with testing via platform.isCaseSensitiveCollation() to determine which asserts/tests apply (based on collation). --- .../java/io/ebean/config/PlatformConfig.java | 18 ++++++++++++++++++ .../config/dbplatform/DatabasePlatform.java | 13 +++++++++++++ src/test/java/io/ebean/BaseTestCase.java | 2 +- .../java/io/ebean/config/ServerConfigTest.java | 3 +++ src/test/resources/ebean.properties | 7 ++++++- 5 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/ebean/config/PlatformConfig.java b/src/main/java/io/ebean/config/PlatformConfig.java index 298b25d23..2aa48c3f0 100644 --- a/src/main/java/io/ebean/config/PlatformConfig.java +++ b/src/main/java/io/ebean/config/PlatformConfig.java @@ -52,6 +52,8 @@ public class PlatformConfig { */ private boolean databaseInetAddressVarchar; + private boolean caseSensitiveCollation = true; + /** * Modify the default mapping of standard types such as default precision for DECIMAL etc. */ @@ -74,6 +76,7 @@ public class PlatformConfig { this.idType = platformConfig.idType; this.geometrySRID = platformConfig.geometrySRID; this.dbUuid = platformConfig.dbUuid; + this.caseSensitiveCollation = platformConfig.caseSensitiveCollation; } /** @@ -90,6 +93,20 @@ public class PlatformConfig { this.allQuotedIdentifiers = allQuotedIdentifiers; } + /** + * Return true if the collation is case sensitive. + */ + public boolean isCaseSensitiveCollation() { + return caseSensitiveCollation; + } + + /** + * Set to false to indicate that the collation is case insensitive. + */ + public void setCaseSensitiveCollation(boolean caseSensitiveCollation) { + this.caseSensitiveCollation = caseSensitiveCollation; + } + /** * Return a value used to represent TRUE in the database. *

@@ -255,6 +272,7 @@ public class PlatformConfig { databaseBooleanTrue = p.get("databaseBooleanTrue", databaseBooleanTrue); databaseBooleanFalse = p.get("databaseBooleanFalse", databaseBooleanFalse); databaseInetAddressVarchar = p.getBoolean("databaseInetAddressVarchar", databaseInetAddressVarchar); + caseSensitiveCollation = p.getBoolean("caseSensitiveCollation", caseSensitiveCollation); 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 16ab2592a..6a96724e8 100644 --- a/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java +++ b/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java @@ -71,6 +71,8 @@ public class DatabasePlatform { */ protected boolean allQuotedIdentifiers; + protected boolean caseSensitiveCollation = true; + /** * For limit/offset, row_number etc limiting of SQL queries. */ @@ -226,6 +228,7 @@ public class DatabasePlatform { */ public void configure(PlatformConfig config) { this.sequenceBatchSize = config.getDatabaseSequenceBatchSize(); + this.caseSensitiveCollation = config.isCaseSensitiveCollation(); configureIdType(config.getIdType()); configure(config, config.isAllQuotedIdentifiers()); } @@ -315,6 +318,16 @@ public class DatabasePlatform { return supportsDeleteTableAlias; } + /** + * Return true if the collation is case sensitive. + *

+ * This is expected to be used for testing only. + *

+ */ + public boolean isCaseSensitiveCollation() { + return caseSensitiveCollation; + } + /** * Return the maximum table name length. *

diff --git a/src/test/java/io/ebean/BaseTestCase.java b/src/test/java/io/ebean/BaseTestCase.java index db22d6deb..9156aaf3c 100644 --- a/src/test/java/io/ebean/BaseTestCase.java +++ b/src/test/java/io/ebean/BaseTestCase.java @@ -127,7 +127,7 @@ public abstract class BaseTestCase { } public boolean isPlatformCaseSensitive() { - return !isMySql() && !isSqlServer(); + return spiEbeanServer().getDatabasePlatform().isCaseSensitiveCollation(); } /** diff --git a/src/test/java/io/ebean/config/ServerConfigTest.java b/src/test/java/io/ebean/config/ServerConfigTest.java index 7a5097190..2279a864e 100644 --- a/src/test/java/io/ebean/config/ServerConfigTest.java +++ b/src/test/java/io/ebean/config/ServerConfigTest.java @@ -70,6 +70,7 @@ public class ServerConfigTest { props.setProperty("namingConvention", "io.ebean.config.MatchingNamingConvention"); props.setProperty("idGeneratorAutomatic", "true"); props.setProperty("enabledL2Regions", "r0,users,orgs"); + props.setProperty("caseSensitiveCollation", "false"); serverConfig.loadFromProperties(props); @@ -79,6 +80,7 @@ public class ServerConfigTest { assertTrue(serverConfig.isDbOffline()); assertTrue(serverConfig.isAutoReadOnlyDataSource()); assertTrue(serverConfig.isIdGeneratorAutomatic()); + assertFalse(serverConfig.getPlatformConfig().isCaseSensitiveCollation()); assertThat(serverConfig.getNamingConvention()).isInstanceOf(MatchingNamingConvention.class); @@ -131,6 +133,7 @@ public class ServerConfigTest { assertFalse(serverConfig.isIdGeneratorAutomatic()); assertEquals(JsonConfig.DateTime.ISO8601, serverConfig.getJsonDateTime()); assertEquals(JsonConfig.Date.ISO8601, serverConfig.getJsonDate()); + assertTrue(serverConfig.getPlatformConfig().isCaseSensitiveCollation()); } @Test diff --git a/src/test/resources/ebean.properties b/src/test/resources/ebean.properties index cc60f184a..7fdded46b 100644 --- a/src/test/resources/ebean.properties +++ b/src/test/resources/ebean.properties @@ -129,7 +129,9 @@ datasource.hsqldb.password= datasource.hsqldb.databaseUrl=jdbc:hsqldb:mem:tests datasource.hsqldb.databaseDriver=org.hsqldb.jdbcDriver - +# Set caseSensitiveCollation to false when using +# MySql with case insenstive collation +ebean.mysql.caseSensitiveCollation=false datasource.mysql.username=unit datasource.mysql.password=unit datasource.mysql.databaseUrl=jdbc:mysql://127.0.0.1:3306/unit @@ -158,6 +160,9 @@ datasource.pg.maxStackTraceSize=50 # Our main testing target for SqlServer is sqlserver17 ebean.sqlserver.databasePlatformName=sqlserver17 +# set caseSensitiveCollation=false when using a +# case insenstive collation with sql server +ebean.sqlserver.caseSensitiveCollation=false datasource.sqlserver.username=test_ebean datasource.sqlserver.password=SqlS3rv#r datasource.sqlserver.url=jdbc:sqlserver://localhost:1433;databaseName=test_ebean;sendTimeAsDateTime=false