in c/validation/adbc_validation.cc [482:562]
void ConnectionTest::TestMetadataGetObjectsDbSchemas() {
ASSERT_THAT(AdbcConnectionNew(&connection, &error), IsOkStatus(&error));
ASSERT_THAT(AdbcConnectionInit(&connection, &database, &error), IsOkStatus(&error));
if (!quirks()->supports_get_objects()) {
GTEST_SKIP();
}
{
// Expect at least one catalog, at least one schema, and tables should be null
StreamReader reader;
ASSERT_THAT(AdbcConnectionGetObjects(&connection, ADBC_OBJECT_DEPTH_DB_SCHEMAS,
nullptr, nullptr, nullptr, nullptr, nullptr,
&reader.stream.value, &error),
IsOkStatus(&error));
ASSERT_NO_FATAL_FAILURE(reader.GetSchema());
ASSERT_NO_FATAL_FAILURE(CheckGetObjectsSchema(&reader.schema.value));
ASSERT_NO_FATAL_FAILURE(reader.Next());
ASSERT_NE(nullptr, reader.array->release);
ASSERT_GT(reader.array->length, 0);
do {
for (int64_t row = 0; row < reader.array->length; row++) {
// type: list<db_schema_schema>
struct ArrowArrayView* catalog_db_schemas_list = reader.array_view->children[1];
// type: db_schema_schema (struct)
struct ArrowArrayView* catalog_db_schemas = catalog_db_schemas_list->children[0];
// type: list<table_schema>
struct ArrowArrayView* db_schema_tables_list = catalog_db_schemas->children[1];
ASSERT_FALSE(ArrowArrayViewIsNull(catalog_db_schemas_list, row))
<< "Row " << row << " should have non-null catalog_db_schemas";
ArrowStringView catalog_name =
ArrowArrayViewGetStringUnsafe(reader.array_view->children[0], row);
const int64_t start_offset =
ArrowArrayViewListChildOffset(catalog_db_schemas_list, row);
const int64_t end_offset =
ArrowArrayViewListChildOffset(catalog_db_schemas_list, row + 1);
ASSERT_GE(end_offset, start_offset)
<< "Row " << row << " (Catalog "
<< std::string(catalog_name.data, catalog_name.size_bytes)
<< ") should have nonempty catalog_db_schemas ";
ASSERT_FALSE(ArrowArrayViewIsNull(catalog_db_schemas_list, row));
for (int64_t list_index = start_offset; list_index < end_offset; list_index++) {
ASSERT_TRUE(ArrowArrayViewIsNull(db_schema_tables_list, row + list_index))
<< "Row " << row << " should have null db_schema_tables";
}
}
ASSERT_NO_FATAL_FAILURE(reader.Next());
} while (reader.array->release);
}
{
// Filter with a nonexistent DB schema - we should get nothing
StreamReader reader;
ASSERT_THAT(AdbcConnectionGetObjects(&connection, ADBC_OBJECT_DEPTH_DB_SCHEMAS,
nullptr, "this schema does not exist", nullptr,
nullptr, nullptr, &reader.stream.value, &error),
IsOkStatus(&error));
ASSERT_NO_FATAL_FAILURE(reader.GetSchema());
ASSERT_NO_FATAL_FAILURE(CheckGetObjectsSchema(&reader.schema.value));
ASSERT_NO_FATAL_FAILURE(reader.Next());
ASSERT_NE(nullptr, reader.array->release);
ASSERT_GT(reader.array->length, 0);
do {
for (int64_t row = 0; row < reader.array->length; row++) {
struct ArrowArrayView* catalog_db_schemas_list = reader.array_view->children[1];
ASSERT_FALSE(ArrowArrayViewIsNull(catalog_db_schemas_list, row))
<< "Row " << row << " should have non-null catalog_db_schemas";
const int64_t start_offset =
ArrowArrayViewListChildOffset(catalog_db_schemas_list, row);
const int64_t end_offset =
ArrowArrayViewListChildOffset(catalog_db_schemas_list, row + 1);
ASSERT_EQ(start_offset, end_offset);
}
ASSERT_NO_FATAL_FAILURE(reader.Next());
} while (reader.array->release);
}
}