diff --git a/src/main/java/org/tarantool/jdbc/SQLStatement.java b/src/main/java/org/tarantool/jdbc/SQLStatement.java index 142c3f60..7aa6c0cb 100644 --- a/src/main/java/org/tarantool/jdbc/SQLStatement.java +++ b/src/main/java/org/tarantool/jdbc/SQLStatement.java @@ -218,13 +218,21 @@ public int getUpdateCount() throws SQLException { @Override public boolean getMoreResults() throws SQLException { - checkNotClosed(); - return false; + return getMoreResults(Statement.CLOSE_CURRENT_RESULT); } @Override public boolean getMoreResults(int current) throws SQLException { checkNotClosed(); + JdbcConstants.checkCurrentResultConstant(current); + if (resultSet != null && + (current == KEEP_CURRENT_RESULT || current == CLOSE_ALL_RESULTS)) { + throw new SQLFeatureNotSupportedException(); + } + + // the driver doesn't support multiple results + // close current result and return no-more-results flag + discardLastResults(); return false; } diff --git a/src/main/java/org/tarantool/util/JdbcConstants.java b/src/main/java/org/tarantool/util/JdbcConstants.java index 32ce2007..e6e57cc4 100644 --- a/src/main/java/org/tarantool/util/JdbcConstants.java +++ b/src/main/java/org/tarantool/util/JdbcConstants.java @@ -27,6 +27,14 @@ public static void checkHoldabilityConstant(int holdability) throws SQLException } } + public static void checkCurrentResultConstant(int currentResult) throws SQLException { + if (currentResult != Statement.CLOSE_CURRENT_RESULT && + currentResult != Statement.CLOSE_ALL_RESULTS && + currentResult != Statement.KEEP_CURRENT_RESULT) { + throw new SQLNonTransientException("", SQLStates.INVALID_PARAMETER_VALUE.getSqlState()); + } + } + public static class DatabaseMetadataTable { private DatabaseMetadataTable() { diff --git a/src/test/java/org/tarantool/jdbc/JdbcPreparedStatementIT.java b/src/test/java/org/tarantool/jdbc/JdbcPreparedStatementIT.java index 62c17625..148e6425 100644 --- a/src/test/java/org/tarantool/jdbc/JdbcPreparedStatementIT.java +++ b/src/test/java/org/tarantool/jdbc/JdbcPreparedStatementIT.java @@ -26,6 +26,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; import java.sql.Statement; import java.util.Collections; import java.util.List; @@ -243,6 +244,84 @@ void testStatementConnection() throws SQLException { assertEquals(conn, statement.getConnection()); } + @Test + public void testMoreResultsWithResultSet() throws SQLException { + prep = conn.prepareStatement("SELECT val FROM test WHERE id = ?"); + prep.setInt(1, 1); + + prep.execute(); + ResultSet resultSet = prep.getResultSet(); + + assertFalse(resultSet.isClosed()); + assertFalse(prep.getMoreResults()); + assertEquals(-1, prep.getUpdateCount()); + assertTrue(resultSet.isClosed()); + } + + @Test + public void testMoreResultsWithUpdateCount() throws SQLException { + prep = conn.prepareStatement("INSERT INTO test VALUES (?, ?)"); + prep.setInt(1, 9); + prep.setString(2, "nine"); + + prep.execute(); + int updateCount = prep.getUpdateCount(); + + assertEquals(1, prep.getUpdateCount()); + assertFalse(prep.getMoreResults()); + assertEquals(-1, prep.getUpdateCount()); + } + + @Test + public void testMoreResultsButCloseCurrent() throws SQLException { + prep = conn.prepareStatement("SELECT val FROM test WHERE id = ?"); + prep.setInt(1, 2); + + prep.execute(); + ResultSet resultSet = prep.getResultSet(); + + assertFalse(resultSet.isClosed()); + assertFalse(prep.getMoreResults(Statement.CLOSE_CURRENT_RESULT)); + assertEquals(-1, prep.getUpdateCount()); + assertTrue(resultSet.isClosed()); + } + + @Test + public void testMoreResultsButCloseAll() throws SQLException { + prep = conn.prepareStatement("SELECT val FROM test WHERE id = ?"); + prep.setInt(1, 2); + prep.execute(); + + assertThrows(SQLFeatureNotSupportedException.class, () -> prep.getMoreResults(Statement.CLOSE_ALL_RESULTS)); + + prep = conn.prepareStatement("INSERT INTO test VALUES (?, ?)"); + prep.setInt(1, 21); + prep.setString(2, "twenty one"); + prep.execute(); + + assertEquals(1, prep.getUpdateCount()); + assertFalse(prep.getMoreResults(Statement.CLOSE_ALL_RESULTS)); + assertEquals(-1, prep.getUpdateCount()); + } + + @Test + public void testMoreResultsButKeepCurrent() throws SQLException { + prep = conn.prepareStatement("SELECT val FROM test WHERE id = ?"); + prep.setInt(1, 3); + prep.execute(); + + assertThrows(SQLFeatureNotSupportedException.class, () -> prep.getMoreResults(Statement.KEEP_CURRENT_RESULT)); + + prep = conn.prepareStatement("INSERT INTO test VALUES (?, ?)"); + prep.setInt(1, 22); + prep.setString(2, "twenty two"); + prep.execute(); + + assertEquals(1, prep.getUpdateCount()); + assertFalse(prep.getMoreResults(Statement.KEEP_CURRENT_RESULT)); + assertEquals(-1, prep.getUpdateCount()); + } + private List consoleSelect(Object key) { List list = testHelper.evaluate(TestUtils.toLuaSelect("TEST", key)); return list == null ? Collections.emptyList() : (List) list.get(0); diff --git a/src/test/java/org/tarantool/jdbc/JdbcStatementIT.java b/src/test/java/org/tarantool/jdbc/JdbcStatementIT.java index 5dd06154..16080204 100644 --- a/src/test/java/org/tarantool/jdbc/JdbcStatementIT.java +++ b/src/test/java/org/tarantool/jdbc/JdbcStatementIT.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.tarantool.TestAssumptions.assumeMinimalServerVersion; +import static org.tarantool.jdbc.SqlAssertions.assertSqlExceptionHasStatus; import org.tarantool.ServerVersion; import org.tarantool.TarantoolTestHelper; @@ -22,6 +23,7 @@ import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; import java.sql.Statement; import java.util.Collections; import java.util.List; @@ -93,7 +95,7 @@ public void testExecuteWrongQuery() throws SQLException { String wrongResultQuery = "INSERT INTO test(id, val) VALUES (40, 'forty')"; SQLException exception = assertThrows(SQLException.class, () -> stmt.executeQuery(wrongResultQuery)); - SqlAssertions.assertSqlExceptionHasStatus(exception, SQLStates.NO_DATA); + assertSqlExceptionHasStatus(exception, SQLStates.NO_DATA); } @Test @@ -108,7 +110,7 @@ public void testExecuteWrongUpdate() throws SQLException { String wrongUpdateQuery = "SELECT val FROM test"; SQLException exception = assertThrows(SQLException.class, () -> stmt.executeUpdate(wrongUpdateQuery)); - SqlAssertions.assertSqlExceptionHasStatus(exception, SQLStates.TOO_MANY_RESULTS); + assertSqlExceptionHasStatus(exception, SQLStates.TOO_MANY_RESULTS); } @Test @@ -364,6 +366,61 @@ void testCloseOnCompletionMixedQueries() throws SQLException { assertTrue(stmt.isClosed()); } + @Test + public void testMoreResultsWithResultSet() throws SQLException { + stmt.execute("SELECT val FROM test WHERE id = 1"); + + ResultSet rs = stmt.getResultSet(); + + assertFalse(rs.isClosed()); + assertFalse(stmt.getMoreResults()); + assertEquals(-1, stmt.getUpdateCount()); + assertTrue(rs.isClosed()); + } + + @Test + public void testMoreResultsWithUpdateCount() throws SQLException { + stmt.execute("INSERT INTO test(id, val) VALUES (9, 'nine')"); + + assertEquals(1, stmt.getUpdateCount()); + assertFalse(stmt.getMoreResults()); + assertEquals(-1, stmt.getUpdateCount()); + } + + @Test + public void testMoreResultsButCloseCurrent() throws SQLException { + stmt.execute("SELECT val FROM test WHERE id = 1"); + + ResultSet resultSet = stmt.getResultSet(); + + assertFalse(resultSet.isClosed()); + assertFalse(stmt.getMoreResults(Statement.CLOSE_CURRENT_RESULT)); + assertEquals(-1, stmt.getUpdateCount()); + assertTrue(resultSet.isClosed()); + } + + @Test + public void testMoreResultsButCloseAll() throws SQLException { + stmt.execute("SELECT val FROM test WHERE id = 3"); + assertThrows(SQLFeatureNotSupportedException.class, () -> stmt.getMoreResults(Statement.CLOSE_ALL_RESULTS)); + + stmt.execute("INSERT INTO test(id, val) VALUES (21, 'twenty one')"); + assertEquals(1, stmt.getUpdateCount()); + assertFalse(stmt.getMoreResults(Statement.CLOSE_ALL_RESULTS)); + assertEquals(-1, stmt.getUpdateCount()); + } + + @Test + public void testMoreResultsButKeepCurrent() throws SQLException { + stmt.execute("SELECT val FROM test WHERE id = 2"); + assertThrows(SQLFeatureNotSupportedException.class, () -> stmt.getMoreResults(Statement.KEEP_CURRENT_RESULT)); + + stmt.execute("INSERT INTO test(id, val) VALUES (22, 'twenty two')"); + assertEquals(1, stmt.getUpdateCount()); + assertFalse(stmt.getMoreResults(Statement.KEEP_CURRENT_RESULT)); + assertEquals(-1, stmt.getUpdateCount()); + } + private List consoleSelect(Object key) { List list = testHelper.evaluate(TestUtils.toLuaSelect("TEST", key)); return list == null ? Collections.emptyList() : (List) list.get(0);