diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/locking/options/LockedRowsTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/locking/options/LockedRowsTests.java index beb6d3b559bf..09936208ff1c 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/locking/options/LockedRowsTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/locking/options/LockedRowsTests.java @@ -8,7 +8,7 @@ import jakarta.persistence.Timeout; import org.hibernate.PessimisticLockException; import org.hibernate.community.dialect.InformixDialect; -import org.hibernate.dialect.MariaDBDialect; +import org.hibernate.dialect.CockroachDialect; import org.hibernate.dialect.lock.PessimisticEntityLockException; import org.hibernate.jpa.SpecHints; import org.hibernate.testing.orm.AsyncExecutor; @@ -87,6 +87,7 @@ void testFindNoWait(SessionFactoryScope factoryScope) { @Test @RequiresDialectFeature(feature = DialectFeatureChecks.SupportNoWait.class) @SkipForDialect(dialectClass = InformixDialect.class, reason = "no failure") + @SkipForDialect(dialectClass = CockroachDialect.class, reason = "Seems FOR UPDATE locks might block read accesses of other TXs") void testLockNoWait(SessionFactoryScope factoryScope) { factoryScope.inTransaction( (session) -> { session.find(Book.class,1, PESSIMISTIC_WRITE); @@ -105,10 +106,6 @@ void testLockNoWait(SessionFactoryScope factoryScope) { @Test @RequiresDialectFeature(feature = DialectFeatureChecks.SupportsSkipLocked.class) - @SkipForDialect( - dialectClass = MariaDBDialect.class, - reason = "Cannot figure this out - it passes when run by itself, but fails when run as part of the complete suite." - ) void testQuerySkipLocked(SessionFactoryScope factoryScope) { factoryScope.inTransaction( (session1) -> { session1.find(Book.class,1, PESSIMISTIC_WRITE); @@ -127,10 +124,6 @@ void testQuerySkipLocked(SessionFactoryScope factoryScope) { @Test @RequiresDialectFeature(feature = DialectFeatureChecks.SupportsSkipLocked.class) - @SkipForDialect( - dialectClass = MariaDBDialect.class, - reason = "Cannot figure this out - it passes when run by itself, but fails when run as part of the complete suite." - ) @SkipForDialect(dialectClass = InformixDialect.class, reason = "no failure") void testFindSkipLocked(SessionFactoryScope factoryScope) { factoryScope.inTransaction( (session) -> { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/typeoverride/TypeOverrideTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/typeoverride/TypeOverrideTest.java index c7ddbfd7558f..8cf0e3691f79 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/typeoverride/TypeOverrideTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/typeoverride/TypeOverrideTest.java @@ -15,7 +15,6 @@ import org.hibernate.dialect.SybaseDialect; import org.hibernate.type.descriptor.jdbc.BlobJdbcType; import org.hibernate.type.descriptor.jdbc.IntegerJdbcType; -import org.hibernate.type.descriptor.jdbc.VarbinaryJdbcType; import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry; import org.hibernate.testing.orm.junit.BaseSessionFactoryFunctionalTest; @@ -54,7 +53,7 @@ public void testStandardBasicSqlTypeDescriptor() { // A few dialects explicitly override BlobTypeDescriptor.DEFAULT if ( CockroachDialect.class.isInstance( dialect ) ) { assertSame( - VarbinaryJdbcType.INSTANCE, + BlobJdbcType.MATERIALIZED, jdbcTypeRegistry.getDescriptor( Types.BLOB ) ); } diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/DialectFilterExtension.java b/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/DialectFilterExtension.java index 92856ec81f82..816617c35527 100644 --- a/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/DialectFilterExtension.java +++ b/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/DialectFilterExtension.java @@ -8,8 +8,10 @@ import java.util.LinkedHashMap; import java.util.Locale; +import org.hibernate.dialect.DatabaseVersion; import org.hibernate.dialect.Dialect; +import org.hibernate.dialect.SimpleDatabaseVersion; import org.junit.jupiter.api.extension.ConditionEvaluationResult; import org.junit.jupiter.api.extension.ExecutionCondition; import org.junit.jupiter.api.extension.ExtensionContext; @@ -181,27 +183,46 @@ public enum VersionMatchMode { SAME_OR_OLDER } + record DialectVersionKey(Class dialect, DatabaseVersion version) { + public static DialectVersionKey of(SkipForDialect annotation) { + final Class dialectClass = annotation.dialectClass(); + int majorVersion = DatabaseVersion.NO_VERSION; + int minorVersion = DatabaseVersion.NO_VERSION; + int microVersion = DatabaseVersion.NO_VERSION; + if ( annotation.majorVersion() != -1 ) { + majorVersion = annotation.majorVersion(); + if ( annotation.minorVersion() != -1 ) { + minorVersion += annotation.minorVersion(); + if ( annotation.microVersion() != -1 ) { + microVersion += annotation.microVersion(); + } + } + } + return new DialectVersionKey( dialectClass, new SimpleDatabaseVersion( majorVersion, minorVersion, microVersion ) ); + } + } + private ConditionEvaluationResult evaluateSkipConditions(ExtensionContext context, Dialect dialect, String enabledResult) { final Collection effectiveSkips = TestingUtil.collectAnnotations( context, SkipForDialect.class, SkipForDialectGroup.class, (methodAnnotation, methodAnnotations, classAnnotation, classAnnotations) -> { - final LinkedHashMap, SkipForDialect> map = new LinkedHashMap<>(); + final LinkedHashMap map = new LinkedHashMap<>(); if ( classAnnotation != null ) { - map.put( classAnnotation.dialectClass(), classAnnotation ); + map.put( DialectVersionKey.of( classAnnotation ), classAnnotation ); } if ( classAnnotations != null ) { for ( SkipForDialect annotation : classAnnotations ) { - map.put( annotation.dialectClass(), annotation ); + map.put( DialectVersionKey.of( annotation ), annotation ); } } if ( methodAnnotation != null ) { - map.put( methodAnnotation.dialectClass(), methodAnnotation ); + map.put( DialectVersionKey.of( methodAnnotation ), methodAnnotation ); } if ( methodAnnotations != null ) { for ( SkipForDialect annotation : methodAnnotations ) { - map.put( annotation.dialectClass(), annotation ); + map.put( DialectVersionKey.of( annotation ), annotation ); } } return map.values();