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 639ca71  fix(java/driver/jdbc): check for existence when getting table 
schema (#567)
639ca71 is described below

commit 639ca716801c995c7532a924a4809e0acd00ad85
Author: David Li <[email protected]>
AuthorDate: Fri Mar 31 12:55:29 2023 -0400

    fix(java/driver/jdbc): check for existence when getting table schema (#567)
    
    Fixes #565.
---
 .../apache/arrow/adbc/driver/jdbc/JdbcConnection.java    | 16 ++++++++++++++++
 .../driver/testsuite/AbstractConnectionMetadataTest.java | 12 ++++++++++++
 2 files changed, 28 insertions(+)

diff --git 
a/java/driver/jdbc/src/main/java/org/apache/arrow/adbc/driver/jdbc/JdbcConnection.java
 
b/java/driver/jdbc/src/main/java/org/apache/arrow/adbc/driver/jdbc/JdbcConnection.java
index 205f193..6582716 100644
--- 
a/java/driver/jdbc/src/main/java/org/apache/arrow/adbc/driver/jdbc/JdbcConnection.java
+++ 
b/java/driver/jdbc/src/main/java/org/apache/arrow/adbc/driver/jdbc/JdbcConnection.java
@@ -27,6 +27,7 @@ import org.apache.arrow.adapter.jdbc.JdbcToArrowUtils;
 import org.apache.arrow.adbc.core.AdbcConnection;
 import org.apache.arrow.adbc.core.AdbcException;
 import org.apache.arrow.adbc.core.AdbcStatement;
+import org.apache.arrow.adbc.core.AdbcStatusCode;
 import org.apache.arrow.adbc.core.BulkIngestMode;
 import org.apache.arrow.adbc.core.IsolationLevel;
 import org.apache.arrow.adbc.core.StandardSchemas;
@@ -121,6 +122,21 @@ public class JdbcConnection implements AdbcConnection {
   @Override
   public Schema getTableSchema(String catalog, String dbSchema, String 
tableName)
       throws AdbcException {
+    // Check for existence
+    try (final ResultSet rs =
+        connection.getMetaData().getTables(catalog, dbSchema, tableName, 
/*tableTypes*/ null)) {
+      if (!rs.next()) {
+        throw new AdbcException(
+            JdbcDriverUtil.prefixExceptionMessage("Table not found: " + 
tableName), /*cause*/
+            null,
+            AdbcStatusCode.NOT_FOUND, /*sqlState*/
+            null, /*vendorCode*/
+            0);
+      }
+    } catch (SQLException e) {
+      throw JdbcDriverUtil.fromSqlException(e);
+    }
+
     // Reconstruct the schema from the metadata
     // XXX: this may be inconsistent with reading the table
     final List<Field> fields = new ArrayList<>();
diff --git 
a/java/driver/validation/src/main/java/org/apache/arrow/adbc/driver/testsuite/AbstractConnectionMetadataTest.java
 
b/java/driver/validation/src/main/java/org/apache/arrow/adbc/driver/testsuite/AbstractConnectionMetadataTest.java
index 5d14339..e2b377b 100644
--- 
a/java/driver/validation/src/main/java/org/apache/arrow/adbc/driver/testsuite/AbstractConnectionMetadataTest.java
+++ 
b/java/driver/validation/src/main/java/org/apache/arrow/adbc/driver/testsuite/AbstractConnectionMetadataTest.java
@@ -18,6 +18,7 @@
 package org.apache.arrow.adbc.driver.testsuite;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -28,8 +29,10 @@ import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import org.apache.arrow.adbc.core.AdbcConnection;
 import org.apache.arrow.adbc.core.AdbcDatabase;
+import org.apache.arrow.adbc.core.AdbcException;
 import org.apache.arrow.adbc.core.AdbcInfoCode;
 import org.apache.arrow.adbc.core.AdbcStatement;
+import org.apache.arrow.adbc.core.AdbcStatusCode;
 import org.apache.arrow.adbc.core.BulkIngestMode;
 import org.apache.arrow.adbc.core.StandardSchemas;
 import org.apache.arrow.memory.BufferAllocator;
@@ -306,6 +309,15 @@ public abstract class AbstractConnectionMetadataTest {
         .isEqualTo(schema);
   }
 
+  @Test
+  public void getTableSchemaDoesNotExist() throws Exception {
+    final AdbcException thrown =
+        assertThrows(
+            AdbcException.class,
+            () -> connection.getTableSchema(/*catalog*/ null, /*dbSchema*/ 
null, "DOESNOTEXIST"));
+    assertThat(thrown.getStatus()).isEqualTo(AdbcStatusCode.NOT_FOUND);
+  }
+
   @Test
   public void getTableTypes() throws Exception {
     try (final ArrowReader reader = connection.getTableTypes()) {

Reply via email to