From 93a087a0e17bb8421eb22cc7829b0e195cbf826e Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Mon, 7 Aug 2023 15:54:44 +0200 Subject: [PATCH 1/2] HHH-16611 Switch NameQualifierSupport for Sybase to BOTH --- Jenkinsfile | 17 +++++++++++++++-- ci/build.sh | 2 ++ gradle/databases.gradle | 2 +- .../org/hibernate/dialect/SybaseDialect.java | 6 ++---- .../AbstractInformationExtractorImpl.java | 10 ++++++++-- .../SchemaManagerExplicitSchemaTest.java | 18 +++++++++--------- nightly.Jenkinsfile | 15 +++++++++++++-- 7 files changed, 50 insertions(+), 20 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 5f82e034884d..6f667217f668 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -59,6 +59,9 @@ stage('Configure') { if ( pullRequest.labels.contains( 'hana' ) ) { this.environments.add( new BuildEnvironment( dbName: 'hana_cloud', dbLockableResource: 'hana-cloud', dbLockResourceAsHost: true ) ) } + if ( pullRequest.labels.contains( 'sybase' ) ) { + this.environments.add( new BuildEnvironment( dbName: 'sybase_jconn' ) ) + } } helper.configure { @@ -235,6 +238,13 @@ stage('Build') { sh "./docker_db.sh sybase" state[buildEnv.tag]['containerName'] = "sybase" break; + case "sybase_jconn": + docker.withRegistry('https://index.docker.io/v1/', 'hibernateci.hub.docker.com') { + docker.image('nguoianphu/docker-sybase').pull() + } + sh "./docker_db.sh sybase" + state[buildEnv.tag]['containerName'] = "sybase" + break; case "cockroachdb": docker.withRegistry('https://index.docker.io/v1/', 'hibernateci.hub.docker.com') { docker.image('cockroachdb/cockroach:v22.2.2').pull() @@ -256,8 +266,11 @@ stage('Build') { withEnv(["RDBMS=${buildEnv.dbName}"]) { try { if (buildEnv.dbLockableResource == null) { - timeout( [time: buildEnv.longRunning ? 480 : 120, unit: 'MINUTES'] ) { - sh cmd + withCredentials([file(credentialsId: 'sybase-jconnect-driver', variable: 'jconnect_driver')]) { + sh 'cp $jconnect_driver ./drivers/jconn4.jar' + timeout( [time: buildEnv.longRunning ? 480 : 120, unit: 'MINUTES'] ) { + sh cmd + } } } else { diff --git a/ci/build.sh b/ci/build.sh index f83866aade06..37b55645fefe 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -32,6 +32,8 @@ elif [ "$RDBMS" == "mssql" ] || [ "$RDBMS" == "mssql_2017" ]; then goal="-Pdb=mssql_ci" elif [ "$RDBMS" == "sybase" ]; then goal="-Pdb=sybase_ci" +elif [ "$RDBMS" == "sybase_jconn" ]; then + goal="-Pdb=sybase_jconn_ci" elif [ "$RDBMS" == "tidb" ]; then goal="-Pdb=tidb" elif [ "$RDBMS" == "hana_cloud" ]; then diff --git a/gradle/databases.gradle b/gradle/databases.gradle index 46e808bbdd85..eaf9adf60ddd 100644 --- a/gradle/databases.gradle +++ b/gradle/databases.gradle @@ -88,7 +88,7 @@ ext { 'jdbc.user' : 'hibernate_orm_test', 'jdbc.pass' : 'hibernate_orm_test', // Disable prepared statement caching to avoid issues with changing schemas - 'jdbc.url' : 'jdbc:sybase:Tds:' + dbHost + ':5000/hibernate_orm_test', + 'jdbc.url' : 'jdbc:sybase:Tds:' + dbHost + ':9000/hibernate_orm_test', 'connection.init_sql' : 'set ansinull on set quoted_identifier on' ], mysql : [ diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/SybaseDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/SybaseDialect.java index 9baf70b53001..fbc236b31154 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/SybaseDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/SybaseDialect.java @@ -309,7 +309,7 @@ public boolean canCreateSchema() { @Override public String getCurrentSchemaCommand() { - return "select db_name()"; + return "select user_name()"; } @Override @@ -477,9 +477,7 @@ public IdentifierHelper buildIdentifierHelper(IdentifierHelperBuilder builder, D @Override public NameQualifierSupport getNameQualifierSupport() { - // No support for schemas: https://userapps.support.sap.com/sap/support/knowledge/en/2591730 - // Authorization schemas seem to be something different: https://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc36272.1550/html/commands/X48762.htm - return NameQualifierSupport.CATALOG; + return NameQualifierSupport.BOTH; } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/AbstractInformationExtractorImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/AbstractInformationExtractorImpl.java index c512bb84b721..25b893b5d4eb 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/AbstractInformationExtractorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/AbstractInformationExtractorImpl.java @@ -435,6 +435,9 @@ private Identifier getCurrentSchema(JdbcEnvironment jdbcEnvironment) { catch (SQLException ignore) { LOG.sqlWarning( ignore.getErrorCode(), ignore.getSQLState() ); } + catch (AbstractMethodError ignore) { + // jConnect and jTDS report that they "support" schemas, but they don't really + } } return currentSchema; } @@ -498,6 +501,9 @@ private String getCurrentSchemaFilter(JdbcEnvironment jdbcEnvironment) { catch (SQLException ignore) { LOG.sqlWarning( ignore.getErrorCode(), ignore.getSQLState() ); } + catch (AbstractMethodError ignore) { + // jConnect and jTDS report that they "support" schemas, but they don't really + } } return currentSchemaFilter; } @@ -523,7 +529,7 @@ public NameSpaceTablesInformation getTables(Identifier catalog, Identifier schem catalogFilter = toMetaDataObjectName( extractionContext.getDefaultCatalog() ); } else { - catalogFilter = ""; + catalogFilter = null; } } } @@ -548,7 +554,7 @@ public NameSpaceTablesInformation getTables(Identifier catalog, Identifier schem schemaFilter = toMetaDataObjectName( extractionContext.getDefaultSchema() ); } else { - schemaFilter = ""; + schemaFilter = null; } } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/schemamanager/SchemaManagerExplicitSchemaTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/schemamanager/SchemaManagerExplicitSchemaTest.java index 9564e9207753..9e0278af673c 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/schemamanager/SchemaManagerExplicitSchemaTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/schemamanager/SchemaManagerExplicitSchemaTest.java @@ -6,13 +6,10 @@ */ package org.hibernate.orm.test.schemamanager; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.ManyToOne; -import org.hibernate.dialect.OracleDialect; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SessionImplementor; +import org.hibernate.tool.schema.spi.SchemaManagementException; + import org.hibernate.testing.orm.junit.DialectFeatureChecks; import org.hibernate.testing.orm.junit.DomainModel; import org.hibernate.testing.orm.junit.RequiresDialectFeature; @@ -20,11 +17,14 @@ import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.hibernate.testing.orm.junit.Setting; -import org.hibernate.testing.orm.junit.SkipForDialect; -import org.hibernate.tool.schema.spi.SchemaManagementException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; + import static org.hibernate.cfg.AvailableSettings.DEFAULT_SCHEMA; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -36,8 +36,8 @@ @DomainModel(annotatedClasses = {SchemaManagerExplicitSchemaTest.Book.class, SchemaManagerExplicitSchemaTest.Author.class}) @SessionFactory(exportSchema = false) @ServiceRegistry(settings = @Setting(name = DEFAULT_SCHEMA, value = "schema_manager_test")) -@SkipForDialect(dialectClass = OracleDialect.class, reason = "Oracle tests run in the DBO schema") -@RequiresDialectFeature(feature= DialectFeatureChecks.SupportsTruncateTable.class) +@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsTruncateTable.class) +@RequiresDialectFeature(feature = DialectFeatureChecks.SupportSchemaCreation.class) public class SchemaManagerExplicitSchemaTest { @BeforeEach diff --git a/nightly.Jenkinsfile b/nightly.Jenkinsfile index 485966c13971..6fd6aa00849b 100644 --- a/nightly.Jenkinsfile +++ b/nightly.Jenkinsfile @@ -38,6 +38,7 @@ stage('Configure') { new BuildEnvironment( dbName: 'db2_10_5', longRunning: true ), new BuildEnvironment( dbName: 'mssql_2017' ), // Unfortunately there is no SQL Server 2008 image, so we have to test with 2017 // new BuildEnvironment( dbName: 'sybase_16' ), // There only is a Sybase ASE 16 image, so no pint in testing that nightly + new BuildEnvironment( dbName: 'sybase_jconn' ), // Long running databases new BuildEnvironment( dbName: 'cockroachdb', node: 'cockroachdb', longRunning: true ), new BuildEnvironment( dbName: 'cockroachdb_22_1', node: 'cockroachdb', longRunning: true ), @@ -220,6 +221,13 @@ stage('Build') { sh "./docker_db.sh sybase" state[buildEnv.tag]['containerName'] = "sybase" break; + case "sybase_jconn": + docker.withRegistry('https://index.docker.io/v1/', 'hibernateci.hub.docker.com') { + docker.image('nguoianphu/docker-sybase').pull() + } + sh "./docker_db.sh sybase" + state[buildEnv.tag]['containerName'] = "sybase" + break; case "cockroachdb": docker.withRegistry('https://index.docker.io/v1/', 'hibernateci.hub.docker.com') { docker.image('cockroachdb/cockroach:v22.2.2').pull() @@ -248,8 +256,11 @@ stage('Build') { withEnv(["RDBMS=${buildEnv.dbName}"]) { try { if (buildEnv.dbLockableResource == null) { - timeout( [time: buildEnv.longRunning ? 480 : 120, unit: 'MINUTES'] ) { - sh cmd + withCredentials([file(credentialsId: 'sybase-jconnect-driver', variable: 'jconnect_driver')]) { + sh 'cp $jconnect_driver ./drivers/jconn4.jar' + timeout( [time: buildEnv.longRunning ? 480 : 120, unit: 'MINUTES'] ) { + sh cmd + } } } else { From 79d47cf35f18af0e69fff051ee887dce0be98f97 Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Mon, 7 Aug 2023 17:19:22 +0200 Subject: [PATCH 2/2] Improve test reliability on Sybase --- .../orm/test/timezones/AutoZonedTest.java | 55 +++++++++------- .../orm/test/timezones/ColumnZonedTest.java | 55 +++++++++------- .../orm/test/timezones/DefaultZonedTest.java | 54 ++++++++------- .../test/timezones/JDBCTimeZoneZonedTest.java | 57 ++++++++-------- .../orm/test/timezones/PassThruZonedTest.java | 57 ++++++++-------- .../timezones/UTCNormalizedInstantTest.java | 66 +++++++++---------- .../timezones/UTCNormalizedZonedTest.java | 55 +++++++++------- 7 files changed, 214 insertions(+), 185 deletions(-) diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/AutoZonedTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/AutoZonedTest.java index fab1d95e9516..421fd7deb3b5 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/AutoZonedTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/AutoZonedTest.java @@ -1,8 +1,11 @@ package org.hibernate.orm.test.timezones; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; +import java.time.OffsetDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoField; + import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.SybaseDialect; @@ -15,11 +18,9 @@ import org.hibernate.testing.orm.junit.Setting; import org.junit.jupiter.api.Test; -import java.time.OffsetDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.time.temporal.ChronoUnit; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -29,8 +30,19 @@ public class AutoZonedTest { @Test void test(SessionFactoryScope scope) { - ZonedDateTime nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ); - OffsetDateTime nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours(3) ); + final ZonedDateTime nowZoned; + final OffsetDateTime nowOffset; + if ( scope.getSessionFactory().getJdbcServices().getDialect() instanceof SybaseDialect ) { + // Sybase has 1/300th sec precision + nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ) + .with( ChronoField.NANO_OF_SECOND, 0L ); + nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours(3) ) + .with( ChronoField.NANO_OF_SECOND, 0L ); + } + else { + nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ); + nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours(3) ); + } long id = scope.fromTransaction( s-> { Zoned z = new Zoned(); z.zonedDateTime = nowZoned; @@ -41,21 +53,14 @@ public class AutoZonedTest { scope.inSession( s -> { Zoned z = s.find(Zoned.class, id); final Dialect dialect = scope.getSessionFactory().getJdbcServices().getDialect(); - if ( dialect instanceof SybaseDialect ) { - // Sybase with jTDS driver has 1/300th sec precision - assertEquals( nowZoned.toInstant().truncatedTo(ChronoUnit.SECONDS), z.zonedDateTime.toInstant().truncatedTo(ChronoUnit.SECONDS) ); - assertEquals( nowOffset.toInstant().truncatedTo(ChronoUnit.SECONDS), z.offsetDateTime.toInstant().truncatedTo(ChronoUnit.SECONDS) ); - } - else { - assertEquals( - DateTimeUtils.roundToDefaultPrecision( nowZoned.toInstant(), dialect ), - DateTimeUtils.roundToDefaultPrecision( z.zonedDateTime.toInstant(), dialect ) - ); - assertEquals( - DateTimeUtils.roundToDefaultPrecision( nowOffset.toInstant(), dialect ), - DateTimeUtils.roundToDefaultPrecision( z.offsetDateTime.toInstant(), dialect ) - ); - } + assertEquals( + DateTimeUtils.roundToDefaultPrecision( nowZoned.toInstant(), dialect ), + DateTimeUtils.roundToDefaultPrecision( z.zonedDateTime.toInstant(), dialect ) + ); + assertEquals( + DateTimeUtils.roundToDefaultPrecision( nowOffset.toInstant(), dialect ), + DateTimeUtils.roundToDefaultPrecision( z.offsetDateTime.toInstant(), dialect ) + ); assertEquals( nowZoned.toOffsetDateTime().getOffset(), z.zonedDateTime.toOffsetDateTime().getOffset() ); assertEquals( nowOffset.getOffset(), z.offsetDateTime.getOffset() ); }); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/ColumnZonedTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/ColumnZonedTest.java index de445847456a..dbbcb3a62eca 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/ColumnZonedTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/ColumnZonedTest.java @@ -1,8 +1,11 @@ package org.hibernate.orm.test.timezones; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; +import java.time.OffsetDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoField; + import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.SybaseDialect; @@ -15,11 +18,9 @@ import org.hibernate.testing.orm.junit.Setting; import org.junit.jupiter.api.Test; -import java.time.OffsetDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.time.temporal.ChronoUnit; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -29,8 +30,19 @@ public class ColumnZonedTest { @Test void test(SessionFactoryScope scope) { - ZonedDateTime nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ); - OffsetDateTime nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours(3) ); + final ZonedDateTime nowZoned; + final OffsetDateTime nowOffset; + if ( scope.getSessionFactory().getJdbcServices().getDialect() instanceof SybaseDialect ) { + // Sybase has 1/300th sec precision + nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ) + .with( ChronoField.NANO_OF_SECOND, 0L ); + nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours(3) ) + .with( ChronoField.NANO_OF_SECOND, 0L ); + } + else { + nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ); + nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours(3) ); + } long id = scope.fromTransaction( s-> { Zoned z = new Zoned(); z.zonedDateTime = nowZoned; @@ -41,21 +53,14 @@ public class ColumnZonedTest { scope.inSession( s -> { Zoned z = s.find(Zoned.class, id); final Dialect dialect = scope.getSessionFactory().getJdbcServices().getDialect(); - if ( dialect instanceof SybaseDialect) { - // Sybase with jTDS driver has 1/300th sec precision - assertEquals( nowZoned.toInstant().truncatedTo(ChronoUnit.SECONDS), z.zonedDateTime.toInstant().truncatedTo(ChronoUnit.SECONDS) ); - assertEquals( nowOffset.toInstant().truncatedTo(ChronoUnit.SECONDS), z.offsetDateTime.toInstant().truncatedTo(ChronoUnit.SECONDS) ); - } - else { - assertEquals( - DateTimeUtils.roundToDefaultPrecision( nowZoned.toInstant(), dialect ), - DateTimeUtils.roundToDefaultPrecision( z.zonedDateTime.toInstant(), dialect ) - ); - assertEquals( - DateTimeUtils.roundToDefaultPrecision( nowOffset.toInstant(), dialect ), - DateTimeUtils.roundToDefaultPrecision( z.offsetDateTime.toInstant(), dialect ) - ); - } + assertEquals( + DateTimeUtils.roundToDefaultPrecision( nowZoned.toInstant(), dialect ), + DateTimeUtils.roundToDefaultPrecision( z.zonedDateTime.toInstant(), dialect ) + ); + assertEquals( + DateTimeUtils.roundToDefaultPrecision( nowOffset.toInstant(), dialect ), + DateTimeUtils.roundToDefaultPrecision( z.offsetDateTime.toInstant(), dialect ) + ); assertEquals( nowZoned.toOffsetDateTime().getOffset(), z.zonedDateTime.toOffsetDateTime().getOffset() ); assertEquals( nowOffset.getOffset(), z.offsetDateTime.getOffset() ); }); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/DefaultZonedTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/DefaultZonedTest.java index 6b8fa956d530..0bb8a1f3b220 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/DefaultZonedTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/DefaultZonedTest.java @@ -1,8 +1,10 @@ package org.hibernate.orm.test.timezones; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; +import java.time.OffsetDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoField; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.SybaseDialect; @@ -14,11 +16,9 @@ import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.junit.jupiter.api.Test; -import java.time.OffsetDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.time.temporal.ChronoUnit; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -27,8 +27,19 @@ public class DefaultZonedTest { @Test void test(SessionFactoryScope scope) { - ZonedDateTime nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ); - OffsetDateTime nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours(3) ); + final ZonedDateTime nowZoned; + final OffsetDateTime nowOffset; + if ( scope.getSessionFactory().getJdbcServices().getDialect() instanceof SybaseDialect ) { + // Sybase has 1/300th sec precision + nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ) + .with( ChronoField.NANO_OF_SECOND, 0L ); + nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours(3) ) + .with( ChronoField.NANO_OF_SECOND, 0L ); + } + else { + nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ); + nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours(3) ); + } long id = scope.fromTransaction( s-> { Zoned z = new Zoned(); z.zonedDateTime = nowZoned; @@ -39,21 +50,14 @@ public class DefaultZonedTest { scope.inSession( s -> { Zoned z = s.find(Zoned.class, id); final Dialect dialect = scope.getSessionFactory().getJdbcServices().getDialect(); - if ( dialect instanceof SybaseDialect) { - // Sybase with jTDS driver has 1/300th sec precision - assertEquals( nowZoned.toInstant().truncatedTo(ChronoUnit.SECONDS), z.zonedDateTime.toInstant().truncatedTo(ChronoUnit.SECONDS) ); - assertEquals( nowOffset.toInstant().truncatedTo(ChronoUnit.SECONDS), z.offsetDateTime.toInstant().truncatedTo(ChronoUnit.SECONDS) ); - } - else { - assertEquals( - DateTimeUtils.roundToDefaultPrecision( nowZoned.toInstant(), dialect ), - DateTimeUtils.roundToDefaultPrecision( z.zonedDateTime.toInstant(), dialect ) - ); - assertEquals( - DateTimeUtils.roundToDefaultPrecision( nowOffset.toInstant(), dialect ), - DateTimeUtils.roundToDefaultPrecision( z.offsetDateTime.toInstant(), dialect ) - ); - } + assertEquals( + DateTimeUtils.roundToDefaultPrecision( nowZoned.toInstant(), dialect ), + DateTimeUtils.roundToDefaultPrecision( z.zonedDateTime.toInstant(), dialect ) + ); + assertEquals( + DateTimeUtils.roundToDefaultPrecision( nowOffset.toInstant(), dialect ), + DateTimeUtils.roundToDefaultPrecision( z.offsetDateTime.toInstant(), dialect ) + ); if ( dialect.getTimeZoneSupport() == TimeZoneSupport.NATIVE ) { assertEquals( nowZoned.toOffsetDateTime().getOffset(), z.zonedDateTime.toOffsetDateTime().getOffset() ); assertEquals( nowOffset.getOffset(), z.offsetDateTime.getOffset() ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/JDBCTimeZoneZonedTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/JDBCTimeZoneZonedTest.java index ed2bae14da38..f77bc9ced6a0 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/JDBCTimeZoneZonedTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/JDBCTimeZoneZonedTest.java @@ -1,8 +1,12 @@ package org.hibernate.orm.test.timezones; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; +import java.time.Instant; +import java.time.OffsetDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoField; + import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.SybaseDialect; @@ -15,12 +19,9 @@ import org.hibernate.testing.orm.junit.Setting; import org.junit.jupiter.api.Test; -import java.time.Instant; -import java.time.OffsetDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.time.temporal.ChronoUnit; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -31,8 +32,19 @@ public class JDBCTimeZoneZonedTest { @Test void test(SessionFactoryScope scope) { - ZonedDateTime nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ); - OffsetDateTime nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours( 3) ); + final ZonedDateTime nowZoned; + final OffsetDateTime nowOffset; + if ( scope.getSessionFactory().getJdbcServices().getDialect() instanceof SybaseDialect ) { + // Sybase has 1/300th sec precision + nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ) + .with( ChronoField.NANO_OF_SECOND, 0L ); + nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours(3) ) + .with( ChronoField.NANO_OF_SECOND, 0L ); + } + else { + nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ); + nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours(3) ); + } long id = scope.fromTransaction( s-> { Zoned z = new Zoned(); z.zonedDateTime = nowZoned; @@ -45,21 +57,14 @@ public class JDBCTimeZoneZonedTest { ZoneId systemZone = ZoneId.systemDefault(); ZoneOffset systemOffset = systemZone.getRules().getOffset( Instant.now() ); final Dialect dialect = scope.getSessionFactory().getJdbcServices().getDialect(); - if ( dialect instanceof SybaseDialect) { - // Sybase with jTDS driver has 1/300th sec precision - assertEquals( nowZoned.toInstant().truncatedTo(ChronoUnit.SECONDS), z.zonedDateTime.toInstant().truncatedTo(ChronoUnit.SECONDS)); - assertEquals( nowOffset.toInstant().truncatedTo(ChronoUnit.SECONDS), z.offsetDateTime.toInstant().truncatedTo(ChronoUnit.SECONDS)); - } - else { - assertEquals( - DateTimeUtils.roundToDefaultPrecision( nowZoned.toInstant(), dialect ), - DateTimeUtils.roundToDefaultPrecision( z.zonedDateTime.toInstant(), dialect ) - ); - assertEquals( - DateTimeUtils.roundToDefaultPrecision( nowOffset.toInstant(), dialect ), - DateTimeUtils.roundToDefaultPrecision( z.offsetDateTime.toInstant(), dialect ) - ); - } + assertEquals( + DateTimeUtils.roundToDefaultPrecision( nowZoned.toInstant(), dialect ), + DateTimeUtils.roundToDefaultPrecision( z.zonedDateTime.toInstant(), dialect ) + ); + assertEquals( + DateTimeUtils.roundToDefaultPrecision( nowOffset.toInstant(), dialect ), + DateTimeUtils.roundToDefaultPrecision( z.offsetDateTime.toInstant(), dialect ) + ); assertEquals( systemZone, z.zonedDateTime.getZone() ); assertEquals( systemOffset, z.offsetDateTime.getOffset() ); }); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/PassThruZonedTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/PassThruZonedTest.java index 85f897adadc2..8404eb25e475 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/PassThruZonedTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/PassThruZonedTest.java @@ -1,8 +1,12 @@ package org.hibernate.orm.test.timezones; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; +import java.time.Instant; +import java.time.OffsetDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoField; + import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.SybaseDialect; @@ -15,12 +19,9 @@ import org.hibernate.testing.orm.junit.Setting; import org.junit.jupiter.api.Test; -import java.time.Instant; -import java.time.OffsetDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.time.temporal.ChronoUnit; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -30,8 +31,19 @@ public class PassThruZonedTest { @Test void test(SessionFactoryScope scope) { - ZonedDateTime nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ); - OffsetDateTime nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours( 3) ); + final ZonedDateTime nowZoned; + final OffsetDateTime nowOffset; + if ( scope.getSessionFactory().getJdbcServices().getDialect() instanceof SybaseDialect ) { + // Sybase has 1/300th sec precision + nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ) + .with( ChronoField.NANO_OF_SECOND, 0L ); + nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours(3) ) + .with( ChronoField.NANO_OF_SECOND, 0L ); + } + else { + nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ); + nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours(3) ); + } long id = scope.fromTransaction( s-> { Zoned z = new Zoned(); z.zonedDateTime = nowZoned; @@ -44,21 +56,14 @@ public class PassThruZonedTest { ZoneId systemZone = ZoneId.systemDefault(); ZoneOffset systemOffset = systemZone.getRules().getOffset( Instant.now() ); final Dialect dialect = scope.getSessionFactory().getJdbcServices().getDialect(); - if ( dialect instanceof SybaseDialect) { - // Sybase with jTDS driver has 1/300th sec precision - assertEquals( nowZoned.toInstant().truncatedTo(ChronoUnit.SECONDS), z.zonedDateTime.toInstant().truncatedTo(ChronoUnit.SECONDS)); - assertEquals( nowOffset.toInstant().truncatedTo(ChronoUnit.SECONDS), z.offsetDateTime.toInstant().truncatedTo(ChronoUnit.SECONDS)); - } - else { - assertEquals( - DateTimeUtils.roundToDefaultPrecision( nowZoned.toInstant(), dialect ), - DateTimeUtils.roundToDefaultPrecision( z.zonedDateTime.toInstant(), dialect ) - ); - assertEquals( - DateTimeUtils.roundToDefaultPrecision( nowOffset.toInstant(), dialect ), - DateTimeUtils.roundToDefaultPrecision( z.offsetDateTime.toInstant(), dialect ) - ); - } + assertEquals( + DateTimeUtils.roundToDefaultPrecision( nowZoned.toInstant(), dialect ), + DateTimeUtils.roundToDefaultPrecision( z.zonedDateTime.toInstant(), dialect ) + ); + assertEquals( + DateTimeUtils.roundToDefaultPrecision( nowOffset.toInstant(), dialect ), + DateTimeUtils.roundToDefaultPrecision( z.offsetDateTime.toInstant(), dialect ) + ); assertEquals( systemZone, z.zonedDateTime.getZone() ); assertEquals( systemOffset, z.offsetDateTime.getOffset() ); }); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/UTCNormalizedInstantTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/UTCNormalizedInstantTest.java index 70f4dedc9b1e..57c40aae06b7 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/UTCNormalizedInstantTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/UTCNormalizedInstantTest.java @@ -1,7 +1,7 @@ package org.hibernate.orm.test.timezones; import java.time.Instant; -import java.time.temporal.ChronoUnit; +import java.time.temporal.ChronoField; import java.util.TimeZone; import org.hibernate.annotations.JdbcTypeCode; @@ -26,7 +26,14 @@ public class UTCNormalizedInstantTest { @Test void test(SessionFactoryScope scope) { - final Instant instant = Instant.now(); + final Instant instant; + if ( scope.getSessionFactory().getJdbcServices().getDialect() instanceof SybaseDialect ) { + // Sybase has 1/300th sec precision + instant = Instant.now().with( ChronoField.NANO_OF_SECOND, 0L ); + } + else { + instant = Instant.now(); + } long id = scope.fromTransaction( s-> { final Zoned z = new Zoned(); z.utcInstant = instant; @@ -37,27 +44,27 @@ public class UTCNormalizedInstantTest { scope.inSession( s-> { final Zoned z = s.find(Zoned.class, id); final Dialect dialect = scope.getSessionFactory().getJdbcServices().getDialect(); - if ( dialect instanceof SybaseDialect) { - // Sybase with jTDS driver has 1/300th sec precision - assertEquals( z.utcInstant.truncatedTo(ChronoUnit.SECONDS), instant.truncatedTo(ChronoUnit.SECONDS) ); - assertEquals( z.localInstant.truncatedTo(ChronoUnit.SECONDS), instant.truncatedTo(ChronoUnit.SECONDS) ); - } - else { - assertEquals( - DateTimeUtils.roundToDefaultPrecision( z.utcInstant, dialect ), - DateTimeUtils.roundToDefaultPrecision( instant, dialect ) - ); - assertEquals( - DateTimeUtils.roundToDefaultPrecision( z.localInstant, dialect ), - DateTimeUtils.roundToDefaultPrecision( instant, dialect ) - ); - } + assertEquals( + DateTimeUtils.roundToDefaultPrecision( z.utcInstant, dialect ), + DateTimeUtils.roundToDefaultPrecision( instant, dialect ) + ); + assertEquals( + DateTimeUtils.roundToDefaultPrecision( z.localInstant, dialect ), + DateTimeUtils.roundToDefaultPrecision( instant, dialect ) + ); }); } @Test void testWithSystemTimeZone(SessionFactoryScope scope) { TimeZone.setDefault( TimeZone.getTimeZone("CET") ); - final Instant instant = Instant.now(); + final Instant instant; + if ( scope.getSessionFactory().getJdbcServices().getDialect() instanceof SybaseDialect ) { + // Sybase has 1/300th sec precision + instant = Instant.now().with( ChronoField.NANO_OF_SECOND, 0L ); + } + else { + instant = Instant.now(); + } long id = scope.fromTransaction( s-> { final Zoned z = new Zoned(); z.utcInstant = instant; @@ -68,21 +75,14 @@ public class UTCNormalizedInstantTest { scope.inSession( s-> { final Zoned z = s.find(Zoned.class, id); final Dialect dialect = scope.getSessionFactory().getJdbcServices().getDialect(); - if ( dialect instanceof SybaseDialect) { - // Sybase with jTDS driver has 1/300th sec precision - assertEquals( z.utcInstant.truncatedTo(ChronoUnit.SECONDS), instant.truncatedTo(ChronoUnit.SECONDS) ); - assertEquals( z.localInstant.truncatedTo(ChronoUnit.SECONDS), instant.truncatedTo(ChronoUnit.SECONDS) ); - } - else { - assertEquals( - DateTimeUtils.roundToDefaultPrecision( z.utcInstant, dialect ), - DateTimeUtils.roundToDefaultPrecision( instant, dialect ) - ); - assertEquals( - DateTimeUtils.roundToDefaultPrecision( z.localInstant, dialect ), - DateTimeUtils.roundToDefaultPrecision( instant, dialect ) - ); - } + assertEquals( + DateTimeUtils.roundToDefaultPrecision( z.utcInstant, dialect ), + DateTimeUtils.roundToDefaultPrecision( instant, dialect ) + ); + assertEquals( + DateTimeUtils.roundToDefaultPrecision( z.localInstant, dialect ), + DateTimeUtils.roundToDefaultPrecision( instant, dialect ) + ); }); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/UTCNormalizedZonedTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/UTCNormalizedZonedTest.java index 00306c9622b5..cbab481e0f1d 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/UTCNormalizedZonedTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/timezones/UTCNormalizedZonedTest.java @@ -1,8 +1,11 @@ package org.hibernate.orm.test.timezones; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; +import java.time.OffsetDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoField; + import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.SybaseDialect; @@ -15,11 +18,9 @@ import org.hibernate.testing.orm.junit.Setting; import org.junit.jupiter.api.Test; -import java.time.OffsetDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.time.temporal.ChronoUnit; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -29,8 +30,19 @@ public class UTCNormalizedZonedTest { @Test void test(SessionFactoryScope scope) { - ZonedDateTime nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ); - OffsetDateTime nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours(3) ); + final ZonedDateTime nowZoned; + final OffsetDateTime nowOffset; + if ( scope.getSessionFactory().getJdbcServices().getDialect() instanceof SybaseDialect ) { + // Sybase has 1/300th sec precision + nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ) + .with( ChronoField.NANO_OF_SECOND, 0L ); + nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours(3) ) + .with( ChronoField.NANO_OF_SECOND, 0L ); + } + else { + nowZoned = ZonedDateTime.now().withZoneSameInstant( ZoneId.of("CET") ); + nowOffset = OffsetDateTime.now().withOffsetSameInstant( ZoneOffset.ofHours(3) ); + } long id = scope.fromTransaction( s-> { Zoned z = new Zoned(); z.zonedDateTime = nowZoned; @@ -41,21 +53,14 @@ public class UTCNormalizedZonedTest { scope.inSession( s-> { Zoned z = s.find(Zoned.class, id); final Dialect dialect = scope.getSessionFactory().getJdbcServices().getDialect(); - if ( dialect instanceof SybaseDialect) { - // Sybase with jTDS driver has 1/300th sec precision - assertEquals( nowZoned.toInstant().truncatedTo(ChronoUnit.SECONDS), z.zonedDateTime.toInstant().truncatedTo(ChronoUnit.SECONDS) ); - assertEquals( nowOffset.toInstant().truncatedTo(ChronoUnit.SECONDS), z.offsetDateTime.toInstant().truncatedTo(ChronoUnit.SECONDS) ); - } - else { - assertEquals( - DateTimeUtils.roundToDefaultPrecision( nowZoned.toInstant(), dialect ), - DateTimeUtils.roundToDefaultPrecision( z.zonedDateTime.toInstant(), dialect ) - ); - assertEquals( - DateTimeUtils.roundToDefaultPrecision( nowOffset.toInstant(), dialect ), - DateTimeUtils.roundToDefaultPrecision( z.offsetDateTime.toInstant(), dialect ) - ); - } + assertEquals( + DateTimeUtils.roundToDefaultPrecision( nowZoned.toInstant(), dialect ), + DateTimeUtils.roundToDefaultPrecision( z.zonedDateTime.toInstant(), dialect ) + ); + assertEquals( + DateTimeUtils.roundToDefaultPrecision( nowOffset.toInstant(), dialect ), + DateTimeUtils.roundToDefaultPrecision( z.offsetDateTime.toInstant(), dialect ) + ); assertEquals( ZoneId.of("Z"), z.zonedDateTime.getZone() ); assertEquals( ZoneOffset.ofHours(0), z.offsetDateTime.getOffset() ); });