Skip to content

Commit

Permalink
Polish "Add SAP HANA duplicate key exception error code"
Browse files Browse the repository at this point in the history
  • Loading branch information
snicoll committed Nov 7, 2023
1 parent fcd4ba2 commit 50e55d5
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,11 @@ public void translateDuplicateKeyMSSQL2() {
doTest("23000", 2627, DuplicateKeyException.class);
}

@Test
public void translateDuplicateKeySapHana() {
doTest("23000", 301, DuplicateKeyException.class);
}

@Test
public void translateDataAccessResourceFailure() {
doTest("53", DataAccessResourceFailureException.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

package org.springframework.r2dbc.connection;

import java.util.Set;

import io.r2dbc.spi.Connection;
import io.r2dbc.spi.ConnectionFactory;
import io.r2dbc.spi.R2dbcBadGrammarException;
Expand Down Expand Up @@ -69,6 +71,14 @@ public abstract class ConnectionFactoryUtils {
*/
public static final int CONNECTION_SYNCHRONIZATION_ORDER = 1000;

private static final Set<Integer> DUPLICATE_KEY_ERROR_CODES = Set.of(
1, // Oracle
301, // Sap Hana
1062, // MySQL/MariaDB
2601, // MS SQL Server
2627 // MS SQL Server
);


/**
* Obtain a {@link Connection} from the given {@link ConnectionFactory}.
Expand Down Expand Up @@ -255,8 +265,7 @@ else if (ex instanceof R2dbcNonTransientException) {
*/
static boolean indicatesDuplicateKey(@Nullable String sqlState, int errorCode) {
return ("23505".equals(sqlState) ||
("23000".equals(sqlState) &&
(errorCode == 1 || errorCode == 1062 || errorCode == 2601 || errorCode == 2627)));
("23000".equals(sqlState) && DUPLICATE_KEY_ERROR_CODES.contains(errorCode)));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,10 @@ public void shouldTranslateIntegrityViolationException() {
new R2dbcDataIntegrityViolationException("reason", "23000", 1));
assertThat(exception).isExactlyInstanceOf(DuplicateKeyException.class);

exception = ConnectionFactoryUtils.convertR2dbcException("", "",
new R2dbcDataIntegrityViolationException("reason", "23000", 301));
assertThat(exception).isExactlyInstanceOf(DuplicateKeyException.class);

exception = ConnectionFactoryUtils.convertR2dbcException("", "",
new R2dbcDataIntegrityViolationException("reason", "23000", 1062));
assertThat(exception).isExactlyInstanceOf(DuplicateKeyException.class);
Expand Down

0 comments on commit 50e55d5

Please sign in to comment.