Skip to content

Commit 020db79

Browse files
committed
skip some locking-related tests for Informix
Informix only allows FOR UPDATE with single-table SELECTs
1 parent 24a0203 commit 020db79

File tree

9 files changed

+58
-2
lines changed

9 files changed

+58
-2
lines changed

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixDialect.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,11 @@ public int getDoublePrecision() {
313313
return 16;
314314
}
315315

316+
@Override
317+
public boolean doesReadCommittedCauseWritersToBlockReaders() {
318+
return true;
319+
}
320+
316321
@Override
317322
public SelectItemReferenceStrategy getGroupBySelectItemReferenceStrategy() {
318323
return SelectItemReferenceStrategy.POSITION;

hibernate-core/src/test/java/org/hibernate/orm/test/jpa/findoptions/FindOptionsTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020
import org.hibernate.Session;
2121
import org.hibernate.annotations.FetchProfile;
2222
import org.hibernate.annotations.FetchProfileOverride;
23+
import org.hibernate.community.dialect.InformixDialect;
2324
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
2425
import org.hibernate.testing.orm.junit.Jpa;
26+
import org.hibernate.testing.orm.junit.SkipForDialect;
2527
import org.junit.jupiter.api.Test;
2628

2729
import java.util.List;
@@ -35,6 +37,8 @@
3537
@Jpa(annotatedClasses = FindOptionsTest.MyEntity.class)
3638
public class FindOptionsTest {
3739
@Test
40+
@SkipForDialect(dialectClass = InformixDialect.class,
41+
reason = "Informix disallows FOR UPDATE with multi-table queries")
3842
void test(EntityManagerFactoryScope scope) {
3943
MyEntity hello = new MyEntity("Hello");
4044
scope.getEntityManagerFactory()

hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/LockTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
package org.hibernate.orm.test.jpa.lock;
66

7+
import java.sql.Connection;
78
import java.util.HashMap;
89
import java.util.List;
910
import java.util.Map;
@@ -21,6 +22,7 @@
2122
import org.hibernate.cfg.AvailableSettings;
2223
import org.hibernate.community.dialect.AltibaseDialect;
2324
import org.hibernate.community.dialect.FirebirdDialect;
25+
import org.hibernate.community.dialect.InformixDialect;
2426
import org.hibernate.dialect.HANADialect;
2527
import org.hibernate.dialect.CockroachDialect;
2628
import org.hibernate.community.dialect.DerbyDialect;
@@ -68,6 +70,10 @@ public class LockTest extends BaseEntityManagerFunctionalTestCase {
6870
@Override
6971
protected void addConfigOptions(Map options) {
7072
super.addConfigOptions( options );
73+
if ( getDialect() instanceof InformixDialect ) {
74+
options.put( AvailableSettings.ISOLATION,
75+
Connection.TRANSACTION_REPEATABLE_READ );
76+
}
7177
// We can't use a shared connection provider if we use TransactionUtil.setJdbcTimeout because that is set on the connection level
7278
// options.remove( AvailableSettings.CONNECTION_PROVIDER );
7379
}

hibernate-core/src/test/java/org/hibernate/orm/test/jpa/lock/StatementIsClosedAfterALockExceptionTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@
44
*/
55
package org.hibernate.orm.test.jpa.lock;
66

7+
import java.sql.Connection;
78
import java.sql.PreparedStatement;
89
import java.sql.SQLException;
910
import java.util.HashMap;
1011
import java.util.Map;
1112
import jakarta.persistence.LockModeType;
1213
import org.hibernate.Session;
14+
import org.hibernate.cfg.AvailableSettings;
1315
import org.hibernate.community.dialect.AltibaseDialect;
16+
import org.hibernate.community.dialect.InformixDialect;
1417
import org.hibernate.dialect.CockroachDialect;
1518
import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase;
1619
import org.hibernate.testing.orm.jdbc.PreparedStatementSpyConnectionProvider;
@@ -48,6 +51,10 @@ protected Map getConfig() {
4851
org.hibernate.cfg.AvailableSettings.CONNECTION_PROVIDER,
4952
CONNECTION_PROVIDER
5053
);
54+
if ( getDialect() instanceof InformixDialect ) {
55+
config.put( AvailableSettings.ISOLATION,
56+
Connection.TRANSACTION_REPEATABLE_READ );
57+
}
5158
return config;
5259
}
5360

hibernate-core/src/test/java/org/hibernate/orm/test/locking/JoinedInheritancePessimisticLockingTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
import jakarta.persistence.InheritanceType;
1313
import jakarta.persistence.LockModeType;
1414
import jakarta.persistence.Version;
15+
import org.hibernate.community.dialect.InformixDialect;
1516
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
1617
import org.hibernate.testing.orm.junit.Jira;
1718
import org.hibernate.testing.orm.junit.Jpa;
19+
import org.hibernate.testing.orm.junit.SkipForDialect;
1820
import org.junit.jupiter.api.AfterEach;
1921
import org.junit.jupiter.api.BeforeEach;
2022
import org.junit.jupiter.api.Test;
@@ -55,6 +57,8 @@ public void tearDown(EntityManagerFactoryScope scope) {
5557
}
5658

5759
@Test
60+
@SkipForDialect(dialectClass = InformixDialect.class,
61+
reason = "Informix disallows FOR UPDATE with multi-table queries")
5862
public void findWithLock(EntityManagerFactoryScope scope) {
5963
scope.inTransaction(entityManager -> {
6064
BaseThing t = entityManager.find( BaseThing.class, 1L, LockModeType.PESSIMISTIC_WRITE );

hibernate-core/src/test/java/org/hibernate/orm/test/locking/LockModeTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
package org.hibernate.orm.test.locking;
66

7+
import java.sql.Connection;
78
import java.util.Collections;
89

910
import jakarta.persistence.LockModeType;
@@ -14,7 +15,9 @@
1415
import org.hibernate.LockMode;
1516
import org.hibernate.Session;
1617
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
18+
import org.hibernate.cfg.AvailableSettings;
1719
import org.hibernate.community.dialect.AltibaseDialect;
20+
import org.hibernate.community.dialect.InformixDialect;
1821
import org.hibernate.dialect.CockroachDialect;
1922
import org.hibernate.dialect.SQLServerDialect;
2023
import org.hibernate.dialect.SybaseASEDialect;
@@ -62,6 +65,10 @@ protected void applySettings(StandardServiceRegistryBuilder ssrBuilder) {
6265
super.applySettings( ssrBuilder );
6366
// We can't use a shared connection provider if we use TransactionUtil.setJdbcTimeout because that is set on the connection level
6467
// ssrBuilder.getSettings().remove( AvailableSettings.CONNECTION_PROVIDER );
68+
if ( getDialect() instanceof InformixDialect ) {
69+
ssrBuilder.applySetting( AvailableSettings.ISOLATION,
70+
Connection.TRANSACTION_REPEATABLE_READ );
71+
}
6572
}
6673

6774
@BeforeEach

hibernate-core/src/test/java/org/hibernate/orm/test/locking/LockRefreshReferencedAndCascadingTest.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@
66

77
import org.hibernate.Hibernate;
88

9+
import org.hibernate.community.dialect.InformixDialect;
910
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
1011
import org.hibernate.testing.orm.junit.Jpa;
11-
import org.junit.jupiter.api.BeforeAll;
12+
import org.hibernate.testing.orm.junit.SkipForDialect;
13+
import org.junit.jupiter.api.AfterEach;
14+
import org.junit.jupiter.api.BeforeEach;
1215
import org.junit.jupiter.api.Test;
1316

1417
import jakarta.persistence.CascadeType;
@@ -34,7 +37,7 @@
3437
)
3538
public class LockRefreshReferencedAndCascadingTest {
3639

37-
@BeforeAll
40+
@BeforeEach
3841
public void setUp(EntityManagerFactoryScope scope) {
3942
scope.inTransaction(
4043
entityManager -> {
@@ -52,6 +55,11 @@ public void setUp(EntityManagerFactoryScope scope) {
5255
);
5356
}
5457

58+
@AfterEach
59+
public void tearDown(EntityManagerFactoryScope scope) {
60+
scope.getEntityManagerFactory().getSchemaManager().truncate();
61+
}
62+
5563
@Test
5664
public void testRefreshBeforeRead(EntityManagerFactoryScope scope) {
5765
scope.inTransaction(
@@ -81,6 +89,8 @@ public void testRefreshBeforeRead(EntityManagerFactoryScope scope) {
8189
}
8290

8391
@Test
92+
@SkipForDialect(dialectClass = InformixDialect.class,
93+
reason = "Informix disallows FOR UPDATE with multi-table queries")
8494
public void testRefresh(EntityManagerFactoryScope scope) {
8595
scope.inTransaction(
8696
entityManager -> {
@@ -100,6 +110,8 @@ public void testRefresh(EntityManagerFactoryScope scope) {
100110
}
101111

102112
@Test
113+
@SkipForDialect(dialectClass = InformixDialect.class,
114+
reason = "Informix disallows FOR UPDATE with multi-table queries")
103115
public void testRefreshAfterRead(EntityManagerFactoryScope scope) {
104116
scope.inTransaction(
105117
entityManager -> {
@@ -124,6 +136,8 @@ public void testRefreshAfterRead(EntityManagerFactoryScope scope) {
124136
}
125137

126138
@Test
139+
@SkipForDialect(dialectClass = InformixDialect.class,
140+
reason = "Informix disallows FOR UPDATE with multi-table queries")
127141
public void testRefreshLockMode(EntityManagerFactoryScope scope) {
128142
scope.inTransaction(
129143
entityManager -> {
@@ -150,6 +164,8 @@ public void testRefreshLockMode(EntityManagerFactoryScope scope) {
150164
}
151165

152166
@Test
167+
@SkipForDialect(dialectClass = InformixDialect.class,
168+
reason = "Informix disallows FOR UPDATE with multi-table queries")
153169
public void testFindWithLockMode(EntityManagerFactoryScope scope) {
154170
scope.inTransaction(
155171
session -> {

hibernate-core/src/test/java/org/hibernate/orm/test/locking/LockRefreshReferencedTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77

88
import org.hibernate.Hibernate;
99

10+
import org.hibernate.community.dialect.InformixDialect;
1011
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
1112
import org.hibernate.testing.orm.junit.JiraKey;
1213
import org.hibernate.testing.orm.junit.Jpa;
14+
import org.hibernate.testing.orm.junit.SkipForDialect;
1315
import org.junit.jupiter.api.BeforeAll;
1416
import org.junit.jupiter.api.Test;
1517

@@ -117,6 +119,8 @@ public void testRefreshAfterRead(EntityManagerFactoryScope scope) {
117119

118120

119121
@Test
122+
@SkipForDialect(dialectClass = InformixDialect.class,
123+
reason = "Informix disallows FOR UPDATE with multi-table queries")
120124
public void testFindWithLockMode(EntityManagerFactoryScope scope) {
121125
scope.inTransaction(
122126
session -> {

hibernate-core/src/test/java/org/hibernate/orm/test/locking/jpa/FollowOnLockingTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.concurrent.TimeUnit;
99

1010
import org.hibernate.community.dialect.AltibaseDialect;
11+
import org.hibernate.community.dialect.InformixDialect;
1112
import org.hibernate.dialect.CockroachDialect;
1213
import org.hibernate.dialect.HSQLDialect;
1314
import org.hibernate.dialect.OracleDialect;
@@ -39,6 +40,8 @@
3940
@SkipForDialect(dialectClass = CockroachDialect.class, reason = "Cockroach allows the concurrent access but cancels one or both transactions at the end")
4041
@SkipForDialect(dialectClass = OracleDialect.class, majorVersion = 11, reason = "Timeouts don't work on Oracle 11 when using a driver other than ojdbc6, but we can't test with that driver")
4142
@SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase does not support timeout in statement level")
43+
@SkipForDialect(dialectClass = InformixDialect.class, reason = "Test requires REPEATABLE_READ (and then it passes)")
44+
//@ServiceRegistry(settings = @Setting(name = AvailableSettings.ISOLATION, value = "REPEATABLE_READ"))
4245
public class FollowOnLockingTest {
4346

4447
@Test

0 commit comments

Comments
 (0)