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,

Reply via email to