From dd2c4bc299e316dd94a60064b4bc215ce38e72c4 Mon Sep 17 00:00:00 2001 From: aaronchung-bitquill <118320132+aaronchung-bitquill@users.noreply.github.com> Date: Wed, 20 Dec 2023 23:05:48 +0000 Subject: [PATCH] fix: SqlMethodAnalyzer to handle empty SQL query and not throw IndexOutOfBoundsException (#798) --- .../amazon/jdbc/util/SqlMethodAnalyzer.java | 6 ++++- .../jdbc/util/SqlMethodAnalyzerTest.java | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/wrapper/src/main/java/software/amazon/jdbc/util/SqlMethodAnalyzer.java b/wrapper/src/main/java/software/amazon/jdbc/util/SqlMethodAnalyzer.java index 8dd8d2048..61f9adc97 100644 --- a/wrapper/src/main/java/software/amazon/jdbc/util/SqlMethodAnalyzer.java +++ b/wrapper/src/main/java/software/amazon/jdbc/util/SqlMethodAnalyzer.java @@ -47,7 +47,11 @@ public boolean doesOpenTransaction(final Connection conn, final String methodNam } private String getFirstSqlStatement(final String sql) { - String statement = parseMultiStatementQueries(sql).get(0); + List statementList = parseMultiStatementQueries(sql); + if (statementList.isEmpty()) { + return sql; + } + String statement = statementList.get(0); statement = statement.toUpperCase(); statement = statement.replaceAll("\\s*/\\*(.*?)\\*/\\s*", " ").trim(); return statement; diff --git a/wrapper/src/test/java/software/amazon/jdbc/util/SqlMethodAnalyzerTest.java b/wrapper/src/test/java/software/amazon/jdbc/util/SqlMethodAnalyzerTest.java index fb93cba8a..93faf55dc 100644 --- a/wrapper/src/test/java/software/amazon/jdbc/util/SqlMethodAnalyzerTest.java +++ b/wrapper/src/test/java/software/amazon/jdbc/util/SqlMethodAnalyzerTest.java @@ -16,6 +16,7 @@ package software.amazon.jdbc.util; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -34,6 +35,8 @@ import org.mockito.MockitoAnnotations; class SqlMethodAnalyzerTest { + private static final String EXECUTE_METHOD = "execute"; + private static final String EMPTY_SQL = ""; @Mock Connection conn; @@ -68,6 +71,11 @@ void testOpenTransaction(final String methodName, final String sql, final boolea assertEquals(expected, actual); } + @Test + void testOpenTransactionWithEmptySqlDoesNotThrow() { + assertDoesNotThrow(() -> sqlMethodAnalyzer.doesOpenTransaction(conn, EXECUTE_METHOD, new String[]{EMPTY_SQL})); + } + @ParameterizedTest @MethodSource("closeTransactionQueries") void testCloseTransaction(final String methodName, final String sql, final boolean expected) { @@ -82,6 +90,11 @@ void testCloseTransaction(final String methodName, final String sql, final boole assertEquals(expected, actual); } + @Test + void testCloseTransactionWithEmptySqlDoesNotThrow() { + assertDoesNotThrow(() -> sqlMethodAnalyzer.doesCloseTransaction(conn, EXECUTE_METHOD, new String[]{EMPTY_SQL})); + } + @Test void testDoesSwitchAutoCommitFalseTrue() throws SQLException { assertFalse(sqlMethodAnalyzer.doesSwitchAutoCommitFalseTrue(conn, "Connection.setAutoCommit", @@ -123,6 +136,11 @@ void testIsStatementSettingAutoCommit(final String methodName, final String sql, assertEquals(expected, actual); } + @Test + void testIsStatementSettingAutoCommitWithEmptySqlDoesNotThrow() { + assertDoesNotThrow(() -> sqlMethodAnalyzer.isStatementSettingAutoCommit(EXECUTE_METHOD, new String[]{EMPTY_SQL})); + } + @ParameterizedTest @MethodSource("getAutoCommitQueries") void testGetAutoCommit(final String sql, final Boolean expected) { @@ -137,6 +155,11 @@ void testGetAutoCommit(final String sql, final Boolean expected) { assertEquals(expected, actual); } + @Test + void testGetAutoCommitWithEmptySqlDoesNotThrow() { + assertDoesNotThrow(() -> sqlMethodAnalyzer.getAutoCommitValueFromSqlStatement(new String[]{EMPTY_SQL})); + } + @ParameterizedTest @MethodSource("getIsMethodClosingSqlObjectMethods") void testIsMethodClosingSqlObject(final String methodName, final boolean expected) {