From 1fbcb392106aadf1fc937ce4376baa22f6fe609d Mon Sep 17 00:00:00 2001 From: hutiefang76 <137664623+hutiefang76@users.noreply.github.com> Date: Sat, 10 Oct 2026 23:44:17 +0800 Subject: [PATCH] Support reading BLOB bytes by column label (2.0) This is a backport of the PR #922 to `v2.0-cyanoptera` branch. --- src/main/java/org/duckdb/DuckDBResultSet.java | 2 +- src/test/java/org/duckdb/TestDuckDBJDBC.java | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/duckdb/DuckDBResultSet.java b/src/main/java/org/duckdb/DuckDBResultSet.java index 4566e50df..df22ee22a 100644 --- a/src/main/java/org/duckdb/DuckDBResultSet.java +++ b/src/main/java/org/duckdb/DuckDBResultSet.java @@ -578,7 +578,7 @@ public BigDecimal getBigDecimal(String columnLabel, int scale) throws SQLExcepti } public byte[] getBytes(String columnLabel) throws SQLException { - throw new SQLFeatureNotSupportedException("getBytes"); + return getBytes(findColumn(columnLabel)); } public Date getDate(String columnLabel) throws SQLException { diff --git a/src/test/java/org/duckdb/TestDuckDBJDBC.java b/src/test/java/org/duckdb/TestDuckDBJDBC.java index d737198bb..639933c5a 100644 --- a/src/test/java/org/duckdb/TestDuckDBJDBC.java +++ b/src/test/java/org/duckdb/TestDuckDBJDBC.java @@ -2061,6 +2061,41 @@ public static void test_get_bytes() throws Exception { } } + public static void test_get_bytes_by_label() throws Exception { + try (Connection connection = DriverManager.getConnection(JDBC_URL); Statement s = connection.createStatement(); + ResultSet rs = + s.executeQuery("SELECT 'abc'::BLOB AS abcCol, ''::BLOB AS emptyCol, NULL::BLOB AS nullCol")) { + + assertTrue(rs.next()); + + assertEquals(rs.getBytes("abcCol"), rs.getBytes(1)); + assertEquals(rs.getBytes(1), "abc".getBytes(UTF_8)); + assertNotNull(rs.getBytes("abcCol")); + assertFalse(rs.wasNull()); + + assertEquals(rs.getBytes("emptyCol"), new byte[0]); + assertNotNull(rs.getBytes("emptyCol")); + assertFalse(rs.wasNull()); + + assertNull(rs.getBytes("nullCol")); + assertTrue(rs.wasNull()); + + assertEquals(rs.getBytes("ABCCOL"), "abc".getBytes(UTF_8)); + assertEquals(rs.getBytes("AbCcOl"), "abc".getBytes(UTF_8)); + + assertThrows(() -> rs.getBytes("does_not_exist"), SQLException.class); + } + + try (Connection connection = DriverManager.getConnection(JDBC_URL); + Statement s = connection.createStatement()) { + ResultSet rs = s.executeQuery("SELECT 'abc'::BLOB AS abcCol"); + assertTrue(rs.next()); + rs.close(); + assertTrue(rs.isClosed()); + assertThrows(() -> rs.getBytes("abcCol"), SQLException.class); + } + } + public static void test_set_streams() throws Exception { try (Connection connection = DriverManager.getConnection(JDBC_URL); PreparedStatement ps = connection.prepareStatement("select ?::VARCHAR")) {