Skip to content

Commit

Permalink
bump to adbc 16 (#116)
Browse files Browse the repository at this point in the history
Signed-off-by: Cocoa <[email protected]>
  • Loading branch information
cocoa-xu authored Jan 21, 2025
1 parent 8a4c11f commit e3dc6e6
Show file tree
Hide file tree
Showing 8 changed files with 129 additions and 79 deletions.
30 changes: 22 additions & 8 deletions 3rd_party/apache-arrow-adbc/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -760,7 +760,7 @@
- **c/driver**: Use non-objects framework components in Postgres driver (#2166)
- **c/driver/postgresql**: Use copy writer in BindStream for parameter binding (#2157)

## ADBC Libraries 16 (2025-01-08)
## ADBC Libraries 16 (2025-01-17)

### Versions

Expand All @@ -770,21 +770,35 @@
- R: 0.16.0
- Rust: 0.16.0

### Feat
### Breaking Changes

- ⚠️ **rust/driver/snowflake**: return a `Result` from `Builder::from_env` when parsing fails (#2334)

### New Features

- **csharp/src/Client**: parse custom properties from connection string (#2352)
- **csharp/src/Drivers/Apache**: add connect and query timeout options (#2312)
- **csharp/src/Drivers**: introduce Interop.FlightSql driver (#2214)
- **csharp/src/Drivers/Apache**: add connect and query timeout options (#2312)
- **csharp/src/Drivers/Apache**: make Apache driver tests inheritable (#2341)
- **rust/driver/snowflake**: return a `Result` from `Builder::from_env` when parsing fails (#2334)
- **rust/driver/snowflake**: add `adbc_snowflake` crate with Go driver wrapper (#2207)
- ⚠️ **rust/driver/snowflake**: return a `Result` from `Builder::from_env` when parsing fails (#2334)

### Fix
### Bugfixes

- **c/driver/postgresql**: don't unnecessarily COMMIT (#2412)
- **c/driver/postgresql**: return unknown OIDs as opaque (#2450)
- **ci**: ensure wheels are built with older manylinux (#2351)
- **csharp/src/Apache.Arrow.Adbc/C**: export statement_execute_schema correctly (#2409)
- **go/adbc/driver/bigquery**: set default project and dataset for new statements (#2342)
- **csharp/src/Drivers/Apache**: detect sever error when polling for response (#2355)
- **ci**: ensure wheels are built with older manylinux (#2351)
- **java/driver-manager**: typo (#2336)
- **csharp/src/Drivers/BigQuery**: Use job reference instead of job id to get job to avoid interference between different locations (#2433)
- **csharp/src/Drivers/BigQuery**: ensure BigQuery DATE type is Date32 Arrow type (#2446)
- **csharp/src/Drivers/BigQuery**: remove details to have type names match ODBC (#2431)
- **go/adbc/driver/bigquery**: set default project and dataset for new statements (#2342)
- **go/adbc/driver/snowflake**: update default values for fetch params (#2325)
- **java/driver-manager**: typo (#2336)

### Documentation Improvements

- add related work (#2333)
- change Flight SQL driver usage to executable example (#2395)
- remove crosslinking to Arrow Javadocs (#2455)
Original file line number Diff line number Diff line change
Expand Up @@ -235,18 +235,20 @@ TEST_F(SqliteFlightSqlTest, TestGarbageInput) {
ASSERT_THAT(AdbcDatabaseRelease(&database, &error), IsOkStatus(&error));
}

int Canary(const struct AdbcError*) { return 0; }

TEST_F(SqliteFlightSqlTest, AdbcDriverBackwardsCompatibility) {
// XXX: sketchy cast
auto* driver = static_cast<struct AdbcDriver*>(malloc(ADBC_DRIVER_1_0_0_SIZE));
std::memset(driver, 0, ADBC_DRIVER_1_0_0_SIZE);
struct AdbcDriver driver;
std::memset(&driver, 0, ADBC_DRIVER_1_1_0_SIZE);
driver.ErrorGetDetailCount = Canary;

ASSERT_THAT(::FlightSQLDriverInit(ADBC_VERSION_1_0_0, driver, &error),
ASSERT_THAT(::FlightSQLDriverInit(ADBC_VERSION_1_0_0, &driver, &error),
IsOkStatus(&error));

ASSERT_THAT(::FlightSQLDriverInit(424242, driver, &error),
adbc_validation::IsStatus(ADBC_STATUS_NOT_IMPLEMENTED, &error));
ASSERT_EQ(Canary, driver.ErrorGetDetailCount);

free(driver);
ASSERT_THAT(::FlightSQLDriverInit(424242, &driver, &error),
adbc_validation::IsStatus(ADBC_STATUS_NOT_IMPLEMENTED, &error));
}

class SqliteFlightSqlConnectionTest : public ::testing::Test,
Expand Down
68 changes: 47 additions & 21 deletions 3rd_party/apache-arrow-adbc/c/driver/postgresql/postgresql_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -223,18 +223,20 @@ class PostgresDatabaseTest : public ::testing::Test,
};
ADBCV_TEST_DATABASE(PostgresDatabaseTest)

int Canary(const struct AdbcError*) { return 0; }

TEST_F(PostgresDatabaseTest, AdbcDriverBackwardsCompatibility) {
// XXX: sketchy cast
auto* driver = static_cast<struct AdbcDriver*>(malloc(ADBC_DRIVER_1_0_0_SIZE));
std::memset(driver, 0, ADBC_DRIVER_1_0_0_SIZE);
struct AdbcDriver driver;
std::memset(&driver, 0, ADBC_DRIVER_1_1_0_SIZE);
driver.ErrorGetDetailCount = Canary;

ASSERT_THAT(::PostgresqlDriverInit(ADBC_VERSION_1_0_0, driver, &error),
ASSERT_THAT(::PostgresqlDriverInit(ADBC_VERSION_1_0_0, &driver, &error),
IsOkStatus(&error));

ASSERT_THAT(::PostgresqlDriverInit(424242, driver, &error),
IsStatus(ADBC_STATUS_NOT_IMPLEMENTED, &error));
ASSERT_EQ(Canary, driver.ErrorGetDetailCount);

free(driver);
ASSERT_THAT(::PostgresqlDriverInit(424242, &driver, &error),
IsStatus(ADBC_STATUS_NOT_IMPLEMENTED, &error));
}

class PostgresConnectionTest : public ::testing::Test,
Expand Down Expand Up @@ -1552,24 +1554,25 @@ TEST_F(PostgresStatementTest, BatchSizeHint) {

// Test that an ADBC 1.0.0-sized error still works
TEST_F(PostgresStatementTest, AdbcErrorBackwardsCompatibility) {
// XXX: sketchy cast
auto* error = static_cast<struct AdbcError*>(malloc(ADBC_ERROR_1_0_0_SIZE));
std::memset(error, 0, ADBC_ERROR_1_0_0_SIZE);
struct AdbcError error;
std::memset(&error, 0, ADBC_ERROR_1_1_0_SIZE);
struct AdbcDriver canary;
error.private_data = &canary;
error.private_driver = &canary;

ASSERT_THAT(AdbcStatementNew(&connection, &statement, error), IsOkStatus(error));
ASSERT_THAT(AdbcStatementNew(&connection, &statement, &error), IsOkStatus(&error));
ASSERT_THAT(
AdbcStatementSetSqlQuery(&statement, "SELECT * FROM thistabledoesnotexist", error),
IsOkStatus(error));
AdbcStatementSetSqlQuery(&statement, "SELECT * FROM thistabledoesnotexist", &error),
IsOkStatus(&error));
adbc_validation::StreamReader reader;
ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value,
&reader.rows_affected, error),
IsStatus(ADBC_STATUS_NOT_FOUND, error));

ASSERT_EQ("42P01", std::string_view(error->sqlstate, 5));
ASSERT_EQ(0, AdbcErrorGetDetailCount(error));

error->release(error);
free(error);
&reader.rows_affected, &error),
IsStatus(ADBC_STATUS_NOT_FOUND, &error));
ASSERT_EQ("42P01", std::string_view(error.sqlstate, 5));
ASSERT_EQ(0, AdbcErrorGetDetailCount(&error));
ASSERT_EQ(&canary, error.private_data);
ASSERT_EQ(&canary, error.private_driver);
error.release(&error);
}

TEST_F(PostgresStatementTest, Cancel) {
Expand Down Expand Up @@ -1693,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
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
Original file line number Diff line number Diff line change
Expand Up @@ -2817,21 +2817,23 @@ struct ADBC_EXPORT AdbcError100 {
// Test that an ADBC 1.0.0-sized error still works
void StatementTest::TestErrorCompatibility() {
static_assert(sizeof(AdbcError100) == ADBC_ERROR_1_0_0_SIZE, "Wrong size");
// XXX: sketchy cast
auto* error = reinterpret_cast<struct AdbcError*>(malloc(ADBC_ERROR_1_0_0_SIZE));
std::memset(error, 0, ADBC_ERROR_1_0_0_SIZE);
struct AdbcError error;
std::memset(&error, 0, ADBC_ERROR_1_1_0_SIZE);
struct AdbcDriver canary;
error.private_data = &canary;
error.private_driver = &canary;

ASSERT_THAT(AdbcStatementNew(&connection, &statement, error), IsOkStatus(error));
ASSERT_THAT(AdbcStatementNew(&connection, &statement, &error), IsOkStatus(&error));
ASSERT_THAT(
AdbcStatementSetSqlQuery(&statement, "SELECT * FROM thistabledoesnotexist", error),
IsOkStatus(error));
AdbcStatementSetSqlQuery(&statement, "SELECT * FROM thistabledoesnotexist", &error),
IsOkStatus(&error));
adbc_validation::StreamReader reader;
ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value,
&reader.rows_affected, error),
::testing::Not(IsOkStatus(error)));
auto* old_error = reinterpret_cast<AdbcError100*>(error);
old_error->release(old_error);
free(error);
&reader.rows_affected, &error),
::testing::Not(IsOkStatus(&error)));
ASSERT_EQ(&canary, error.private_data);
ASSERT_EQ(&canary, error.private_driver);
error.release(&error);
}

void StatementTest::TestResultInvalidation() {
Expand Down
7 changes: 7 additions & 0 deletions 3rd_party/apache-arrow-adbc/c/vendor/nanoarrow/nanoarrow.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,16 @@ namespace literals {
/// @{

/// \brief User literal operator allowing ArrowStringView construction like "str"_asv
#if !defined(__clang__) && (defined(__GNUC__) && __GNUC__ < 6)
inline ArrowStringView operator"" _asv(const char* data, std::size_t size_bytes) {
return {data, static_cast<int64_t>(size_bytes)};
}
#else
inline ArrowStringView operator""_asv(const char* data, std::size_t size_bytes) {
return {data, static_cast<int64_t>(size_bytes)};
}
#endif
// N.B. older GCC requires the space above, newer Clang forbids the space

// @}

Expand Down
Loading

0 comments on commit e3dc6e6

Please sign in to comment.