in c/validation/adbc_validation.cc [250:331]
void ConnectionTest::TestMetadataGetInfo() {
ASSERT_THAT(AdbcConnectionNew(&connection, &error), IsOkStatus(&error));
ASSERT_THAT(AdbcConnectionInit(&connection, &database, &error), IsOkStatus(&error));
if (!quirks()->supports_get_sql_info()) {
GTEST_SKIP();
}
StreamReader reader;
std::vector<uint32_t> info = {
ADBC_INFO_DRIVER_NAME,
ADBC_INFO_DRIVER_VERSION,
ADBC_INFO_VENDOR_NAME,
ADBC_INFO_VENDOR_VERSION,
};
ASSERT_THAT(AdbcConnectionGetInfo(&connection, info.data(), info.size(),
&reader.stream.value, &error),
IsOkStatus(&error));
ASSERT_NO_FATAL_FAILURE(reader.GetSchema());
ASSERT_NO_FATAL_FAILURE(CompareSchema(
&reader.schema.value, {
{"info_name", NANOARROW_TYPE_UINT32, NOT_NULL},
{"info_value", NANOARROW_TYPE_DENSE_UNION, NULLABLE},
}));
ASSERT_NO_FATAL_FAILURE(
CompareSchema(reader.schema->children[1],
{
{"string_value", NANOARROW_TYPE_STRING, NULLABLE},
{"bool_value", NANOARROW_TYPE_BOOL, NULLABLE},
{"int64_value", NANOARROW_TYPE_INT64, NULLABLE},
{"int32_bitmask", NANOARROW_TYPE_INT32, NULLABLE},
{"string_list", NANOARROW_TYPE_LIST, NULLABLE},
{"int32_to_int32_list_map", NANOARROW_TYPE_MAP, NULLABLE},
}));
ASSERT_NO_FATAL_FAILURE(CompareSchema(reader.schema->children[1]->children[4],
{
{"item", NANOARROW_TYPE_STRING, NULLABLE},
}));
ASSERT_NO_FATAL_FAILURE(CompareSchema(reader.schema->children[1]->children[5],
{
{"entries", NANOARROW_TYPE_STRUCT, NOT_NULL},
}));
ASSERT_NO_FATAL_FAILURE(
CompareSchema(reader.schema->children[1]->children[5]->children[0],
{
{"key", NANOARROW_TYPE_INT32, NOT_NULL},
{"value", NANOARROW_TYPE_LIST, NULLABLE},
}));
ASSERT_NO_FATAL_FAILURE(
CompareSchema(reader.schema->children[1]->children[5]->children[0]->children[1],
{
{"item", NANOARROW_TYPE_INT32, NULLABLE},
}));
std::vector<uint32_t> seen;
while (true) {
ASSERT_NO_FATAL_FAILURE(reader.Next());
if (!reader.array->release) break;
for (int64_t row = 0; row < reader.array->length; row++) {
ASSERT_FALSE(ArrowArrayViewIsNull(reader.array_view->children[0], row));
const uint32_t code =
reader.array_view->children[0]->buffer_views[1].data.as_uint32[row];
seen.push_back(code);
switch (code) {
case ADBC_INFO_DRIVER_NAME:
case ADBC_INFO_DRIVER_VERSION:
case ADBC_INFO_VENDOR_NAME:
case ADBC_INFO_VENDOR_VERSION:
// UTF8
ASSERT_EQ(uint8_t(0),
reader.array_view->children[1]->buffer_views[0].data.as_uint8[row]);
default:
// Ignored
break;
}
}
}
ASSERT_THAT(seen, ::testing::UnorderedElementsAreArray(info));
}