diff --git a/src/main/java/org/duckdb/DuckDBAppender.java b/src/main/java/org/duckdb/DuckDBAppender.java index 08eb5ef35..82dd6d28c 100644 --- a/src/main/java/org/duckdb/DuckDBAppender.java +++ b/src/main/java/org/duckdb/DuckDBAppender.java @@ -93,6 +93,10 @@ public void append(byte[] value) throws SQLException { } } + public void appendNull() throws SQLException { + DuckDBNative.duckdb_jdbc_appender_append_null(appender_ref); + } + protected void finalize() throws Throwable { close(); } diff --git a/src/test/java/org/duckdb/TestDuckDBJDBC.java b/src/test/java/org/duckdb/TestDuckDBJDBC.java index 1908d89e9..069c958cb 100644 --- a/src/test/java/org/duckdb/TestDuckDBJDBC.java +++ b/src/test/java/org/duckdb/TestDuckDBJDBC.java @@ -2713,6 +2713,31 @@ public static void test_appender_null_integer() throws Exception { conn.close(); } + public static void test_appender_append_null_integer() throws Exception { + DuckDBConnection conn = DriverManager.getConnection(JDBC_URL).unwrap(DuckDBConnection.class); + Statement stmt = conn.createStatement(); + + stmt.execute("CREATE TABLE data (a INTEGER)"); + + DuckDBAppender appender = conn.createAppender(DuckDBConnection.DEFAULT_SCHEMA, "data"); + + appender.beginRow(); + appender.appendNull(); + appender.endRow(); + appender.flush(); + appender.close(); + + ResultSet results = stmt.executeQuery("SELECT * FROM data"); + assertTrue(results.next()); + // java.sql.ResultSet.getInt(int) returns 0 if the value is NULL + assertEquals(0, results.getInt(1)); + assertTrue(results.wasNull()); + + results.close(); + stmt.close(); + conn.close(); + } + public static void test_appender_null_varchar() throws Exception { DuckDBConnection conn = DriverManager.getConnection(JDBC_URL).unwrap(DuckDBConnection.class); Statement stmt = conn.createStatement(); @@ -2737,6 +2762,30 @@ public static void test_appender_null_varchar() throws Exception { conn.close(); } + public static void test_appender_append_null_varchar() throws Exception { + DuckDBConnection conn = DriverManager.getConnection(JDBC_URL).unwrap(DuckDBConnection.class); + Statement stmt = conn.createStatement(); + + stmt.execute("CREATE TABLE data (a VARCHAR)"); + + DuckDBAppender appender = conn.createAppender(DuckDBConnection.DEFAULT_SCHEMA, "data"); + + appender.beginRow(); + appender.appendNull(); + appender.endRow(); + appender.flush(); + appender.close(); + + ResultSet results = stmt.executeQuery("SELECT * FROM data"); + assertTrue(results.next()); + assertNull(results.getString(1)); + assertTrue(results.wasNull()); + + results.close(); + stmt.close(); + conn.close(); + } + public static void test_appender_null_blob() throws Exception { DuckDBConnection conn = DriverManager.getConnection(JDBC_URL).unwrap(DuckDBConnection.class); Statement stmt = conn.createStatement(); @@ -2761,6 +2810,30 @@ public static void test_appender_null_blob() throws Exception { conn.close(); } + public static void test_appender_append_null_blob() throws Exception { + DuckDBConnection conn = DriverManager.getConnection(JDBC_URL).unwrap(DuckDBConnection.class); + Statement stmt = conn.createStatement(); + + stmt.execute("CREATE TABLE data (a BLOB)"); + + DuckDBAppender appender = conn.createAppender(DuckDBConnection.DEFAULT_SCHEMA, "data"); + + appender.beginRow(); + appender.appendNull(); + appender.endRow(); + appender.flush(); + appender.close(); + + ResultSet results = stmt.executeQuery("SELECT * FROM data"); + assertTrue(results.next()); + assertNull(results.getString(1)); + assertTrue(results.wasNull()); + + results.close(); + stmt.close(); + conn.close(); + } + public static void test_appender_roundtrip_blob() throws Exception { DuckDBConnection conn = DriverManager.getConnection(JDBC_URL).unwrap(DuckDBConnection.class); Statement stmt = conn.createStatement();