diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/SybaseASEDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/SybaseASEDialect.java index fccfbd3fa031..055afd1702e8 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/SybaseASEDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/SybaseASEDialect.java @@ -119,6 +119,21 @@ public SybaseASEDialect(DialectResolutionInfo info) { pageSize = pageSize( info ); } + @Override + public DatabaseVersion determineDatabaseVersion(DialectResolutionInfo info) { + if ( SybaseDriverKind.determineKind( info ) == SybaseDriverKind.JTDS + && info.getDatabaseMinorVersion() != DatabaseVersion.NO_VERSION ) { + // The jTDS driver encodes the SP part into the minor version, so we have to unpack this + final int infoMinorVersion = info.getDatabaseMinorVersion(); + final int minorVersion = infoMinorVersion / 10; + final int microVersion = infoMinorVersion % 10; + return new SimpleDatabaseVersion( info.getDatabaseMajorVersion(), minorVersion, microVersion ); + } + else { + return super.determineDatabaseVersion( info ); + } + } + @Override protected String columnType(int sqlTypeCode) { return switch ( sqlTypeCode ) { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/lock/internal/TransactSQLLockingSupport.java b/hibernate-core/src/main/java/org/hibernate/dialect/lock/internal/TransactSQLLockingSupport.java index 95714c02456d..2647de7886e0 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/lock/internal/TransactSQLLockingSupport.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/lock/internal/TransactSQLLockingSupport.java @@ -47,8 +47,8 @@ public class TransactSQLLockingSupport extends LockingSupportParameterized { public static final LockingSupport SYBASE_ASE = new TransactSQLLockingSupport( PessimisticLockStyle.TABLE_HINT, LockTimeoutType.CONNECTION, - LockTimeoutType.NONE, - LockTimeoutType.NONE, + LockTimeoutType.CONNECTION, + LockTimeoutType.QUERY, RowLockStrategy.TABLE, OuterJoinLockingType.IDENTIFIED, SybaseImpl.IMPL diff --git a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java index be75353d4f1b..eeda424954c3 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java @@ -125,6 +125,14 @@ private T doExecuteQuery( StatementCreator statementCreator, ResultsConsumer resultsConsumer) { + final var session = executionContext.getSession(); + final var factory = session.getFactory(); + final var logicalConnection = session.getJdbcCoordinator().getLogicalConnection(); + + final var connection = logicalConnection.getPhysicalConnection(); + final var statementAccess = new StatementAccessImpl( connection, logicalConnection, factory ); + jdbcSelect.performPreActions( statementAccess, connection, executionContext ); + final var deferredResultSetAccess = new DeferredResultSetAccess( jdbcSelect, jdbcParameterBindings, @@ -144,9 +152,6 @@ private T doExecuteQuery( rowTransformer = getRowTransformer( executionContext, jdbcValues ); } - final var session = executionContext.getSession(); - final var factory = session.getFactory(); - final boolean stats; long startTime = 0; final var statistics = factory.getStatistics(); @@ -201,12 +206,6 @@ public boolean shouldReturnProxies() { final var rowProcessingState = new RowProcessingStateStandardImpl( valuesProcessingState, executionContext, rowReader, jdbcValues ); - final var logicalConnection = session.getJdbcCoordinator().getLogicalConnection(); - - final var connection = logicalConnection.getPhysicalConnection(); - final var statementAccess = new StatementAccessImpl( connection, logicalConnection, factory ); - jdbcSelect.performPreActions( statementAccess, connection, executionContext ); - try { final T result = resultsConsumer.consume( jdbcValues, diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/LockExceptionTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/LockExceptionTests.java index 85ccd2f50e29..45ea2d8a337a 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/LockExceptionTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/LockExceptionTests.java @@ -13,6 +13,7 @@ import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.CockroachDialect; import org.hibernate.dialect.SQLServerDialect; +import org.hibernate.dialect.SybaseASEDialect; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.exception.LockAcquisitionException; import org.hibernate.orm.test.jpa.model.AbstractJPATest; @@ -22,6 +23,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.testing.transaction.TransactionUtil2; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; @@ -54,6 +56,8 @@ protected void tearDown() { @Test @JiraKey( value = "HHH-8786" ) @SkipForDialect(dialectClass = InformixDialect.class, reason = "no failure") + @SkipForDialect(dialectClass = SybaseASEDialect.class, majorVersion = 16, minorVersion = 0, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "holdlock isn't the same as updating a row. Bug in our Sybase ASE version?") public void testLockTimeoutFind() { final Item item = new Item( "find" ); @@ -96,6 +100,8 @@ public void testLockTimeoutFind() { @Test @SkipForDialect(dialectClass = CockroachDialect.class, reason = "Cockroach uses SERIALIZABLE by default and seems to fail reading a row that is exclusively locked by a different TX") @SkipForDialect(dialectClass = InformixDialect.class, reason = "Cursor must be on simple SELECT for FOR UPDATE") + @SkipForDialect(dialectClass = SybaseASEDialect.class, majorVersion = 16, minorVersion = 0, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "holdlock isn't the same as updating a row. Bug in our Sybase ASE version?") public void testLockTimeoutRefresh() { final Item item = new Item( "refresh" ); @@ -139,6 +145,8 @@ public void testLockTimeoutRefresh() { @Test @SkipForDialect(dialectClass = CockroachDialect.class, reason = "Cockroach uses SERIALIZABLE by default and seems to fail reading a row that is exclusively locked by a different TX") @SkipForDialect(dialectClass = InformixDialect.class, reason = "no failure") + @SkipForDialect(dialectClass = SybaseASEDialect.class, majorVersion = 16, minorVersion = 0, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "holdlock isn't the same as updating a row. Bug in our Sybase ASE version?") public void testLockTimeoutLock() { final Item item = new Item( "lock" ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/LockTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/LockTest.java index 4bae66941aa6..5799964ab31e 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/LockTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/LockTest.java @@ -35,12 +35,14 @@ import org.hibernate.dialect.PostgreSQLDialect; import org.hibernate.dialect.SQLServerDialect; +import org.hibernate.dialect.SybaseASEDialect; import org.hibernate.testing.orm.junit.DialectFeatureChecks; import org.hibernate.testing.orm.junit.EntityManagerFactoryBasedFunctionalTest; import org.hibernate.testing.orm.junit.RequiresDialect; import org.hibernate.testing.orm.junit.RequiresDialectFeature; import org.hibernate.testing.orm.junit.SkipForDialect; import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.VersionMatchMode; import org.hibernate.testing.transaction.TransactionUtil; import org.hibernate.testing.util.ExceptionUtil; import org.junit.jupiter.api.AfterEach; @@ -113,10 +115,12 @@ public void testFindWithTimeoutHint() { @Test @JiraKey( value = "HHH-7252" ) - @RequiresDialectFeature( feature = DialectFeatureChecks.SupportsLockTimeouts.class, + @RequiresDialectFeature( feature = DialectFeatureChecks.SupportsNoWait.class, comment = "Test verifies proper exception throwing when a lock timeout is specified.", jiraKey = "HHH-7252" ) @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase close socket after lock timeout occurred") + @SkipForDialect(dialectClass = SybaseASEDialect.class, majorVersion = 16, minorVersion = 0, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "holdlock isn't the same as updating a row. Bug in our Sybase ASE version?") public void testFindWithPessimisticWriteLockTimeoutException() { assertTimeout( Duration.ofSeconds(5), () -> { Lock lock = new Lock(); @@ -165,10 +169,12 @@ public void testFindWithPessimisticWriteLockTimeoutException() { @Test @JiraKey( value = "HHH-13364" ) - @RequiresDialectFeature( feature = DialectFeatureChecks.SupportsLockTimeouts.class, + @RequiresDialectFeature( feature = DialectFeatureChecks.SupportsNoWait.class, comment = "Test verifies proper exception throwing when a lock timeout is specified for Query#getSingleResult.", jiraKey = "HHH-13364" ) @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase close socket after lock timeout occurred") + @SkipForDialect(dialectClass = SybaseASEDialect.class, majorVersion = 16, minorVersion = 0, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "holdlock isn't the same as updating a row. Bug in our Sybase ASE version?") public void testQuerySingleResultPessimisticWriteLockTimeoutException() { assertTimeout( Duration.ofSeconds(5), () -> { Lock lock = new Lock(); @@ -216,10 +222,12 @@ public void testQuerySingleResultPessimisticWriteLockTimeoutException() { @Test @JiraKey( value = "HHH-13364" ) - @RequiresDialectFeature( feature = DialectFeatureChecks.SupportsLockTimeouts.class, + @RequiresDialectFeature( feature = DialectFeatureChecks.SupportsNoWait.class, comment = "Test verifies proper exception throwing when a lock timeout is specified for Query#getResultList.", jiraKey = "HHH-13364" ) @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase close socket after lock timeout occurred") + @SkipForDialect(dialectClass = SybaseASEDialect.class, majorVersion = 16, minorVersion = 0, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "holdlock isn't the same as updating a row. Bug in our Sybase ASE version?") public void testQueryResultListPessimisticWriteLockTimeoutException() { assertTimeout( Duration.ofSeconds(5), () -> { Lock lock = new Lock(); @@ -272,6 +280,8 @@ public void testQueryResultListPessimisticWriteLockTimeoutException() { comment = "Test verifies proper exception throwing when a lock timeout is specified for NamedQuery#getResultList.", jiraKey = "HHH-13364" ) @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase close socket after lock timeout occurred") + @SkipForDialect(dialectClass = SybaseASEDialect.class, majorVersion = 16, minorVersion = 0, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "holdlock isn't the same as updating a row. Bug in our Sybase ASE version?") public void testNamedQueryResultListPessimisticWriteLockTimeoutException() { assertTimeout( Duration.ofSeconds(5), () -> { Lock lock = new Lock(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/StatementIsClosedAfterALockExceptionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/StatementIsClosedAfterALockExceptionTest.java index e8b8fca6fa94..579ee23a1a9b 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/StatementIsClosedAfterALockExceptionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/StatementIsClosedAfterALockExceptionTest.java @@ -15,12 +15,14 @@ import org.hibernate.cfg.AvailableSettings; import org.hibernate.community.dialect.AltibaseDialect; import org.hibernate.community.dialect.InformixDialect; +import org.hibernate.dialect.SybaseASEDialect; import org.hibernate.testing.orm.jdbc.PreparedStatementSpyConnectionProvider; import org.hibernate.testing.orm.junit.DialectFeatureChecks; import org.hibernate.testing.orm.junit.RequiresDialectFeature; import org.hibernate.testing.orm.junit.SkipForDialect; import org.hibernate.testing.orm.junit.EntityManagerFactoryBasedFunctionalTest; import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.VersionMatchMode; import org.hibernate.testing.transaction.TransactionUtil; import org.hibernate.testing.util.ExceptionUtil; import org.junit.jupiter.api.AfterEach; @@ -37,8 +39,10 @@ /** * @author Andrea Boriero */ -@RequiresDialectFeature( feature = DialectFeatureChecks.SupportsLockTimeouts.class) +@RequiresDialectFeature( feature = DialectFeatureChecks.SupportsNoWait.class) @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase does not close Statement after lock timeout") +@SkipForDialect(dialectClass = SybaseASEDialect.class, majorVersion = 16, minorVersion = 0, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "holdlock isn't the same as updating a row. Bug in our Sybase ASE version?") public class StatementIsClosedAfterALockExceptionTest extends EntityManagerFactoryBasedFunctionalTest { private static final PreparedStatementSpyConnectionProvider CONNECTION_PROVIDER = new PreparedStatementSpyConnectionProvider(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/locking/LockingBasedOnSelectClauseTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/locking/LockingBasedOnSelectClauseTests.java index 6d08cc2dc872..604aea475345 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/locking/LockingBasedOnSelectClauseTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/locking/LockingBasedOnSelectClauseTests.java @@ -12,6 +12,7 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import org.hibernate.dialect.HSQLDialect; +import org.hibernate.dialect.SybaseASEDialect; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.tree.Statement; import org.hibernate.sql.ast.tree.select.SelectStatement; @@ -20,6 +21,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.hibernate.testing.orm.transaction.TransactionUtil; import org.hibernate.testing.util.ast.HqlHelper; import org.hibernate.testing.util.ast.LoadingAstHelper; @@ -59,6 +61,8 @@ void tearDown(SessionFactoryScope factoryScope) { @Test @SkipForDialect(dialectClass = HSQLDialect.class, reason = "See https://sourceforge.net/p/hsqldb/bugs/1734/") + @SkipForDialect(dialectClass = SybaseASEDialect.class, majorVersion = 16, minorVersion = 0, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "holdlock isn't the same as updating a row. Bug in our Sybase ASE version?") void testBasicHqlUsage(SessionFactoryScope factoryScope) { factoryScope.inTransaction( (session) -> { session.createQuery( "select b.author from Book b" ) 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 09936208ff1c..32fdf4a917e2 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 @@ -9,6 +9,7 @@ import org.hibernate.PessimisticLockException; import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.CockroachDialect; +import org.hibernate.dialect.SybaseASEDialect; import org.hibernate.dialect.lock.PessimisticEntityLockException; import org.hibernate.jpa.SpecHints; import org.hibernate.testing.orm.AsyncExecutor; @@ -19,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.BeforeEach; import org.junit.jupiter.api.Tag; @@ -68,6 +70,8 @@ void dropTestData(SessionFactoryScope factoryScope) { @Test @RequiresDialectFeature(feature = DialectFeatureChecks.SupportNoWait.class) @SkipForDialect(dialectClass = InformixDialect.class, reason = "no failure") + @SkipForDialect(dialectClass = SybaseASEDialect.class, majorVersion = 16, minorVersion = 0, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "holdlock isn't the same as updating a row. Bug in our Sybase ASE version?") void testFindNoWait(SessionFactoryScope factoryScope) { factoryScope.inTransaction( (session) -> { assert session.getDialect().supportsNoWait(); @@ -88,6 +92,8 @@ void testFindNoWait(SessionFactoryScope factoryScope) { @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") + @SkipForDialect(dialectClass = SybaseASEDialect.class, majorVersion = 16, minorVersion = 0, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "holdlock isn't the same as updating a row. Bug in our Sybase ASE version?") void testLockNoWait(SessionFactoryScope factoryScope) { factoryScope.inTransaction( (session) -> { session.find(Book.class,1, PESSIMISTIC_WRITE); @@ -106,6 +112,7 @@ void testLockNoWait(SessionFactoryScope factoryScope) { @Test @RequiresDialectFeature(feature = DialectFeatureChecks.SupportsSkipLocked.class) + @SkipForDialect(dialectClass = SybaseASEDialect.class, reason = "Sybase ASE supports SKIP_LOCKED only with PESSIMISTIC_READ") void testQuerySkipLocked(SessionFactoryScope factoryScope) { factoryScope.inTransaction( (session1) -> { session1.find(Book.class,1, PESSIMISTIC_WRITE); @@ -125,6 +132,7 @@ void testQuerySkipLocked(SessionFactoryScope factoryScope) { @Test @RequiresDialectFeature(feature = DialectFeatureChecks.SupportsSkipLocked.class) @SkipForDialect(dialectClass = InformixDialect.class, reason = "no failure") + @SkipForDialect(dialectClass = SybaseASEDialect.class, reason = "Sybase ASE supports SKIP_LOCKED only with PESSIMISTIC_READ") void testFindSkipLocked(SessionFactoryScope factoryScope) { factoryScope.inTransaction( (session) -> { session.find(Book.class,1, PESSIMISTIC_WRITE); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/locking/options/ScopeAndSecondaryTableTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/locking/options/ScopeAndSecondaryTableTests.java index 586047f889cf..813a3fb2a6ef 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/locking/options/ScopeAndSecondaryTableTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/locking/options/ScopeAndSecondaryTableTests.java @@ -6,6 +6,7 @@ import jakarta.persistence.LockModeType; import org.hibernate.community.dialect.InformixDialect; +import org.hibernate.dialect.SybaseASEDialect; import org.hibernate.testing.jdbc.SQLStatementInspector; import org.hibernate.testing.orm.junit.DialectFeatureChecks; import org.hibernate.testing.orm.junit.DomainModel; @@ -13,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.hibernate.testing.orm.transaction.TransactionUtil; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -43,6 +45,8 @@ void dropTestData(SessionFactoryScope factoryScope) { @Test @RequiresDialectFeature(feature=DialectFeatureChecks.SupportsLockingJoins.class, comment = "Come back and rework this to account for follow-on testing") @SkipForDialect( dialectClass = InformixDialect.class, reason = "Cursor must be on simple SELECT for FOR UPDATE") + @SkipForDialect(dialectClass = SybaseASEDialect.class, majorVersion = 16, minorVersion = 0, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "holdlock isn't the same as updating a row. Bug in our Sybase ASE version?") void simpleTest(SessionFactoryScope factoryScope) { final SQLStatementInspector sqlCollector = factoryScope.getCollectingStatementInspector(); factoryScope.inTransaction( (session) -> { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/locking/options/ScopeTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/locking/options/ScopeTests.java index 83d9481612cc..327be5d2ba5a 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/locking/options/ScopeTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/locking/options/ScopeTests.java @@ -10,6 +10,7 @@ import org.hibernate.dialect.Dialect; import org.hibernate.dialect.H2Dialect; import org.hibernate.dialect.HSQLDialect; +import org.hibernate.dialect.SybaseASEDialect; import org.hibernate.dialect.lock.spi.OuterJoinLockingType; import org.hibernate.testing.orm.junit.DialectFeatureChecks; import org.hibernate.testing.orm.junit.DomainModel; @@ -18,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.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; @@ -43,6 +45,8 @@ @Jira( "https://hibernate.atlassian.net/browse/HHH-19336" ) @Jira( "https://hibernate.atlassian.net/browse/HHH-19459" ) @RequiresDialectFeature( feature = DialectFeatureChecks.SupportsSelectLocking.class ) +@SkipForDialect(dialectClass = SybaseASEDialect.class, majorVersion = 16, minorVersion = 0, microVersion = 2, + versionMatchMode = VersionMatchMode.SAME_OR_OLDER, reason = "holdlock isn't the same as updating a row. Bug in our Sybase ASE version?") @Tag("db-locking") public class ScopeTests { @BeforeEach diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/DialectFeatureChecks.java b/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/DialectFeatureChecks.java index b76ceb011792..c3a75a14272d 100644 --- a/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/DialectFeatureChecks.java +++ b/hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/DialectFeatureChecks.java @@ -298,7 +298,15 @@ public boolean apply(Dialect dialect) { public static class SupportsLockTimeouts implements DialectFeatureCheck { public boolean apply(Dialect dialect) { - return dialect.supportsLockTimeouts(); + return dialect.getLockingSupport().getMetadata().getLockTimeoutType( Timeouts.ONE_SECOND ) != LockTimeoutType.NONE; + } + } + + public static class SupportsNoWait implements DialectFeatureCheck { + public boolean apply(Dialect dialect) { + return dialect.getLockingSupport() + .getMetadata() + .getLockTimeoutType( Timeouts.NO_WAIT ) != LockTimeoutType.NONE; } } @@ -332,19 +340,19 @@ public boolean apply(Dialect dialect) { public static class SupportsSkipLocked implements DialectFeatureCheck { public boolean apply(Dialect dialect) { - return dialect.supportsSkipLocked(); + return dialect.getLockingSupport().getMetadata().getLockTimeoutType( Timeouts.SKIP_LOCKED ) != LockTimeoutType.NONE; } } public static class SupportNoWait implements DialectFeatureCheck { public boolean apply(Dialect dialect) { - return dialect.supportsNoWait(); + return dialect.getLockingSupport().getMetadata().getLockTimeoutType( Timeouts.NO_WAIT ) != LockTimeoutType.NONE; } } public static class SupportsWait implements DialectFeatureCheck { public boolean apply(Dialect dialect) { - return dialect.supportsWait(); + return dialect.getLockingSupport().getMetadata().getLockTimeoutType( Timeouts.ONE_SECOND ) != LockTimeoutType.NONE; } }