From e778d2e908d36c5062c6124179a31f5ccdabbe78 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Tue, 7 Nov 2023 16:53:25 +0100 Subject: [PATCH] Polish duplicate key exception error code support for SAP HANA database for R2DBC See gh-31554 --- .../r2dbc/connection/ConnectionFactoryUtils.java | 16 +++++++++------- .../ConnectionFactoryUtilsUnitTests.java | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/ConnectionFactoryUtils.java b/spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/ConnectionFactoryUtils.java index fcbe5303d6..847dd93b72 100644 --- a/spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/ConnectionFactoryUtils.java +++ b/spring-r2dbc/src/main/java/org/springframework/r2dbc/connection/ConnectionFactoryUtils.java @@ -72,12 +72,12 @@ public abstract class ConnectionFactoryUtils { public static final int CONNECTION_SYNCHRONIZATION_ORDER = 1000; private static final Set DUPLICATE_KEY_ERROR_CODES = Set.of( - 1, // Oracle - 301, // Sap Hana + 1, // Oracle + 301, // SAP HANA 1062, // MySQL/MariaDB 2601, // MS SQL Server 2627 // MS SQL Server - ); + ); /** @@ -257,11 +257,13 @@ public abstract class ConnectionFactoryUtils { } /** - * Check whether the given SQL state (and the associated error code in case - * of a generic SQL state value) indicate a duplicate key exception. See - * {@code org.springframework.jdbc.support.SQLStateSQLExceptionTranslator#indicatesDuplicateKey}. + * Check whether the given SQL state and the associated error code (in case + * of a generic SQL state value) indicate a duplicate key exception: + * either SQL state 23505 as a specific indication, or the generic SQL state + * 23000 with a well-known vendor code. * @param sqlState the SQL state value - * @param errorCode the error code value + * @param errorCode the error code + * @see org.springframework.jdbc.support.SQLStateSQLExceptionTranslator#indicatesDuplicateKey */ static boolean indicatesDuplicateKey(@Nullable String sqlState, int errorCode) { return ("23505".equals(sqlState) || diff --git a/spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/ConnectionFactoryUtilsUnitTests.java b/spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/ConnectionFactoryUtilsUnitTests.java index 0949e45965..6268475611 100644 --- a/spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/ConnectionFactoryUtilsUnitTests.java +++ b/spring-r2dbc/src/test/java/org/springframework/r2dbc/connection/ConnectionFactoryUtilsUnitTests.java @@ -102,7 +102,7 @@ class ConnectionFactoryUtilsUnitTests { exception = ConnectionFactoryUtils.convertR2dbcException("", "", new R2dbcDataIntegrityViolationException("reason", "23000", 301)); - assertThat(exception).isExactlyInstanceOf(DuplicateKeyException.class); + assertThat(exception).as("SAP HANA").isExactlyInstanceOf(DuplicateKeyException.class); exception = ConnectionFactoryUtils.convertR2dbcException("", "", new R2dbcDataIntegrityViolationException("reason", "23000", 1062));