Skip to content

Commit

Permalink
fix(c/driver/postgresql): return unknown OIDs as opaque
Browse files Browse the repository at this point in the history
  • Loading branch information
lidavidm committed Jan 15, 2025
1 parent 4d09ef8 commit 46f9f85
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 5 deletions.
23 changes: 23 additions & 0 deletions c/driver/postgresql/postgresql_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1696,6 +1696,29 @@ TEST_F(PostgresStatementTest, SetUseCopyFalse) {
ASSERT_EQ(reader.array->release, nullptr);
}

TEST_F(PostgresStatementTest, UnknownOid) {
// Regression test for https://github.com/apache/arrow-adbc/issues/2448
ASSERT_THAT(AdbcStatementNew(&connection, &statement, &error), IsOkStatus(&error));
ASSERT_THAT(AdbcStatementSetSqlQuery(
&statement, "SELECT typacl FROM pg_type WHERE oid <= 6157", &error),
IsOkStatus(&error));
adbc_validation::StreamReader reader;
ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value,
&reader.rows_affected, &error),
IsOkStatus(&error));
ASSERT_NO_FATAL_FAILURE(reader.GetSchema());
ASSERT_EQ(1, reader.fields.size());
ASSERT_EQ(NANOARROW_TYPE_BINARY, reader.fields[0].type);
struct ArrowStringView extension_name = reader.fields[0].extension_name;
ASSERT_EQ("arrow.opaque",
std::string_view(extension_name.data,
static_cast<size_t>(extension_name.size_bytes)));
struct ArrowStringView extension_metadata = reader.fields[0].extension_metadata;
ASSERT_EQ(R"({"type_name": "unnamed<oid:1034>", "vendor_name": "PostgreSQL"})",
std::string_view(extension_metadata.data,
static_cast<size_t>(extension_metadata.size_bytes)));
}

struct TypeTestCase {
std::string name;
std::string sql_type;
Expand Down
9 changes: 4 additions & 5 deletions c/driver/postgresql/result_helper.cc
Original file line number Diff line number Diff line change
Expand Up @@ -167,11 +167,10 @@ Status PqResultHelper::ResolveOutputTypes(PostgresTypeResolver& type_resolver,
const Oid pg_oid = PQftype(result_, i);
PostgresType pg_type;
if (type_resolver.Find(pg_oid, &pg_type, &na_error) != NANOARROW_OK) {
Status status =
Status::NotImplemented("[libpq] Column #", i + 1, " (\"", PQfname(result_, i),
"\") has unknown type code ", pg_oid);
ClearResult();
return status;
// We couldn't look up the OID.
// TODO(apache/arrow-adbc#1243): issue a warning (maybe reloading the
// connection will load the OIDs if it was a newly created type)
pg_type = PostgresType::Unnamed(pg_oid);
}

root_type.AppendChild(PQfname(result_, i), pg_type);
Expand Down

0 comments on commit 46f9f85

Please sign in to comment.