Skip to content

Commit 80a7371

Browse files
committed
Merge branch '6.2.x'
2 parents 410eff6 + 64721b3 commit 80a7371

File tree

4 files changed

+49
-31
lines changed

4 files changed

+49
-31
lines changed

spring-jdbc/src/main/java/org/springframework/jdbc/support/SQLStateSQLExceptionTranslator.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,9 @@ public class SQLStateSQLExceptionTranslator extends AbstractFallbackSQLException
9595
301, // SAP HANA
9696
1062, // MySQL/MariaDB
9797
2601, // MS SQL Server
98-
2627 // MS SQL Server
98+
2627, // MS SQL Server
99+
-239, // Informix
100+
-268 // Informix
99101
);
100102

101103

spring-jdbc/src/test/java/org/springframework/jdbc/support/SQLStateSQLExceptionTranslatorTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,16 @@ void translateDuplicateKeySapHana() {
9090
assertTranslation("23000", 301, DuplicateKeyException.class);
9191
}
9292

93+
@Test
94+
void translateDuplicateKeyInformix1() {
95+
assertTranslation("23000", -239, DuplicateKeyException.class);
96+
}
97+
98+
@Test
99+
void translateDuplicateKeyInformix2() {
100+
assertTranslation("23000", -268, DuplicateKeyException.class);
101+
}
102+
93103
@Test
94104
void translateDataAccessResourceFailure() {
95105
assertTranslation("53", DataAccessResourceFailureException.class);

spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/ConnectionFactoryUtils.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,9 @@ public abstract class ConnectionFactoryUtils {
7676
301, // SAP HANA
7777
1062, // MySQL/MariaDB
7878
2601, // MS SQL Server
79-
2627 // MS SQL Server
79+
2627, // MS SQL Server
80+
-239, // Informix
81+
-268 // Informix
8082
);
8183

8284

spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/ConnectionFactoryUtilsTests.java

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.r2dbc.connection;
1818

19+
import java.util.List;
20+
1921
import io.r2dbc.spi.R2dbcBadGrammarException;
2022
import io.r2dbc.spi.R2dbcDataIntegrityViolationException;
2123
import io.r2dbc.spi.R2dbcException;
@@ -25,6 +27,9 @@
2527
import io.r2dbc.spi.R2dbcTimeoutException;
2628
import io.r2dbc.spi.R2dbcTransientResourceException;
2729
import org.junit.jupiter.api.Test;
30+
import org.junit.jupiter.params.ParameterizedTest;
31+
import org.junit.jupiter.params.provider.Arguments;
32+
import org.junit.jupiter.params.provider.FieldSource;
2833

2934
import org.springframework.dao.CannotAcquireLockException;
3035
import org.springframework.dao.DataAccessResourceFailureException;
@@ -38,6 +43,7 @@
3843
import org.springframework.r2dbc.UncategorizedR2dbcException;
3944

4045
import static org.assertj.core.api.Assertions.assertThat;
46+
import static org.junit.jupiter.params.provider.Arguments.arguments;
4147

4248
/**
4349
* Tests for {@link ConnectionFactoryUtils}.
@@ -91,30 +97,25 @@ void shouldTranslateIntegrityViolationException() {
9197
Exception exception = ConnectionFactoryUtils.convertR2dbcException("", "",
9298
new R2dbcDataIntegrityViolationException());
9399
assertThat(exception).isExactlyInstanceOf(DataIntegrityViolationException.class);
100+
}
94101

95-
exception = ConnectionFactoryUtils.convertR2dbcException("", "",
96-
new R2dbcDataIntegrityViolationException("reason", "23505"));
97-
assertThat(exception).isExactlyInstanceOf(DuplicateKeyException.class);
98-
99-
exception = ConnectionFactoryUtils.convertR2dbcException("", "",
100-
new R2dbcDataIntegrityViolationException("reason", "23000", 1));
101-
assertThat(exception).as("Oracle").isExactlyInstanceOf(DuplicateKeyException.class);
102-
103-
exception = ConnectionFactoryUtils.convertR2dbcException("", "",
104-
new R2dbcDataIntegrityViolationException("reason", "23000", 301));
105-
assertThat(exception).as("SAP HANA").isExactlyInstanceOf(DuplicateKeyException.class);
106-
107-
exception = ConnectionFactoryUtils.convertR2dbcException("", "",
108-
new R2dbcDataIntegrityViolationException("reason", "23000", 1062));
109-
assertThat(exception).as("MySQL/MariaDB").isExactlyInstanceOf(DuplicateKeyException.class);
110-
111-
exception = ConnectionFactoryUtils.convertR2dbcException("", "",
112-
new R2dbcDataIntegrityViolationException("reason", "23000", 2601));
113-
assertThat(exception).as("MS SQL Server").isExactlyInstanceOf(DuplicateKeyException.class);
114-
115-
exception = ConnectionFactoryUtils.convertR2dbcException("", "",
116-
new R2dbcDataIntegrityViolationException("reason", "23000", 2627));
117-
assertThat(exception).as("MS SQL Server").isExactlyInstanceOf(DuplicateKeyException.class);
102+
static final List<Arguments> duplicateKeyErrorCodes = List.of(
103+
arguments("Oracle", "23505", 0),
104+
arguments("Oracle", "23000", 1),
105+
arguments("SAP HANA", "23000", 301),
106+
arguments("MySQL/MariaDB", "23000", 1062),
107+
arguments("MS SQL Server", "23000", 2601),
108+
arguments("MS SQL Server", "23000", 2627),
109+
arguments("Informix", "23000", -239),
110+
arguments("Informix", "23000", -268)
111+
);
112+
113+
@ParameterizedTest
114+
@FieldSource("duplicateKeyErrorCodes")
115+
void shouldTranslateIntegrityViolationExceptionToDuplicateKeyException(String db, String sqlState, int errorCode) {
116+
Exception exception = ConnectionFactoryUtils.convertR2dbcException("", "",
117+
new R2dbcDataIntegrityViolationException("reason", sqlState, errorCode));
118+
assertThat(exception).as(db).isExactlyInstanceOf(DuplicateKeyException.class);
118119
}
119120

120121
@Test
@@ -135,24 +136,27 @@ void shouldTranslateBadSqlGrammarException() {
135136
void messageGeneration() {
136137
Exception exception = ConnectionFactoryUtils.convertR2dbcException("TASK",
137138
"SOME-SQL", new R2dbcTransientResourceException("MESSAGE"));
138-
assertThat(exception).isExactlyInstanceOf(
139-
TransientDataAccessResourceException.class).hasMessage("TASK; SQL [SOME-SQL]; MESSAGE");
139+
assertThat(exception)
140+
.isExactlyInstanceOf(TransientDataAccessResourceException.class)
141+
.hasMessage("TASK; SQL [SOME-SQL]; MESSAGE");
140142
}
141143

142144
@Test
143145
void messageGenerationNullSQL() {
144146
Exception exception = ConnectionFactoryUtils.convertR2dbcException("TASK", null,
145147
new R2dbcTransientResourceException("MESSAGE"));
146-
assertThat(exception).isExactlyInstanceOf(
147-
TransientDataAccessResourceException.class).hasMessage("TASK; MESSAGE");
148+
assertThat(exception)
149+
.isExactlyInstanceOf(TransientDataAccessResourceException.class)
150+
.hasMessage("TASK; MESSAGE");
148151
}
149152

150153
@Test
151154
void messageGenerationNullMessage() {
152155
Exception exception = ConnectionFactoryUtils.convertR2dbcException("TASK",
153156
"SOME-SQL", new R2dbcTransientResourceException());
154-
assertThat(exception).isExactlyInstanceOf(
155-
TransientDataAccessResourceException.class).hasMessage("TASK; SQL [SOME-SQL]; null");
157+
assertThat(exception)
158+
.isExactlyInstanceOf(TransientDataAccessResourceException.class)
159+
.hasMessage("TASK; SQL [SOME-SQL]; null");
156160
}
157161

158162

0 commit comments

Comments
 (0)