Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bump to adbc 16 #116

Merged
merged 1 commit into from
Jan 21, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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