Skip to content
Open
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
3 changes: 1 addition & 2 deletions cpp/src/arrow/flight/sql/odbc/odbc_api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,6 @@ SQLRETURN SQLError(SQLHENV env, SQLHDBC conn, SQLHSTMT stmt, SQLWCHAR* sql_state

// Use the last record
SQLINTEGER diag_number;
SQLSMALLINT diag_number_length;

SQLRETURN ret = arrow::flight::sql::odbc::SQLGetDiagField(
handle_type, handle, 0, SQL_DIAG_NUMBER, &diag_number, sizeof(SQLINTEGER), 0);
Expand Down Expand Up @@ -642,7 +641,7 @@ SQLRETURN SQLGetDiagRec(SQLSMALLINT handle_type, SQLHANDLE handle, SQLSMALLINT r
}

// Convert from ODBC 1 based record number to internal diagnostics 0 indexed storage
const size_t record_index = static_cast<size_t>(rec_number - 1);
const auto record_index = static_cast<uint32_t>(rec_number - 1);
if (!diagnostics->HasRecord(record_index)) {
return SQL_NO_DATA;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ RowStatus TimestampArrayFlightSqlAccessor<TARGET_TYPE, UNIT>::MoveSingleCellImpl
? ((value + 1) / divisor) - 1
// Towards zero is already floor
: value / divisor;
tm timestamp = {0};
tm timestamp{};

GetTimeForSecondsSinceEpoch(converted_result_seconds, timestamp);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ std::string ReadDsnString(const std::string& dsn, const std::string_view& key,
}

std::string result("");
SetAttributeSQLWCHAR(buf.data(), ret * GetSqlWCharSize(), result);
SetAttributeSQLWCHAR(buf.data(), ret * static_cast<SQLINTEGER>(GetSqlWCharSize()),
result);
return result;
}

Expand Down Expand Up @@ -110,7 +111,8 @@ std::vector<std::string> ReadAllKeys(const std::string& dsn) {

std::string key("");
SQLINTEGER key_len = static_cast<SQLINTEGER>(cur - begin);
SetAttributeSQLWCHAR(begin, key_len * GetSqlWCharSize(), key);
SetAttributeSQLWCHAR(begin, key_len * static_cast<SQLINTEGER>(GetSqlWCharSize()),
key);
keys.emplace_back(key);
begin = ++cur;
}
Expand Down
20 changes: 6 additions & 14 deletions cpp/src/arrow/flight/sql/odbc/odbc_impl/encoding.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,11 @@

#pragma once

#include <boost/locale/encoding_utf.hpp>
#include <cassert>
#include <codecvt>
#include <cstring>
#include <locale>
#include <vector>
#include "arrow/flight/sql/odbc/odbc_impl/exceptions.h"
#include "arrow/util/macros.h"

#if defined(__APPLE__)
# include <atomic>
Expand Down Expand Up @@ -68,21 +66,18 @@ inline size_t wcsstrlen(const void* wcs_string) {
}
}

// GH-46576: suppress unicode warnings
ARROW_SUPPRESS_DEPRECATION_WARNING
template <typename CHAR_TYPE>
inline void Utf8ToWcs(const char* utf8_string, size_t length,
std::vector<uint8_t>* result) {
thread_local std::wstring_convert<std::codecvt_utf8<CHAR_TYPE>, CHAR_TYPE> converter;
auto string = converter.from_bytes(utf8_string, utf8_string + length);
auto string = boost::locale::conv::utf_to_utf<CHAR_TYPE>(
utf8_string, utf8_string + length, boost::locale::conv::stop);

uint32_t length_in_bytes = static_cast<uint32_t>(string.size() * GetSqlWCharSize());
const uint8_t* data = (uint8_t*)string.data();

result->reserve(length_in_bytes);
result->assign(data, data + length_in_bytes);
}
ARROW_UNSUPPRESS_DEPRECATION_WARNING

inline void Utf8ToWcs(const char* utf8_string, size_t length,
std::vector<uint8_t>* result) {
Expand All @@ -102,22 +97,19 @@ inline void Utf8ToWcs(const char* utf8_string, std::vector<uint8_t>* result) {
return Utf8ToWcs(utf8_string, strlen(utf8_string), result);
}

// GH-46576: suppress unicode warnings
ARROW_SUPPRESS_DEPRECATION_WARNING
template <typename CHAR_TYPE>
inline void WcsToUtf8(const void* wcs_string, size_t length_in_code_units,
std::vector<uint8_t>* result) {
thread_local std::wstring_convert<std::codecvt_utf8<CHAR_TYPE>, CHAR_TYPE> converter;
auto byte_string = converter.to_bytes((CHAR_TYPE*)wcs_string,
(CHAR_TYPE*)wcs_string + length_in_code_units);
const auto* begin = static_cast<const CHAR_TYPE*>(wcs_string);
auto byte_string = boost::locale::conv::utf_to_utf<char>(
begin, begin + length_in_code_units, boost::locale::conv::stop);

uint32_t length_in_bytes = static_cast<uint32_t>(byte_string.size());
const uint8_t* data = (uint8_t*)byte_string.data();

result->reserve(length_in_bytes);
result->assign(data, data + length_in_bytes);
}
ARROW_UNSUPPRESS_DEPRECATION_WARNING

inline void WcsToUtf8(const void* wcs_string, size_t length_in_code_units,
std::vector<uint8_t>* result) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -412,7 +412,6 @@ FlightSqlConnection::FlightSqlConnection(OdbcVersion odbc_version,
const std::string& driver_version)
: info_(client_options_, call_options_, sql_client_, driver_version),
diagnostics_("Apache Arrow", "Flight SQL", odbc_version),
odbc_version_(odbc_version),
closed_(true) {
attribute_[CONNECTION_DEAD] = static_cast<uint32_t>(SQL_TRUE);
attribute_[LOGIN_TIMEOUT] = static_cast<uint32_t>(0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ class FlightSqlConnection : public Connection {
std::unique_ptr<FlightSqlClient> sql_client_;
GetInfoCache info_;
Diagnostics diagnostics_;
OdbcVersion odbc_version_;
bool closed_;

void PopulateMetadataSettings(const Connection::ConnPropertyMap& conn_property_map);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ size_t FlightSqlResultSet::Move(size_t rows, size_t bind_offset, size_t bind_typ
}

for (size_t column_num = 0; column_num < columns_.size(); ++column_num) {
columns_[column_num].ResetAccessor(current_chunk_.data->column(column_num));
columns_[column_num].ResetAccessor(
current_chunk_.data->column(static_cast<int>(column_num)));
}
}

Expand All @@ -101,7 +102,8 @@ size_t FlightSqlResultSet::Move(size_t rows, size_t bind_offset, size_t bind_typ
}

for (size_t column_num = 0; column_num < columns_.size(); ++column_num) {
columns_[column_num].ResetAccessor(current_chunk_.data->column(column_num));
columns_[column_num].ResetAccessor(
current_chunk_.data->column(static_cast<int>(column_num)));
}
current_row_ = 0;
continue;
Expand Down
14 changes: 8 additions & 6 deletions cpp/src/arrow/flight/sql/odbc/odbc_impl/json_converter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ Status ConvertScalarToStringAndWrite(const ScalarT& scalar,
rapidjson::Writer<rapidjson::StringBuffer>& writer) {
ARROW_ASSIGN_OR_RAISE(auto string_scalar, scalar.CastTo(arrow::utf8()))
const auto& view = reinterpret_cast<StringScalar*>(string_scalar.get())->view();
writer.String(view.data(), view.length(), true);
writer.String(view.data(), static_cast<rapidjson::SizeType>(view.length()), true);
return Status::OK();
}

Expand All @@ -50,7 +50,7 @@ Status ConvertBinaryToBase64StringAndWrite(
size_t encoded_size = base64::encoded_size(view.length());
std::vector<char> encoded(std::max(encoded_size, static_cast<size_t>(1)));
base64::encode(&encoded[0], view.data(), view.length());
writer.String(&encoded[0], encoded_size, true);
writer.String(&encoded[0], static_cast<rapidjson::SizeType>(encoded_size), true);
return Status::OK();
}

Expand Down Expand Up @@ -164,7 +164,7 @@ class ScalarToJson : public ScalarVisitor {

Status Visit(const StringScalar& scalar) override {
const auto& view = scalar.view();
writer_.String(view.data(), view.length());
writer_.String(view.data(), static_cast<rapidjson::SizeType>(view.length()));

return Status::OK();
}
Expand All @@ -175,7 +175,7 @@ class ScalarToJson : public ScalarVisitor {

Status Visit(const LargeStringScalar& scalar) override {
const auto& view = scalar.view();
writer_.String(view.data(), view.length());
writer_.String(view.data(), static_cast<rapidjson::SizeType>(view.length()));

return Status::OK();
}
Expand Down Expand Up @@ -227,14 +227,16 @@ class ScalarToJson : public ScalarVisitor {

Status Visit(const Decimal128Scalar& scalar) override {
const auto& view = scalar.ToString();
writer_.RawValue(view.data(), view.length(), rapidjson::kNumberType);
writer_.RawValue(view.data(), static_cast<rapidjson::SizeType>(view.length()),
rapidjson::kNumberType);

return Status::OK();
}

Status Visit(const Decimal256Scalar& scalar) override {
const auto& view = scalar.ToString();
writer_.RawValue(view.data(), view.length(), rapidjson::kNumberType);
writer_.RawValue(view.data(), static_cast<rapidjson::SizeType>(view.length()),
rapidjson::kNumberType);

return Status::OK();
}
Expand Down
5 changes: 3 additions & 2 deletions cpp/src/arrow/flight/sql/odbc/odbc_impl/main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,9 @@ void TestGetColumnsV3(const std::shared_ptr<Connection>& connection) {

while (result_set->Move(1, 0, 0, nullptr) == 1) {
for (size_t i = 0; i < column_count; ++i) {
result_set->GetData(1 + i, arrow::flight::sql::odbc::CDataType_CHAR, 0, 0,
result.data(), buffer_length, &result_length);
result_set->GetData(static_cast<int>(i + 1),
arrow::flight::sql::odbc::CDataType_CHAR, 0, 0, result.data(),
buffer_length, &result_length);
std::cout << (result_length != -1 ? result.data() : "NULL") << '\t';
}

Expand Down
8 changes: 4 additions & 4 deletions cpp/src/arrow/flight/sql/odbc/odbc_impl/odbc_descriptor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,7 @@ void ODBCDescriptor::PopulateFromResultSetMetadata(ResultSetMetadata* rsmd) {
highest_one_based_bound_record_ = records_.size() + 1;

for (size_t i = 0; i < records_.size(); ++i) {
size_t one_based_index = i + 1;
int one_based_index = static_cast<int>(i + 1);
int16_t concise_type = rsmd->GetConciseType(one_based_index);

records_[i].base_column_name = rsmd->GetBaseColumnName(one_based_index);
Expand All @@ -509,10 +509,10 @@ void ODBCDescriptor::PopulateFromResultSetMetadata(ResultSetMetadata* rsmd) {
rsmd->IsAutoUnique(one_based_index) ? SQL_TRUE : SQL_FALSE;
records_[i].case_sensitive =
rsmd->IsCaseSensitive(one_based_index) ? SQL_TRUE : SQL_FALSE;
records_[i].datetime_interval_precision; // TODO - update when rsmd adds this
SQLINTEGER num_prec_radix = rsmd->GetNumPrecRadix(one_based_index);
// TODO - update datetime_interval_precision when rsmd adds this
auto num_prec_radix = static_cast<SQLINTEGER>(rsmd->GetNumPrecRadix(one_based_index));
records_[i].num_prec_radix = num_prec_radix > 0 ? num_prec_radix : 0;
records_[i].datetime_interval_code; // TODO
// TODO - update datetime_interval_code when rsmd adds this
records_[i].fixed_prec_scale =
rsmd->IsFixedPrecScale(one_based_index) ? SQL_TRUE : SQL_FALSE;
records_[i].nullable = rsmd->IsNullable(one_based_index);
Expand Down
5 changes: 3 additions & 2 deletions cpp/src/arrow/flight/sql/odbc/odbc_impl/odbc_statement.cc
Original file line number Diff line number Diff line change
Expand Up @@ -339,14 +339,15 @@ bool ODBCStatement::Fetch(size_t rows, SQLULEN* row_count_ptr,
// Note that the number of ARD records can both be more or less
// than the number of columns.
for (size_t i = 0; i < ird_->GetRecords().size(); i++) {
const int column_number = static_cast<int>(i + 1);
if (i < current_ard_->GetRecords().size() &&
current_ard_->GetRecords()[i].is_bound) {
const DescriptorRecord& ard_record = current_ard_->GetRecords()[i];
current_result_->BindColumn(i + 1, ard_record.type, ard_record.precision,
current_result_->BindColumn(column_number, ard_record.type, ard_record.precision,
ard_record.scale, ard_record.data_ptr,
GetLength(ard_record), ard_record.indicator_ptr);
} else {
current_result_->BindColumn(i + 1,
current_result_->BindColumn(column_number,
arrow::flight::sql::odbc::CDataType_CHAR
/* arbitrary type, not used */,
0, 0, nullptr, 0, nullptr);
Expand Down
Loading