diff --git a/docker_db.sh b/docker_db.sh index 365bd2db7f73..4cc2d099fd0b 100755 --- a/docker_db.sh +++ b/docker_db.sh @@ -93,7 +93,7 @@ mysql_setup() { } mariadb() { - mariadb_11_8 + mariadb_12_0 } mariadb_wait_until_start() @@ -117,37 +117,31 @@ mariadb_wait_until_start() mariadb_10_6() { $CONTAINER_CLI rm -f mariadb || true - $CONTAINER_CLI run --name mariadb -e MARIADB_USER=hibernate_orm_test -e MARIADB_PASSWORD=hibernate_orm_test -e MARIADB_DATABASE=hibernate_orm_test -e MARIADB_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d ${DB_IMAGE_MARIADB_10_6:-docker.io/mariadb:10.6.20} --character-set-server=utf8mb4 --collation-server=utf8mb4_bin --skip-character-set-client-handshake --lower_case_table_names=2 + $CONTAINER_CLI run --name mariadb -e MARIADB_USER=hibernate_orm_test -e MARIADB_PASSWORD=hibernate_orm_test -e MARIADB_DATABASE=hibernate_orm_test -e MARIADB_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d ${DB_IMAGE_MARIADB_10_6:-docker.io/mariadb:10.6.23} --character-set-server=utf8mb4 --collation-server=utf8mb4_bin --skip-character-set-client-handshake --lower_case_table_names=2 mariadb_wait_until_start } mariadb_10_11() { $CONTAINER_CLI rm -f mariadb || true - $CONTAINER_CLI run --name mariadb -e MARIADB_USER=hibernate_orm_test -e MARIADB_PASSWORD=hibernate_orm_test -e MARIADB_DATABASE=hibernate_orm_test -e MARIADB_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d ${DB_IMAGE_MARIADB_10_11:-docker.io/mariadb:10.11.8} --character-set-server=utf8mb4 --collation-server=utf8mb4_bin --skip-character-set-client-handshake --lower_case_table_names=2 - mariadb_wait_until_start -} - -mariadb_11_1() { - $CONTAINER_CLI rm -f mariadb || true - $CONTAINER_CLI run --name mariadb -e MARIADB_USER=hibernate_orm_test -e MARIADB_PASSWORD=hibernate_orm_test -e MARIADB_DATABASE=hibernate_orm_test -e MARIADB_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d ${DB_IMAGE_MARIADB_11_1:-docker.io/mariadb:11.1.2} --character-set-server=utf8mb4 --collation-server=utf8mb4_bin --skip-character-set-client-handshake --lower_case_table_names=2 + $CONTAINER_CLI run --name mariadb -e MARIADB_USER=hibernate_orm_test -e MARIADB_PASSWORD=hibernate_orm_test -e MARIADB_DATABASE=hibernate_orm_test -e MARIADB_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d ${DB_IMAGE_MARIADB_10_11:-docker.io/mariadb:10.11.14} --character-set-server=utf8mb4 --collation-server=utf8mb4_bin --skip-character-set-client-handshake --lower_case_table_names=2 mariadb_wait_until_start } mariadb_11_4() { $CONTAINER_CLI rm -f mariadb || true - $CONTAINER_CLI run --name mariadb -e MARIADB_USER=hibernate_orm_test -e MARIADB_PASSWORD=hibernate_orm_test -e MARIADB_DATABASE=hibernate_orm_test -e MARIADB_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d ${DB_IMAGE_MARIADB_11_4:-docker.io/mariadb:11.4.2} --character-set-server=utf8mb4 --collation-server=utf8mb4_bin --skip-character-set-client-handshake --lower_case_table_names=2 + $CONTAINER_CLI run --name mariadb -e MARIADB_USER=hibernate_orm_test -e MARIADB_PASSWORD=hibernate_orm_test -e MARIADB_DATABASE=hibernate_orm_test -e MARIADB_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d ${DB_IMAGE_MARIADB_11_4:-docker.io/mariadb:11.4.8} --character-set-server=utf8mb4 --collation-server=utf8mb4_bin --skip-character-set-client-handshake --lower_case_table_names=2 mariadb_wait_until_start } -mariadb_11_7() { +mariadb_11_8() { $CONTAINER_CLI rm -f mariadb || true - $CONTAINER_CLI run --name mariadb -e MARIADB_USER=hibernate_orm_test -e MARIADB_PASSWORD=hibernate_orm_test -e MARIADB_DATABASE=hibernate_orm_test -e MARIADB_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d ${DB_IMAGE_MARIADB_11_7:-docker.io/mariadb:11.7.2} --character-set-server=utf8mb4 --collation-server=utf8mb4_bin --skip-character-set-client-handshake --lower_case_table_names=2 + $CONTAINER_CLI run --name mariadb -e MARIADB_USER=hibernate_orm_test -e MARIADB_PASSWORD=hibernate_orm_test -e MARIADB_DATABASE=hibernate_orm_test -e MARIADB_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d ${DB_IMAGE_MARIADB_11_8:-docker.io/mariadb:11.8.3} --character-set-server=utf8mb4 --collation-server=utf8mb4_bin --skip-character-set-client-handshake --lower_case_table_names=2 mariadb_wait_until_start } -mariadb_11_8() { +mariadb_12_0() { $CONTAINER_CLI rm -f mariadb || true - $CONTAINER_CLI run --name mariadb -e MARIADB_USER=hibernate_orm_test -e MARIADB_PASSWORD=hibernate_orm_test -e MARIADB_DATABASE=hibernate_orm_test -e MARIADB_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d ${DB_IMAGE_MARIADB_11_8:-docker.io/mariadb:11.8.2} --character-set-server=utf8mb4 --collation-server=utf8mb4_bin --skip-character-set-client-handshake --lower_case_table_names=2 + $CONTAINER_CLI run --name mariadb -e MARIADB_USER=hibernate_orm_test -e MARIADB_PASSWORD=hibernate_orm_test -e MARIADB_DATABASE=hibernate_orm_test -e MARIADB_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d ${DB_IMAGE_MARIADB_12_0:-docker.io/mariadb:12.0.2} --character-set-server=utf8mb4 --collation-server=utf8mb4_bin --skip-character-set-client-handshake --lower_case_table_names=2 mariadb_wait_until_start } @@ -1100,9 +1094,8 @@ if [ -z ${1} ]; then echo -e "\thana" echo -e "\tmariadb" echo -e "\tmariadb_verylatest" - echo -e "\tmariadb_11_7" + echo -e "\tmariadb_11_8" echo -e "\tmariadb_11_4" - echo -e "\tmariadb_11_1" echo -e "\tmariadb_10_11" echo -e "\tmariadb_10_6" echo -e "\tmssql" diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/MariaDBLegacyDialect.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/MariaDBLegacyDialect.java index 6f5d4e6e702e..f9ef9ec3ca50 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/MariaDBLegacyDialect.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/MariaDBLegacyDialect.java @@ -216,6 +216,11 @@ public boolean supportsColumnCheck() { return getVersion().isSameOrAfter( 10, 2 ); } + @Override + public boolean supportsNamedColumnCheck() { + return false; + } + @Override public boolean doesRoundTemporalOnOverflow() { // See https://jira.mariadb.org/browse/MDEV-16991 diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AnnotatedColumn.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AnnotatedColumn.java index f0385ea2ab6f..6bf98fddaf22 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AnnotatedColumn.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/AnnotatedColumn.java @@ -967,7 +967,7 @@ void applyCheckConstraints(jakarta.persistence.CheckConstraint[] checkConstraint if ( isNotEmpty( checkConstraintAnnotationUsages ) ) { for ( jakarta.persistence.CheckConstraint checkConstraintAnnotationUsage : checkConstraintAnnotationUsages ) { addCheckConstraint( - checkConstraintAnnotationUsage.name(), + nullIfEmpty( checkConstraintAnnotationUsage.name() ), checkConstraintAnnotationUsage.constraint(), checkConstraintAnnotationUsage.options() ); @@ -983,7 +983,7 @@ void applyCheckConstraint(PropertyData inferredData, int length) { if ( checksAnn != null ) { final Check[] checkAnns = checksAnn.value(); for ( Check checkAnn : checkAnns ) { - addCheckConstraint( checkAnn.name(), checkAnn.constraints() ); + addCheckConstraint( nullIfEmpty( checkAnn.name() ), checkAnn.constraints() ); } } else { diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/TableBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/TableBinder.java index ed807176d6b2..8392cf29716a 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/internal/TableBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/internal/TableBinder.java @@ -44,6 +44,7 @@ import static org.hibernate.internal.util.StringHelper.isNotEmpty; import static org.hibernate.internal.util.StringHelper.isQuoted; import static org.hibernate.internal.util.StringHelper.nullIfBlank; +import static org.hibernate.internal.util.StringHelper.nullIfEmpty; import static org.hibernate.internal.util.StringHelper.unquote; import static org.hibernate.internal.util.collections.CollectionHelper.isNotEmpty; @@ -896,7 +897,7 @@ static void addTableCheck( for ( jakarta.persistence.CheckConstraint checkConstraintAnnotationUsage : checkConstraintAnnotationUsages ) { table.addCheck( new CheckConstraint( - checkConstraintAnnotationUsage.name(), + nullIfEmpty( checkConstraintAnnotationUsage.name() ), checkConstraintAnnotationUsage.constraint(), checkConstraintAnnotationUsage.options() ) diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/DatabaseVersion.java b/hibernate-core/src/main/java/org/hibernate/dialect/DatabaseVersion.java index 69f91c49d4ce..e3fb9810e9bb 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/DatabaseVersion.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/DatabaseVersion.java @@ -208,6 +208,56 @@ default boolean isSameOrAfter(int otherMajor, int otherMinor, int otherMicro) { || ( major == otherMajor && minor == otherMinor && micro >= otherMicro ); } + /** + * {@link #isSame} or {@link #isBefore} + */ + default boolean isSameOrBefore(DatabaseVersion other) { + return isSameOrBefore( other.getDatabaseMajorVersion(), other.getDatabaseMinorVersion() ); + } + + /** + * {@link #isSame} or {@link #isBefore} + */ + default boolean isSameOrBefore(Integer otherMajor, Integer otherMinor) { + return isSameOrBefore( + (int) otherMajor, + otherMinor == null ? NO_VERSION : otherMinor + ); + } + + /** + * {@link #isSame} or {@link #isBefore} + */ + default boolean isSameOrBefore(int otherMajor) { + final int major = getDatabaseMajorVersion(); + + return major <= otherMajor; + } + + /** + * {@link #isSame} or {@link #isBefore} + */ + default boolean isSameOrBefore(int otherMajor, int otherMinor) { + final int major = getDatabaseMajorVersion(); + final int minor = getDatabaseMinorVersion(); + + return major < otherMajor + || ( major == otherMajor && minor <= otherMinor ); + } + + /** + * {@link #isSame} or {@link #isBefore} + */ + default boolean isSameOrBefore(int otherMajor, int otherMinor, int otherMicro) { + final int major = getDatabaseMajorVersion(); + final int minor = getDatabaseMinorVersion(); + final int micro = getDatabaseMicroVersion(); + + return major < otherMajor + || ( major == otherMajor && minor < otherMinor ) + || ( major == otherMajor && minor == otherMinor && micro <= otherMicro ); + } + /** * Determine whether this version comes after the passed one */ diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java index dd1224ea07d0..585e8d7f7375 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java @@ -4188,6 +4188,16 @@ public boolean supportsColumnCheck() { return true; } + /** + * Does this dialect support named column-level check constraints? + * + * @return True if named column-level {@code check} constraints are supported; + * false otherwise. + */ + public boolean supportsNamedColumnCheck() { + return supportsColumnCheck(); + } + /** * Does this dialect support table-level check constraints? * diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/MariaDBDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/MariaDBDialect.java index 850056742042..19c4fb69d1c8 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/MariaDBDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/MariaDBDialect.java @@ -242,6 +242,11 @@ public boolean supportsColumnCheck() { return true; } + @Override + public boolean supportsNamedColumnCheck() { + return false; + } + @Override public boolean doesRoundTemporalOnOverflow() { // See https://jira.mariadb.org/browse/MDEV-16991 diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/ColumnDefinitions.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/ColumnDefinitions.java index 3130e3ed894f..c68bb8b359d7 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/ColumnDefinitions.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/ColumnDefinitions.java @@ -144,34 +144,41 @@ private static void appendConstraints( } if ( dialect.supportsColumnCheck() ) { - // some databases (Maria, SQL Server) don't like multiple 'check' clauses final List checkConstraints = column.getCheckConstraints(); - long anonConstraints = checkConstraints.stream().filter(CheckConstraint::isAnonymous).count(); - if ( anonConstraints == 1 ) { - for ( CheckConstraint constraint : checkConstraints ) { - definition.append( constraint.constraintString( dialect ) ); + boolean hasAnonymousConstraints = false; + for ( CheckConstraint constraint : checkConstraints ) { + if ( constraint.isAnonymous() ) { + if ( !hasAnonymousConstraints ) { + definition.append(" check ("); + hasAnonymousConstraints = true; + } + else { + definition.append(" and "); + } + definition.append( constraint.getConstraintInParens() ); } } - else { - boolean first = true; + if ( hasAnonymousConstraints ) { + definition.append( ')' ); + } + + if ( !dialect.supportsTableCheck() ) { + // When table check constraints are not supported, try to render all named constraints for ( CheckConstraint constraint : checkConstraints ) { - if ( constraint.isAnonymous() ) { - if ( first ) { - definition.append(" check ("); - first = false; - } - else { - definition.append(" and "); - } - definition.append( constraint.getConstraintInParens() ); + if ( constraint.isNamed() ) { + definition.append( constraint.constraintString( dialect ) ); } } - if ( !first ) { - definition.append(")"); - } + } + else if ( !hasAnonymousConstraints && dialect.supportsNamedColumnCheck() ) { + // Otherwise only render the first named constraint as column constraint if there are no anonymous + // constraints and named column check constraint are supported, because some database don't like + // multiple check clauses. + // Note that the TableExporter will take care of named constraints then for ( CheckConstraint constraint : checkConstraints ) { if ( constraint.isNamed() ) { definition.append( constraint.constraintString( dialect ) ); + break; } } } diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java index 98358f28aab0..f597d840371e 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java @@ -197,37 +197,43 @@ protected void applyTableTypeString(StringBuilder buf) { protected void applyTableCheck(Table table, StringBuilder buf) { if ( dialect.supportsTableCheck() ) { - if ( !dialect.supportsColumnCheck() ) { - for ( Column column : table.getColumns() ) { - // some databases (Maria, SQL Server) don't like multiple 'check' clauses - final List checkConstraints = column.getCheckConstraints(); - long anonConstraints = checkConstraints.stream().filter( CheckConstraint::isAnonymous ).count(); - if ( anonConstraints == 1 ) { - for ( CheckConstraint constraint : checkConstraints ) { - buf.append( "," ).append( constraint.constraintString( dialect ) ); - } - } - else { - boolean first = true; - for ( CheckConstraint constraint : checkConstraints ) { - if ( constraint.isAnonymous() ) { - if ( first ) { - buf.append( "," ).append( " check (" ); - first = false; - } - else { - buf.append( " and " ); - } - buf.append( constraint.getConstraintInParens() ); + for ( Column column : table.getColumns() ) { + final List checkConstraints = column.getCheckConstraints(); + boolean hasAnonymousConstraints = false; + if ( !dialect.supportsColumnCheck() ) { + for ( CheckConstraint constraint : checkConstraints ) { + if ( constraint.isAnonymous() ) { + if ( !hasAnonymousConstraints ) { + buf.append( ", check (" ); + hasAnonymousConstraints = true; + } + else { + buf.append( " and " ); } + buf.append( constraint.getConstraintInParens() ); } - if ( !first ) { - buf.append( ")" ); + } + if ( hasAnonymousConstraints ) { + buf.append( ')' ); + } + } + else { + hasAnonymousConstraints = checkConstraints.stream().anyMatch( CheckConstraint::isAnonymous ); + } + + // Since some databases don't like when multiple check clauses appear for a colum definition, + // named constraints need to be hoisted to the table definition. + // Skip the first named constraint if the column has no anonymous constraints and the dialect + // supports named column check constraints, because ColumnDefinitions will render the first check + // constraint already. + boolean skipNextNamedConstraint = !hasAnonymousConstraints && dialect.supportsNamedColumnCheck(); + for ( CheckConstraint constraint : checkConstraints ) { + if ( constraint.isNamed() ) { + if ( skipNextNamedConstraint ) { + skipNextNamedConstraint = false; } - for ( CheckConstraint constraint : checkConstraints ) { - if ( constraint.isNamed() ) { - buf.append( constraint.constraintString( dialect ) ); - } + else { + buf.append( ',' ).append( constraint.constraintString( dialect ) ); } } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/generics/GenericsTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/generics/GenericsTest.java index d9f9a9901d6a..8c41528a7a4d 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/generics/GenericsTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/generics/GenericsTest.java @@ -39,7 +39,7 @@ @ServiceRegistry(settings = @Setting(name = Environment.AUTO_CLOSE_SESSION, value = "true")) public class GenericsTest { - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = "known bug in HANA: rs.next() returns false for org.hibernate.id.enhanced.SequenceStructure$1.getNextValue() for this test") + @SkipForDialect(dialectClass = HANADialect.class, reason = "known bug in HANA: rs.next() returns false for org.hibernate.id.enhanced.SequenceStructure$1.getNextValue() for this test") @Test public void testManyToOneGenerics(SessionFactoryScope scope) { Paper white = new Paper(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/query/QueryAndSQLTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/query/QueryAndSQLTest.java index 4678d372f113..6902becac8cb 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/query/QueryAndSQLTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/query/QueryAndSQLTest.java @@ -15,7 +15,6 @@ import org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl; import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.HANADialect; -import org.hibernate.dialect.PostgreSQLDialect; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.query.NativeQuery; import org.hibernate.query.Query; @@ -119,7 +118,7 @@ public void testNativeQueryWithFormulaAttribute(SessionFactoryScope scope) { } @Test - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = "invalid name of function or procedure: SYSDATE") + @SkipForDialect(dialectClass = HANADialect.class, reason = "invalid name of function or procedure: SYSDATE") public void testNativeQueryWithFormulaAttributeWithoutAlias(SessionFactoryScope scope) { scope.inTransaction( session -> { @@ -596,8 +595,6 @@ public void testDiscriminator(SessionFactoryScope scope) { } @Test - @SkipForDialect(dialectClass = PostgreSQLDialect.class, matchSubTypes = true, - reason = "postgresql jdbc driver does not implement the setQueryTimeout method") public void testCache(SessionFactoryScope scope) { Plane plane = new Plane(); scope.inTransaction( diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/uniqueconstraint/UniqueConstraintTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/uniqueconstraint/UniqueConstraintTest.java index a9ad3c316ae5..201c5273d71b 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/uniqueconstraint/UniqueConstraintTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/uniqueconstraint/UniqueConstraintTest.java @@ -27,7 +27,6 @@ @DomainModel( annotatedClasses = { Room.class, Building.class, House.class } ) @SessionFactory @SkipForDialect( dialectClass = InformixDialect.class, - matchSubTypes = true, reason = "Informix does not properly support unique constraints on nullable columns" ) @SkipForDialect( dialectClass = SybaseDialect.class, matchSubTypes = true, diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/cache/CollectionCacheEvictionComplexIdTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/cache/CollectionCacheEvictionComplexIdTest.java index 40d9ceb1c9ea..0cc82ab58419 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/cache/CollectionCacheEvictionComplexIdTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/cache/CollectionCacheEvictionComplexIdTest.java @@ -36,7 +36,7 @@ @SkipForDialect(dialectClass = MySQLDialect.class, majorVersion = 5, reason = "BLOB/TEXT column 'id' used in key specification without a key length") -@SkipForDialect(dialectClass = OracleDialect.class, matchSubTypes = true, reason = "ORA-02329: column of datatype LOB cannot be unique or a primary key") +@SkipForDialect(dialectClass = OracleDialect.class, reason = "ORA-02329: column of datatype LOB cannot be unique or a primary key") @SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix does not support unique / primary constraints on binary columns") @DomainModel( annotatedClasses = { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/constraint/ConstraintInterpretationTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/constraint/ConstraintInterpretationTest.java index 94728d62c2e8..8a77605a473e 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/constraint/ConstraintInterpretationTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/constraint/ConstraintInterpretationTest.java @@ -15,19 +15,9 @@ import jakarta.persistence.UniqueConstraint; import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.DB2Dialect; -import org.hibernate.dialect.H2Dialect; -import org.hibernate.dialect.HSQLDialect; -import org.hibernate.dialect.MariaDBDialect; -import org.hibernate.dialect.MySQLDialect; -import org.hibernate.dialect.OracleDialect; -import org.hibernate.dialect.PostgreSQLDialect; -import org.hibernate.dialect.SQLServerDialect; -import org.hibernate.dialect.SybaseASEDialect; import org.hibernate.exception.ConstraintViolationException; import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.Jpa; -import org.hibernate.testing.orm.junit.RequiresDialect; -import org.hibernate.testing.orm.junit.SkipForDialect; import org.junit.jupiter.api.Test; @@ -37,16 +27,6 @@ @Jpa(annotatedClasses = {ConstraintInterpretationTest.Enttity1.class, ConstraintInterpretationTest.Entity2.class}) -@RequiresDialect( PostgreSQLDialect.class ) -@RequiresDialect( MySQLDialect.class ) -@RequiresDialect( H2Dialect.class ) -@RequiresDialect( HSQLDialect.class ) -@RequiresDialect( SQLServerDialect.class ) -@RequiresDialect( SybaseASEDialect.class ) -@RequiresDialect( OracleDialect.class ) -@RequiresDialect( DB2Dialect.class ) -@RequiresDialect( InformixDialect.class ) -@SkipForDialect(dialectClass = MariaDBDialect.class) // Maria doesn't allow named column-level check constraints public class ConstraintInterpretationTest { @Test void testNotNullPrimaryKey(EntityManagerFactoryScope scope) { scope.inTransaction( em -> { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/constraint/ConstraintInterpretationTest2.java b/hibernate-core/src/test/java/org/hibernate/orm/test/constraint/ConstraintInterpretationTest2.java index cb546e3d5ad3..ed37a7b15560 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/constraint/ConstraintInterpretationTest2.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/constraint/ConstraintInterpretationTest2.java @@ -15,18 +15,10 @@ import jakarta.persistence.UniqueConstraint; import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.DB2Dialect; -import org.hibernate.dialect.H2Dialect; import org.hibernate.dialect.HANADialect; -import org.hibernate.dialect.HSQLDialect; -import org.hibernate.dialect.MySQLDialect; -import org.hibernate.dialect.OracleDialect; -import org.hibernate.dialect.PostgreSQLDialect; -import org.hibernate.dialect.SQLServerDialect; -import org.hibernate.dialect.SybaseASEDialect; import org.hibernate.exception.ConstraintViolationException; import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.Jpa; -import org.hibernate.testing.orm.junit.RequiresDialect; import org.hibernate.testing.orm.junit.SkipForDialect; import org.junit.jupiter.api.Test; @@ -36,16 +28,6 @@ @Jpa(annotatedClasses = {ConstraintInterpretationTest2.Enttity1.class, ConstraintInterpretationTest2.Entity2.class}) -@RequiresDialect( PostgreSQLDialect.class ) -@RequiresDialect( MySQLDialect.class ) -@RequiresDialect( H2Dialect.class ) -@RequiresDialect( HSQLDialect.class ) -@RequiresDialect( SQLServerDialect.class ) -@RequiresDialect( SybaseASEDialect.class ) -@RequiresDialect( OracleDialect.class ) -@RequiresDialect( DB2Dialect.class ) -@RequiresDialect( HANADialect.class ) -@RequiresDialect( InformixDialect.class ) public class ConstraintInterpretationTest2 { @Test void testNotNullPrimaryKey(EntityManagerFactoryScope scope) { scope.inTransaction( em -> { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/function/array/ArrayTrimTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/function/array/ArrayTrimTest.java index a09ed8914434..8c7d2e582a9f 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/function/array/ArrayTrimTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/function/array/ArrayTrimTest.java @@ -10,6 +10,7 @@ import org.hibernate.dialect.CockroachDialect; import org.hibernate.dialect.PostgreSQLDialect; +import org.hibernate.dialect.PostgresPlusDialect; import org.hibernate.query.criteria.JpaCriteriaQuery; import org.hibernate.query.criteria.JpaRoot; import org.hibernate.query.sqm.NodeBuilder; @@ -22,6 +23,7 @@ import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.hibernate.testing.orm.junit.SkipForDialect; +import org.hibernate.testing.orm.junit.VersionMatchMode; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -84,7 +86,8 @@ public void testTrimAll(SessionFactoryScope scope) { } @Test - @SkipForDialect(dialectClass = PostgreSQLDialect.class, majorVersion = 13, matchSubTypes = true, reason = "The PostgreSQL emulation for version < 14 doesn't throw an error") + @SkipForDialect(dialectClass = PostgreSQLDialect.class, majorVersion = 14, versionMatchMode = VersionMatchMode.SAME_OR_NEWER, reason = "The PostgreSQL emulation for version < 14 doesn't throw an error") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, majorVersion = 14, versionMatchMode = VersionMatchMode.SAME_OR_NEWER, reason = "The PostgreSQL emulation for version < 14 doesn't throw an error") @SkipForDialect(dialectClass = CockroachDialect.class, reason = "The Cockroach emulation doesn't throw an error") public void testTrimOutOfRange(SessionFactoryScope scope) { scope.inSession( em -> { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/function/json/JsonExistsTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/function/json/JsonExistsTest.java index 7d3a3795a5d7..cf5fa22ce72d 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/function/json/JsonExistsTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/function/json/JsonExistsTest.java @@ -22,6 +22,7 @@ import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.hibernate.testing.orm.junit.Setting; import org.hibernate.testing.orm.junit.SkipForDialect; +import org.hibernate.testing.orm.junit.VersionMatchMode; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -71,7 +72,7 @@ public void testSimple(SessionFactoryScope scope) { } @Test - @SkipForDialect(dialectClass = OracleDialect.class, majorVersion = 21, matchSubTypes = true, reason = "Oracle bug in versions before 23") + @SkipForDialect(dialectClass = OracleDialect.class, majorVersion = 23, versionMatchMode = VersionMatchMode.OLDER, reason = "Oracle bug in versions before 23") public void testPassing(SessionFactoryScope scope) { scope.inSession( em -> { //tag::hql-json-exists-passing-example[] diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/function/json/JsonObjectAggregateTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/function/json/JsonObjectAggregateTest.java index 7436b94c1175..b502a810a163 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/function/json/JsonObjectAggregateTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/function/json/JsonObjectAggregateTest.java @@ -10,6 +10,7 @@ import org.hibernate.dialect.HANADialect; import org.hibernate.dialect.MySQLDialect; import org.hibernate.dialect.PostgreSQLDialect; +import org.hibernate.dialect.PostgresPlusDialect; import org.hibernate.dialect.SQLServerDialect; import org.hibernate.testing.orm.domain.StandardDomainModel; @@ -21,6 +22,7 @@ import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.hibernate.testing.orm.junit.Setting; import org.hibernate.testing.orm.junit.SkipForDialect; +import org.hibernate.testing.orm.junit.VersionMatchMode; import org.junit.jupiter.api.Test; /** @@ -56,7 +58,8 @@ public void testNull(SessionFactoryScope scope) { @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA has no way to throw an error on duplicate json object keys.") @SkipForDialect(dialectClass = DB2Dialect.class, reason = "DB2 has no way to throw an error on duplicate json object keys.") @SkipForDialect(dialectClass = CockroachDialect.class, reason = "CockroachDB has no way to throw an error on duplicate json object keys.") - @SkipForDialect(dialectClass = PostgreSQLDialect.class, majorVersion = 15, matchSubTypes = true, reason = "CockroachDB has no way to throw an error on duplicate json object keys.") + @SkipForDialect(dialectClass = PostgreSQLDialect.class, majorVersion = 15, versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "Before version 16, PostgreSQL didn't support the unique keys clause.") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, majorVersion = 15, versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "Before version 16, PostgresPlus didn't support the unique keys clause.") public void testUniqueKeys(SessionFactoryScope scope) { scope.inSession( em -> { //tag::hql-json-objectagg-unique-keys-example[] diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/hql/ScrollableCollectionFetchingTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/hql/ScrollableCollectionFetchingTest.java index bb9a909be410..e564699e6eec 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/hql/ScrollableCollectionFetchingTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/hql/ScrollableCollectionFetchingTest.java @@ -10,8 +10,8 @@ import org.hibernate.dialect.HANADialect; import org.hibernate.dialect.DB2Dialect; import org.hibernate.community.dialect.DerbyDialect; -import org.hibernate.dialect.SybaseASEDialect; +import org.hibernate.dialect.SybaseASEDialect; import org.hibernate.query.SemanticException; import org.hibernate.query.sqm.UnknownPathException; import org.hibernate.testing.orm.junit.DialectFeatureChecks; @@ -20,6 +20,7 @@ import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.hibernate.testing.orm.junit.SkipForDialect; +import org.hibernate.testing.orm.junit.VersionMatchMode; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; @@ -44,8 +45,8 @@ public class ScrollableCollectionFetchingTest { @Test - @SkipForDialect(dialectClass=DB2Dialect.class, matchSubTypes = true) - @SkipForDialect(dialectClass= DerbyDialect.class) + @SkipForDialect(dialectClass = DB2Dialect.class, matchSubTypes = true) + @SkipForDialect(dialectClass = DerbyDialect.class) public void testTupleReturnWithFetch(SessionFactoryScope scope) { scope.inTransaction( session -> { @@ -94,8 +95,8 @@ public void testUknownPathFailure(SessionFactoryScope scope) { } @Test - @SkipForDialect(dialectClass = SybaseASEDialect.class, majorVersion = 15, matchSubTypes = true, reason = "HHH-5229") - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = "HANA only supports forward-only cursors.") + @SkipForDialect(dialectClass = SybaseASEDialect.class, majorVersion = 15, versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "HHH-5229") + @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA only supports forward-only cursors.") public void testScrollingJoinFetchesEmptyResultSet(SessionFactoryScope scope) { scope.inTransaction( s -> { @@ -163,7 +164,7 @@ public void testScrollingJoinFetchesEmptyResultSet(SessionFactoryScope scope) { @Test @RequiresDialectFeature(feature = DialectFeatureChecks.SupportsTemporaryTable.class) - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = "HANA only supports forward-only cursors") + @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA only supports forward-only cursors") public void testScrollingJoinFetchesSingleRowResultSet(SessionFactoryScope scope) { scope.inTransaction( @@ -314,7 +315,7 @@ public void testScrollingJoinFetchesForward(SessionFactoryScope scope) { @Test @RequiresDialectFeature(feature = DialectFeatureChecks.SupportsTemporaryTable.class) - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = "HANA only supports forward-only cursors.") + @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA only supports forward-only cursors.") public void testScrollingJoinFetchesReverse(SessionFactoryScope scope) { TestData data = new TestData(); data.prepare( scope ); @@ -342,7 +343,7 @@ public void testScrollingJoinFetchesReverse(SessionFactoryScope scope) { @Test @RequiresDialectFeature(feature = DialectFeatureChecks.SupportsTemporaryTable.class) - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = "HANA only supports forward-only cursors.") + @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA only supports forward-only cursors.") public void testScrollingJoinFetchesWithNext(SessionFactoryScope scope) { TestData data = new TestData(); data.prepare( scope ); @@ -374,7 +375,7 @@ public void testScrollingJoinFetchesWithNext(SessionFactoryScope scope) { @Test @RequiresDialectFeature(feature = DialectFeatureChecks.SupportsTemporaryTable.class) - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = "HANA only supports forward-only cursors.") + @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA only supports forward-only cursors.") public void testScrollingNoJoinFetchesWithNext(SessionFactoryScope scope) { TestData data = new TestData(); data.prepare( scope ); @@ -406,7 +407,7 @@ public void testScrollingNoJoinFetchesWithNext(SessionFactoryScope scope) { @Test @RequiresDialectFeature(feature = DialectFeatureChecks.SupportsTemporaryTable.class) - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = "HANA only supports forward-only cursors.") + @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA only supports forward-only cursors.") public void testScrollingJoinFetchesPositioning(SessionFactoryScope scope) { TestData data = new TestData(); data.prepare( scope ); @@ -474,7 +475,7 @@ public void testScrollingJoinFetchesPositioning(SessionFactoryScope scope) { @Test @RequiresDialectFeature(feature = DialectFeatureChecks.SupportsTemporaryTable.class) - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = "HANA only supports forward-only cursors.") + @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA only supports forward-only cursors.") public void testScrollingNoJoinFetchesPositioning(SessionFactoryScope scope) { TestData data = new TestData(); data.prepare( scope ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/id/QuotedIdentifierTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/id/QuotedIdentifierTest.java index d9193c6ef0d1..9a29d4efdad3 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/id/QuotedIdentifierTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/id/QuotedIdentifierTest.java @@ -19,6 +19,7 @@ import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.hibernate.testing.orm.junit.SkipForDialect; +import org.hibernate.testing.orm.junit.VersionMatchMode; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -27,7 +28,7 @@ * @author Vlad Mihalcea */ @RequiresDialectFeature(feature = SupportsIdentityColumns.class, jiraKey = "HHH-9271") -@SkipForDialect(dialectClass = OracleDialect.class, majorVersion = 12, matchSubTypes = true, reason = "Oracle and identity column: java.sql.Connection#prepareStatement(String sql, int columnIndexes[]) does not work with quoted table names and/or quoted columnIndexes") +@SkipForDialect(dialectClass = OracleDialect.class, majorVersion = 12, versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "Oracle and identity column: java.sql.Connection#prepareStatement(String sql, int columnIndexes[]) does not work with quoted table names and/or quoted columnIndexes") @DomainModel( annotatedClasses = { QuotedIdentifierTest.QuotedIdentifier.class diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/id/SequenceGeneratorTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/id/SequenceGeneratorTest.java index 57d66d57cef0..de3e86922203 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/id/SequenceGeneratorTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/id/SequenceGeneratorTest.java @@ -14,6 +14,7 @@ import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.hibernate.testing.orm.junit.SkipForDialect; +import org.hibernate.testing.orm.junit.VersionMatchMode; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -35,7 +36,7 @@ public class SequenceGeneratorTest { dialectClass = SQLServerDialect.class, majorVersion = 11, reason = "SQLServer2012Dialect initializes sequence to minimum value (e.g., Long.MIN_VALUE; Hibernate assumes it is uninitialized.", - matchSubTypes = true + versionMatchMode = VersionMatchMode.SAME_OR_OLDER ) public void testStartOfSequence(SessionFactoryScope scope) { final Person person = new Person(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/id/array/ByteArrayIdTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/id/array/ByteArrayIdTest.java index 72b438679b8e..581a9949f605 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/id/array/ByteArrayIdTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/id/array/ByteArrayIdTest.java @@ -16,6 +16,7 @@ import org.hibernate.dialect.MySQLDialect; import org.hibernate.dialect.OracleDialect; import org.hibernate.query.Query; +import org.hibernate.testing.orm.junit.VersionMatchMode; import org.hibernate.type.descriptor.java.ByteArrayJavaType; import org.hibernate.testing.orm.junit.JiraKey; @@ -34,9 +35,9 @@ * @author Piotr Krauzowicz * @author Gail Badner */ -@SkipForDialect(dialectClass = MySQLDialect.class, majorVersion = 5, matchSubTypes = true, +@SkipForDialect(dialectClass = MySQLDialect.class, majorVersion = 5, versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "BLOB/TEXT column 'id' used in key specification without a key length") -@SkipForDialect(dialectClass = OracleDialect.class, matchSubTypes = true, +@SkipForDialect(dialectClass = OracleDialect.class, reason = "ORA-02329: column of datatype LOB cannot be unique or a primary key") @SkipForDialect(dialectClass = InformixDialect.class, reason = "Cannot add index") @DomainModel(annotatedClasses = ByteArrayIdTest.DemoEntity.class) diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/id/array/PrimitiveByteArrayIdCollectionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/id/array/PrimitiveByteArrayIdCollectionTest.java index bd6db0b9519f..2151d9c6c2bd 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/id/array/PrimitiveByteArrayIdCollectionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/id/array/PrimitiveByteArrayIdCollectionTest.java @@ -30,7 +30,7 @@ @SkipForDialect(dialectClass = MySQLDialect.class, majorVersion = 5, reason = "BLOB/TEXT column 'id' used in key specification without a key length") -@SkipForDialect(dialectClass = OracleDialect.class, matchSubTypes = true, reason = "ORA-02329: column of datatype LOB cannot be unique or a primary key") +@SkipForDialect(dialectClass = OracleDialect.class, reason = "ORA-02329: column of datatype LOB cannot be unique or a primary key") @SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix does not support unique / primary constraints on binary columns") @DomainModel( annotatedClasses = { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/id/array/PrimitiveByteArrayIdTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/id/array/PrimitiveByteArrayIdTest.java index 11e3435c98ea..1bad5a4cb17f 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/id/array/PrimitiveByteArrayIdTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/id/array/PrimitiveByteArrayIdTest.java @@ -33,7 +33,7 @@ * @author Gail Badner */ @SkipForDialect(dialectClass = MySQLDialect.class, majorVersion = 5, reason = "BLOB/TEXT column 'id' used in key specification without a key length") -@SkipForDialect(dialectClass = OracleDialect.class, matchSubTypes = true, reason = "ORA-02329: column of datatype LOB cannot be unique or a primary key") +@SkipForDialect(dialectClass = OracleDialect.class, reason = "ORA-02329: column of datatype LOB cannot be unique or a primary key") @SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix does not support unique / primary constraints on binary columns") @DomainModel( annotatedClasses = PrimitiveByteArrayIdTest.DemoEntity.class diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/RepeatableReadTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/RepeatableReadTest.java index 189067a16df0..15bedba8b192 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/RepeatableReadTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/RepeatableReadTest.java @@ -24,6 +24,7 @@ import org.hibernate.testing.jdbc.SQLServerSnapshotIsolationConnectionProvider; import org.hibernate.testing.orm.junit.DialectFeatureChecks; import org.hibernate.testing.orm.junit.RequiresDialectFeature; +import org.hibernate.testing.orm.junit.VersionMatchMode; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; @@ -106,7 +107,9 @@ public void testStaleVersionedInstanceFoundInQueryResult() { @Test @SkipForDialect(dialectClass = CockroachDialect.class, reason = "Cockroach uses SERIALIZABLE by default and fails to acquire a write lock after a TX in between committed changes to a row") - @SkipForDialect(dialectClass = MariaDBDialect.class, majorVersion = 11, minorVersion = 6, microVersion = 2, reason = "MariaDB will throw an error DB_RECORD_CHANGED when acquiring a lock on a record that have changed") + @SkipForDialect(dialectClass = MariaDBDialect.class, majorVersion = 11, minorVersion = 6, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_NEWER, + reason = "MariaDB will throw an error DB_RECORD_CHANGED when acquiring a lock on a record that have changed") public void testStaleVersionedInstanceFoundOnLock() { if ( !readCommittedIsolationMaintained( "repeatable read tests" ) ) { return; @@ -230,7 +233,9 @@ public void testStaleNonVersionedInstanceFoundInQueryResult() { @Test @SkipForDialect(dialectClass = CockroachDialect.class, reason = "Cockroach uses SERIALIZABLE by default and fails to acquire a write lock after a TX in between committed changes to a row") - @SkipForDialect(dialectClass = MariaDBDialect.class, majorVersion = 11, minorVersion = 6, microVersion = 2, reason = "MariaDB will throw an error DB_RECORD_CHANGED when acquiring a lock on a record that have changed") + @SkipForDialect(dialectClass = MariaDBDialect.class, majorVersion = 11, minorVersion = 6, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_NEWER, + reason = "MariaDB will throw an error DB_RECORD_CHANGED when acquiring a lock on a record that have changed") public void testStaleNonVersionedInstanceFoundOnLock() { if ( !readCommittedIsolationMaintained( "repeatable read tests" ) ) { return; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/naturalid/MutableNaturalIdTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/naturalid/MutableNaturalIdTest.java index 4862c0032817..0257d032429f 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/naturalid/MutableNaturalIdTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/naturalid/MutableNaturalIdTest.java @@ -20,9 +20,9 @@ /** * @author Steve Ebersole */ -@SkipForDialect(dialectClass = OracleDialect.class, matchSubTypes = true, +@SkipForDialect(dialectClass = OracleDialect.class, reason = "Oracle do not support identity key generation") -@SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, +@SkipForDialect(dialectClass = HANADialect.class, reason = "Hana do not support identity key generation") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase do not support identity key generation") diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NativeQueryResultTypeAutoDiscoveryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NativeQueryResultTypeAutoDiscoveryTest.java index da4fbd59d9f1..5988526197e2 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NativeQueryResultTypeAutoDiscoveryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NativeQueryResultTypeAutoDiscoveryTest.java @@ -154,7 +154,7 @@ public void bitType() { @SkipForDialect(dialectClass = DerbyDialect.class, reason = "No support for the tinyint datatype so we use smallint") @SkipForDialect(dialectClass = DB2Dialect.class, reason = "No support for the tinyint datatype so we use smallint") @SkipForDialect(dialectClass = AbstractTransactSQLDialect.class, matchSubTypes = true, reason = "No support for the tinyint datatype so we use smallint") - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = "No support for the tinyint datatype so we use smallint") + @SkipForDialect(dialectClass = HANADialect.class, reason = "No support for the tinyint datatype so we use smallint") @SkipForDialect(dialectClass = OracleDialect.class, reason = "Oracle maps tinyint to number") @SkipForDialect(dialectClass = FirebirdDialect.class, reason = "No support for the tinyint datatype so we use smallint") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase maps tinyint to smallint") @@ -189,7 +189,7 @@ public void realType() { @SkipForDialect(dialectClass = DB2Dialect.class, reason = "Value is too big for the maximum allowed precision of DB2") @SkipForDialect(dialectClass = OracleDialect.class, reason = "Value is too big for the maximum allowed precision of Oracle") @SkipForDialect(dialectClass = AbstractTransactSQLDialect.class, matchSubTypes = true, reason = "Value is too big for the maximum allowed precision of SQL Server and Sybase") - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = "Value is too big for the maximum allowed precision of HANA") + @SkipForDialect(dialectClass = HANADialect.class, reason = "Value is too big for the maximum allowed precision of HANA") @SkipForDialect(dialectClass = FirebirdDialect.class, reason = "Value is too big for the maximum allowed precision of Firebird") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Value is too big for the maximum allowed precision of Altibase") @SkipForDialect(dialectClass = InformixDialect.class, reason = "The scale exceeds the maximum precision specified") @@ -205,7 +205,7 @@ public void numericType() { @SkipForDialect(dialectClass = DB2Dialect.class, reason = "Value is too big for the maximum allowed precision of DB2") @SkipForDialect(dialectClass = OracleDialect.class, reason = "Value is too big for the maximum allowed precision of Oracle") @SkipForDialect(dialectClass = AbstractTransactSQLDialect.class, matchSubTypes = true, reason = "Value is too big for the maximum allowed precision of SQL Server and Sybase") - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = "Value is too big for the maximum allowed precision of HANA") + @SkipForDialect(dialectClass = HANADialect.class, reason = "Value is too big for the maximum allowed precision of HANA") @SkipForDialect(dialectClass = FirebirdDialect.class, reason = "Value is too big for the maximum allowed precision of Firebird") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Value is too big for the maximum allowed precision of Altibase") @SkipForDialect(dialectClass = InformixDialect.class, reason = "The scale exceeds the maximum precision specified") @@ -229,7 +229,7 @@ public void commonTextTypes() { @SkipForDialect(dialectClass = OracleDialect.class, reason = "Oracle maps LONGVARCHAR to CLOB") @SkipForDialect(dialectClass = DB2Dialect.class, reason = "DB2 maps LONGVARCHAR to CLOB") @SkipForDialect(dialectClass = SybaseDialect.class, matchSubTypes = true, reason = "Sybase maps LONGVARCHAR to CLOB") - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = "HANA maps LONGVARCHAR to CLOB") + @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA maps LONGVARCHAR to CLOB") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase maps LONGVARCHAR to CLOB") public void longCharType() { createEntityManagerFactory( @@ -269,7 +269,7 @@ public void binaryTypes() { @SkipForDialect(dialectClass = DB2Dialect.class, reason = "DB2 maps LONGVARBINARY to BLOB") @SkipForDialect(dialectClass = SybaseDialect.class, matchSubTypes = true, reason = "Sybase maps LONGVARBINARY to BLOB") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase maps LONGVARBINARY to BLOB") - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = "HANA maps LONGVARCHAR to BLOB") + @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA maps LONGVARCHAR to BLOB") public void longBinaryType() { createEntityManagerFactory( LongvarbinaryEntity.class diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/schemagen/SchemaDatabaseFileGenerationFailureTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/schemagen/SchemaDatabaseFileGenerationFailureTest.java index 20827faac075..c911dd50d72c 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/schemagen/SchemaDatabaseFileGenerationFailureTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/schemagen/SchemaDatabaseFileGenerationFailureTest.java @@ -21,6 +21,7 @@ import org.hibernate.cfg.Environment; import org.hibernate.community.dialect.GaussDBDialect; import org.hibernate.dialect.PostgreSQLDialect; +import org.hibernate.dialect.PostgresPlusDialect; import org.hibernate.jpa.boot.spi.Bootstrap; import org.hibernate.jpa.boot.spi.EntityManagerFactoryBuilder; import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; @@ -73,7 +74,9 @@ public void destroy() { @Test @JiraKey(value = "HHH-12192") - @SkipForDialect(dialectClass = PostgreSQLDialect.class, matchSubTypes = true, + @SkipForDialect(dialectClass = PostgreSQLDialect.class, + reason = "on postgres we send 'set client_min_messages = WARNING'") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, reason = "on postgres we send 'set client_min_messages = WARNING'") @SkipForDialect( dialectClass = GaussDBDialect.class, reason = "on gauss we send 'set client_min_messages = WARNING'") public void testErrorMessageContainsTheFailingDDLCommand() { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/schemagen/SchemaScriptFileGenerationFailureTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/schemagen/SchemaScriptFileGenerationFailureTest.java index d35715cfbd9c..0cc6a892d3e4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/schemagen/SchemaScriptFileGenerationFailureTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/schemagen/SchemaScriptFileGenerationFailureTest.java @@ -19,6 +19,7 @@ import org.hibernate.cfg.Environment; import org.hibernate.community.dialect.GaussDBDialect; import org.hibernate.dialect.PostgreSQLDialect; +import org.hibernate.dialect.PostgresPlusDialect; import org.hibernate.jpa.boot.spi.Bootstrap; import org.hibernate.jpa.boot.spi.EntityManagerFactoryBuilder; import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; @@ -64,7 +65,9 @@ public void destroy() { @Test @JiraKey(value = "HHH-12192") - @SkipForDialect(dialectClass = PostgreSQLDialect.class, matchSubTypes = true, + @SkipForDialect(dialectClass = PostgreSQLDialect.class, + reason = "on postgres we send 'set client_min_messages = WARNING'") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, reason = "on postgres we send 'set client_min_messages = WARNING'") @SkipForDialect( dialectClass = GaussDBDialect.class, reason = "on gauss we send 'set client_min_messages = WARNING'") public void testErrorMessageContainsTheFailingDDLCommand() { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/locking/OptimisticAndPessimisticLockTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/locking/OptimisticAndPessimisticLockTest.java index 0cbcf9a239d1..5254f50498b4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/locking/OptimisticAndPessimisticLockTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/locking/OptimisticAndPessimisticLockTest.java @@ -16,6 +16,7 @@ import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.hibernate.testing.orm.junit.SkipForDialect; +import org.hibernate.testing.orm.junit.VersionMatchMode; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -30,7 +31,9 @@ @SessionFactory @JiraKey("HHH-16461") @SkipForDialect(dialectClass = CockroachDialect.class, reason = "CockroachDB uses SERIALIZABLE isolation, and does not support this") -@SkipForDialect(dialectClass = MariaDBDialect.class, majorVersion = 11, minorVersion = 6, microVersion = 2, reason = "MariaDB will throw an error DB_RECORD_CHANGED when acquiring a lock on a record that have changed") +@SkipForDialect(dialectClass = MariaDBDialect.class, majorVersion = 11, minorVersion = 6, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_NEWER, + reason = "MariaDB will throw an error DB_RECORD_CHANGED when acquiring a lock on a record that have changed") public class OptimisticAndPessimisticLockTest { public Stream pessimisticLockModes() { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/locking/OptimisticLockTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/locking/OptimisticLockTest.java index e42bd4ee2371..a62b0f4cf6db 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/locking/OptimisticLockTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/locking/OptimisticLockTest.java @@ -13,6 +13,7 @@ import org.hibernate.dialect.MariaDBDialect; import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; import org.hibernate.testing.orm.junit.SkipForDialect; +import org.hibernate.testing.orm.junit.VersionMatchMode; import org.junit.Test; import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; @@ -31,7 +32,9 @@ protected Class[] getAnnotatedClasses() { @Test @SkipForDialect(dialectClass = CockroachDialect.class, reason = "Fails at SERIALIZABLE isolation") - @SkipForDialect(dialectClass = MariaDBDialect.class, majorVersion = 11, minorVersion = 6, microVersion = 2, reason = "MariaDB will throw an error DB_RECORD_CHANGED when acquiring a lock on a record that have changed") + @SkipForDialect(dialectClass = MariaDBDialect.class, majorVersion = 11, minorVersion = 6, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_NEWER, + reason = "MariaDB will throw an error DB_RECORD_CHANGED when acquiring a lock on a record that have changed") public void test() { doInJPA(this::entityManagerFactory, entityManager -> { Phone phone = new Phone(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/BooleanMappingTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/BooleanMappingTests.java index b0551b54f163..27f731099b58 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/BooleanMappingTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/BooleanMappingTests.java @@ -353,7 +353,7 @@ public void testBooleanFunctionAsPredicate(SessionFactoryScope scope) { @SkipForDialect(dialectClass = OracleDialect.class) @SkipForDialect(dialectClass = SQLServerDialect.class) @SkipForDialect(dialectClass = SybaseDialect.class, matchSubTypes = true) - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true) + @SkipForDialect(dialectClass = HANADialect.class) @SkipForDialect(dialectClass = DB2Dialect.class, majorVersion = 10) @SkipForDialect(dialectClass = AltibaseDialect.class) @SkipForDialect(dialectClass = InformixDialect.class) diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/JsonMappingTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/JsonMappingTests.java index 86b2adc23483..7f5ecf8be859 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/JsonMappingTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/JsonMappingTests.java @@ -194,11 +194,11 @@ public void verifyDirtyChecking(SessionFactoryScope scope) { @Test @SkipForDialect(dialectClass = DerbyDialect.class, reason = "Derby doesn't support comparing CLOBs with the = operator") - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, + @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA doesn't support comparing LOBs with the = operator") @SkipForDialect(dialectClass = SybaseDialect.class, matchSubTypes = true, reason = "Sybase doesn't support comparing LOBs with the = operator") - @SkipForDialect(dialectClass = OracleDialect.class, matchSubTypes = true, + @SkipForDialect(dialectClass = OracleDialect.class, reason = "Oracle doesn't support comparing JSON with the = operator") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase doesn't support comparing CLOBs with the = operator") diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/XmlMappingTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/XmlMappingTests.java index bed401be66ff..b88fbf140bed 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/XmlMappingTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/XmlMappingTests.java @@ -136,9 +136,9 @@ public void verifyReadWorks(SessionFactoryScope scope) { @Test @SkipForDialect(dialectClass = DerbyDialect.class, reason = "Derby doesn't support comparing CLOBs with the = operator") - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = "HANA doesn't support comparing LOBs with the = operator") + @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA doesn't support comparing LOBs with the = operator") @SkipForDialect(dialectClass = SybaseDialect.class, matchSubTypes = true, reason = "Sybase doesn't support comparing LOBs with the = operator") - @SkipForDialect(dialectClass = OracleDialect.class, matchSubTypes = true, reason = "Oracle doesn't support comparing JSON with the = operator") + @SkipForDialect(dialectClass = OracleDialect.class, reason = "Oracle doesn't support comparing JSON with the = operator") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase doesn't support comparing CLOBs with the = operator") @SkipForDialect(dialectClass = InformixDialect.class, reason = "Blobs are not allowed in this expression") @SkipForDialect(dialectClass = GaussDBDialect.class, reason = "GaussDB doesn't support comparing CLOBs with the = operator") diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/NestedXmlEmbeddableTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/NestedXmlEmbeddableTest.java index fb845af3d8ba..90f646d6d5ac 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/NestedXmlEmbeddableTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/NestedXmlEmbeddableTest.java @@ -17,6 +17,7 @@ import org.hibernate.testing.orm.junit.Jira; import org.hibernate.testing.orm.junit.RequiresDialectFeature; import org.hibernate.testing.orm.junit.SkipForDialect; +import org.hibernate.testing.orm.junit.VersionMatchMode; import org.hibernate.type.SqlTypes; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -42,7 +43,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; @RequiresDialectFeature(feature = DialectFeatureChecks.SupportsXmlAggregate.class) -@SkipForDialect(dialectClass = OracleDialect.class, majorVersion = 23, matchSubTypes = true, +@SkipForDialect(dialectClass = OracleDialect.class, majorVersion = 23, versionMatchMode = VersionMatchMode.SAME_OR_NEWER, reason = "Currently failing on Oracle 23+ due to Bug 37319693 - ORA-00600 with check constraint on xml type") public class NestedXmlEmbeddableTest extends BaseSessionFactoryFunctionalTest { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/XmlEmbeddableTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/XmlEmbeddableTest.java index ffe1bf2cb028..4fed7e4f5523 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/XmlEmbeddableTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/embeddable/XmlEmbeddableTest.java @@ -16,6 +16,7 @@ import org.hibernate.testing.orm.junit.JiraKey; import org.hibernate.testing.orm.junit.RequiresDialectFeature; import org.hibernate.testing.orm.junit.SkipForDialect; +import org.hibernate.testing.orm.junit.VersionMatchMode; import org.hibernate.type.SqlTypes; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -39,7 +40,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; @RequiresDialectFeature(feature = DialectFeatureChecks.SupportsXmlAggregate.class) -@SkipForDialect(dialectClass = OracleDialect.class, majorVersion = 23, matchSubTypes = true, +@SkipForDialect(dialectClass = OracleDialect.class, majorVersion = 23, versionMatchMode = VersionMatchMode.SAME_OR_NEWER, reason = "Currently failing on Oracle 23+ due to Bug 37319693 - ORA-00600 with check constraint on xml type") public class XmlEmbeddableTest extends BaseSessionFactoryFunctionalTest { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generated/always/GeneratedAlwaysTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generated/always/GeneratedAlwaysTest.java index e7467d7e91ae..b8e3c65bdc32 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generated/always/GeneratedAlwaysTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generated/always/GeneratedAlwaysTest.java @@ -14,11 +14,13 @@ import org.hibernate.dialect.H2Dialect; import org.hibernate.dialect.HSQLDialect; import org.hibernate.dialect.PostgreSQLDialect; +import org.hibernate.dialect.PostgresPlusDialect; import org.hibernate.dialect.SybaseASEDialect; import org.hibernate.testing.orm.junit.DomainModel; import org.hibernate.testing.orm.junit.SessionFactory; import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.hibernate.testing.orm.junit.SkipForDialect; +import org.hibernate.testing.orm.junit.VersionMatchMode; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; @@ -35,7 +37,8 @@ @SkipForDialect(dialectClass = HSQLDialect.class) @SkipForDialect(dialectClass = DerbyDialect.class) @SkipForDialect(dialectClass = SybaseASEDialect.class) -@SkipForDialect(dialectClass = PostgreSQLDialect.class, majorVersion = 11, matchSubTypes = true) // 'generated always' was added in 12 +@SkipForDialect(dialectClass = PostgreSQLDialect.class, majorVersion = 11, versionMatchMode = VersionMatchMode.SAME_OR_OLDER) // 'generated always' was added in 12 +@SkipForDialect(dialectClass = PostgresPlusDialect.class, majorVersion = 11, versionMatchMode = VersionMatchMode.SAME_OR_OLDER) // 'generated always' was added in 12 @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "generated always is not supported in Altibase") @SkipForDialect(dialectClass = InformixDialect.class) public class GeneratedAlwaysTest { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generated/temporals/MultipleGeneratedValuesTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generated/temporals/MultipleGeneratedValuesTests.java index e086882dc264..1324817df5b7 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generated/temporals/MultipleGeneratedValuesTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/generated/temporals/MultipleGeneratedValuesTests.java @@ -35,7 +35,7 @@ @SessionFactory @RequiresDialectFeature(feature = DialectFeatureChecks.CurrentTimestampHasMicrosecondPrecision.class, comment = "Without this, we might not see an update to the timestamp") @RequiresDialectFeature( feature = DialectFeatureChecks.UsesStandardCurrentTimestampFunction.class ) -@SkipForDialect( dialectClass = SQLServerDialect.class, matchSubTypes = true, reason = "CURRENT_TIMESTAMP has millisecond precision" ) +@SkipForDialect( dialectClass = SQLServerDialect.class, reason = "CURRENT_TIMESTAMP has millisecond precision" ) public class MultipleGeneratedValuesTests { @Test public void test(SessionFactoryScope scope) { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/javatime/GlobalJavaTimeJdbcTypeTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/javatime/GlobalJavaTimeJdbcTypeTests.java index 3d30fda8f585..1d71226f5277 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/javatime/GlobalJavaTimeJdbcTypeTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/javatime/GlobalJavaTimeJdbcTypeTests.java @@ -173,8 +173,8 @@ void testLocalDate(SessionFactoryScope scope) { } @Test - @SkipForDialect(dialectClass = OracleDialect.class, reason = "Oracle drivers truncate fractional seconds from the LocalTime", matchSubTypes = true) - @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA time type does not support fractional seconds", matchSubTypes = true) + @SkipForDialect(dialectClass = OracleDialect.class, reason = "Oracle drivers truncate fractional seconds from the LocalTime") + @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA time type does not support fractional seconds") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase drivers truncate fractional seconds from the LocalTime") void testLocalTime(SessionFactoryScope scope) { final Dialect dialect = scope.getSessionFactory().getJdbcServices().getDialect(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/javatime/JavaTimeJdbcTypeTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/javatime/JavaTimeJdbcTypeTests.java index 80e5eb6ef858..7b212737f837 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/javatime/JavaTimeJdbcTypeTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/javatime/JavaTimeJdbcTypeTests.java @@ -172,8 +172,8 @@ void testLocalDate(SessionFactoryScope scope) { } @Test - @SkipForDialect(dialectClass = OracleDialect.class, reason = "Oracle drivers truncate fractional seconds from the LocalTime", matchSubTypes = true) - @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA time type does not support fractional seconds", matchSubTypes = true) + @SkipForDialect(dialectClass = OracleDialect.class, reason = "Oracle drivers truncate fractional seconds from the LocalTime") + @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA time type does not support fractional seconds") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase drivers truncate fractional seconds from the LocalTime") void testLocalTime(SessionFactoryScope scope) { final Dialect dialect = scope.getSessionFactory().getJdbcServices().getDialect(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/onetoone/singletable/SingleTableOneToOneTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/onetoone/singletable/SingleTableOneToOneTest.java index feca29bb82ea..f40b2702f7d4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/onetoone/singletable/SingleTableOneToOneTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/onetoone/singletable/SingleTableOneToOneTest.java @@ -58,7 +58,7 @@ public void tearDown(SessionFactoryScope scope) { @Test @SkipForDialect(dialectClass = SybaseDialect.class, matchSubTypes = true, reason = "SybaseDialect ignores unique constraints on nullable columns") - @SkipForDialect(dialectClass = InformixDialect.class, matchSubTypes = true, + @SkipForDialect(dialectClass = InformixDialect.class, reason = "InformixDialect ignores unique constraints on nullable columns") public void testMultipleRelationshipsOnSingleTableInheritanceWronglyMappedAsOneToOne(SessionFactoryScope scope) { assertThrows( diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/FunctionTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/FunctionTests.java index 4cfee36b8c46..892a2e5f6b58 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/FunctionTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/FunctionTests.java @@ -1178,8 +1178,9 @@ public void testCastFunctionWithLength(SessionFactoryScope scope) { @Test @RequiresDialectFeature( feature = DialectFeatureChecks.SupportsTruncateWithCast.class, comment = "Dialect does not support truncate with cast" ) @SkipForDialect(dialectClass = DerbyDialect.class, reason = "Derby doesn't support casting to binary types") - @SkipForDialect(dialectClass = PostgreSQLDialect.class, matchSubTypes = true, reason = "PostgreSQL bytea doesn't have a length") - @SkipForDialect(dialectClass = CockroachDialect.class, matchSubTypes = true, reason = "CockroachDB bytes doesn't have a length") + @SkipForDialect(dialectClass = PostgreSQLDialect.class, reason = "PostgreSQL bytea doesn't have a length") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, reason = "PostgresPlus bytea doesn't have a length") + @SkipForDialect(dialectClass = CockroachDialect.class, reason = "CockroachDB bytes doesn't have a length") @SkipForDialect(dialectClass = OracleDialect.class, reason = "Oracle cast to raw does not do truncation") @SkipForDialect(dialectClass = DB2Dialect.class, majorVersion = 10, minorVersion = 5, reason = "On this version the length of the cast to the parameter appears to be > 2") @SkipForDialect(dialectClass = HSQLDialect.class, reason = "HSQL interprets string as hex literal and produces error") @@ -1211,7 +1212,9 @@ public void testCastBinaryWithLengthForOracle(SessionFactoryScope scope) { } @Test - @SkipForDialect(dialectClass = PostgreSQLDialect.class, matchSubTypes = true, reason = "PostgreSQL bytea doesn't have a length") + @SkipForDialect(dialectClass = PostgreSQLDialect.class, reason = "PostgreSQL bytea doesn't have a length") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, reason = "PostgresPlus bytea doesn't have a length") + @SkipForDialect(dialectClass = CockroachDialect.class, reason = "CockroachDB bytes doesn't have a length") @SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix does not support binary literals") public void testCastBinaryWithLengthForDerby(SessionFactoryScope scope) { scope.inTransaction( diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/JsonFunctionTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/JsonFunctionTests.java index ed3bad3b08ac..fcf80569cc3c 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/JsonFunctionTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/JsonFunctionTests.java @@ -23,7 +23,9 @@ import org.hibernate.dialect.MySQLDialect; import org.hibernate.dialect.OracleDialect; import org.hibernate.dialect.PostgreSQLDialect; +import org.hibernate.dialect.PostgresPlusDialect; import org.hibernate.dialect.SQLServerDialect; +import org.hibernate.testing.orm.junit.VersionMatchMode; import org.hibernate.type.SqlTypes; import org.hibernate.testing.orm.domain.gambit.EntityOfBasics; @@ -337,7 +339,7 @@ public void testJsonObjectAndArray(SessionFactoryScope scope) { @Test @RequiresDialectFeature(feature = DialectFeatureChecks.SupportsJsonExists.class) - @SkipForDialect(dialectClass = OracleDialect.class, majorVersion = 21, matchSubTypes = true, reason = "Oracle bug in versions before 23") + @SkipForDialect(dialectClass = OracleDialect.class, majorVersion = 23, versionMatchMode = VersionMatchMode.OLDER, reason = "Oracle bug in versions before 23") public void testJsonExists(SessionFactoryScope scope) { scope.inTransaction( session -> { @@ -454,7 +456,8 @@ public void testJsonObjectAggNullClause(SessionFactoryScope scope) { @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA has no way to throw an error on duplicate json object keys.") @SkipForDialect(dialectClass = DB2Dialect.class, reason = "DB2 has no way to throw an error on duplicate json object keys.") @SkipForDialect(dialectClass = CockroachDialect.class, reason = "CockroachDB has no way to throw an error on duplicate json object keys.") - @SkipForDialect(dialectClass = PostgreSQLDialect.class, majorVersion = 15, matchSubTypes = true, reason = "CockroachDB has no way to throw an error on duplicate json object keys.") + @SkipForDialect(dialectClass = PostgreSQLDialect.class, majorVersion = 15, versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "Before version 16, PostgreSQL didn't support the unique keys clause.") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, majorVersion = 15, versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "Before version 16, PostgresPlus didn't support the unique keys clause.") public void testJsonObjectAggUniqueKeys(SessionFactoryScope scope) { scope.inTransaction( session -> { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/SubqueryOperatorsTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/SubqueryOperatorsTest.java index f725e96d58b5..e8b0a81e89e4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/SubqueryOperatorsTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/SubqueryOperatorsTest.java @@ -54,7 +54,7 @@ public void testAny(SessionFactoryScope scope) { } @Test @SuppressWarnings("deprecation") - @SkipForDialect(dialectClass = SybaseASEDialect.class, reason = "Sybase ASE does not allow a subquery in the order by clause, but we could move it to the select clause and refer to it by position", matchSubTypes = true) + @SkipForDialect(dialectClass = SybaseASEDialect.class, reason = "Sybase ASE does not allow a subquery in the order by clause, but we could move it to the select clause and refer to it by position") @SkipForDialect(dialectClass = InformixDialect.class, reason = "A syntax error has occurred") public void testSubqueryInVariousClauses(SessionFactoryScope scope) { scope.inTransaction( diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/returns/ScrollableResultsTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/returns/ScrollableResultsTests.java index 2f728d1c27e1..cd6b3d0a0fa9 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/returns/ScrollableResultsTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/returns/ScrollableResultsTests.java @@ -52,7 +52,7 @@ public void cleanUpTestData(SessionFactoryScope scope) { } @Test - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = "HANA supports only ResultSet.TYPE_FORWARD_ONLY") + @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA supports only ResultSet.TYPE_FORWARD_ONLY") public void testCursorPositioning(SessionFactoryScope scope) { // create an extra row so we can better test cursor positioning scope.inTransaction( diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/stateless/StatelessSessionQueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/stateless/StatelessSessionQueryTest.java index 6f26cb75df8c..af2d00373ba8 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/stateless/StatelessSessionQueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/stateless/StatelessSessionQueryTest.java @@ -38,7 +38,7 @@ public class StatelessSessionQueryTest { @Test - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = " HANA doesn't support tables consisting of only a single auto-generated column") + @SkipForDialect(dialectClass = HANADialect.class, reason = " HANA doesn't support tables consisting of only a single auto-generated column") public void testHQL(SessionFactoryScope scope) { scope.inStatelessSession( session -> @@ -51,7 +51,7 @@ public void testHQL(SessionFactoryScope scope) { @Test @JiraKey(value = "HHH-13194") - @SkipForDialect(dialectClass = HANADialect.class, matchSubTypes = true, reason = " HANA doesn't support tables consisting of only a single auto-generated column") + @SkipForDialect(dialectClass = HANADialect.class, reason = " HANA doesn't support tables consisting of only a single auto-generated column") public void testNewQueryApis(SessionFactoryScope scope) { final String queryString = "from Contact c join fetch c.org o join fetch o.country"; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/temporal/FractionalSecondsTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/temporal/FractionalSecondsTests.java index bea8cce7626f..ac69a5ca9192 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/temporal/FractionalSecondsTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/temporal/FractionalSecondsTests.java @@ -24,6 +24,7 @@ import org.hibernate.dialect.MariaDBDialect; import org.hibernate.dialect.MySQLDialect; import org.hibernate.dialect.PostgreSQLDialect; +import org.hibernate.dialect.PostgresPlusDialect; import org.hibernate.dialect.SQLServerDialect; import org.hibernate.dialect.SybaseDialect; import org.hibernate.engine.jdbc.Size; @@ -191,7 +192,8 @@ void testUsage3(SessionFactoryScope scope) { @SkipForDialect(dialectClass = MySQLDialect.class, reason = "MySQL only supports precision <= 6", matchSubTypes = true) @SkipForDialect(dialectClass = SQLServerDialect.class, reason = "SQL Server only supports precision <= 6") @SkipForDialect(dialectClass = SybaseDialect.class, reason = "Because... Sybase...", matchSubTypes = true) - @SkipForDialect(dialectClass = PostgreSQLDialect.class, reason = "PostgreSQL only supports precision <= 6", matchSubTypes = true) + @SkipForDialect(dialectClass = PostgreSQLDialect.class, reason = "PostgreSQL only supports precision <= 6") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, reason = "PostgresPlus only supports precision <= 6") @SkipForDialect(dialectClass = CockroachDialect.class, reason = "CockroachDB only supports precision <= 6") @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA does not support specifying a precision on timestamps") @SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix only supports precision from 1 to 5") diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/temporal/JavaTimeFractionalSecondsTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/temporal/JavaTimeFractionalSecondsTests.java index a53a440c12c8..c7b7f9da370e 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/temporal/JavaTimeFractionalSecondsTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/temporal/JavaTimeFractionalSecondsTests.java @@ -25,6 +25,7 @@ import org.hibernate.dialect.MariaDBDialect; import org.hibernate.dialect.MySQLDialect; import org.hibernate.dialect.PostgreSQLDialect; +import org.hibernate.dialect.PostgresPlusDialect; import org.hibernate.dialect.SQLServerDialect; import org.hibernate.dialect.SybaseDialect; import org.hibernate.engine.jdbc.Size; @@ -193,7 +194,8 @@ void testUsage3(SessionFactoryScope scope) { @SkipForDialect(dialectClass = MySQLDialect.class, reason = "MySQL only supports precision <= 6", matchSubTypes = true) @SkipForDialect(dialectClass = SQLServerDialect.class, reason = "SQL Server only supports precision <= 6") @SkipForDialect(dialectClass = SybaseDialect.class, reason = "Because... Sybase...", matchSubTypes = true) - @SkipForDialect(dialectClass = PostgreSQLDialect.class, reason = "PostgreSQL only supports precision <= 6", matchSubTypes = true) + @SkipForDialect(dialectClass = PostgreSQLDialect.class, reason = "PostgreSQL only supports precision <= 6") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, reason = "PostgresPlus only supports precision <= 6") @SkipForDialect(dialectClass = CockroachDialect.class, reason = "CockroachDB only supports precision <= 6") @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA does not support specifying a precision on timestamps") @SkipForDialect(dialectClass = InformixDialect.class, reason = "Informix only supports precision from 1 to 5") diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/timestamp/JdbcTimestampWithoutUTCTimeZoneTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/timestamp/JdbcTimestampWithoutUTCTimeZoneTest.java index 92ceef5797cf..8c84cfcb3698 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/timestamp/JdbcTimestampWithoutUTCTimeZoneTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/timestamp/JdbcTimestampWithoutUTCTimeZoneTest.java @@ -62,7 +62,7 @@ protected void releaseResources() { } @Test - @SkipForDialect(dialectClass = CockroachDialect.class, matchSubTypes = true, reason = "https://github.com/cockroachdb/cockroach/issues/3781") + @SkipForDialect(dialectClass = CockroachDialect.class, reason = "https://github.com/cockroachdb/cockroach/issues/3781") public void testTimeZone() { inTransaction( session -> { Person person = new Person(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/tm/CMTTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/tm/CMTTest.java index d978874cae62..045ea1dc56bf 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/tm/CMTTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/tm/CMTTest.java @@ -44,7 +44,7 @@ /** * @author Gavin King */ -@SkipForDialect(dialectClass = SQLServerDialect.class, matchSubTypes = true) +@SkipForDialect(dialectClass = SQLServerDialect.class) @DomainModel( xmlMappings = "org/hibernate/orm/test/tm/Item.hbm.xml", concurrencyStrategy = "transactional" diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/type/VarbinaryArrayTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/type/VarbinaryArrayTest.java index 6292e99cdb8e..1e6f6a4bceb6 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/type/VarbinaryArrayTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/type/VarbinaryArrayTest.java @@ -219,7 +219,7 @@ void queryById(String propertyName, long id, T value, Function { + if ( matchingMicroVersion < 0 ) { + yield matchingMinorVersion < 0 + ? dialect.getVersion().isSame( matchingMajorVersion ) + : dialect.getVersion().isSame( matchingMajorVersion, matchingMinorVersion ); + } + else { + yield dialect.getVersion().isSame( matchingMajorVersion, matchingMinorVersion, matchingMicroVersion ); + } + } + case SAME_OR_OLDER -> dialect.getVersion().isSameOrBefore( matchingMajorVersion, minorVersion, microVersion ); + case SAME_OR_NEWER -> dialect.getVersion().isSameOrAfter( matchingMajorVersion, minorVersion, microVersion ); + case NEWER -> dialect.getVersion().isAfter( matchingMajorVersion, minorVersion, microVersion ); + case OLDER -> dialect.getVersion().isBefore( matchingMajorVersion, minorVersion, microVersion ); + }; } record DialectVersionKey(Class dialect, DatabaseVersion version) { @@ -239,9 +234,7 @@ private ConditionEvaluationResult evaluateSkipConditions(ExtensionContext contex effectiveSkipForDialect.minorVersion(), effectiveSkipForDialect.microVersion(), dialect, - effectiveSkipForDialect.matchSubTypes() - ? VersionMatchMode.SAME_OR_OLDER - : VersionMatchMode.SAME + effectiveSkipForDialect.versionMatchMode() ); if ( versionsMatch ) { diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/RequiresDialect.java b/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/RequiresDialect.java index 386880680f2c..e0dadca5a57b 100644 --- a/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/RequiresDialect.java +++ b/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/RequiresDialect.java @@ -44,6 +44,8 @@ int microVersion() default -1; + VersionMatchMode versionMatchMode() default VersionMatchMode.SAME_OR_NEWER; + /** * Comment describing the reason why the dialect is required. * diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/SkipForDialect.java b/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/SkipForDialect.java index 9809a3c2e973..1711e37b15a0 100644 --- a/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/SkipForDialect.java +++ b/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/SkipForDialect.java @@ -41,4 +41,6 @@ int minorVersion() default -1; int microVersion() default -1; + + VersionMatchMode versionMatchMode() default VersionMatchMode.SAME; } diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/VersionMatchMode.java b/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/VersionMatchMode.java new file mode 100644 index 000000000000..fc03dc04bfae --- /dev/null +++ b/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/VersionMatchMode.java @@ -0,0 +1,34 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.testing.orm.junit; + +/** + * The mode how versions shall be matched. + * + * @see SkipForDialect + * @see RequiresDialect + */ +public enum VersionMatchMode { + /** + * A database version must be older than the specified version. + */ + OLDER, + /** + * A database version must be the same as the specified version. + */ + SAME, + /** + * A database version must be the same or newer than the specified version. + */ + SAME_OR_NEWER, + /** + * A database version must be the same or older than the specified version. + */ + SAME_OR_OLDER, + /** + * A database version must be newer than the specified version. + */ + NEWER +} diff --git a/hibernate-vector/src/test/java/org/hibernate/vector/MariaDBTest.java b/hibernate-vector/src/test/java/org/hibernate/vector/MariaDBTest.java index 9fe030842601..78afe7fd5291 100644 --- a/hibernate-vector/src/test/java/org/hibernate/vector/MariaDBTest.java +++ b/hibernate-vector/src/test/java/org/hibernate/vector/MariaDBTest.java @@ -30,7 +30,7 @@ */ @DomainModel(annotatedClasses = MariaDBTest.VectorEntity.class) @SessionFactory -@RequiresDialect(value = MariaDBDialect.class, matchSubTypes = false, majorVersion = 11, minorVersion = 7) +@RequiresDialect(value = MariaDBDialect.class, majorVersion = 11, minorVersion = 7) public class MariaDBTest { private static final float[] V1 = new float[]{ 1, 2, 3 }; diff --git a/hibernate-vector/src/test/java/org/hibernate/vector/OracleByteVectorTest.java b/hibernate-vector/src/test/java/org/hibernate/vector/OracleByteVectorTest.java index bfbf2cc28d34..f10764997053 100644 --- a/hibernate-vector/src/test/java/org/hibernate/vector/OracleByteVectorTest.java +++ b/hibernate-vector/src/test/java/org/hibernate/vector/OracleByteVectorTest.java @@ -33,7 +33,7 @@ */ @DomainModel(annotatedClasses = OracleByteVectorTest.VectorEntity.class) @SessionFactory -@RequiresDialect(value = OracleDialect.class, matchSubTypes = false, majorVersion = 23, minorVersion = 4) +@RequiresDialect(value = OracleDialect.class, majorVersion = 23, minorVersion = 4) public class OracleByteVectorTest { private static final byte[] V1 = new byte[]{ 1, 2, 3 }; diff --git a/hibernate-vector/src/test/java/org/hibernate/vector/OracleDoubleVectorTest.java b/hibernate-vector/src/test/java/org/hibernate/vector/OracleDoubleVectorTest.java index 49add683b4d4..9aee2b8f0dd5 100644 --- a/hibernate-vector/src/test/java/org/hibernate/vector/OracleDoubleVectorTest.java +++ b/hibernate-vector/src/test/java/org/hibernate/vector/OracleDoubleVectorTest.java @@ -33,7 +33,7 @@ */ @DomainModel(annotatedClasses = OracleDoubleVectorTest.VectorEntity.class) @SessionFactory -@RequiresDialect(value = OracleDialect.class, matchSubTypes = false, majorVersion = 23, minorVersion = 4) +@RequiresDialect(value = OracleDialect.class, majorVersion = 23, minorVersion = 4) public class OracleDoubleVectorTest { private static final double[] V1 = new double[]{ 1, 2, 3 }; diff --git a/hibernate-vector/src/test/java/org/hibernate/vector/OracleFloatVectorTest.java b/hibernate-vector/src/test/java/org/hibernate/vector/OracleFloatVectorTest.java index da83e8bf7ef6..7f34f305a472 100644 --- a/hibernate-vector/src/test/java/org/hibernate/vector/OracleFloatVectorTest.java +++ b/hibernate-vector/src/test/java/org/hibernate/vector/OracleFloatVectorTest.java @@ -33,7 +33,7 @@ */ @DomainModel(annotatedClasses = OracleFloatVectorTest.VectorEntity.class) @SessionFactory -@RequiresDialect(value = OracleDialect.class, matchSubTypes = false, majorVersion = 23, minorVersion = 4) +@RequiresDialect(value = OracleDialect.class, majorVersion = 23, minorVersion = 4) public class OracleFloatVectorTest { private static final float[] V1 = new float[] { 1, 2, 3 }; diff --git a/hibernate-vector/src/test/java/org/hibernate/vector/OracleGenericVectorTest.java b/hibernate-vector/src/test/java/org/hibernate/vector/OracleGenericVectorTest.java index d199b91f594b..0f024f9fa766 100644 --- a/hibernate-vector/src/test/java/org/hibernate/vector/OracleGenericVectorTest.java +++ b/hibernate-vector/src/test/java/org/hibernate/vector/OracleGenericVectorTest.java @@ -34,7 +34,7 @@ */ @DomainModel(annotatedClasses = OracleGenericVectorTest.VectorEntity.class) @SessionFactory -@RequiresDialect(value = OracleDialect.class, matchSubTypes = false, majorVersion = 23, minorVersion = 4) +@RequiresDialect(value = OracleDialect.class, majorVersion = 23, minorVersion = 4) public class OracleGenericVectorTest { private static final float[] V1 = new float[] { 1, 2, 3 }; diff --git a/settings.gradle b/settings.gradle index f27540865894..43cf51e4c366 100644 --- a/settings.gradle +++ b/settings.gradle @@ -229,7 +229,7 @@ dependencyResolutionManagement { def h2gisVersion = version "h2gis", overrideableVersion( "gradle.libs.versions.h2gis", "2.2.3" ) def hsqldbVersion = version "hsqldb", overrideableVersion( "gradle.libs.versions.hsqldb", "2.7.4" ) def informixVersion = version "informix", "15.0.0.1.1" - def mariadbVersion = version "mariadb", "3.5.3" + def mariadbVersion = version "mariadb", "3.5.5" def mssqlVersion = version "mssql", "12.10.1.jre11" def mysqlVersion = version "mysql", "9.4.0" def oracleVersion = version "oracle", "23.9.0.25.07"