Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
710d761
Set up static build of ODBC FlightSQL driver
amoeba Mar 24, 2026
7d34a77
Set CMAKE_MSVC_RUNTIME_LIBRARY
amoeba Mar 24, 2026
cb0ea3b
mimalloc doesn't respect link mode
amoeba Mar 24, 2026
83e0f34
wip
amoeba Mar 25, 2026
50e8f3d
Revert "Set CMAKE_MSVC_RUNTIME_LIBRARY"
amoeba Mar 25, 2026
7e3afa0
Update cpp_extra.yml
amoeba Mar 25, 2026
2e57e08
Update cpp_extra.yml
amoeba Mar 25, 2026
5bbcd06
testing
amoeba Mar 26, 2026
59b0c02
last set of fixes
amoeba Mar 27, 2026
a0f0a23
Update cpp_extra.yml
amoeba Mar 29, 2026
084a195
more testing
amoeba Mar 30, 2026
c55f47e
try shared test linkage
amoeba Mar 31, 2026
ef740cc
Update odbc_test_suite.cc
amoeba Mar 31, 2026
507fa70
Check ARROW_FLIGHT_TEST_LINKAGE
amoeba Mar 31, 2026
f49eceb
force static link libs
amoeba Mar 31, 2026
388480a
try reomving disconnect
amoeba Apr 4, 2026
1ddbdc6
Update odbc_test_suite.cc
amoeba Apr 4, 2026
bcb175a
Update CMakeLists.txt
amoeba Apr 4, 2026
72bd9e7
Update CMakeLists.txt
amoeba Apr 4, 2026
9d62947
cleanup
amoeba Apr 4, 2026
807cfae
Update cpp_extra.yml
amoeba Apr 4, 2026
6041123
Update odbc_test_suite.cc
amoeba Apr 4, 2026
ef880fd
cleanup unneeded cmake
amoeba Apr 4, 2026
0588a4d
remove comments
amoeba Apr 7, 2026
3edef30
formatting
amoeba Apr 7, 2026
edbb20e
switch back to VCPKG_DEFAULT_TRIPLET
amoeba Apr 7, 2026
57b04de
Simplify odbc_impl test linkage cmake directives
amoeba Apr 7, 2026
22a25b1
cleanup
amoeba Apr 7, 2026
1d4f607
Update CMakeLists.txt
amoeba Apr 7, 2026
fa69c21
format
amoeba Apr 10, 2026
dafb905
try to fix macos test crash
amoeba Apr 10, 2026
6763cec
format
amoeba Apr 10, 2026
1c8ac04
add missing header
amoeba Apr 11, 2026
705e7ca
testing
amoeba Apr 11, 2026
7782c69
format
amoeba Apr 11, 2026
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
10 changes: 7 additions & 3 deletions .github/workflows/cpp_extra.yml
Original file line number Diff line number Diff line change
Expand Up @@ -526,20 +526,24 @@ jobs:
packages: write
env:
ARROW_BUILD_SHARED: ON
ARROW_BUILD_STATIC: OFF
ARROW_BUILD_STATIC: ON
ARROW_BUILD_TESTS: ON
ARROW_BUILD_TYPE: release
# Turn Arrow CSV off to disable `find_package(Arrow)` check on MSVC CI.
ARROW_TEST_LINKAGE: shared
# Turn Arrow CSV off to disable `find_package(Arrow)` check on MSVC CI.
# GH-49050 TODO: enable `find_package(Arrow)` check on MSVC CI.
ARROW_CSV: OFF
ARROW_DEPENDENCY_SOURCE: VCPKG
ARROW_DEPENDENCY_USE_SHARED: OFF
ARROW_FLIGHT_SQL_ODBC: ON
ARROW_FLIGHT_SQL_ODBC_INSTALLER: ON
ARROW_HOME: /usr
ARROW_MIMALLOC: OFF
ARROW_USE_STATIC_CRT: OFF
CMAKE_GENERATOR: Ninja
CMAKE_INSTALL_PREFIX: /usr
VCPKG_BINARY_SOURCES: 'clear;nugettimeout,600;nuget,GitHub,readwrite'
VCPKG_DEFAULT_TRIPLET: x64-windows
VCPKG_DEFAULT_TRIPLET: x64-windows-static-md
steps:
- name: Disable Crash Dialogs
run: |
Expand Down
73 changes: 47 additions & 26 deletions cpp/src/arrow/flight/sql/odbc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -62,23 +62,34 @@ if(WIN32)
list(APPEND ARROW_FLIGHT_SQL_ODBC_SRCS odbc.def install/versioninfo.rc)
endif()

# On Windows, dynmaic build for ODBC is supported.
# On unix systems, static build for ODBC is supported, all libraries are linked statically on unix.
set(ARROW_FLIGHT_SQL_ODBC_DEPENDENCIES "")
# Initialize install interface libs (only set in Windows static build)
set(ARROW_FLIGHT_SQL_ODBC_SHARED_INSTALL_INTERFACE_LIBS "")
set(ARROW_FLIGHT_SQL_ODBC_STATIC_INSTALL_INTERFACE_LIBS "")
set(ARROW_FLIGHT_SQL_ODBC_SHARED_PRIVATE_LINK_LIBS "")

if(WIN32)
set(ARROW_FLIGHT_SQL_ODBC_DEPENDENCIES arrow_flight_sql)
set(ARROW_FLIGHT_SQL_ODBC_SHARED_LINK_LIBS arrow_flight_sql_shared arrow_odbc_spi_impl)
set(ARROW_FLIGHT_SQL_ODBC_STATIC_LINK_LIBS arrow_flight_sql_static)
list(APPEND ARROW_FLIGHT_SQL_ODBC_SHARED_INSTALL_INTERFACE_LIBS
ArrowFlight::arrow_flight_sql_shared)
list(APPEND ARROW_FLIGHT_SQL_ODBC_STATIC_INSTALL_INTERFACE_LIBS
ArrowFlight::arrow_flight_sql_static)
if(ARROW_BUILD_STATIC)
# Static Arrow deps on Windows — self-contained ODBC DLL
set(ARROW_FLIGHT_SQL_ODBC_SHARED_LINK_LIBS arrow_flight_sql_static
arrow_odbc_spi_impl)
set(ARROW_FLIGHT_SQL_ODBC_STATIC_LINK_LIBS arrow_flight_sql_static)
list(APPEND ARROW_FLIGHT_SQL_ODBC_SHARED_INSTALL_INTERFACE_LIBS
ArrowFlight::arrow_flight_sql_static)
list(APPEND ARROW_FLIGHT_SQL_ODBC_STATIC_INSTALL_INTERFACE_LIBS
ArrowFlight::arrow_flight_sql_static)
else()
set(ARROW_FLIGHT_SQL_ODBC_SHARED_LINK_LIBS arrow_flight_sql_shared
arrow_odbc_spi_impl)
set(ARROW_FLIGHT_SQL_ODBC_STATIC_LINK_LIBS arrow_flight_sql_static)
list(APPEND ARROW_FLIGHT_SQL_ODBC_SHARED_INSTALL_INTERFACE_LIBS
ArrowFlight::arrow_flight_sql_shared)
list(APPEND ARROW_FLIGHT_SQL_ODBC_STATIC_INSTALL_INTERFACE_LIBS
ArrowFlight::arrow_flight_sql_static)
endif()
list(APPEND ARROW_FLIGHT_SQL_ODBC_SHARED_PRIVATE_LINK_LIBS ODBC::ODBC ${ODBCINST})
else()
# Unix
# Unix/macOS: driver dynamically links arrow_flight_sql so the driver and test
# binary share the same grpc/arrow_flight runtime.
set(ARROW_FLIGHT_SQL_ODBC_SHARED_LINK_LIBS arrow_odbc_spi_impl)
set(ARROW_FLIGHT_SQL_ODBC_STATIC_LINK_LIBS ODBC::ODBC ${ODBCINST})
endif()
Expand All @@ -94,8 +105,6 @@ add_arrow_lib(arrow_flight_sql_odbc
${ARROW_FLIGHT_SQL_ODBC_SRCS}
DEFINITIONS
UNICODE
DEPENDENCIES
${ARROW_FLIGHT_SQL_ODBC_DEPENDENCIES}
SHARED_LINK_FLAGS
${ARROW_VERSION_SCRIPT_FLAGS} # Defined in cpp/arrow/CMakeLists.txt
SHARED_LINK_LIBS
Expand Down Expand Up @@ -135,22 +144,34 @@ if(ARROW_FLIGHT_SQL_ODBC_INSTALLER)
# GH-47876 TODO: set up `arrow_flight_sql_odbc` component for macOS Installer
# GH-47877 TODO: set up `arrow_flight_sql_odbc` component for Linux Installer
if(WIN32)
# Install ODBC and its Arrow dependencies
install(PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS}
DESTINATION bin
COMPONENT arrow_flight_sql_odbc)
install(TARGETS arrow_shared
arrow_compute_shared
arrow_flight_shared
arrow_flight_sql_shared
arrow_flight_sql_odbc_shared
RUNTIME_DEPENDENCIES
PRE_EXCLUDE_REGEXES
"api-ms-.*"
"ext-ms-.*"
POST_EXCLUDE_REGEXES
".*system32/.*\\.dll"
RUNTIME DESTINATION bin COMPONENT arrow_flight_sql_odbc)
if(ARROW_BUILD_STATIC)
# Static build: only install the self-contained ODBC DLL
install(TARGETS arrow_flight_sql_odbc_shared
RUNTIME_DEPENDENCIES
PRE_EXCLUDE_REGEXES
"api-ms-.*"
"ext-ms-.*"
POST_EXCLUDE_REGEXES
".*system32/.*\\.dll"
RUNTIME DESTINATION bin COMPONENT arrow_flight_sql_odbc)
else()
# Dynamic build: install ODBC DLL + Arrow dependency DLLs
install(TARGETS arrow_shared
arrow_compute_shared
arrow_flight_shared
arrow_flight_sql_shared
arrow_flight_sql_odbc_shared
RUNTIME_DEPENDENCIES
PRE_EXCLUDE_REGEXES
"api-ms-.*"
"ext-ms-.*"
POST_EXCLUDE_REGEXES
".*system32/.*\\.dll"
RUNTIME DESTINATION bin COMPONENT arrow_flight_sql_odbc)
endif()

set(CPACK_WIX_EXTRA_SOURCES
"${CMAKE_CURRENT_SOURCE_DIR}/install/windows/arrow-flight-sql-odbc.wxs")
Expand Down
33 changes: 24 additions & 9 deletions cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -133,9 +133,15 @@ endif()
if(WIN32)
find_package(ODBC REQUIRED)
target_include_directories(arrow_odbc_spi_impl PUBLIC ${ODBC_INCLUDE_DIR})
target_link_libraries(arrow_odbc_spi_impl
PUBLIC arrow_flight_sql_shared arrow_compute_shared Boost::locale
${ODBCINST})
if(ARROW_BUILD_STATIC)
target_link_libraries(arrow_odbc_spi_impl
PUBLIC arrow_flight_sql_static arrow_compute_static
Boost::locale ${ODBCINST})
else()
target_link_libraries(arrow_odbc_spi_impl
PUBLIC arrow_flight_sql_shared arrow_compute_shared
Boost::locale ${ODBCINST})
endif()
else()
# Unix
target_include_directories(arrow_odbc_spi_impl SYSTEM BEFORE PUBLIC ${ODBC_INCLUDE_DIR})
Expand Down Expand Up @@ -163,11 +169,19 @@ target_link_libraries(arrow_odbc_spi_impl_cli arrow_odbc_spi_impl)

# On Windows, dynamic linking ODBC is supported.
# On unix systems, static linking ODBC is supported, thus the library linking is static.
if(WIN32)
set(ODBC_SPI_IMPL_TEST_LINK_LIBS arrow_flight_testing_shared)
# Use STATIC_LINK_LIBS when Flight tests require static linkage to avoid mixing static/shared Arrow
if(WIN32 AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static")
set(ODBC_SPI_IMPL_TEST_STATIC_LIBS arrow_odbc_spi_impl arrow_flight_testing_static
${ARROW_TEST_STATIC_LINK_LIBS})
set(ODBC_SPI_IMPL_TEST_EXTRA_LIBS "")
elseif(WIN32)
set(ODBC_SPI_IMPL_TEST_STATIC_LIBS "")
set(ODBC_SPI_IMPL_TEST_EXTRA_LIBS arrow_odbc_spi_impl arrow_flight_testing_shared)
else()
# unix
set(ODBC_SPI_IMPL_TEST_LINK_LIBS arrow_flight_testing_static)
# Unix - always static
set(ODBC_SPI_IMPL_TEST_STATIC_LIBS arrow_odbc_spi_impl arrow_flight_testing_static
${ARROW_TEST_STATIC_LINK_LIBS})
set(ODBC_SPI_IMPL_TEST_EXTRA_LIBS "")
endif()

add_arrow_test(odbc_spi_impl_test
Expand All @@ -187,5 +201,6 @@ add_arrow_test(odbc_spi_impl_test
record_batch_transformer_test.cc
util_test.cc
EXTRA_LINK_LIBS
arrow_odbc_spi_impl
${ODBC_SPI_IMPL_TEST_LINK_LIBS})
${ODBC_SPI_IMPL_TEST_EXTRA_LIBS}
STATIC_LINK_LIBS
${ODBC_SPI_IMPL_TEST_STATIC_LIBS})
17 changes: 13 additions & 4 deletions cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,24 @@ endif()
set(ARROW_FLIGHT_SQL_ODBC_TEST_LIBS ${ODBCINST} ${ODBC_LIBRARIES} ${SQLite3_LIBRARIES})

# On Windows, dynamic linking ODBC is supported, tests link libraries dynamically.
# On unix systems, static linking ODBC is supported, thus tests link libraries statically.
# On Windows with static Arrow, use STATIC_LINK_LIBS to avoid mixing static/shared.
# On Unix/macOS, tests link libraries statically.
set(ARROW_FLIGHT_SQL_ODBC_TEST_EXTRA_LINK_LIBS "")
set(ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS "")
if(WIN32)
# arrow_odbc_spi_impl is required on Windows due to dynamic linking
if(WIN32 AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static")
# Static Windows tests
list(APPEND
ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS
arrow_odbc_spi_impl
${ARROW_FLIGHT_SQL_ODBC_TEST_LIBS}
${ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS}
${ARROW_TEST_STATIC_LINK_LIBS})
elseif(WIN32)
# Dynamic Windows tests
list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_EXTRA_LINK_LIBS arrow_odbc_spi_impl
${ARROW_FLIGHT_SQL_ODBC_TEST_LIBS})
else()
# Unix
# Unix/macOS
list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS
${ARROW_FLIGHT_SQL_ODBC_TEST_LIBS} ${ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS})
endif()
Expand Down
6 changes: 5 additions & 1 deletion cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,11 @@ void ODBCTestBase::TearDown() {

void ODBCTestBase::TearDownTestSuite() {
if (connected) {
Disconnect();
// TODO(XXX): Without commenting this out, Disconnect() makes this test
// executable segfault when run under ctest but not when the test executable
// is run directly. This only happens under static test linkage.
//
// Disconnect();
connected = false;
}
}
Expand Down
Loading