Skip to content

Commit 669c374

Browse files
authored
GH-50756: [C++][FlightSQL][ODBC] Fix Clang 20 compilation on macOS 26 (#50757)
### Rationale for this change Fix Clang 20 compilation on macOS 26. ### What changes are included in this PR? Fix four kinds of compile errors mentioned in the issue GH-50756. ### Are these changes tested? Yes. ### Are there any user-facing changes? No. * GitHub Issue: #50756 Authored-by: Zehua Zou <zehuazou2000@gmail.com> Signed-off-by: David Li <li.davidm96@gmail.com>
1 parent 4dd7eb7 commit 669c374

14 files changed

Lines changed: 49 additions & 48 deletions

cpp/src/arrow/flight/sql/odbc/odbc_api.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,6 @@ SQLRETURN SQLError(SQLHENV env, SQLHDBC conn, SQLHSTMT stmt, SQLWCHAR* sql_state
279279

280280
// Use the last record
281281
SQLINTEGER diag_number;
282-
SQLSMALLINT diag_number_length;
283282

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

644643
// Convert from ODBC 1 based record number to internal diagnostics 0 indexed storage
645-
const size_t record_index = static_cast<size_t>(rec_number - 1);
644+
const auto record_index = static_cast<uint32_t>(rec_number - 1);
646645
if (!diagnostics->HasRecord(record_index)) {
647646
return SQL_NO_DATA;
648647
}

cpp/src/arrow/flight/sql/odbc/odbc_impl/accessors/timestamp_array_accessor.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ RowStatus TimestampArrayFlightSqlAccessor<TARGET_TYPE, UNIT>::MoveSingleCellImpl
9595
? ((value + 1) / divisor) - 1
9696
// Towards zero is already floor
9797
: value / divisor;
98-
tm timestamp = {0};
98+
tm timestamp{};
9999

100100
GetTimeForSecondsSinceEpoch(converted_result_seconds, timestamp);
101101

cpp/src/arrow/flight/sql/odbc/odbc_impl/config/configuration.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ std::string ReadDsnString(const std::string& dsn, const std::string_view& key,
6464
}
6565

6666
std::string result("");
67-
SetAttributeSQLWCHAR(buf.data(), ret * GetSqlWCharSize(), result);
67+
SetAttributeSQLWCHAR(buf.data(), ret * static_cast<SQLINTEGER>(GetSqlWCharSize()),
68+
result);
6869
return result;
6970
}
7071

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

111112
std::string key("");
112113
SQLINTEGER key_len = static_cast<SQLINTEGER>(cur - begin);
113-
SetAttributeSQLWCHAR(begin, key_len * GetSqlWCharSize(), key);
114+
SetAttributeSQLWCHAR(begin, key_len * static_cast<SQLINTEGER>(GetSqlWCharSize()),
115+
key);
114116
keys.emplace_back(key);
115117
begin = ++cur;
116118
}

cpp/src/arrow/flight/sql/odbc/odbc_impl/encoding.h

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818
#pragma once
1919

2020
#include <cassert>
21-
#include <codecvt>
2221
#include <cstring>
23-
#include <locale>
22+
#include <iterator>
23+
#include <string>
2424
#include <vector>
2525
#include "arrow/flight/sql/odbc/odbc_impl/exceptions.h"
26-
#include "arrow/util/macros.h"
26+
#include "arrow/vendored/utfcpp/checked.h"
2727

2828
#if defined(__APPLE__)
2929
# include <atomic>
@@ -68,21 +68,23 @@ inline size_t wcsstrlen(const void* wcs_string) {
6868
}
6969
}
7070

71-
// GH-46576: suppress unicode warnings
72-
ARROW_SUPPRESS_DEPRECATION_WARNING
7371
template <typename CHAR_TYPE>
7472
inline void Utf8ToWcs(const char* utf8_string, size_t length,
7573
std::vector<uint8_t>* result) {
76-
thread_local std::wstring_convert<std::codecvt_utf8<CHAR_TYPE>, CHAR_TYPE> converter;
77-
auto string = converter.from_bytes(utf8_string, utf8_string + length);
74+
std::basic_string<CHAR_TYPE> string;
75+
if constexpr (sizeof(CHAR_TYPE) == sizeof(char16_t)) {
76+
::utf8::utf8to16(utf8_string, utf8_string + length, std::back_inserter(string));
77+
} else {
78+
static_assert(sizeof(CHAR_TYPE) == sizeof(char32_t));
79+
::utf8::utf8to32(utf8_string, utf8_string + length, std::back_inserter(string));
80+
}
7881

79-
uint32_t length_in_bytes = static_cast<uint32_t>(string.size() * GetSqlWCharSize());
82+
auto length_in_bytes = static_cast<uint32_t>(string.size() * sizeof(CHAR_TYPE));
8083
const uint8_t* data = (uint8_t*)string.data();
8184

8285
result->reserve(length_in_bytes);
8386
result->assign(data, data + length_in_bytes);
8487
}
85-
ARROW_UNSUPPRESS_DEPRECATION_WARNING
8688

8789
inline void Utf8ToWcs(const char* utf8_string, size_t length,
8890
std::vector<uint8_t>* result) {
@@ -102,22 +104,21 @@ inline void Utf8ToWcs(const char* utf8_string, std::vector<uint8_t>* result) {
102104
return Utf8ToWcs(utf8_string, strlen(utf8_string), result);
103105
}
104106

105-
// GH-46576: suppress unicode warnings
106-
ARROW_SUPPRESS_DEPRECATION_WARNING
107107
template <typename CHAR_TYPE>
108108
inline void WcsToUtf8(const void* wcs_string, size_t length_in_code_units,
109109
std::vector<uint8_t>* result) {
110-
thread_local std::wstring_convert<std::codecvt_utf8<CHAR_TYPE>, CHAR_TYPE> converter;
111-
auto byte_string = converter.to_bytes((CHAR_TYPE*)wcs_string,
112-
(CHAR_TYPE*)wcs_string + length_in_code_units);
113-
114-
uint32_t length_in_bytes = static_cast<uint32_t>(byte_string.size());
115-
const uint8_t* data = (uint8_t*)byte_string.data();
110+
const auto* begin = static_cast<const CHAR_TYPE*>(wcs_string);
111+
112+
std::string string;
113+
if constexpr (sizeof(CHAR_TYPE) == sizeof(char16_t)) {
114+
::utf8::utf16to8(begin, begin + length_in_code_units, std::back_inserter(string));
115+
} else {
116+
static_assert(sizeof(CHAR_TYPE) == sizeof(char32_t));
117+
::utf8::utf32to8(begin, begin + length_in_code_units, std::back_inserter(string));
118+
}
116119

117-
result->reserve(length_in_bytes);
118-
result->assign(data, data + length_in_bytes);
120+
result->assign(string.begin(), string.end());
119121
}
120-
ARROW_UNSUPPRESS_DEPRECATION_WARNING
121122

122123
inline void WcsToUtf8(const void* wcs_string, size_t length_in_code_units,
123124
std::vector<uint8_t>* result) {

cpp/src/arrow/flight/sql/odbc/odbc_impl/encoding_utils.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@
2222
#include "arrow/flight/sql/odbc/odbc_impl/odbc_includes.h"
2323

2424
#include <algorithm>
25-
#include <codecvt>
2625
#include <cstring>
27-
#include <locale>
2826
#include <memory>
2927
#include <string>
3028

cpp/src/arrow/flight/sql/odbc/odbc_impl/flight_sql_connection.cc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,6 @@ FlightSqlConnection::FlightSqlConnection(OdbcVersion odbc_version,
412412
const std::string& driver_version)
413413
: info_(client_options_, call_options_, sql_client_, driver_version),
414414
diagnostics_("Apache Arrow", "Flight SQL", odbc_version),
415-
odbc_version_(odbc_version),
416415
closed_(true) {
417416
attribute_[CONNECTION_DEAD] = static_cast<uint32_t>(SQL_TRUE);
418417
attribute_[LOGIN_TIMEOUT] = static_cast<uint32_t>(0);

cpp/src/arrow/flight/sql/odbc/odbc_impl/flight_sql_connection.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ class FlightSqlConnection : public Connection {
4747
std::unique_ptr<FlightSqlClient> sql_client_;
4848
GetInfoCache info_;
4949
Diagnostics diagnostics_;
50-
OdbcVersion odbc_version_;
5150
bool closed_;
5251

5352
void PopulateMetadataSettings(const Connection::ConnPropertyMap& conn_property_map);

cpp/src/arrow/flight/sql/odbc/odbc_impl/flight_sql_result_set.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ size_t FlightSqlResultSet::Move(size_t rows, size_t bind_offset, size_t bind_typ
7676
}
7777

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

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

103104
for (size_t column_num = 0; column_num < columns_.size(); ++column_num) {
104-
columns_[column_num].ResetAccessor(current_chunk_.data->column(column_num));
105+
columns_[column_num].ResetAccessor(
106+
current_chunk_.data->column(static_cast<int>(column_num)));
105107
}
106108
current_row_ = 0;
107109
continue;

cpp/src/arrow/flight/sql/odbc/odbc_impl/json_converter.cc

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ Status ConvertScalarToStringAndWrite(const ScalarT& scalar,
3939
rapidjson::Writer<rapidjson::StringBuffer>& writer) {
4040
ARROW_ASSIGN_OR_RAISE(auto string_scalar, scalar.CastTo(arrow::utf8()))
4141
const auto& view = reinterpret_cast<StringScalar*>(string_scalar.get())->view();
42-
writer.String(view.data(), view.length(), true);
42+
writer.String(view.data(), static_cast<rapidjson::SizeType>(view.length()), true);
4343
return Status::OK();
4444
}
4545

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

@@ -164,7 +164,7 @@ class ScalarToJson : public ScalarVisitor {
164164

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

169169
return Status::OK();
170170
}
@@ -175,7 +175,7 @@ class ScalarToJson : public ScalarVisitor {
175175

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

180180
return Status::OK();
181181
}
@@ -227,14 +227,16 @@ class ScalarToJson : public ScalarVisitor {
227227

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

232233
return Status::OK();
233234
}
234235

235236
Status Visit(const Decimal256Scalar& scalar) override {
236237
const auto& view = scalar.ToString();
237-
writer_.RawValue(view.data(), view.length(), rapidjson::kNumberType);
238+
writer_.RawValue(view.data(), static_cast<rapidjson::SizeType>(view.length()),
239+
rapidjson::kNumberType);
238240

239241
return Status::OK();
240242
}

cpp/src/arrow/flight/sql/odbc/odbc_impl/main.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,9 @@ void TestGetColumnsV3(const std::shared_ptr<Connection>& connection) {
184184

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

0 commit comments

Comments
 (0)