This is an automated email from the ASF dual-hosted git repository.
kou pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/master by this push:
new 9c93f82a06 ARROW-16902: [C++][FlightRPC] Fix DLL linkage in Flight SQL
(#13434)
9c93f82a06 is described below
commit 9c93f82a06ecae4d0e51f64b25fc63d32701d734
Author: David Li <[email protected]>
AuthorDate: Thu Jul 7 17:03:33 2022 -0400
ARROW-16902: [C++][FlightRPC] Fix DLL linkage in Flight SQL (#13434)
Also, enable Flight SQL in Windows CI builds.
Authored-by: David Li <[email protected]>
Signed-off-by: Sutou Kouhei <[email protected]>
---
.github/workflows/cpp.yml | 1 +
appveyor.yml | 2 +
ci/appveyor-cpp-build.bat | 1 +
cpp/cmake_modules/BuildUtils.cmake | 1 +
cpp/src/arrow/flight/sql/CMakeLists.txt | 31 +++++++++++---
cpp/src/arrow/flight/sql/client.cc | 5 ++-
cpp/src/arrow/flight/sql/client.h | 5 ++-
cpp/src/arrow/flight/sql/client_test.cc | 5 ++-
cpp/src/arrow/flight/sql/column_metadata.h | 5 ++-
cpp/src/arrow/flight/sql/example/sqlite_server.cc | 20 ++++-----
.../sql/example/sqlite_statement_batch_reader.cc | 21 +++++-----
cpp/src/arrow/flight/sql/protocol_internal.cc | 23 +++++++++++
cpp/src/arrow/flight/sql/protocol_internal.h | 26 ++++++++++++
cpp/src/arrow/flight/sql/server.cc | 5 ++-
cpp/src/arrow/flight/sql/server.h | 38 +++++++++--------
cpp/src/arrow/flight/sql/server_test.cc | 1 +
cpp/src/arrow/flight/sql/sql_info_internal.h | 3 +-
cpp/src/arrow/flight/sql/types.h | 5 ++-
cpp/src/arrow/flight/sql/visibility.h | 48 ++++++++++++++++++++++
cpp/src/arrow/symbols.map | 1 +
docs/source/developers/cpp/windows.rst | 16 ++++++--
21 files changed, 205 insertions(+), 58 deletions(-)
diff --git a/.github/workflows/cpp.yml b/.github/workflows/cpp.yml
index 4b44ec01f7..a7b1e2a7fc 100644
--- a/.github/workflows/cpp.yml
+++ b/.github/workflows/cpp.yml
@@ -281,6 +281,7 @@ jobs:
ARROW_BUILD_TYPE: release
ARROW_DATASET: ON
ARROW_FLIGHT: ON
+ ARROW_FLIGHT_SQL: ON
ARROW_GANDIVA: ON
ARROW_GCS: ON
ARROW_HDFS: OFF
diff --git a/appveyor.yml b/appveyor.yml
index 2699e479b7..03a3597c9b 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -46,6 +46,7 @@ environment:
CLCACHE_COMPRESS: 1
CLCACHE_COMPRESSLEVEL: 6
ARROW_BUILD_FLIGHT: "OFF"
+ ARROW_BUILD_FLIGHT_SQL: "OFF"
ARROW_BUILD_GANDIVA: "OFF"
ARROW_LLVM_VERSION: "7.0.*"
ARROW_S3: "OFF"
@@ -60,6 +61,7 @@ environment:
ARROW_GCS: "ON"
ARROW_S3: "ON"
ARROW_BUILD_FLIGHT: "ON"
+ ARROW_BUILD_FLIGHT_SQL: "ON"
ARROW_BUILD_GANDIVA: "ON"
- JOB: "Build_Debug"
GENERATOR: Ninja
diff --git a/ci/appveyor-cpp-build.bat b/ci/appveyor-cpp-build.bat
index e9441c63e2..e7fea480b4 100644
--- a/ci/appveyor-cpp-build.bat
+++ b/ci/appveyor-cpp-build.bat
@@ -103,6 +103,7 @@ cmake -G "%GENERATOR%" %CMAKE_ARGS% ^
-DARROW_DATASET=ON ^
-DARROW_ENABLE_TIMING_TESTS=OFF ^
-DARROW_FLIGHT=%ARROW_BUILD_FLIGHT% ^
+ -DARROW_FLIGHT_SQL=%ARROW_BUILD_FLIGHT_SQL% ^
-DARROW_GANDIVA=%ARROW_BUILD_GANDIVA% ^
-DARROW_MIMALLOC=ON ^
-DARROW_PARQUET=ON ^
diff --git a/cpp/cmake_modules/BuildUtils.cmake
b/cpp/cmake_modules/BuildUtils.cmake
index 5ce65ee51d..888ca19af5 100644
--- a/cpp/cmake_modules/BuildUtils.cmake
+++ b/cpp/cmake_modules/BuildUtils.cmake
@@ -386,6 +386,7 @@ function(ADD_ARROW_LIB LIB_NAME)
if(WIN32)
target_compile_definitions(${LIB_NAME}_static PUBLIC ARROW_STATIC)
target_compile_definitions(${LIB_NAME}_static PUBLIC ARROW_FLIGHT_STATIC)
+ target_compile_definitions(${LIB_NAME}_static PUBLIC
ARROW_FLIGHT_SQL_STATIC)
endif()
set_target_properties(${LIB_NAME}_static
diff --git a/cpp/src/arrow/flight/sql/CMakeLists.txt
b/cpp/src/arrow/flight/sql/CMakeLists.txt
index 1f5a72b50d..0c789fd71c 100644
--- a/cpp/src/arrow/flight/sql/CMakeLists.txt
+++ b/cpp/src/arrow/flight/sql/CMakeLists.txt
@@ -29,11 +29,11 @@ set(PROTO_DEPENDS ${FLIGHT_SQL_PROTO}
${ARROW_PROTOBUF_LIBPROTOBUF})
add_custom_command(OUTPUT ${FLIGHT_SQL_GENERATED_PROTO_FILES}
COMMAND ${ARROW_PROTOBUF_PROTOC}
"-I${FLIGHT_SQL_PROTO_PATH}"
- "--cpp_out=${CMAKE_CURRENT_BINARY_DIR}"
"${FLIGHT_SQL_PROTO}"
+
"--cpp_out=dllexport_decl=ARROW_FLIGHT_SQL_EXPORT:${CMAKE_CURRENT_BINARY_DIR}"
+ "${FLIGHT_SQL_PROTO}"
DEPENDS ${PROTO_DEPENDS})
set_source_files_properties(${FLIGHT_SQL_GENERATED_PROTO_FILES} PROPERTIES
GENERATED TRUE)
-
add_custom_target(flight_sql_protobuf_gen ALL DEPENDS
${FLIGHT_SQL_GENERATED_PROTO_FILES})
set(ARROW_FLIGHT_SQL_SRCS
@@ -41,7 +41,7 @@ set(ARROW_FLIGHT_SQL_SRCS
sql_info_internal.cc
column_metadata.cc
client.cc
- "${CMAKE_CURRENT_BINARY_DIR}/FlightSql.pb.cc")
+ protocol_internal.cc)
add_arrow_lib(arrow_flight_sql
CMAKE_PACKAGE_NAME
@@ -63,6 +63,14 @@ add_arrow_lib(arrow_flight_sql
PRIVATE_INCLUDES
"${Protobuf_INCLUDE_DIRS}")
+if(MSVC)
+ # Suppress warnings caused by Protobuf (casts)
+ set_source_files_properties(protocol_internal.cc PROPERTIES COMPILE_FLAGS
"/wd4267")
+endif()
+foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_LIBRARIES})
+ target_compile_definitions(${LIB_TARGET} PRIVATE ARROW_FLIGHT_SQL_EXPORTING)
+endforeach()
+
if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static" AND ARROW_BUILD_STATIC)
set(ARROW_FLIGHT_SQL_TEST_LINK_LIBS arrow_flight_sql_static)
else()
@@ -81,11 +89,18 @@ if(ARROW_BUILD_TESTS OR ARROW_BUILD_EXAMPLES)
example/sqlite_statement_batch_reader.cc
example/sqlite_server.cc
example/sqlite_tables_schema_batch_reader.cc)
+ set(ARROW_FLIGHT_SQL_TEST_SRCS server_test.cc)
+ if(NOT MSVC AND NOT MINGW)
+ # ARROW-16902: getting Protobuf generated code to have all the
+ # proper dllexport/dllimport declarations is difficult, since
+ # protoc does not insert them everywhere needed to satisfy both
+ # MinGW and MSVC, and the Protobuf team recommends against it
+ list(APPEND ARROW_FLIGHT_SQL_TEST_SRCS client_test.cc)
+ endif()
add_arrow_test(flight_sql_test
SOURCES
- client_test.cc
- server_test.cc
+ ${ARROW_FLIGHT_SQL_TEST_SRCS}
${ARROW_FLIGHT_SQL_TEST_SERVER_SRCS}
STATIC_LINK_LIBS
${ARROW_FLIGHT_SQL_TEST_LINK_LIBS}
@@ -102,4 +117,10 @@ if(ARROW_BUILD_TESTS OR ARROW_BUILD_EXAMPLES)
add_executable(flight-sql-test-app test_app_cli.cc)
target_link_libraries(flight-sql-test-app PRIVATE
${ARROW_FLIGHT_SQL_TEST_LINK_LIBS}
${GFLAGS_LIBRARIES})
+
+ if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static" AND ARROW_BUILD_STATIC)
+ target_compile_definitions(flight_sql_test
+ flight-sql-test-server flight-sql-test-app
+ PUBLIC ARROW_FLIGHT_STATIC
ARROW_FLIGHT_SQL_STATIC)
+ endif()
endif()
diff --git a/cpp/src/arrow/flight/sql/client.cc
b/cpp/src/arrow/flight/sql/client.cc
index 89cfb3aad0..10ff1eea6f 100644
--- a/cpp/src/arrow/flight/sql/client.cc
+++ b/cpp/src/arrow/flight/sql/client.cc
@@ -15,12 +15,15 @@
// specific language governing permissions and limitations
// under the License.
+// Platform-specific defines
+#include "arrow/flight/platform.h"
+
#include "arrow/flight/sql/client.h"
#include <google/protobuf/any.pb.h>
#include "arrow/buffer.h"
-#include "arrow/flight/sql/FlightSql.pb.h"
+#include "arrow/flight/sql/protocol_internal.h"
#include "arrow/flight/types.h"
#include "arrow/io/memory.h"
#include "arrow/ipc/reader.h"
diff --git a/cpp/src/arrow/flight/sql/client.h
b/cpp/src/arrow/flight/sql/client.h
index 78c162e4cd..7c8cb640e8 100644
--- a/cpp/src/arrow/flight/sql/client.h
+++ b/cpp/src/arrow/flight/sql/client.h
@@ -22,6 +22,7 @@
#include "arrow/flight/client.h"
#include "arrow/flight/sql/types.h"
+#include "arrow/flight/sql/visibility.h"
#include "arrow/flight/types.h"
#include "arrow/result.h"
#include "arrow/status.h"
@@ -35,7 +36,7 @@ class PreparedStatement;
/// \brief Flight client with Flight SQL semantics.
///
/// Wraps a Flight client to provide the Flight SQL RPC calls.
-class ARROW_EXPORT FlightSqlClient {
+class ARROW_FLIGHT_SQL_EXPORT FlightSqlClient {
friend class PreparedStatement;
private:
@@ -202,7 +203,7 @@ class ARROW_EXPORT FlightSqlClient {
};
/// \brief A prepared statement that can be executed.
-class ARROW_EXPORT PreparedStatement {
+class ARROW_FLIGHT_SQL_EXPORT PreparedStatement {
public:
/// \brief Create a new prepared statement. However, applications
/// should generally use FlightSqlClient::Prepare.
diff --git a/cpp/src/arrow/flight/sql/client_test.cc
b/cpp/src/arrow/flight/sql/client_test.cc
index 1cfce2520f..b9eeda76b0 100644
--- a/cpp/src/arrow/flight/sql/client_test.cc
+++ b/cpp/src/arrow/flight/sql/client_test.cc
@@ -15,6 +15,9 @@
// specific language governing permissions and limitations
// under the License.
+// Platform-specific defines
+#include "arrow/flight/platform.h"
+
#include "arrow/flight/client.h"
#include <gmock/gmock.h>
@@ -24,8 +27,8 @@
#include <utility>
#include "arrow/buffer.h"
-#include "arrow/flight/sql/FlightSql.pb.h"
#include "arrow/flight/sql/api.h"
+#include "arrow/flight/sql/protocol_internal.h"
#include "arrow/testing/gtest_util.h"
namespace pb = arrow::flight::protocol;
diff --git a/cpp/src/arrow/flight/sql/column_metadata.h
b/cpp/src/arrow/flight/sql/column_metadata.h
index 08e7c64aee..15b139ec58 100644
--- a/cpp/src/arrow/flight/sql/column_metadata.h
+++ b/cpp/src/arrow/flight/sql/column_metadata.h
@@ -19,6 +19,7 @@
#include <string>
+#include "arrow/flight/sql/visibility.h"
#include "arrow/util/key_value_metadata.h"
namespace arrow {
@@ -26,7 +27,7 @@ namespace flight {
namespace sql {
/// \brief Helper class to set column metadata.
-class ColumnMetadata {
+class ARROW_FLIGHT_SQL_EXPORT ColumnMetadata {
private:
std::shared_ptr<const arrow::KeyValueMetadata> metadata_map_;
@@ -114,7 +115,7 @@ class ColumnMetadata {
const std::shared_ptr<const arrow::KeyValueMetadata>& metadata_map() const;
/// \brief A builder class to construct the ColumnMetadata object.
- class ColumnMetadataBuilder {
+ class ARROW_FLIGHT_SQL_EXPORT ColumnMetadataBuilder {
public:
friend class ColumnMetadata;
diff --git a/cpp/src/arrow/flight/sql/example/sqlite_server.cc
b/cpp/src/arrow/flight/sql/example/sqlite_server.cc
index 2105eb5be0..35fa05468b 100644
--- a/cpp/src/arrow/flight/sql/example/sqlite_server.cc
+++ b/cpp/src/arrow/flight/sql/example/sqlite_server.cc
@@ -249,9 +249,11 @@ class SQLiteFlightSqlServer::Impl {
std::string GenerateRandomString() {
uint32_t length = 16;
- std::uniform_int_distribution<char> dist('0', 'z');
+ // MSVC doesn't support char types here
+ std::uniform_int_distribution<uint16_t> dist(static_cast<uint16_t>('0'),
+ static_cast<uint16_t>('z'));
std::string ret(length, 0);
- auto get_random_char = [&]() { return dist(gen_); };
+ auto get_random_char = [&]() { return static_cast<char>(dist(gen_)); };
std::generate_n(ret.begin(), length, get_random_char);
return ret;
}
@@ -384,14 +386,14 @@ class SQLiteFlightSqlServer::Impl {
const ActionCreatePreparedStatementRequest& request) {
std::shared_ptr<SqliteStatement> statement;
ARROW_ASSIGN_OR_RAISE(statement, SqliteStatement::Create(db_,
request.query));
- const std::string handle = GenerateRandomString();
+ std::string handle = GenerateRandomString();
prepared_statements_[handle] = statement;
ARROW_ASSIGN_OR_RAISE(auto dataset_schema, statement->GetSchema());
sqlite3_stmt* stmt = statement->GetSqlite3Stmt();
const int parameter_count = sqlite3_bind_parameter_count(stmt);
- std::vector<std::shared_ptr<arrow::Field>> parameter_fields;
+ FieldVector parameter_fields;
parameter_fields.reserve(parameter_count);
// As SQLite doesn't know the parameter types before executing the query,
the
@@ -410,13 +412,9 @@ class SQLiteFlightSqlServer::Impl {
parameter_fields.push_back(field(parameter_name, dense_union_type));
}
- const std::shared_ptr<Schema>& parameter_schema =
arrow::schema(parameter_fields);
-
- ActionCreatePreparedStatementResult result{.dataset_schema =
dataset_schema,
- .parameter_schema =
parameter_schema,
- .prepared_statement_handle =
handle};
-
- return result;
+ std::shared_ptr<Schema> parameter_schema = arrow::schema(parameter_fields);
+ return ActionCreatePreparedStatementResult{
+ std::move(dataset_schema), std::move(parameter_schema),
std::move(handle)};
}
Status ClosePreparedStatement(const ServerCallContext& context,
diff --git a/cpp/src/arrow/flight/sql/example/sqlite_statement_batch_reader.cc
b/cpp/src/arrow/flight/sql/example/sqlite_statement_batch_reader.cc
index e31d6173ee..c247eb6287 100644
--- a/cpp/src/arrow/flight/sql/example/sqlite_statement_batch_reader.cc
+++ b/cpp/src/arrow/flight/sql/example/sqlite_statement_batch_reader.cc
@@ -63,16 +63,17 @@
break; \
}
-#define FLOAT_BUILDER_CASE(TYPE_CLASS, STMT, COLUMN) \
- case TYPE_CLASS##Type::type_id: { \
- auto builder = reinterpret_cast<TYPE_CLASS##Builder*>(array_builder); \
- if (sqlite3_column_type(stmt_, i) == SQLITE_NULL) { \
- ARROW_RETURN_NOT_OK(builder->AppendNull()); \
- break; \
- } \
- const double value = sqlite3_column_double(STMT, COLUMN); \
- ARROW_RETURN_NOT_OK(builder->Append(value)); \
- break; \
+#define FLOAT_BUILDER_CASE(TYPE_CLASS, STMT, COLUMN) \
+ case TYPE_CLASS##Type::type_id: { \
+ auto builder = reinterpret_cast<TYPE_CLASS##Builder*>(array_builder); \
+ if (sqlite3_column_type(stmt_, i) == SQLITE_NULL) { \
+ ARROW_RETURN_NOT_OK(builder->AppendNull()); \
+ break; \
+ } \
+ const double value = sqlite3_column_double(STMT, COLUMN); \
+ ARROW_RETURN_NOT_OK( \
+ builder->Append(static_cast<const TYPE_CLASS##Type::c_type>(value))); \
+ break; \
}
namespace arrow {
diff --git a/cpp/src/arrow/flight/sql/protocol_internal.cc
b/cpp/src/arrow/flight/sql/protocol_internal.cc
new file mode 100644
index 0000000000..0d5e3c4c60
--- /dev/null
+++ b/cpp/src/arrow/flight/sql/protocol_internal.cc
@@ -0,0 +1,23 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+
+#include "arrow/flight/sql/protocol_internal.h"
+
+// NOTE(lidavidm): Normally this is forbidden, but on Windows to get
+// the dllexport/dllimport macro in the right places, we need to
+// ensure our header gets included (and Protobuf will not insert the
+// include for you)
+#include "arrow/flight/sql/FlightSql.pb.cc" // NOLINT
diff --git a/cpp/src/arrow/flight/sql/protocol_internal.h
b/cpp/src/arrow/flight/sql/protocol_internal.h
new file mode 100644
index 0000000000..ce50ad2f61
--- /dev/null
+++ b/cpp/src/arrow/flight/sql/protocol_internal.h
@@ -0,0 +1,26 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+
+#pragma once
+
+// This addresses platform-specific defines, e.g. on Windows
+#include "arrow/flight/platform.h" // IWYU pragma: keep
+
+// This header holds the Flight SQL definitions.
+
+#include "arrow/flight/sql/visibility.h"
+
+#include "arrow/flight/sql/FlightSql.pb.h" // IWYU pragma: export
diff --git a/cpp/src/arrow/flight/sql/server.cc
b/cpp/src/arrow/flight/sql/server.cc
index 5ad1be466e..0ebe647ba1 100644
--- a/cpp/src/arrow/flight/sql/server.cc
+++ b/cpp/src/arrow/flight/sql/server.cc
@@ -18,13 +18,16 @@
// Interfaces to use for defining Flight RPC servers. API should be considered
// experimental for now
+// Platform-specific defines
+#include "arrow/flight/platform.h"
+
#include "arrow/flight/sql/server.h"
#include <google/protobuf/any.pb.h>
#include "arrow/buffer.h"
#include "arrow/builder.h"
-#include "arrow/flight/sql/FlightSql.pb.h"
+#include "arrow/flight/sql/protocol_internal.h"
#include "arrow/flight/sql/sql_info_internal.h"
#include "arrow/type.h"
#include "arrow/util/checked_cast.h"
diff --git a/cpp/src/arrow/flight/sql/server.h
b/cpp/src/arrow/flight/sql/server.h
index 4e6ddce239..f077c5d5d5 100644
--- a/cpp/src/arrow/flight/sql/server.h
+++ b/cpp/src/arrow/flight/sql/server.h
@@ -27,6 +27,7 @@
#include "arrow/flight/server.h"
#include "arrow/flight/sql/server.h"
#include "arrow/flight/sql/types.h"
+#include "arrow/flight/sql/visibility.h"
#include "arrow/util/optional.h"
namespace arrow {
@@ -39,43 +40,43 @@ namespace sql {
/// @{
/// \brief A SQL query.
-struct StatementQuery {
+struct ARROW_FLIGHT_SQL_EXPORT StatementQuery {
/// \brief The SQL query.
std::string query;
};
/// \brief A SQL update query.
-struct StatementUpdate {
+struct ARROW_FLIGHT_SQL_EXPORT StatementUpdate {
/// \brief The SQL query.
std::string query;
};
/// \brief A request to execute a query.
-struct StatementQueryTicket {
+struct ARROW_FLIGHT_SQL_EXPORT StatementQueryTicket {
/// \brief The server-generated opaque identifier for the query.
std::string statement_handle;
};
/// \brief A prepared query statement.
-struct PreparedStatementQuery {
+struct ARROW_FLIGHT_SQL_EXPORT PreparedStatementQuery {
/// \brief The server-generated opaque identifier for the statement.
std::string prepared_statement_handle;
};
/// \brief A prepared update statement.
-struct PreparedStatementUpdate {
+struct ARROW_FLIGHT_SQL_EXPORT PreparedStatementUpdate {
/// \brief The server-generated opaque identifier for the statement.
std::string prepared_statement_handle;
};
/// \brief A request to fetch server metadata.
-struct GetSqlInfo {
+struct ARROW_FLIGHT_SQL_EXPORT GetSqlInfo {
/// \brief A list of metadata IDs to fetch.
std::vector<int32_t> info;
};
/// \brief A request to list database schemas.
-struct GetDbSchemas {
+struct ARROW_FLIGHT_SQL_EXPORT GetDbSchemas {
/// \brief An optional database catalog to filter on.
util::optional<std::string> catalog;
/// \brief An optional database schema to filter on.
@@ -83,7 +84,7 @@ struct GetDbSchemas {
};
/// \brief A request to list database tables.
-struct GetTables {
+struct ARROW_FLIGHT_SQL_EXPORT GetTables {
/// \brief An optional database catalog to filter on.
util::optional<std::string> catalog;
/// \brief An optional database schema to filter on.
@@ -97,33 +98,33 @@ struct GetTables {
};
/// \brief A request to get SQL data type information.
-struct GetXdbcTypeInfo {
+struct ARROW_FLIGHT_SQL_EXPORT GetXdbcTypeInfo {
/// \brief A specific SQL type ID to fetch information about.
util::optional<int> data_type;
};
/// \brief A request to list primary keys of a table.
-struct GetPrimaryKeys {
+struct ARROW_FLIGHT_SQL_EXPORT GetPrimaryKeys {
/// \brief The given table.
TableRef table_ref;
};
/// \brief A request to list foreign key columns referencing primary key
/// columns of a table.
-struct GetExportedKeys {
+struct ARROW_FLIGHT_SQL_EXPORT GetExportedKeys {
/// \brief The given table.
TableRef table_ref;
};
/// \brief A request to list foreign keys of a table.
-struct GetImportedKeys {
+struct ARROW_FLIGHT_SQL_EXPORT GetImportedKeys {
/// \brief The given table.
TableRef table_ref;
};
/// \brief A request to list foreign key columns of a table that
/// reference columns in a given parent table.
-struct GetCrossReference {
+struct ARROW_FLIGHT_SQL_EXPORT GetCrossReference {
/// \brief The parent table (the one containing referenced columns).
TableRef pk_table_ref;
/// \brief The foreign table (for which foreign key columns will be listed).
@@ -131,19 +132,19 @@ struct GetCrossReference {
};
/// \brief A request to create a new prepared statement.
-struct ActionCreatePreparedStatementRequest {
+struct ARROW_FLIGHT_SQL_EXPORT ActionCreatePreparedStatementRequest {
/// \brief The SQL query.
std::string query;
};
/// \brief A request to close a prepared statement.
-struct ActionClosePreparedStatementRequest {
+struct ARROW_FLIGHT_SQL_EXPORT ActionClosePreparedStatementRequest {
/// \brief The server-generated opaque identifier for the statement.
std::string prepared_statement_handle;
};
/// \brief The result of creating a new prepared statement.
-struct ActionCreatePreparedStatementResult {
+struct ARROW_FLIGHT_SQL_EXPORT ActionCreatePreparedStatementResult {
/// \brief The schema of the query results, if applicable.
std::shared_ptr<Schema> dataset_schema;
/// \brief The schema of the query parameters, if applicable.
@@ -160,6 +161,7 @@ struct ActionCreatePreparedStatementResult {
///
/// \param[in] statement_handle The statement handle that will originate
the ticket.
/// \return The parsed ticket as an string.
+ARROW_FLIGHT_SQL_EXPORT
arrow::Result<std::string> CreateStatementQueryTicket(
const std::string& statement_handle);
@@ -167,7 +169,7 @@ arrow::Result<std::string> CreateStatementQueryTicket(
///
/// Applications should subclass this class and override the virtual
/// methods declared on this class.
-class ARROW_EXPORT FlightSqlServerBase : public FlightServerBase {
+class ARROW_FLIGHT_SQL_EXPORT FlightSqlServerBase : public FlightServerBase {
private:
SqlInfoResultMap sql_info_id_to_result_;
@@ -488,7 +490,7 @@ class ARROW_EXPORT FlightSqlServerBase : public
FlightServerBase {
};
/// \brief Auxiliary class containing all Schemas used on Flight SQL.
-class ARROW_EXPORT SqlSchema {
+class ARROW_FLIGHT_SQL_EXPORT SqlSchema {
public:
/// \brief Get the Schema used on GetCatalogs response.
/// \return The default schema template.
diff --git a/cpp/src/arrow/flight/sql/server_test.cc
b/cpp/src/arrow/flight/sql/server_test.cc
index 746c91c102..69081acdb5 100644
--- a/cpp/src/arrow/flight/sql/server_test.cc
+++ b/cpp/src/arrow/flight/sql/server_test.cc
@@ -21,6 +21,7 @@
#include <gmock/gmock.h>
#include <gtest/gtest.h>
+#include <signal.h>
#include <sqlite3.h>
#include <condition_variable>
diff --git a/cpp/src/arrow/flight/sql/sql_info_internal.h
b/cpp/src/arrow/flight/sql/sql_info_internal.h
index b18789c254..2a3cafdbe6 100644
--- a/cpp/src/arrow/flight/sql/sql_info_internal.h
+++ b/cpp/src/arrow/flight/sql/sql_info_internal.h
@@ -18,6 +18,7 @@
#pragma once
#include "arrow/flight/sql/types.h"
+#include "arrow/flight/sql/visibility.h"
namespace arrow {
namespace flight {
@@ -26,7 +27,7 @@ namespace internal {
/// \brief Auxiliary class used to populate GetSqlInfo's DenseUnionArray with
different
/// data types.
-class SqlInfoResultAppender {
+class ARROW_FLIGHT_SQL_EXPORT SqlInfoResultAppender {
public:
/// \brief Append a string to the DenseUnionBuilder.
/// \param[in] value Value to be appended.
diff --git a/cpp/src/arrow/flight/sql/types.h b/cpp/src/arrow/flight/sql/types.h
index ebfb2ef0ea..a6c2648e7c 100644
--- a/cpp/src/arrow/flight/sql/types.h
+++ b/cpp/src/arrow/flight/sql/types.h
@@ -22,6 +22,7 @@
#include <unordered_map>
#include <vector>
+#include "arrow/flight/sql/visibility.h"
#include "arrow/type_fwd.h"
#include "arrow/util/optional.h"
#include "arrow/util/variant.h"
@@ -43,7 +44,7 @@ using SqlInfoResult =
using SqlInfoResultMap = std::unordered_map<int32_t, SqlInfoResult>;
/// \brief Options to be set in the SqlInfo.
-struct SqlInfoOptions {
+struct ARROW_FLIGHT_SQL_EXPORT SqlInfoOptions {
/// \brief Predefined info values for GetSqlInfo.
enum SqlInfo {
/// \name Server Information
@@ -835,7 +836,7 @@ struct SqlInfoOptions {
};
/// \brief A SQL %table reference, optionally containing table's catalog and
db_schema.
-struct TableRef {
+struct ARROW_FLIGHT_SQL_EXPORT TableRef {
/// \brief The table's catalog.
util::optional<std::string> catalog;
/// \brief The table's database schema.
diff --git a/cpp/src/arrow/flight/sql/visibility.h
b/cpp/src/arrow/flight/sql/visibility.h
new file mode 100644
index 0000000000..2074815e0a
--- /dev/null
+++ b/cpp/src/arrow/flight/sql/visibility.h
@@ -0,0 +1,48 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#pragma once
+
+#if defined(_WIN32) || defined(__CYGWIN__)
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable : 4251)
+#else
+#pragma GCC diagnostic ignored "-Wattributes"
+#endif
+
+#ifdef ARROW_FLIGHT_SQL_STATIC
+#define ARROW_FLIGHT_SQL_EXPORT
+#elif defined(ARROW_FLIGHT_SQL_EXPORTING)
+#define ARROW_FLIGHT_SQL_EXPORT __declspec(dllexport)
+#else
+#define ARROW_FLIGHT_SQL_EXPORT __declspec(dllimport)
+#endif
+
+#define ARROW_FLIGHT_SQL_NO_EXPORT
+#else // Not Windows
+#ifndef ARROW_FLIGHT_SQL_EXPORT
+#define ARROW_FLIGHT_SQL_EXPORT __attribute__((visibility("default")))
+#endif
+#ifndef ARROW_FLIGHT_SQL_NO_EXPORT
+#define ARROW_FLIGHT_SQL_NO_EXPORT __attribute__((visibility("hidden")))
+#endif
+#endif // Non-Windows
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif
diff --git a/cpp/src/arrow/symbols.map b/cpp/src/arrow/symbols.map
index 0c5616c692..7d4f13fa28 100644
--- a/cpp/src/arrow/symbols.map
+++ b/cpp/src/arrow/symbols.map
@@ -35,6 +35,7 @@
pyarrow_*;
# ARROW-14771: export Protobuf symbol table
descriptor_table_Flight_2eproto;
+ descriptor_table_FlightSql_2eproto;
# Symbols marked as 'local' are not exported by the DSO and thus may not
# be used by client applications. Everything except the above falls here.
diff --git a/docs/source/developers/cpp/windows.rst
b/docs/source/developers/cpp/windows.rst
index 84ba000cb5..91562a2c8c 100644
--- a/docs/source/developers/cpp/windows.rst
+++ b/docs/source/developers/cpp/windows.rst
@@ -363,7 +363,7 @@ against Arrow on Windows additionally need this definition.
The Unix builds do
not use the macro.
In addition if using ``-DARROW_FLIGHT=ON``, ``ARROW_FLIGHT_STATIC`` needs to
-be defined.
+be defined, and similarly for ``-DARROW_FLIGHT_SQL=ON``.
.. code-block:: cmake
@@ -372,9 +372,17 @@ be defined.
find_package(Arrow REQUIRED)
add_executable(my_example my_example.cc)
- target_link_libraries(my_example PRIVATE arrow_static arrow_flight_static)
-
- target_compile_definitions(my_example PUBLIC ARROW_STATIC
ARROW_FLIGHT_STATIC)
+ target_link_libraries(my_example
+ PRIVATE
+ arrow_static
+ arrow_flight_static
+ arrow_flight_sql_static)
+
+ target_compile_definitions(my_example
+ PUBLIC
+ ARROW_STATIC
+ ARROW_FLIGHT_STATIC
+ ARROW_FLIGHT_SQL_STATIC)
Downloading the Timezone Database
=================================