You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by li...@apache.org on 2023/05/11 21:26:18 UTC

[arrow-adbc] branch main updated: feat(c/driver/postgresql): implement GetObjectsSchema (#676)

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 1d65bd3  feat(c/driver/postgresql): implement GetObjectsSchema (#676)
1d65bd3 is described below

commit 1d65bd3694a167af61644b0a72e6b1fa4e0a2641
Author: William Ayd <wi...@icloud.com>
AuthorDate: Thu May 11 14:26:13 2023 -0700

    feat(c/driver/postgresql): implement GetObjectsSchema (#676)
---
 c/driver/common/utils.c                | 184 ++++++++++++++++++++++++++++++++
 c/driver/common/utils.h                |   3 +
 c/driver/postgresql/connection.cc      |  71 +++++++++++++
 c/driver/postgresql/connection.h       |   5 +
 c/driver/postgresql/postgresql.cc      |   6 +-
 c/driver/postgresql/postgresql_test.cc |  44 +++++++-
 c/driver/sqlite/sqlite.c               | 186 +--------------------------------
 7 files changed, 312 insertions(+), 187 deletions(-)

diff --git a/c/driver/common/utils.c b/c/driver/common/utils.c
index a8a4a1c..a20a19b 100644
--- a/c/driver/common/utils.c
+++ b/c/driver/common/utils.c
@@ -243,3 +243,187 @@ AdbcStatusCode AdbcConnectionGetInfoAppendString(struct ArrowArray* array,
            error);
   return ADBC_STATUS_OK;
 }
+
+AdbcStatusCode AdbcInitConnectionObjectsSchema(struct ArrowSchema* schema,
+                                               struct AdbcError* error) {
+  ArrowSchemaInit(schema);
+  CHECK_NA(INTERNAL, ArrowSchemaSetTypeStruct(schema, /*num_columns=*/2), error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(schema->children[0], NANOARROW_TYPE_STRING),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(schema->children[0], "catalog_name"), error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(schema->children[1], NANOARROW_TYPE_LIST), error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(schema->children[1], "catalog_db_schemas"),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetTypeStruct(schema->children[1]->children[0], 2),
+           error);
+
+  struct ArrowSchema* db_schema_schema = schema->children[1]->children[0];
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(db_schema_schema->children[0], NANOARROW_TYPE_STRING),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(db_schema_schema->children[0], "db_schema_name"),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(db_schema_schema->children[1], NANOARROW_TYPE_LIST), error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetName(db_schema_schema->children[1], "db_schema_tables"), error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetTypeStruct(db_schema_schema->children[1]->children[0], 4),
+           error);
+
+  struct ArrowSchema* table_schema = db_schema_schema->children[1]->children[0];
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(table_schema->children[0], NANOARROW_TYPE_STRING),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(table_schema->children[0], "table_name"), error);
+  table_schema->children[0]->flags &= ~ARROW_FLAG_NULLABLE;
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(table_schema->children[1], NANOARROW_TYPE_STRING),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(table_schema->children[1], "table_type"), error);
+  table_schema->children[1]->flags &= ~ARROW_FLAG_NULLABLE;
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(table_schema->children[2], NANOARROW_TYPE_LIST),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(table_schema->children[2], "table_columns"),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetTypeStruct(table_schema->children[2]->children[0], 19),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(table_schema->children[3], NANOARROW_TYPE_LIST),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(table_schema->children[3], "table_constraints"),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetTypeStruct(table_schema->children[3]->children[0], 4),
+           error);
+
+  struct ArrowSchema* column_schema = table_schema->children[2]->children[0];
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(column_schema->children[0], NANOARROW_TYPE_STRING), error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[0], "column_name"),
+           error);
+  column_schema->children[0]->flags &= ~ARROW_FLAG_NULLABLE;
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(column_schema->children[1], NANOARROW_TYPE_INT32),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[1], "ordinal_position"),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(column_schema->children[2], NANOARROW_TYPE_STRING), error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[2], "remarks"), error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(column_schema->children[3], NANOARROW_TYPE_INT16),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[3], "xdbc_data_type"),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(column_schema->children[4], NANOARROW_TYPE_STRING), error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[4], "xdbc_type_name"),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(column_schema->children[5], NANOARROW_TYPE_INT32),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[5], "xdbc_column_size"),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(column_schema->children[6], NANOARROW_TYPE_INT16),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetName(column_schema->children[6], "xdbc_decimal_digits"), error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(column_schema->children[7], NANOARROW_TYPE_INT16),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetName(column_schema->children[7], "xdbc_num_prec_radix"), error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(column_schema->children[8], NANOARROW_TYPE_INT16),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[8], "xdbc_nullable"),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(column_schema->children[9], NANOARROW_TYPE_STRING), error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[9], "xdbc_column_def"),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(column_schema->children[10], NANOARROW_TYPE_INT16), error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetName(column_schema->children[10], "xdbc_sql_data_type"), error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(column_schema->children[11], NANOARROW_TYPE_INT16), error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[11], "xdbc_datetime_sub"),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(column_schema->children[12], NANOARROW_TYPE_INT32), error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetName(column_schema->children[12], "xdbc_char_octet_length"),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(column_schema->children[13], NANOARROW_TYPE_STRING), error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[13], "xdbc_is_nullable"),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(column_schema->children[14], NANOARROW_TYPE_STRING), error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetName(column_schema->children[14], "xdbc_scope_catalog"), error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(column_schema->children[15], NANOARROW_TYPE_STRING), error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[15], "xdbc_scope_schema"),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(column_schema->children[16], NANOARROW_TYPE_STRING), error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[16], "xdbc_scope_table"),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(column_schema->children[17], NANOARROW_TYPE_BOOL),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetName(column_schema->children[17], "xdbc_is_autoincrement"),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(column_schema->children[18], NANOARROW_TYPE_BOOL),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetName(column_schema->children[18], "xdbc_is_generatedcolumn"),
+           error);
+
+  struct ArrowSchema* constraint_schema = table_schema->children[3]->children[0];
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(constraint_schema->children[0], NANOARROW_TYPE_STRING),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetName(constraint_schema->children[0], "constraint_name"), error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(constraint_schema->children[1], NANOARROW_TYPE_STRING),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetName(constraint_schema->children[1], "constraint_type"), error);
+  constraint_schema->children[1]->flags &= ~ARROW_FLAG_NULLABLE;
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(constraint_schema->children[2], NANOARROW_TYPE_LIST),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetName(constraint_schema->children[2], "constraint_column_names"),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(constraint_schema->children[2]->children[0],
+                              NANOARROW_TYPE_STRING),
+           error);
+  constraint_schema->children[2]->flags &= ~ARROW_FLAG_NULLABLE;
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetType(constraint_schema->children[3], NANOARROW_TYPE_LIST),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetName(constraint_schema->children[3], "constraint_column_usage"),
+           error);
+  CHECK_NA(INTERNAL,
+           ArrowSchemaSetTypeStruct(constraint_schema->children[3]->children[0], 4),
+           error);
+
+  struct ArrowSchema* usage_schema = constraint_schema->children[3]->children[0];
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(usage_schema->children[0], NANOARROW_TYPE_STRING),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(usage_schema->children[0], "fk_catalog"), error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(usage_schema->children[1], NANOARROW_TYPE_STRING),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(usage_schema->children[1], "fk_db_schema"),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(usage_schema->children[2], NANOARROW_TYPE_STRING),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(usage_schema->children[2], "fk_table"), error);
+  usage_schema->children[2]->flags &= ~ARROW_FLAG_NULLABLE;
+  CHECK_NA(INTERNAL, ArrowSchemaSetType(usage_schema->children[3], NANOARROW_TYPE_STRING),
+           error);
+  CHECK_NA(INTERNAL, ArrowSchemaSetName(usage_schema->children[3], "fk_column_name"),
+           error);
+  usage_schema->children[3]->flags &= ~ARROW_FLAG_NULLABLE;
+
+  return ADBC_STATUS_OK;
+}
diff --git a/c/driver/common/utils.h b/c/driver/common/utils.h
index 21211f9..be0e23a 100644
--- a/c/driver/common/utils.h
+++ b/c/driver/common/utils.h
@@ -117,6 +117,9 @@ AdbcStatusCode AdbcConnectionGetInfoAppendString(struct ArrowArray* array,
                                                  uint32_t info_code,
                                                  const char* info_value,
                                                  struct AdbcError* error);
+
+AdbcStatusCode AdbcInitConnectionObjectsSchema(struct ArrowSchema* schema,
+                                               struct AdbcError* error);
 /// @}
 
 #ifdef __cplusplus
diff --git a/c/driver/postgresql/connection.cc b/c/driver/postgresql/connection.cc
index 893f3c9..684dee5 100644
--- a/c/driver/postgresql/connection.cc
+++ b/c/driver/postgresql/connection.cc
@@ -145,6 +145,77 @@ AdbcStatusCode PostgresConnection::GetInfo(struct AdbcConnection* connection,
   return BatchToArrayStream(&array, &schema, out, error);
 }
 
+AdbcStatusCode PostgresConnectionGetObjectsImpl(
+    PGconn* conn, int depth, const char* catalog, const char* db_schema,
+    const char* table_name, const char** table_types, const char* column_name,
+    struct ArrowSchema* schema, struct ArrowArray* array, struct AdbcError* error) {
+  RAISE_ADBC(AdbcInitConnectionObjectsSchema(schema, error));
+
+  struct ArrowError na_error = {0};
+  CHECK_NA_DETAIL(INTERNAL, ArrowArrayInitFromSchema(array, schema, &na_error), &na_error,
+                  error);
+  CHECK_NA(INTERNAL, ArrowArrayStartAppending(array), error);
+
+  struct ArrowArray* catalog_name_col = array->children[0];
+  struct ArrowArray* catalog_db_schemas_col = array->children[1];
+
+  // TODO: support proper filters
+  if (!catalog) {
+    struct StringBuilder query = {0};
+    if (StringBuilderInit(&query, /*initial_size=*/256) != 0) return ADBC_STATUS_INTERNAL;
+
+    if (StringBuilderAppend(&query, "%s", "SELECT datname FROM pg_catalog.pg_database")) {
+      return ADBC_STATUS_INTERNAL;
+    }
+
+    PqResultHelper result_helper = PqResultHelper{conn, query.buffer};
+    StringBuilderReset(&query);
+    pg_result* result = result_helper.Execute();
+
+    ExecStatusType pq_status = PQresultStatus(result);
+    if (pq_status == PGRES_TUPLES_OK) {
+      int num_rows = PQntuples(result);
+      for (int row = 0; row < num_rows; row++) {
+        const char* db_name = PQgetvalue(result, row, 0);
+        CHECK_NA(INTERNAL,
+                 ArrowArrayAppendString(catalog_name_col, ArrowCharView(db_name)), error);
+        if (depth == ADBC_OBJECT_DEPTH_CATALOGS) {
+          CHECK_NA(INTERNAL, ArrowArrayAppendNull(catalog_db_schemas_col, 1), error);
+        } else {
+          return ADBC_STATUS_NOT_IMPLEMENTED;
+        }
+        CHECK_NA(INTERNAL, ArrowArrayFinishElement(array), error);
+      }
+    } else {
+      return ADBC_STATUS_NOT_IMPLEMENTED;
+    }
+  }
+
+  CHECK_NA_DETAIL(INTERNAL, ArrowArrayFinishBuildingDefault(array, &na_error), &na_error,
+                  error);
+  return ADBC_STATUS_OK;
+}
+
+AdbcStatusCode PostgresConnection::GetObjects(
+    struct AdbcConnection* connection, int depth, const char* catalog,
+    const char* db_schema, const char* table_name, const char** table_types,
+    const char* column_name, struct ArrowArrayStream* out, struct AdbcError* error) {
+  struct ArrowSchema schema = {0};
+  struct ArrowArray array = {0};
+
+  AdbcStatusCode status =
+      PostgresConnectionGetObjectsImpl(conn_, depth, catalog, db_schema, table_name,
+                                       table_types, column_name, &schema, &array, error);
+
+  if (status != ADBC_STATUS_OK) {
+    if (schema.release) schema.release(&schema);
+    if (array.release) array.release(&array);
+    return status;
+  }
+
+  return BatchToArrayStream(&array, &schema, out, error);
+}
+
 AdbcStatusCode PostgresConnection::GetTableSchema(const char* catalog,
                                                   const char* db_schema,
                                                   const char* table_name,
diff --git a/c/driver/postgresql/connection.h b/c/driver/postgresql/connection.h
index 5029fe6..99770c2 100644
--- a/c/driver/postgresql/connection.h
+++ b/c/driver/postgresql/connection.h
@@ -35,6 +35,11 @@ class PostgresConnection {
   AdbcStatusCode GetInfo(struct AdbcConnection* connection, uint32_t* info_codes,
                          size_t info_codes_length, struct ArrowArrayStream* out,
                          struct AdbcError* error);
+  AdbcStatusCode GetObjects(struct AdbcConnection* connection, int depth,
+                            const char* catalog, const char* db_schema,
+                            const char* table_name, const char** table_types,
+                            const char* column_name, struct ArrowArrayStream* out,
+                            struct AdbcError* error);
   AdbcStatusCode GetTableSchema(const char* catalog, const char* db_schema,
                                 const char* table_name, struct ArrowSchema* schema,
                                 struct AdbcError* error);
diff --git a/c/driver/postgresql/postgresql.cc b/c/driver/postgresql/postgresql.cc
index c879a34..51f152a 100644
--- a/c/driver/postgresql/postgresql.cc
+++ b/c/driver/postgresql/postgresql.cc
@@ -135,7 +135,11 @@ AdbcStatusCode PostgresConnectionGetObjects(
     struct AdbcConnection* connection, int depth, const char* catalog,
     const char* db_schema, const char* table_name, const char** table_types,
     const char* column_name, struct ArrowArrayStream* stream, struct AdbcError* error) {
-  return ADBC_STATUS_NOT_IMPLEMENTED;
+  if (!connection->private_data) return ADBC_STATUS_INVALID_STATE;
+  auto ptr =
+      reinterpret_cast<std::shared_ptr<PostgresConnection>*>(connection->private_data);
+  return (*ptr)->GetObjects(connection, depth, catalog, db_schema, table_name,
+                            table_types, column_name, stream, error);
 }
 
 AdbcStatusCode PostgresConnectionGetTableSchema(
diff --git a/c/driver/postgresql/postgresql_test.cc b/c/driver/postgresql/postgresql_test.cc
index 27d4c49..281b83b 100644
--- a/c/driver/postgresql/postgresql_test.cc
+++ b/c/driver/postgresql/postgresql_test.cc
@@ -86,7 +86,6 @@ class PostgresConnectionTest : public ::testing::Test,
   void SetUp() override { ASSERT_NO_FATAL_FAILURE(SetUpTest()); }
   void TearDown() override { ASSERT_NO_FATAL_FAILURE(TearDownTest()); }
 
-  void TestMetadataGetObjectsCatalogs() { GTEST_SKIP() << "Not yet implemented"; }
   void TestMetadataGetObjectsDbSchemas() { GTEST_SKIP() << "Not yet implemented"; }
   void TestMetadataGetObjectsTables() { GTEST_SKIP() << "Not yet implemented"; }
   void TestMetadataGetObjectsTablesTypes() { GTEST_SKIP() << "Not yet implemented"; }
@@ -162,6 +161,49 @@ TEST_F(PostgresConnectionTest, GetInfoMetadata) {
   ASSERT_THAT(seen, ::testing::UnorderedElementsAreArray(info));
 }
 
+TEST_F(PostgresConnectionTest, GetObjectsGetCatalogs) {
+  ASSERT_THAT(AdbcConnectionNew(&connection, &error), IsOkStatus(&error));
+  ASSERT_THAT(AdbcConnectionInit(&connection, &database, &error), IsOkStatus(&error));
+
+  if (!quirks()->supports_get_objects()) {
+    GTEST_SKIP();
+  }
+
+  adbc_validation::StreamReader reader;
+  ASSERT_THAT(
+      AdbcConnectionGetObjects(&connection, ADBC_OBJECT_DEPTH_CATALOGS, nullptr, nullptr,
+                               nullptr, nullptr, nullptr, &reader.stream.value, &error),
+      IsOkStatus(&error));
+  ASSERT_NO_FATAL_FAILURE(reader.GetSchema());
+  ASSERT_NO_FATAL_FAILURE(reader.Next());
+  ASSERT_NE(nullptr, reader.array->release);
+  ASSERT_GT(reader.array->length, 0);
+
+  bool seen_postgres_db = false;
+  bool seen_template0_db = false;
+  bool seen_tempalte1_db = false;
+
+  do {
+    for (int64_t row = 0; row < reader.array->length; row++) {
+      ArrowStringView val =
+          ArrowArrayViewGetStringUnsafe(reader.array_view->children[0], row);
+      auto val_str = std::string(val.data, val.size_bytes);
+      if (val_str == "postgres") {
+        seen_postgres_db = true;
+      } else if (val_str == "template0") {
+        seen_template0_db = true;
+      } else if (val_str == "template1") {
+        seen_tempalte1_db = true;
+      }
+    }
+    ASSERT_NO_FATAL_FAILURE(reader.Next());
+  } while (reader.array->release);
+
+  EXPECT_TRUE(seen_postgres_db) << "postgres database does not exist";
+  EXPECT_TRUE(seen_template0_db) << "template0 database does not exist";
+  EXPECT_TRUE(seen_tempalte1_db) << "template1 database does not exist";
+}
+
 TEST_F(PostgresConnectionTest, MetadataGetTableSchemaInjection) {
   if (!quirks()->supports_bulk_ingest()) {
     GTEST_SKIP();
diff --git a/c/driver/sqlite/sqlite.c b/c/driver/sqlite/sqlite.c
index 353fb35..d671bc7 100644
--- a/c/driver/sqlite/sqlite.c
+++ b/c/driver/sqlite/sqlite.c
@@ -308,190 +308,6 @@ AdbcStatusCode SqliteConnectionGetInfo(struct AdbcConnection* connection,
   return BatchToArrayStream(&array, &schema, out, error);
 }
 
-AdbcStatusCode SqliteConnectionGetObjectsSchema(struct ArrowSchema* schema,
-                                                struct AdbcError* error) {
-  ArrowSchemaInit(schema);
-  CHECK_NA(INTERNAL, ArrowSchemaSetTypeStruct(schema, /*num_columns=*/2), error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(schema->children[0], NANOARROW_TYPE_STRING),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(schema->children[0], "catalog_name"), error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(schema->children[1], NANOARROW_TYPE_LIST), error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(schema->children[1], "catalog_db_schemas"),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetTypeStruct(schema->children[1]->children[0], 2),
-           error);
-
-  struct ArrowSchema* db_schema_schema = schema->children[1]->children[0];
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(db_schema_schema->children[0], NANOARROW_TYPE_STRING),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(db_schema_schema->children[0], "db_schema_name"),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(db_schema_schema->children[1], NANOARROW_TYPE_LIST), error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetName(db_schema_schema->children[1], "db_schema_tables"), error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetTypeStruct(db_schema_schema->children[1]->children[0], 4),
-           error);
-
-  struct ArrowSchema* table_schema = db_schema_schema->children[1]->children[0];
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(table_schema->children[0], NANOARROW_TYPE_STRING),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(table_schema->children[0], "table_name"), error);
-  table_schema->children[0]->flags &= ~ARROW_FLAG_NULLABLE;
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(table_schema->children[1], NANOARROW_TYPE_STRING),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(table_schema->children[1], "table_type"), error);
-  table_schema->children[1]->flags &= ~ARROW_FLAG_NULLABLE;
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(table_schema->children[2], NANOARROW_TYPE_LIST),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(table_schema->children[2], "table_columns"),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetTypeStruct(table_schema->children[2]->children[0], 19),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(table_schema->children[3], NANOARROW_TYPE_LIST),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(table_schema->children[3], "table_constraints"),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetTypeStruct(table_schema->children[3]->children[0], 4),
-           error);
-
-  struct ArrowSchema* column_schema = table_schema->children[2]->children[0];
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(column_schema->children[0], NANOARROW_TYPE_STRING), error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[0], "column_name"),
-           error);
-  column_schema->children[0]->flags &= ~ARROW_FLAG_NULLABLE;
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(column_schema->children[1], NANOARROW_TYPE_INT32),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[1], "ordinal_position"),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(column_schema->children[2], NANOARROW_TYPE_STRING), error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[2], "remarks"), error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(column_schema->children[3], NANOARROW_TYPE_INT16),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[3], "xdbc_data_type"),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(column_schema->children[4], NANOARROW_TYPE_STRING), error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[4], "xdbc_type_name"),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(column_schema->children[5], NANOARROW_TYPE_INT32),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[5], "xdbc_column_size"),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(column_schema->children[6], NANOARROW_TYPE_INT16),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetName(column_schema->children[6], "xdbc_decimal_digits"), error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(column_schema->children[7], NANOARROW_TYPE_INT16),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetName(column_schema->children[7], "xdbc_num_prec_radix"), error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(column_schema->children[8], NANOARROW_TYPE_INT16),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[8], "xdbc_nullable"),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(column_schema->children[9], NANOARROW_TYPE_STRING), error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[9], "xdbc_column_def"),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(column_schema->children[10], NANOARROW_TYPE_INT16), error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetName(column_schema->children[10], "xdbc_sql_data_type"), error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(column_schema->children[11], NANOARROW_TYPE_INT16), error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[11], "xdbc_datetime_sub"),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(column_schema->children[12], NANOARROW_TYPE_INT32), error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetName(column_schema->children[12], "xdbc_char_octet_length"),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(column_schema->children[13], NANOARROW_TYPE_STRING), error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[13], "xdbc_is_nullable"),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(column_schema->children[14], NANOARROW_TYPE_STRING), error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetName(column_schema->children[14], "xdbc_scope_catalog"), error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(column_schema->children[15], NANOARROW_TYPE_STRING), error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[15], "xdbc_scope_schema"),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(column_schema->children[16], NANOARROW_TYPE_STRING), error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(column_schema->children[16], "xdbc_scope_table"),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(column_schema->children[17], NANOARROW_TYPE_BOOL),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetName(column_schema->children[17], "xdbc_is_autoincrement"),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(column_schema->children[18], NANOARROW_TYPE_BOOL),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetName(column_schema->children[18], "xdbc_is_generatedcolumn"),
-           error);
-
-  struct ArrowSchema* constraint_schema = table_schema->children[3]->children[0];
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(constraint_schema->children[0], NANOARROW_TYPE_STRING),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetName(constraint_schema->children[0], "constraint_name"), error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(constraint_schema->children[1], NANOARROW_TYPE_STRING),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetName(constraint_schema->children[1], "constraint_type"), error);
-  constraint_schema->children[1]->flags &= ~ARROW_FLAG_NULLABLE;
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(constraint_schema->children[2], NANOARROW_TYPE_LIST),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetName(constraint_schema->children[2], "constraint_column_names"),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(constraint_schema->children[2]->children[0],
-                              NANOARROW_TYPE_STRING),
-           error);
-  constraint_schema->children[2]->flags &= ~ARROW_FLAG_NULLABLE;
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetType(constraint_schema->children[3], NANOARROW_TYPE_LIST),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetName(constraint_schema->children[3], "constraint_column_usage"),
-           error);
-  CHECK_NA(INTERNAL,
-           ArrowSchemaSetTypeStruct(constraint_schema->children[3]->children[0], 4),
-           error);
-
-  struct ArrowSchema* usage_schema = constraint_schema->children[3]->children[0];
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(usage_schema->children[0], NANOARROW_TYPE_STRING),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(usage_schema->children[0], "fk_catalog"), error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(usage_schema->children[1], NANOARROW_TYPE_STRING),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(usage_schema->children[1], "fk_db_schema"),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(usage_schema->children[2], NANOARROW_TYPE_STRING),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(usage_schema->children[2], "fk_table"), error);
-  usage_schema->children[2]->flags &= ~ARROW_FLAG_NULLABLE;
-  CHECK_NA(INTERNAL, ArrowSchemaSetType(usage_schema->children[3], NANOARROW_TYPE_STRING),
-           error);
-  CHECK_NA(INTERNAL, ArrowSchemaSetName(usage_schema->children[3], "fk_column_name"),
-           error);
-  usage_schema->children[3]->flags &= ~ARROW_FLAG_NULLABLE;
-
-  return ADBC_STATUS_OK;
-}
-
 static const char kTableQuery[] =
     "SELECT name, type "
     "FROM sqlite_master "
@@ -858,7 +674,7 @@ AdbcStatusCode SqliteConnectionGetObjectsImpl(
     struct SqliteConnection* conn, int depth, const char* catalog, const char* db_schema,
     const char* table_name, const char** table_type, const char* column_name,
     struct ArrowSchema* schema, struct ArrowArray* array, struct AdbcError* error) {
-  RAISE_ADBC(SqliteConnectionGetObjectsSchema(schema, error));
+  RAISE_ADBC(AdbcInitConnectionObjectsSchema(schema, error));
 
   struct ArrowError na_error = {0};
   CHECK_NA_DETAIL(INTERNAL, ArrowArrayInitFromSchema(array, schema, &na_error), &na_error,