Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix for https://github.com/duckdb/duckdb-java/issues/139 #140

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
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
118 changes: 59 additions & 59 deletions .github/workflows/Java.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,19 +55,19 @@ jobs:
if: ${{ inputs.skip_tests != 'true' }}
run: make test

- name: Deploy
shell: bash
env:
AWS_ACCESS_KEY_ID: ${{ secrets.S3_DUCKDB_STAGING_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_DUCKDB_STAGING_KEY }}
run: |
cp build/release/duckdb_jdbc.jar duckdb_jdbc-linux-amd64.jar
./scripts/upload-assets-to-staging.sh github_release duckdb_jdbc-linux-amd64.jar
- uses: actions/upload-artifact@v3
with:
name: java-linux-amd64
path: |
build/release/duckdb_jdbc.jar
# - name: Deploy
# shell: bash
# env:
# AWS_ACCESS_KEY_ID: ${{ secrets.S3_DUCKDB_STAGING_ID }}
# AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_DUCKDB_STAGING_KEY }}
# run: |
# cp build/release/duckdb_jdbc.jar duckdb_jdbc-linux-amd64.jar
# ./scripts/upload-assets-to-staging.sh github_release duckdb_jdbc-linux-amd64.jar
# - uses: actions/upload-artifact@v4
# with:
# name: java-linux-amd64
# path: |
# build/release/duckdb_jdbc.jar

java-linux-aarch64:
name: Java Linux (aarch64)
Expand Down Expand Up @@ -99,20 +99,20 @@ jobs:
shell: bash
run: CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ OVERRIDE_JDBC_OS_ARCH=arm64 make release

- name: Deploy
shell: bash
env:
AWS_ACCESS_KEY_ID: ${{ secrets.S3_DUCKDB_STAGING_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_DUCKDB_STAGING_KEY }}
run: |
cp build/release/duckdb_jdbc.jar duckdb_jdbc-linux-aarch64.jar
# ./scripts/upload-assets-to-staging.sh github_release duckdb_jdbc-linux-aarch64.jar
# - name: Deploy
# shell: bash
# env:
# AWS_ACCESS_KEY_ID: ${{ secrets.S3_DUCKDB_STAGING_ID }}
# AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_DUCKDB_STAGING_KEY }}
# run: |
# cp build/release/duckdb_jdbc.jar duckdb_jdbc-linux-aarch64.jar
# # ./scripts/upload-assets-to-staging.sh github_release duckdb_jdbc-linux-aarch64.jar

- uses: actions/upload-artifact@v3
with:
name: java-linux-aarch64
path: |
build/release/duckdb_jdbc.jar
# - uses: actions/upload-artifact@v4
# with:
# name: java-linux-aarch64
# path: |
# build/release/duckdb_jdbc.jar


java-windows-amd64:
Expand Down Expand Up @@ -142,19 +142,19 @@ jobs:
run: |
ls -R .
make test
- name: Deploy
shell: bash
env:
AWS_ACCESS_KEY_ID: ${{ secrets.S3_DUCKDB_STAGING_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_DUCKDB_STAGING_KEY }}
run: |
cp build/release/duckdb_jdbc.jar duckdb_jdbc-windows-amd64.jar
./scripts/upload-assets-to-staging.sh github_release duckdb_jdbc-windows-amd64.jar
- uses: actions/upload-artifact@v3
with:
name: java-windows-amd64
path: |
build/release/duckdb_jdbc.jar
# - name: Deploy
# shell: bash
# env:
# AWS_ACCESS_KEY_ID: ${{ secrets.S3_DUCKDB_STAGING_ID }}
# AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_DUCKDB_STAGING_KEY }}
# run: |
# cp build/release/duckdb_jdbc.jar duckdb_jdbc-windows-amd64.jar
# ./scripts/upload-assets-to-staging.sh github_release duckdb_jdbc-windows-amd64.jar
# - uses: actions/upload-artifact@v4
# with:
# name: java-windows-amd64
# path: |
# build/release/duckdb_jdbc.jar


java-osx-universal:
Expand Down Expand Up @@ -184,19 +184,19 @@ jobs:
- name: See if this actually universal
shell: bash
run: lipo -archs build/release/libduckdb_java.so_osx_universal | grep "x86_64 arm64"
- name: Deploy
shell: bash
env:
AWS_ACCESS_KEY_ID: ${{ secrets.S3_DUCKDB_STAGING_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_DUCKDB_STAGING_KEY }}
run: |
cp build/release/duckdb_jdbc.jar duckdb_jdbc-osx-universal.jar
./scripts/upload-assets-to-staging.sh github_release duckdb_jdbc-osx-universal.jar
- uses: actions/upload-artifact@v3
with:
name: java-osx-universal
path: |
build/release/duckdb_jdbc.jar
# - name: Deploy
# shell: bash
# env:
# AWS_ACCESS_KEY_ID: ${{ secrets.S3_DUCKDB_STAGING_ID }}
# AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_DUCKDB_STAGING_KEY }}
# run: |
# cp build/release/duckdb_jdbc.jar duckdb_jdbc-osx-universal.jar
# ./scripts/upload-assets-to-staging.sh github_release duckdb_jdbc-osx-universal.jar
# - uses: actions/upload-artifact@v4
# with:
# name: java-osx-universal
# path: |
# build/release/duckdb_jdbc.jar


java-combine:
Expand Down Expand Up @@ -265,13 +265,13 @@ jobs:
fi
ls -lahR jdbc-artifacts

- name: Upload artifacts
if: always()
uses: actions/upload-artifact@v3
with:
name: java-jars
path: |
jdbc-artifacts
# - name: Upload artifacts
# if: always()
# uses: actions/upload-artifact@v4
# with:
# name: java-jars
# path: |
# jdbc-artifacts

jdbc-compliance:
name: JDBC Compliance
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
build
.idea
cmake-build-debug
out
36 changes: 36 additions & 0 deletions src/main/java/org/duckdb/DuckDBAppender.java
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,42 @@ public void append(byte[] value) throws SQLException {
}
}

private void appendNull() throws SQLException {
DuckDBNative.duckdb_jdbc_appender_append_null(appender_ref);
}

public void append(Boolean value) throws SQLException {
if (value == null) {
this.appendNull();
} else {
append(value.booleanValue());
}
}

public void append(Long value) throws SQLException {
if (value == null) {
this.appendNull();
} else {
append(value.longValue());
}
}

public void append(Short value) throws SQLException {
if (value == null) {
this.appendNull();
} else {
append(value.shortValue());
}
}

public void append(Integer value) throws SQLException {
if (value == null) {
this.appendNull();
} else {
append(value.intValue());
}
}

protected void finalize() throws Throwable {
close();
}
Expand Down
11 changes: 11 additions & 0 deletions src/main/main.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/java" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
106 changes: 106 additions & 0 deletions src/test/java/org/duckdb/TestDuckDBJDBC.java
Original file line number Diff line number Diff line change
Expand Up @@ -2713,6 +2713,112 @@ public static void test_appender_null_integer() throws Exception {
conn.close();
}

public static void test_appender_Boolean() throws Exception {
try (DuckDBConnection conn = DriverManager.getConnection(JDBC_URL).unwrap(DuckDBConnection.class);
Statement stmt = conn.createStatement();) {

stmt.execute("CREATE TABLE data (a BOOLEAN)");
DuckDBAppender appender = conn.createAppender(DuckDBConnection.DEFAULT_SCHEMA, "data");
Boolean[] values = new Boolean[] {Boolean.TRUE, Boolean.FALSE, null};
for (Boolean value : values) {
appender.beginRow();
appender.append(value);
appender.endRow();
}
appender.flush();
appender.close();

try (ResultSet results = stmt.executeQuery("SELECT count(1) FROM data WHERE a = true");) {
assertTrue(results.next());
assertEquals(1, results.getInt(1));
}
try (ResultSet results = stmt.executeQuery("SELECT count(1) FROM data WHERE a = false");) {
assertTrue(results.next());
assertEquals(1, results.getInt(1));
}
try (ResultSet results = stmt.executeQuery("SELECT count(1) FROM data WHERE a is null");) {
assertTrue(results.next());
assertEquals(1, results.getInt(1));
}
}
}

public static void test_appender_Integer() throws Exception {
try (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();

Integer value = Integer.MAX_VALUE - 10;

appender.append(value);
appender.endRow();
appender.flush();
appender.close();

try (ResultSet results = stmt.executeQuery("SELECT * FROM data");) {
assertTrue(results.next());
assertEquals(value, results.getInt(1));
assertFalse(results.wasNull());
}
}
}

public static void test_appender_Long() throws Exception {
try (DuckDBConnection conn = DriverManager.getConnection(JDBC_URL).unwrap(DuckDBConnection.class);
Statement stmt = conn.createStatement();) {

stmt.execute("CREATE TABLE data (a LONG)");
DuckDBAppender appender = conn.createAppender(DuckDBConnection.DEFAULT_SCHEMA, "data");
appender.beginRow();

Long value = Long.MAX_VALUE - 10;

appender.append(value);
appender.endRow();
appender.flush();
appender.close();

try (ResultSet results = stmt.executeQuery("SELECT * FROM data");) {
assertTrue(results.next());
assertEquals(value, results.getLong(1));
assertFalse(results.wasNull());
}
}
}

public static void test_appender_Short() throws Exception {
try (DuckDBConnection conn = DriverManager.getConnection(JDBC_URL).unwrap(DuckDBConnection.class);
Statement stmt = conn.createStatement();) {

stmt.execute("CREATE TABLE data (a SHORT)");
DuckDBAppender appender = conn.createAppender(DuckDBConnection.DEFAULT_SCHEMA, "data");

Short shortValue = Short.MIN_VALUE;
while (true) {
appender.beginRow();
appender.append(shortValue);
appender.endRow();
if (shortValue == Short.MAX_VALUE) {
break;
}
shortValue++;
}
appender.flush();
appender.close();

try (ResultSet results = stmt.executeQuery("SELECT min(a), max(a), avg(a) FROM data");) {
assertTrue(results.next());
assertEquals(Short.MIN_VALUE, results.getShort(1));
assertEquals(Short.MAX_VALUE, results.getShort(2));
assertEquals(-0.5f, results.getFloat(3));
assertFalse(results.wasNull());
}
}
}

public static void test_appender_null_varchar() throws Exception {
DuckDBConnection conn = DriverManager.getConnection(JDBC_URL).unwrap(DuckDBConnection.class);
Statement stmt = conn.createStatement();
Expand Down
1 change: 1 addition & 0 deletions src/test/test.iml
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="main" />
</component>
</module>