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,