This is an automated email from the ASF dual-hosted git repository.
lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git
The following commit(s) were added to refs/heads/main by this push:
new 2244dd8b5 chore(c): fix some warnings reported by MSVC (#2327)
2244dd8b5 is described below
commit 2244dd8b53b1256c81fe19d3df5e20cf75f7bc46
Author: David Li <[email protected]>
AuthorDate: Thu Nov 14 21:14:14 2024 -0500
chore(c): fix some warnings reported by MSVC (#2327)
Noted in
https://github.com/conda-forge/arrow-adbc-split-feedstock/pull/17
---
c/cmake_modules/AdbcDefines.cmake | 2 +
c/driver/framework/base_driver.h | 6 ++-
c/driver/framework/utility.cc | 1 -
c/driver/postgresql/connection.cc | 3 +-
c/driver/postgresql/database.cc | 8 ++--
c/driver/postgresql/result_helper.cc | 6 +--
c/driver/postgresql/result_reader.cc | 4 +-
c/driver/postgresql/statement.cc | 13 ++++---
c/driver/sqlite/sqlite.cc | 6 +--
c/driver/sqlite/statement_reader.c | 26 ++++++-------
go/adbc/drivermgr/adbc_driver_manager.cc | 63 ++++++++++++++++++++++++++------
11 files changed, 92 insertions(+), 46 deletions(-)
diff --git a/c/cmake_modules/AdbcDefines.cmake
b/c/cmake_modules/AdbcDefines.cmake
index 6c83cca54..d27cb8fb3 100644
--- a/c/cmake_modules/AdbcDefines.cmake
+++ b/c/cmake_modules/AdbcDefines.cmake
@@ -93,7 +93,9 @@ if(MSVC)
# Don't warn about padding added after members
add_compile_options(/wd4820)
add_compile_options(/wd5027)
+ add_compile_options(/wd5039)
add_compile_options(/wd5045)
+ add_compile_options(/wd5246)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang"
OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang"
OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
diff --git a/c/driver/framework/base_driver.h b/c/driver/framework/base_driver.h
index eecb506ee..f379121b6 100644
--- a/c/driver/framework/base_driver.h
+++ b/c/driver/framework/base_driver.h
@@ -116,8 +116,9 @@ class Option {
"': trailing data", value);
}
return parsed;
+ } else {
+ return status::InvalidArgument("Invalid integer value ",
this->Format());
}
- return status::InvalidArgument("Invalid integer value ",
this->Format());
},
value_);
}
@@ -129,8 +130,9 @@ class Option {
using T = std::decay_t<decltype(value)>;
if constexpr (std::is_same_v<T, std::string>) {
return value;
+ } else {
+ return status::InvalidArgument("Invalid string value ",
this->Format());
}
- return status::InvalidArgument("Invalid string value ",
this->Format());
},
value_);
}
diff --git a/c/driver/framework/utility.cc b/c/driver/framework/utility.cc
index cbcd8bb54..d281776e5 100644
--- a/c/driver/framework/utility.cc
+++ b/c/driver/framework/utility.cc
@@ -163,7 +163,6 @@ Status MakeGetInfoStream(const std::vector<InfoValue>&
infos, ArrowArrayStream*
} else {
static_assert(!sizeof(T), "info value type not implemented");
}
- return status::Ok();
},
info.value));
UNWRAP_ERRNO(Internal, ArrowArrayFinishElement(array.get()));
diff --git a/c/driver/postgresql/connection.cc
b/c/driver/postgresql/connection.cc
index b5f12ca73..0f46fff0d 100644
--- a/c/driver/postgresql/connection.cc
+++ b/c/driver/postgresql/connection.cc
@@ -300,7 +300,8 @@ class PostgresGetObjectsHelper : public
adbc::driver::GetObjectsHelper {
Column col;
col.column_name = next_column_[0].value();
- UNWRAP_RESULT(col.ordinal_position, next_column_[1].ParseInteger());
+ UNWRAP_RESULT(int64_t ordinal_position, next_column_[1].ParseInteger());
+ col.ordinal_position = static_cast<int32_t>(ordinal_position);
if (!next_column_[2].is_null) {
col.remarks = next_column_[2].value();
}
diff --git a/c/driver/postgresql/database.cc b/c/driver/postgresql/database.cc
index cdbad7535..1bd744488 100644
--- a/c/driver/postgresql/database.cc
+++ b/c/driver/postgresql/database.cc
@@ -294,7 +294,7 @@ static Status InsertPgAttributeResult(
UNWRAP_RESULT(int64_t col_oid, item[2].ParseInteger());
if (type_oid != current_type_oid && !columns.empty()) {
- resolver->InsertClass(current_type_oid, columns);
+ resolver->InsertClass(static_cast<uint32_t>(current_type_oid), columns);
columns.clear();
current_type_oid = type_oid;
}
@@ -347,12 +347,12 @@ static Status InsertPgTypeResult(const PqResultHelper&
result,
type_item.class_oid = static_cast<uint32_t>(typrelid);
type_item.base_oid = static_cast<uint32_t>(typbasetype);
- int result = resolver->Insert(type_item, nullptr);
+ int insert_result = resolver->Insert(type_item, nullptr);
// If there's an array type and the insert succeeded, add that now too
- if (result == NANOARROW_OK && typarray != 0) {
+ if (insert_result == NANOARROW_OK && typarray != 0) {
std::string array_typname = "_" + std::string(typname);
- type_item.oid = typarray;
+ type_item.oid = static_cast<uint32_t>(typarray);
type_item.typname = array_typname.c_str();
type_item.typreceive = "array_recv";
type_item.child_oid = static_cast<uint32_t>(oid);
diff --git a/c/driver/postgresql/result_helper.cc
b/c/driver/postgresql/result_helper.cc
index 6dd7527a0..48c680488 100644
--- a/c/driver/postgresql/result_helper.cc
+++ b/c/driver/postgresql/result_helper.cc
@@ -46,7 +46,7 @@ Status PqResultHelper::PrepareInternal(int n_params, const
Oid* param_oids) cons
Status PqResultHelper::Prepare() const { return PrepareInternal(0, nullptr); }
Status PqResultHelper::Prepare(const std::vector<Oid>& param_oids) const {
- return PrepareInternal(param_oids.size(), param_oids.data());
+ return PrepareInternal(static_cast<int>(param_oids.size()),
param_oids.data());
}
Status PqResultHelper::DescribePrepared() {
@@ -90,8 +90,8 @@ Status PqResultHelper::Execute(const
std::vector<std::string>& params,
}
ClearResult();
- result_ = PQexecParams(conn_, query_.c_str(), param_values.size(),
param_oids_ptr,
- param_values.data(), param_lengths.data(),
+ result_ = PQexecParams(conn_, query_.c_str(),
static_cast<int>(param_values.size()),
+ param_oids_ptr, param_values.data(),
param_lengths.data(),
param_formats.data(),
static_cast<int>(output_format_));
}
diff --git a/c/driver/postgresql/result_reader.cc
b/c/driver/postgresql/result_reader.cc
index 464bad74a..61d17bb03 100644
--- a/c/driver/postgresql/result_reader.cc
+++ b/c/driver/postgresql/result_reader.cc
@@ -100,8 +100,8 @@ int PqResultArrayReader::GetNext(struct ArrowArray* out) {
item.size_bytes = pg_item.len;
}
- NANOARROW_RETURN_NOT_OK(
- field_readers_[i]->Read(&item, item.size_bytes, tmp->children[i],
&na_error_));
+ NANOARROW_RETURN_NOT_OK(field_readers_[i]->Read(
+ &item, static_cast<int32_t>(item.size_bytes), tmp->children[i],
&na_error_));
}
}
diff --git a/c/driver/postgresql/statement.cc b/c/driver/postgresql/statement.cc
index 129ddebff..9518e378e 100644
--- a/c/driver/postgresql/statement.cc
+++ b/c/driver/postgresql/statement.cc
@@ -546,22 +546,23 @@ AdbcStatusCode PostgresStatement::ExecuteSchema(struct
ArrowSchema* schema,
PqResultHelper helper(connection_->conn(), query_);
if (bind_.release) {
- nanoarrow::UniqueSchema schema;
+ nanoarrow::UniqueSchema param_schema;
struct ArrowError na_error;
ArrowErrorInit(&na_error);
- CHECK_NA_DETAIL(INTERNAL, ArrowArrayStreamGetSchema(&bind_, schema.get(),
&na_error),
+ CHECK_NA_DETAIL(INTERNAL,
+ ArrowArrayStreamGetSchema(&bind_, param_schema.get(),
&na_error),
&na_error, error);
- if (std::string(schema->format) != "+s") {
+ if (std::string(param_schema->format) != "+s") {
SetError(error, "%s", "[libpq] Bind parameters must have type STRUCT");
return ADBC_STATUS_INVALID_STATE;
}
- std::vector<Oid> param_oids(schema->n_children);
- for (int64_t i = 0; i < schema->n_children; i++) {
+ std::vector<Oid> param_oids(param_schema->n_children);
+ for (int64_t i = 0; i < param_schema->n_children; i++) {
PostgresType pg_type;
CHECK_NA_DETAIL(INTERNAL,
- PostgresType::FromSchema(*type_resolver_,
schema->children[i],
+ PostgresType::FromSchema(*type_resolver_,
param_schema->children[i],
&pg_type, &na_error),
&na_error, error);
param_oids[i] = pg_type.oid();
diff --git a/c/driver/sqlite/sqlite.cc b/c/driver/sqlite/sqlite.cc
index a5186d00b..6348b5ce3 100644
--- a/c/driver/sqlite/sqlite.cc
+++ b/c/driver/sqlite/sqlite.cc
@@ -150,7 +150,7 @@ class SqliteQuery {
return Close(rc);
}
- Status Close(int rc) {
+ Status Close(int last_rc) {
if (stmt_) {
int rc = sqlite3_finalize(stmt_);
stmt_ = nullptr;
@@ -158,7 +158,7 @@ class SqliteQuery {
return status::fmt::Internal("failed to execute: {}\nquery was: {}",
sqlite3_errmsg(conn_), query_);
}
- } else if (rc != SQLITE_OK) {
+ } else if (last_rc != SQLITE_OK) {
return status::fmt::Internal("failed to execute: {}\nquery was: {}",
sqlite3_errmsg(conn_), query_);
}
@@ -192,7 +192,7 @@ class SqliteQuery {
UNWRAP_RESULT(bool has_row, q.Next());
if (!has_row) break;
- int rc = std::forward<RowFunc>(row_func)(q.stmt_);
+ rc = std::forward<RowFunc>(row_func)(q.stmt_);
if (rc != SQLITE_OK) break;
}
return q.Close();
diff --git a/c/driver/sqlite/statement_reader.c
b/c/driver/sqlite/statement_reader.c
index f73151673..69f90ebd6 100644
--- a/c/driver/sqlite/statement_reader.c
+++ b/c/driver/sqlite/statement_reader.c
@@ -334,8 +334,8 @@ AdbcStatusCode AdbcSqliteBinderBindNext(struct
AdbcSqliteBinder* binder, sqlite3
case NANOARROW_TYPE_BINARY_VIEW: {
struct ArrowBufferView value =
ArrowArrayViewGetBytesUnsafe(binder->batch.children[col],
binder->next_row);
- status = sqlite3_bind_blob(stmt, col + 1, value.data.as_char,
value.size_bytes,
- SQLITE_STATIC);
+ status = sqlite3_bind_blob(stmt, col + 1, value.data.as_char,
+ (int)value.size_bytes, SQLITE_STATIC);
break;
}
case NANOARROW_TYPE_BOOL:
@@ -377,8 +377,8 @@ AdbcStatusCode AdbcSqliteBinderBindNext(struct
AdbcSqliteBinder* binder, sqlite3
case NANOARROW_TYPE_STRING_VIEW: {
struct ArrowBufferView value =
ArrowArrayViewGetBytesUnsafe(binder->batch.children[col],
binder->next_row);
- status = sqlite3_bind_text(stmt, col + 1, value.data.as_char,
value.size_bytes,
- SQLITE_STATIC);
+ status = sqlite3_bind_text(stmt, col + 1, value.data.as_char,
+ (int)value.size_bytes, SQLITE_STATIC);
break;
}
case NANOARROW_TYPE_DICTIONARY: {
@@ -391,7 +391,7 @@ AdbcStatusCode AdbcSqliteBinderBindNext(struct
AdbcSqliteBinder* binder, sqlite3
struct ArrowBufferView value = ArrowArrayViewGetBytesUnsafe(
binder->batch.children[col]->dictionary, value_index);
status = sqlite3_bind_text(stmt, col + 1, value.data.as_char,
- value.size_bytes, SQLITE_STATIC);
+ (int)value.size_bytes, SQLITE_STATIC);
}
break;
}
@@ -411,16 +411,16 @@ AdbcStatusCode AdbcSqliteBinderBindNext(struct
AdbcSqliteBinder* binder, sqlite3
RAISE_ADBC(ArrowDate32ToIsoString((int32_t)value, &tsstr, error));
// SQLITE_TRANSIENT ensures the value is copied during bind
- status =
- sqlite3_bind_text(stmt, col + 1, tsstr, strlen(tsstr),
SQLITE_TRANSIENT);
+ status = sqlite3_bind_text(stmt, col + 1, tsstr, (int)strlen(tsstr),
+ SQLITE_TRANSIENT);
free(tsstr);
break;
}
case NANOARROW_TYPE_TIMESTAMP: {
struct ArrowSchemaView bind_schema_view;
- RAISE_ADBC(ArrowSchemaViewInit(&bind_schema_view,
binder->schema.children[col],
- &arrow_error));
+ RAISE_NA(ArrowSchemaViewInit(&bind_schema_view,
binder->schema.children[col],
+ &arrow_error));
enum ArrowTimeUnit unit = bind_schema_view.time_unit;
int64_t value =
ArrowArrayViewGetIntUnsafe(binder->batch.children[col],
binder->next_row);
@@ -429,8 +429,8 @@ AdbcStatusCode AdbcSqliteBinderBindNext(struct
AdbcSqliteBinder* binder, sqlite3
RAISE_ADBC(ArrowTimestampToIsoString(value, unit, &tsstr, error));
// SQLITE_TRANSIENT ensures the value is copied during bind
- status =
- sqlite3_bind_text(stmt, col + 1, tsstr, strlen(tsstr),
SQLITE_TRANSIENT);
+ status = sqlite3_bind_text(stmt, col + 1, tsstr, (int)strlen(tsstr),
+ SQLITE_TRANSIENT);
free((char*)tsstr);
break;
}
@@ -844,7 +844,7 @@ AdbcStatusCode StatementReaderUpcastInt64ToDouble(struct
ArrowBuffer* data,
size_t num_elements = data->size_bytes / sizeof(int64_t);
const int64_t* elements = (const int64_t*)data->data;
for (size_t i = 0; i < num_elements; i++) {
- double value = elements[i];
+ double value = (double)elements[i];
ArrowBufferAppendUnsafe(&doubles, &value, sizeof(double));
}
ArrowBufferReset(data);
@@ -1133,7 +1133,7 @@ AdbcStatusCode AdbcSqliteExportReader(sqlite3* db,
sqlite3_stmt* stmt,
memset(reader, 0, sizeof(struct StatementReader));
reader->db = db;
reader->stmt = stmt;
- reader->batch_size = batch_size;
+ reader->batch_size = (int)batch_size;
stream->private_data = reader;
stream->release = StatementReaderRelease;
diff --git a/go/adbc/drivermgr/adbc_driver_manager.cc
b/go/adbc/drivermgr/adbc_driver_manager.cc
index 44c3d9f98..0ce173a88 100644
--- a/go/adbc/drivermgr/adbc_driver_manager.cc
+++ b/go/adbc/drivermgr/adbc_driver_manager.cc
@@ -84,6 +84,36 @@ void SetError(struct AdbcError* error, const std::string&
message) {
error->release = ReleaseError;
}
+// Copies src_error into error and releases src_error
+void SetError(struct AdbcError* error, struct AdbcError* src_error) {
+ if (!error) return;
+ if (error->release) error->release(error);
+
+ if (src_error->message) {
+ size_t message_size = strlen(src_error->message);
+ error->message = new char[message_size];
+ std::memcpy(error->message, src_error->message, message_size);
+ error->message[message_size] = '\0';
+ } else {
+ error->message = nullptr;
+ }
+
+ error->release = ReleaseError;
+ if (src_error->release) {
+ src_error->release(src_error);
+ }
+}
+
+struct OwnedError {
+ struct AdbcError error = ADBC_ERROR_INIT;
+
+ ~OwnedError() {
+ if (error.release) {
+ error.release(&error);
+ }
+ }
+};
+
// Driver state
/// A driver DLL.
@@ -666,7 +696,7 @@ std::string AdbcDriverManagerDefaultEntrypoint(const
std::string& driver) {
int AdbcErrorGetDetailCount(const struct AdbcError* error) {
if (error->vendor_code == ADBC_ERROR_VENDOR_CODE_PRIVATE_DATA &&
error->private_data &&
- error->private_driver) {
+ error->private_driver && error->private_driver->ErrorGetDetailCount) {
return error->private_driver->ErrorGetDetailCount(error);
}
return 0;
@@ -674,7 +704,7 @@ int AdbcErrorGetDetailCount(const struct AdbcError* error) {
struct AdbcErrorDetail AdbcErrorGetDetail(const struct AdbcError* error, int
index) {
if (error->vendor_code == ADBC_ERROR_VENDOR_CODE_PRIVATE_DATA &&
error->private_data &&
- error->private_driver) {
+ error->private_driver && error->private_driver->ErrorGetDetail) {
return error->private_driver->ErrorGetDetail(error, index);
}
return {nullptr, nullptr, 0};
@@ -900,6 +930,7 @@ AdbcStatusCode AdbcDatabaseInit(struct AdbcDatabase*
database, struct AdbcError*
status = AdbcLoadDriver(args->driver.c_str(), nullptr, ADBC_VERSION_1_1_0,
database->private_driver, error);
}
+
if (status != ADBC_STATUS_OK) {
// Restore private_data so it will be released by AdbcDatabaseRelease
database->private_data = args;
@@ -910,10 +941,18 @@ AdbcStatusCode AdbcDatabaseInit(struct AdbcDatabase*
database, struct AdbcError*
database->private_driver = nullptr;
return status;
}
- status = database->private_driver->DatabaseNew(database, error);
+
+ // Errors that occur during AdbcDatabaseXXX() refer to the driver via
+ // the private_driver member; however, after we return we have released
+ // the driver and inspecting the error might segfault. Here, we scope
+ // the driver-produced error to this function and make a copy if necessary.
+ OwnedError driver_error;
+
+ status = database->private_driver->DatabaseNew(database,
&driver_error.error);
if (status != ADBC_STATUS_OK) {
if (database->private_driver->release) {
- database->private_driver->release(database->private_driver, error);
+ SetError(error, &driver_error.error);
+ database->private_driver->release(database->private_driver, nullptr);
}
delete database->private_driver;
database->private_driver = nullptr;
@@ -927,33 +966,34 @@ AdbcStatusCode AdbcDatabaseInit(struct AdbcDatabase*
database, struct AdbcError*
INIT_ERROR(error, database);
for (const auto& option : options) {
- status = database->private_driver->DatabaseSetOption(database,
option.first.c_str(),
-
option.second.c_str(), error);
+ status = database->private_driver->DatabaseSetOption(
+ database, option.first.c_str(), option.second.c_str(),
&driver_error.error);
if (status != ADBC_STATUS_OK) break;
}
for (const auto& option : bytes_options) {
status = database->private_driver->DatabaseSetOptionBytes(
database, option.first.c_str(),
reinterpret_cast<const uint8_t*>(option.second.data()),
option.second.size(),
- error);
+ &driver_error.error);
if (status != ADBC_STATUS_OK) break;
}
for (const auto& option : int_options) {
status = database->private_driver->DatabaseSetOptionInt(
- database, option.first.c_str(), option.second, error);
+ database, option.first.c_str(), option.second, &driver_error.error);
if (status != ADBC_STATUS_OK) break;
}
for (const auto& option : double_options) {
status = database->private_driver->DatabaseSetOptionDouble(
- database, option.first.c_str(), option.second, error);
+ database, option.first.c_str(), option.second, &driver_error.error);
if (status != ADBC_STATUS_OK) break;
}
if (status != ADBC_STATUS_OK) {
// Release the database
- std::ignore = database->private_driver->DatabaseRelease(database, error);
+ std::ignore = database->private_driver->DatabaseRelease(database, nullptr);
if (database->private_driver->release) {
- database->private_driver->release(database->private_driver, error);
+ SetError(error, &driver_error.error);
+ database->private_driver->release(database->private_driver, nullptr);
}
delete database->private_driver;
database->private_driver = nullptr;
@@ -962,6 +1002,7 @@ AdbcStatusCode AdbcDatabaseInit(struct AdbcDatabase*
database, struct AdbcError*
database->private_data = nullptr;
return status;
}
+
return database->private_driver->DatabaseInit(database, error);
}