From aa7e08c7125787879e610da08c49df64e55db18a Mon Sep 17 00:00:00 2001 From: Alex Kasko Date: Sun, 1 Mar 2026 10:31:45 +0000 Subject: [PATCH] Support setting Array parameters with setObject This PR allows to set `Array` query parameters not only with `setArray()`, but also with `setObject()`. Testing: new test added Fixes: #586 --- .../org/duckdb/DuckDBPreparedStatement.java | 8 ++++++++ src/test/java/org/duckdb/TestPrepare.java | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/main/java/org/duckdb/DuckDBPreparedStatement.java b/src/main/java/org/duckdb/DuckDBPreparedStatement.java index 0df54c35e..5c2015835 100644 --- a/src/main/java/org/duckdb/DuckDBPreparedStatement.java +++ b/src/main/java/org/duckdb/DuckDBPreparedStatement.java @@ -42,6 +42,7 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import org.duckdb.user.DuckDBUserArray; public class DuckDBPreparedStatement implements PreparedStatement { private DuckDBConnection conn; @@ -1046,6 +1047,13 @@ public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQ throw new SQLException("Can't convert value to timestamp " + x.getClass().toString()); } break; + case Types.ARRAY: + if (x instanceof DuckDBUserArray) { + setArray(parameterIndex, (Array) x); + } else { + throw new SQLException("Can't convert value to array " + x.getClass().toString()); + } + break; default: throw new SQLException("Unknown target type " + targetSqlType); } diff --git a/src/test/java/org/duckdb/TestPrepare.java b/src/test/java/org/duckdb/TestPrepare.java index b32c3d79a..f6feeb1e4 100644 --- a/src/test/java/org/duckdb/TestPrepare.java +++ b/src/test/java/org/duckdb/TestPrepare.java @@ -4,6 +4,7 @@ import static org.duckdb.test.Assertions.*; import java.sql.*; +import org.duckdb.user.DuckDBUserArray; public class TestPrepare { @@ -346,4 +347,21 @@ public static void test_max_rows() throws Exception { assertEquals(stmt.getLargeMaxRows(), 0L); } } + + public static void test_prepared_statement_array_parameter() throws Exception { + try (Connection conn = DriverManager.getConnection(JDBC_URL); + PreparedStatement ps = conn.prepareStatement("SELECT ?::INT[]")) { + Array arrParam = conn.createArrayOf("INT", new Object[] {41, 42}); + ps.setObject(1, arrParam, Types.ARRAY); + try (ResultSet rs = ps.executeQuery()) { + assertTrue(rs.next()); + Array arrWrapper = rs.getArray(1); + Object[] arr = (Object[]) arrWrapper.getArray(); + assertEquals(arr.length, 2); + assertEquals(arr[0], 41); + assertEquals(arr[1], 42); + assertFalse(rs.next()); + } + } + } }