Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/main/java/org/duckdb/DuckDBPreparedStatement.java
Original file line number Diff line number Diff line change
Expand Up @@ -583,7 +583,9 @@ public long[] executeLargeBatch() throws SQLException {
return executeBatchedStatements();
}
} finally {
clearBatch();
if (!isClosed()) {
clearBatch();
}
}
}

Expand Down
127 changes: 127 additions & 0 deletions src/test/java/org/duckdb/TestBatch.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package org.duckdb;

import static org.duckdb.TestDuckDBJDBC.JDBC_URL;
import static org.duckdb.test.Assertions.*;

import java.sql.*;

public class TestBatch {

public static void test_batch_prepared_statement() throws Exception {
try (Connection conn = DriverManager.getConnection(JDBC_URL)) {
try (Statement s = conn.createStatement()) {
s.execute("CREATE TABLE test (x INT, y INT, z INT)");
}
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO test (x, y, z) VALUES (?, ?, ?);")) {
ps.setObject(1, 1);
ps.setObject(2, 2);
ps.setObject(3, 3);
ps.addBatch();

ps.setObject(1, 4);
ps.setObject(2, 5);
ps.setObject(3, 6);
ps.addBatch();

ps.executeBatch();
}
try (Statement s = conn.createStatement(); ResultSet rs = s.executeQuery("SELECT * FROM test ORDER BY x")) {
rs.next();
assertEquals(rs.getInt(1), rs.getObject(1, Integer.class));
assertEquals(rs.getObject(1, Integer.class), 1);

assertEquals(rs.getInt(2), rs.getObject(2, Integer.class));
assertEquals(rs.getObject(2, Integer.class), 2);

assertEquals(rs.getInt(3), rs.getObject(3, Integer.class));
assertEquals(rs.getObject(3, Integer.class), 3);

rs.next();
assertEquals(rs.getInt(1), rs.getObject(1, Integer.class));
assertEquals(rs.getObject(1, Integer.class), 4);

assertEquals(rs.getInt(2), rs.getObject(2, Integer.class));
assertEquals(rs.getObject(2, Integer.class), 5);

assertEquals(rs.getInt(3), rs.getObject(3, Integer.class));
assertEquals(rs.getObject(3, Integer.class), 6);
}
}
}

public static void test_batch_statement() throws Exception {
try (Connection conn = DriverManager.getConnection(JDBC_URL)) {
try (Statement s = conn.createStatement()) {
s.execute("CREATE TABLE test (x INT, y INT, z INT)");

s.addBatch("INSERT INTO test (x, y, z) VALUES (1, 2, 3);");
s.addBatch("INSERT INTO test (x, y, z) VALUES (4, 5, 6);");

s.executeBatch();
}
try (Statement s2 = conn.createStatement();
ResultSet rs = s2.executeQuery("SELECT * FROM test ORDER BY x")) {
rs.next();
assertEquals(rs.getInt(1), rs.getObject(1, Integer.class));
assertEquals(rs.getObject(1, Integer.class), 1);

assertEquals(rs.getInt(2), rs.getObject(2, Integer.class));
assertEquals(rs.getObject(2, Integer.class), 2);

assertEquals(rs.getInt(3), rs.getObject(3, Integer.class));
assertEquals(rs.getObject(3, Integer.class), 3);

rs.next();
assertEquals(rs.getInt(1), rs.getObject(1, Integer.class));
assertEquals(rs.getObject(1, Integer.class), 4);

assertEquals(rs.getInt(2), rs.getObject(2, Integer.class));
assertEquals(rs.getObject(2, Integer.class), 5);

assertEquals(rs.getInt(3), rs.getObject(3, Integer.class));
assertEquals(rs.getObject(3, Integer.class), 6);
}
}
}

public static void test_execute_while_batch() throws Exception {
try (Connection conn = DriverManager.getConnection(JDBC_URL)) {
try (Statement s = conn.createStatement()) {
s.execute("CREATE TABLE test (id INT)");
}
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO test (id) VALUES (?)")) {
ps.setObject(1, 1);
ps.addBatch();

String msg =
assertThrows(() -> { ps.execute("INSERT INTO test (id) VALUES (1);"); }, SQLException.class);
assertTrue(msg.contains("Batched queries must be executed with executeBatch."));

String msg2 =
assertThrows(() -> { ps.executeUpdate("INSERT INTO test (id) VALUES (1);"); }, SQLException.class);
assertTrue(msg2.contains("Batched queries must be executed with executeBatch."));

String msg3 = assertThrows(() -> { ps.executeQuery("SELECT * FROM test"); }, SQLException.class);
assertTrue(msg3.contains("Batched queries must be executed with executeBatch."));
}
}
}

public static void test_prepared_statement_batch_exception() throws Exception {
try (Connection conn = DriverManager.getConnection(JDBC_URL)) {
try (Statement s = conn.createStatement()) {
s.execute("CREATE TABLE test (id INT)");
}
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO test (id) VALUES (?)")) {
String msg = assertThrows(() -> { ps.addBatch("DUMMY SQL"); }, SQLException.class);
assertTrue(msg.contains("Cannot add batched SQL statement to PreparedStatement"));
}
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO test (id) VALUES (?)")) {
ps.setString(1, "foo");
ps.addBatch();
String msg = assertThrows(ps::executeBatch, SQLException.class);
assertTrue(msg.contains("Conversion Error: Could not convert string 'foo' to INT32"));
}
}
}
}
114 changes: 1 addition & 113 deletions src/test/java/org/duckdb/TestDuckDBJDBC.java
Original file line number Diff line number Diff line change
Expand Up @@ -3085,118 +3085,6 @@ public static void test_user_agent_custom() throws Exception {
}
}

public static void test_batch_prepared_statement() throws Exception {
try (Connection conn = DriverManager.getConnection(JDBC_URL)) {
try (Statement s = conn.createStatement()) {
s.execute("CREATE TABLE test (x INT, y INT, z INT)");
}
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO test (x, y, z) VALUES (?, ?, ?);")) {
ps.setObject(1, 1);
ps.setObject(2, 2);
ps.setObject(3, 3);
ps.addBatch();

ps.setObject(1, 4);
ps.setObject(2, 5);
ps.setObject(3, 6);
ps.addBatch();

ps.executeBatch();
}
try (Statement s = conn.createStatement(); ResultSet rs = s.executeQuery("SELECT * FROM test ORDER BY x")) {
rs.next();
assertEquals(rs.getInt(1), rs.getObject(1, Integer.class));
assertEquals(rs.getObject(1, Integer.class), 1);

assertEquals(rs.getInt(2), rs.getObject(2, Integer.class));
assertEquals(rs.getObject(2, Integer.class), 2);

assertEquals(rs.getInt(3), rs.getObject(3, Integer.class));
assertEquals(rs.getObject(3, Integer.class), 3);

rs.next();
assertEquals(rs.getInt(1), rs.getObject(1, Integer.class));
assertEquals(rs.getObject(1, Integer.class), 4);

assertEquals(rs.getInt(2), rs.getObject(2, Integer.class));
assertEquals(rs.getObject(2, Integer.class), 5);

assertEquals(rs.getInt(3), rs.getObject(3, Integer.class));
assertEquals(rs.getObject(3, Integer.class), 6);
}
}
}

public static void test_batch_statement() throws Exception {
try (Connection conn = DriverManager.getConnection(JDBC_URL)) {
try (Statement s = conn.createStatement()) {
s.execute("CREATE TABLE test (x INT, y INT, z INT)");

s.addBatch("INSERT INTO test (x, y, z) VALUES (1, 2, 3);");
s.addBatch("INSERT INTO test (x, y, z) VALUES (4, 5, 6);");

s.executeBatch();
}
try (Statement s2 = conn.createStatement();
ResultSet rs = s2.executeQuery("SELECT * FROM test ORDER BY x")) {
rs.next();
assertEquals(rs.getInt(1), rs.getObject(1, Integer.class));
assertEquals(rs.getObject(1, Integer.class), 1);

assertEquals(rs.getInt(2), rs.getObject(2, Integer.class));
assertEquals(rs.getObject(2, Integer.class), 2);

assertEquals(rs.getInt(3), rs.getObject(3, Integer.class));
assertEquals(rs.getObject(3, Integer.class), 3);

rs.next();
assertEquals(rs.getInt(1), rs.getObject(1, Integer.class));
assertEquals(rs.getObject(1, Integer.class), 4);

assertEquals(rs.getInt(2), rs.getObject(2, Integer.class));
assertEquals(rs.getObject(2, Integer.class), 5);

assertEquals(rs.getInt(3), rs.getObject(3, Integer.class));
assertEquals(rs.getObject(3, Integer.class), 6);
}
}
}

public static void test_execute_while_batch() throws Exception {
try (Connection conn = DriverManager.getConnection(JDBC_URL)) {
try (Statement s = conn.createStatement()) {
s.execute("CREATE TABLE test (id INT)");
}
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO test (id) VALUES (?)")) {
ps.setObject(1, 1);
ps.addBatch();

String msg =
assertThrows(() -> { ps.execute("INSERT INTO test (id) VALUES (1);"); }, SQLException.class);
assertTrue(msg.contains("Batched queries must be executed with executeBatch."));

String msg2 =
assertThrows(() -> { ps.executeUpdate("INSERT INTO test (id) VALUES (1);"); }, SQLException.class);
assertTrue(msg2.contains("Batched queries must be executed with executeBatch."));

String msg3 = assertThrows(() -> { ps.executeQuery("SELECT * FROM test"); }, SQLException.class);
assertTrue(msg3.contains("Batched queries must be executed with executeBatch."));
}
}
}

public static void test_prepared_statement_batch_exception() throws Exception {
try (Connection conn = DriverManager.getConnection(JDBC_URL)) {
try (Statement s = conn.createStatement()) {
s.execute("CREATE TABLE test (id INT)");
}
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO test (id) VALUES (?)")) {
String msg = assertThrows(() -> { ps.addBatch("DUMMY SQL"); }, SQLException.class);
assertTrue(msg.contains("Cannot add batched SQL statement to PreparedStatement"));
}
}
}

public static void test_get_binary_stream() throws Exception {
try (Connection connection = DriverManager.getConnection("jdbc:duckdb:");
PreparedStatement s = connection.prepareStatement("select ?")) {
Expand Down Expand Up @@ -3557,7 +3445,7 @@ public static void main(String[] args) throws Exception {
statusCode = runTests(new String[0], clazz);
} else {
// extension installation fails on CI, Spatial test is temporary disabled
statusCode = runTests(args, TestDuckDBJDBC.class, TestClosure.class,
statusCode = runTests(args, TestDuckDBJDBC.class, TestBatch.class, TestClosure.class,
TestExtensionTypes.class /*, TestSpatial.class */, TestParameterMetadata.class,
TestPrepare.class, TestResults.class, TestTimestamp.class);
}
Expand Down
1 change: 0 additions & 1 deletion src/test/java/org/duckdb/TestNumeric.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.duckdb;

import static org.duckdb.TestDuckDBJDBC.JDBC_URL;
import static org.duckdb.TestDuckDBJDBC.test_batch_prepared_statement;
import static org.duckdb.test.Assertions.*;

import java.math.BigDecimal;
Expand Down