This is an automated email from the ASF dual-hosted git repository.
lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git
The following commit(s) were added to refs/heads/main by this push:
new fb70f1e38 feat(java/driver/jni): add executeSchema (#4056)
fb70f1e38 is described below
commit fb70f1e38a72548cb9c0d65ebf6f0fc0120be0cb
Author: Tornike Gurgenidze <[email protected]>
AuthorDate: Sun Mar 8 15:19:33 2026 +0400
feat(java/driver/jni): add executeSchema (#4056)
- adds executeSchema to jni driver
- sqlite validation suite can't test it as sqlite driver doesn't support
executeSchema yet, but the change is pretty straightforward
---
.../arrow/adbc/driver/jni/JniSqliteStatementTest.java | 6 +++---
java/driver/jni/src/main/cpp/jni_wrapper.cc | 19 ++++++++++++++++++-
.../apache/arrow/adbc/driver/jni/JniStatement.java | 7 +++++++
.../apache/arrow/adbc/driver/jni/impl/JniLoader.java | 5 +++++
.../apache/arrow/adbc/driver/jni/impl/NativeAdbc.java | 2 ++
5 files changed, 35 insertions(+), 4 deletions(-)
diff --git
a/java/driver/jni-validation-sqlite/src/test/java/org/apache/arrow/adbc/driver/jni/JniSqliteStatementTest.java
b/java/driver/jni-validation-sqlite/src/test/java/org/apache/arrow/adbc/driver/jni/JniSqliteStatementTest.java
index 0f09213f8..0b3a6fd42 100644
---
a/java/driver/jni-validation-sqlite/src/test/java/org/apache/arrow/adbc/driver/jni/JniSqliteStatementTest.java
+++
b/java/driver/jni-validation-sqlite/src/test/java/org/apache/arrow/adbc/driver/jni/JniSqliteStatementTest.java
@@ -40,15 +40,15 @@ class JniSqliteStatementTest extends AbstractStatementTest {
public void bulkIngestCreateConflict() {}
@Override
- @Disabled("Not yet implemented in JNI driver")
+ @Disabled("SQLite driver does not support ExecuteSchema")
public void executeSchema() {}
@Override
- @Disabled("Not yet implemented in JNI driver")
+ @Disabled("SQLite driver does not support ExecuteSchema")
public void executeSchemaPrepared() {}
@Override
- @Disabled("Not yet implemented in JNI driver")
+ @Disabled("SQLite driver does not support ExecuteSchema")
public void executeSchemaParams() {}
@Override
diff --git a/java/driver/jni/src/main/cpp/jni_wrapper.cc
b/java/driver/jni/src/main/cpp/jni_wrapper.cc
index eb2564c5a..080a310ae 100644
--- a/java/driver/jni/src/main/cpp/jni_wrapper.cc
+++ b/java/driver/jni/src/main/cpp/jni_wrapper.cc
@@ -97,7 +97,8 @@ void RaiseAdbcException(AdbcStatusCode code, const AdbcError&
error) {
assert(code != ADBC_STATUS_OK);
throw AdbcException{
.code = code,
- .message = std::string(error.message),
+ .message =
+ error.message ? std::string(error.message) : std::string("(unknown
error)"),
};
}
@@ -439,6 +440,22 @@
Java_org_apache_arrow_adbc_driver_jni_impl_NativeAdbc_statementPrepare(
}
}
+JNIEXPORT jobject JNICALL
+Java_org_apache_arrow_adbc_driver_jni_impl_NativeAdbc_statementExecuteSchema(
+ JNIEnv* env, [[maybe_unused]] jclass self, jlong handle) {
+ try {
+ struct AdbcError error = ADBC_ERROR_INIT;
+ auto* ptr = reinterpret_cast<struct
AdbcStatement*>(static_cast<uintptr_t>(handle));
+ struct ArrowSchema schema = {};
+ CHECK_ADBC_ERROR(AdbcStatementExecuteSchema(ptr, &schema, &error), error);
+
+ return MakeNativeSchemaResult(env, &schema);
+ } catch (const AdbcException& e) {
+ e.ThrowJavaException(env);
+ }
+ return nullptr;
+}
+
JNIEXPORT void JNICALL
Java_org_apache_arrow_adbc_driver_jni_impl_NativeAdbc_statementSetOption(
JNIEnv* env, [[maybe_unused]] jclass self, jlong handle, jstring key,
jstring value) {
diff --git
a/java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/JniStatement.java
b/java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/JniStatement.java
index 5a68fb466..2f98c3aa0 100644
---
a/java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/JniStatement.java
+++
b/java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/JniStatement.java
@@ -27,6 +27,7 @@ import org.apache.arrow.c.ArrowSchema;
import org.apache.arrow.c.Data;
import org.apache.arrow.memory.BufferAllocator;
import org.apache.arrow.vector.VectorSchemaRoot;
+import org.apache.arrow.vector.types.pojo.Schema;
public class JniStatement implements AdbcStatement {
private final BufferAllocator allocator;
@@ -79,6 +80,12 @@ public class JniStatement implements AdbcStatement {
return new UpdateResult(rowsAffected);
}
+ @Override
+ public Schema executeSchema() throws AdbcException {
+ exportBind();
+ return
JniLoader.INSTANCE.statementExecuteSchema(handle).importSchema(allocator);
+ }
+
@Override
public void prepare() throws AdbcException {
JniLoader.INSTANCE.statementPrepare(handle);
diff --git
a/java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/impl/JniLoader.java
b/java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/impl/JniLoader.java
index a885e2ae2..8102af7a8 100644
---
a/java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/impl/JniLoader.java
+++
b/java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/impl/JniLoader.java
@@ -119,6 +119,11 @@ public enum JniLoader {
NativeAdbc.statementSetOption(statement.getStatementHandle(), key, value);
}
+ public NativeSchemaResult statementExecuteSchema(NativeStatementHandle
statement)
+ throws AdbcException {
+ return NativeAdbc.statementExecuteSchema(statement.getStatementHandle());
+ }
+
public NativeQueryResult connectionGetObjects(
NativeConnectionHandle connection,
int depth,
diff --git
a/java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/impl/NativeAdbc.java
b/java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/impl/NativeAdbc.java
index 199662f15..2dcf70f62 100644
---
a/java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/impl/NativeAdbc.java
+++
b/java/driver/jni/src/main/java/org/apache/arrow/adbc/driver/jni/impl/NativeAdbc.java
@@ -52,6 +52,8 @@ class NativeAdbc {
static native void statementSetOption(long handle, String key, String value)
throws AdbcException;
+ static native NativeSchemaResult statementExecuteSchema(long handle) throws
AdbcException;
+
static native NativeQueryResult connectionGetObjects(
long handle,
int depth,