From 383f4dd9372bf73d050fb6f4a5dd82e0f0648c0c Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Mon, 23 Mar 2026 17:47:19 -0700 Subject: [PATCH 01/43] Set up static build of ODBC FlightSQL driver --- .github/workflows/cpp_extra.yml | 8 ++++++-- ci/vcpkg/amd64-windows-no-absl-sync-release.cmake | 4 ++-- cpp/src/arrow/flight/sql/odbc/CMakeLists.txt | 12 +++--------- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/.github/workflows/cpp_extra.yml b/.github/workflows/cpp_extra.yml index 046e95292b04..bbd5a46f4125 100644 --- a/.github/workflows/cpp_extra.yml +++ b/.github/workflows/cpp_extra.yml @@ -689,8 +689,8 @@ jobs: contents: read packages: write env: - ARROW_BUILD_SHARED: ON - ARROW_BUILD_STATIC: OFF + ARROW_BUILD_SHARED: 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. @@ -706,6 +706,10 @@ jobs: # Build Arrow with GPR_DISABLE_ABSEIL_SYNC so grpcpp's Mutex ABI # matches the gRPC rebuilt by the overlay triplet. Remove once fixed upstream. ARROW_CXXFLAGS: -DGPR_DISABLE_ABSEIL_SYNC + ARROW_DEPENDENCY_USE_SHARED: OFF + ARROW_MIMALLOC: OFF + ARROW_TEST_LINKAGE: shared + ARROW_USE_STATIC_CRT: OFF CMAKE_GENERATOR: Ninja CMAKE_INSTALL_PREFIX: /usr VCPKG_BINARY_SOURCES: 'clear;nugettimeout,600;nuget,GitHub,readwrite' diff --git a/ci/vcpkg/amd64-windows-no-absl-sync-release.cmake b/ci/vcpkg/amd64-windows-no-absl-sync-release.cmake index 97c73e31464e..436650842adf 100644 --- a/ci/vcpkg/amd64-windows-no-absl-sync-release.cmake +++ b/ci/vcpkg/amd64-windows-no-absl-sync-release.cmake @@ -17,10 +17,10 @@ # GH-49465: rebuild gRPC with native sync instead of absl::Mutex to avoid the # Windows exit hang. See the ODBC Windows job in cpp_extra.yml -# Dynamic CRT/linkage and release-only to match that job. +# Static library linkage, dynamic CRT (/MD), release-only to match that job. set(VCPKG_TARGET_ARCHITECTURE x64) set(VCPKG_CRT_LINKAGE dynamic) -set(VCPKG_LIBRARY_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE static) set(VCPKG_BUILD_TYPE release) set(VCPKG_C_FLAGS "/DGPR_DISABLE_ABSEIL_SYNC") diff --git a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt index 181d855fde45..865f5e1c8067 100644 --- a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt @@ -67,10 +67,8 @@ 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_SHARED_LINK_LIBS 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) list(APPEND ARROW_FLIGHT_SQL_ODBC_SHARED_PRIVATE_LINK_LIBS ODBC::ODBC ${ODBCINST}) @@ -149,15 +147,11 @@ if(ARROW_FLIGHT_SQL_ODBC_INSTALLER) set(CPACK_PACKAGE_CONTACT "dev@arrow.apache.org") if(WIN32) - # Install ODBC and its Arrow dependencies + # Install ODBC driver install(PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION bin COMPONENT ArrowFlightSQLODBC) - install(TARGETS arrow_shared - arrow_compute_shared - arrow_flight_shared - arrow_flight_sql_shared - arrow_flight_sql_odbc_shared + install(TARGETS arrow_flight_sql_odbc_shared RUNTIME_DEPENDENCIES PRE_EXCLUDE_REGEXES "api-ms-.*" From 51c6999aa725c660ba394251a92dba00aec02ecd Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Mon, 23 Mar 2026 18:36:54 -0700 Subject: [PATCH 02/43] Set CMAKE_MSVC_RUNTIME_LIBRARY --- cpp/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index d39120dec2ed..d183763744fd 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -227,6 +227,11 @@ set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE}) # cmake options include(DefineOptions) +# Set MSVC runtime library (CMP0091 NEW policy) +if(MSVC AND ARROW_USE_STATIC_CRT) + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") +endif() + if(ARROW_BUILD_SHARED AND NOT ARROW_POSITION_INDEPENDENT_CODE) message(WARNING "Can't disable position-independent code to build shared libraries, enabling" ) From d4cedb5fd1f146af2b69975b1f0e5262c9b93924 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Tue, 24 Mar 2026 21:06:02 -0700 Subject: [PATCH 03/43] wip --- cpp/src/arrow/flight/sql/odbc/CMakeLists.txt | 13 ++++++++-- .../flight/sql/odbc/odbc_impl/CMakeLists.txt | 25 +++++++++++++------ .../flight/sql/odbc/tests/CMakeLists.txt | 10 ++++++-- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt index 865f5e1c8067..5559244b4828 100644 --- a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt @@ -65,7 +65,17 @@ set(ARROW_FLIGHT_SQL_ODBC_DEPENDENCIES "") 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) +if(WIN32 AND 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) + list(APPEND ARROW_FLIGHT_SQL_ODBC_SHARED_PRIVATE_LINK_LIBS ODBC::ODBC ${ODBCINST}) +elseif(WIN32) + # Dynamic Arrow deps on Windows (current behavior) set(ARROW_FLIGHT_SQL_ODBC_DEPENDENCIES arrow_flight_sql) set(ARROW_FLIGHT_SQL_ODBC_SHARED_LINK_LIBS arrow_odbc_spi_impl) set(ARROW_FLIGHT_SQL_ODBC_STATIC_LINK_LIBS arrow_flight_sql_static) @@ -147,7 +157,6 @@ if(ARROW_FLIGHT_SQL_ODBC_INSTALLER) set(CPACK_PACKAGE_CONTACT "dev@arrow.apache.org") if(WIN32) - # Install ODBC driver install(PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION bin COMPONENT ArrowFlightSQLODBC) diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt index a455ddadd23d..fefab748c634 100644 --- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt @@ -133,12 +133,21 @@ 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 - arrow::simdjson - ${ODBCINST}) + if(ARROW_BUILD_STATIC) + target_link_libraries(arrow_odbc_spi_impl + PUBLIC arrow_flight_sql_static + arrow_compute_static + Boost::locale + arrow::simdjson + ${ODBCINST}) + else() + target_link_libraries(arrow_odbc_spi_impl + PUBLIC arrow_flight_sql_shared + arrow_compute_shared + Boost::locale + arrow::simdjson + ${ODBCINST}) + endif() else() # Unix target_include_directories(arrow_odbc_spi_impl SYSTEM BEFORE PUBLIC ${ODBC_INCLUDE_DIR}) @@ -166,7 +175,9 @@ 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) +if(WIN32 AND ARROW_TEST_LINKAGE STREQUAL "static") + set(ODBC_SPI_IMPL_TEST_LINK_LIBS arrow_flight_testing_static) +elseif(WIN32) set(ODBC_SPI_IMPL_TEST_LINK_LIBS arrow_flight_testing_shared) else() # unix diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index 0f45bfd0c811..7e3911d0c05e 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -59,8 +59,14 @@ set(ARROW_FLIGHT_SQL_ODBC_TEST_LIBS ${ODBCINST} ${ODBC_LIBRARIES} ${SQLite3_LIBR # On unix systems, static linking ODBC is supported, thus 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_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}) +elseif(WIN32) + # Dynamic Windows tests (current behavior) list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_EXTRA_LINK_LIBS arrow_odbc_spi_impl ${ARROW_FLIGHT_SQL_ODBC_TEST_LIBS}) else() From 10099e36567dc925e58cb8e963d4c65297923046 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Tue, 24 Mar 2026 21:06:14 -0700 Subject: [PATCH 04/43] Revert "Set CMAKE_MSVC_RUNTIME_LIBRARY" This reverts commit 819f2fcce4e59a558e4588c505d74a34404412a0. --- cpp/CMakeLists.txt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index d183763744fd..d39120dec2ed 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -227,11 +227,6 @@ set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE}) # cmake options include(DefineOptions) -# Set MSVC runtime library (CMP0091 NEW policy) -if(MSVC AND ARROW_USE_STATIC_CRT) - set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") -endif() - if(ARROW_BUILD_SHARED AND NOT ARROW_POSITION_INDEPENDENT_CODE) message(WARNING "Can't disable position-independent code to build shared libraries, enabling" ) From 431946fdde4fd182a6f848bd41aae14da60687d9 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Mon, 30 Mar 2026 12:56:10 -0700 Subject: [PATCH 05/43] more testing --- cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index 7e3911d0c05e..5e7f1a029e59 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -40,7 +40,8 @@ set(ARROW_FLIGHT_SQL_ODBC_TEST_SRCS type_info_test.cc # Enable Protobuf cleanup after test execution # GH-46889: move protobuf_test_util to a more common location - ../../../../engine/substrait/protobuf_test_util.cc) + #../../../../engine/substrait/protobuf_test_util.cc) +) # GH-49651 Link ODBC tests statically on Linux and dynamically on macOS/Windows if(WIN32 OR APPLE) From 634c93ed6685415c336a36c1d0d7c1abd571905e Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Mon, 30 Mar 2026 17:42:15 -0700 Subject: [PATCH 06/43] Update odbc_test_suite.cc --- .../flight/sql/odbc/tests/odbc_test_suite.cc | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc b/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc index 3125c18b92ac..3fbc1ceb164b 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc +++ b/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc @@ -232,7 +232,37 @@ void ODBCTestBase::SetUp() { } void ODBCTestBase::TearDown() { - ASSERT_EQ(SQL_SUCCESS, SQLFreeHandle(SQL_HANDLE_STMT, stmt)); + if (connected) { + ASSERT_EQ(SQL_SUCCESS, SQLFreeHandle(SQL_HANDLE_STMT, stmt)); + } +} + +void ODBCTestBase::TearDownTestSuite() { + if (connected) { + // WORKAROUND GH-49585: Skip Disconnect() to avoid segfault when run through CTest + // + // When tests are run through CTest (but NOT when run directly from cmd.exe), + // SQLFreeHandle(SQL_HANDLE_ENV) crashes during cleanup. The crash occurs only with + // static linkage (ARROW_TEST_LINKAGE=static) and happens while freeing the ODBC + // environment handle, which triggers cleanup of statically-linked gRPC/Flight resources. + // + // Root cause appears to be CTest's process management (signal handling, I/O redirection, + // or environment differences) interfering with gRPC cleanup during static destruction. + // + // This workaround leaks the ODBC handles but allows tests to complete successfully. + // A proper fix would require ensuring gRPC is kept alive until all ODBC handles are freed, + // or switching to dynamic linkage for tests. + // + // Disconnect(); + connected = false; + } +} + +void FlightSQLODBCRemoteTestBase::CheckForRemoteTest() { + if (arrow::internal::GetEnvVar(kTestConnectStr.data()).ValueOr("").empty()) { + skipping_test = true; + GTEST_SKIP() << "Skipping test: kTestConnectStr not set"; + } } void FlightSQLODBCRemoteTestBase::SetUpTestSuite() { From 62ded5290e012b837795bfd1d298045c97383431 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Tue, 31 Mar 2026 09:10:19 -0700 Subject: [PATCH 07/43] Check ARROW_FLIGHT_TEST_LINKAGE Flight tests get statically linked no matter what when grpc or protobuf are static. --- cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt index fefab748c634..c4bfdc33173e 100644 --- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt @@ -175,7 +175,7 @@ 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 AND ARROW_TEST_LINKAGE STREQUAL "static") +if(WIN32 AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") set(ODBC_SPI_IMPL_TEST_LINK_LIBS arrow_flight_testing_static) elseif(WIN32) set(ODBC_SPI_IMPL_TEST_LINK_LIBS arrow_flight_testing_shared) From 02f83ab58fb5a763b741376cd0be684451598bce Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Tue, 31 Mar 2026 15:40:58 -0700 Subject: [PATCH 08/43] force static link libs --- .../flight/sql/odbc/odbc_impl/CMakeLists.txt | 24 ++++++++++++++----- .../flight/sql/odbc/tests/CMakeLists.txt | 16 ++++++++++--- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt index c4bfdc33173e..4cf273034cf5 100644 --- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt @@ -175,13 +175,24 @@ 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. +# 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_LINK_LIBS arrow_flight_testing_static) + # Static linkage required - pass everything via STATIC_LINK_LIBS + 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_LINK_LIBS arrow_flight_testing_shared) + # Shared linkage - use EXTRA_LINK_LIBS + 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 @@ -201,5 +212,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}) diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index 5e7f1a029e59..0b79e5a34abb 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -43,8 +43,12 @@ set(ARROW_FLIGHT_SQL_ODBC_TEST_SRCS #../../../../engine/substrait/protobuf_test_util.cc) ) -# GH-49651 Link ODBC tests statically on Linux and dynamically on macOS/Windows -if(WIN32 OR APPLE) +# ODBC tests must respect ARROW_FLIGHT_TEST_LINKAGE since they depend on Flight libraries +# which may be forced to static linkage due to static gRPC/Protobuf +if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") + set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS arrow_flight_sql_odbc_static + ${ARROW_TEST_STATIC_LINK_LIBS}) +else() set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS arrow_flight_sql_odbc_shared ${ARROW_TEST_SHARED_LINK_LIBS}) else() @@ -60,7 +64,7 @@ set(ARROW_FLIGHT_SQL_ODBC_TEST_LIBS ${ODBCINST} ${ODBC_LIBRARIES} ${SQLite3_LIBR # On unix systems, static linking ODBC is supported, thus tests link libraries statically. set(ARROW_FLIGHT_SQL_ODBC_TEST_EXTRA_LINK_LIBS "") set(ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS "") -if(WIN32 AND ARROW_TEST_LINKAGE STREQUAL "static") +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 @@ -83,6 +87,12 @@ else() endif() +# When Flight tests require static linkage, we must also add Arrow test libs to STATIC_LINK_LIBS +# to avoid add_arrow_test from adding shared Arrow test libs +if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") + list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS ${ARROW_TEST_STATIC_LINK_LIBS}) +endif() + add_arrow_test(flight_sql_odbc_test SOURCES ${ARROW_FLIGHT_SQL_ODBC_TEST_SRCS} From 0bf731da85b9c3601d04e3b5e114e8e6cbf17f73 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Fri, 3 Apr 2026 18:31:25 -0700 Subject: [PATCH 09/43] Update CMakeLists.txt --- cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index 0b79e5a34abb..4155eac78880 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -40,7 +40,7 @@ set(ARROW_FLIGHT_SQL_ODBC_TEST_SRCS type_info_test.cc # Enable Protobuf cleanup after test execution # GH-46889: move protobuf_test_util to a more common location - #../../../../engine/substrait/protobuf_test_util.cc) + ../../../../engine/substrait/protobuf_test_util.cc) ) # ODBC tests must respect ARROW_FLIGHT_TEST_LINKAGE since they depend on Flight libraries From de3bb1cac9491c7fba0c4b392d6495657f29f993 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Fri, 3 Apr 2026 18:32:25 -0700 Subject: [PATCH 10/43] Update CMakeLists.txt --- cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index 4155eac78880..dfa361da2b34 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -40,7 +40,7 @@ set(ARROW_FLIGHT_SQL_ODBC_TEST_SRCS type_info_test.cc # Enable Protobuf cleanup after test execution # GH-46889: move protobuf_test_util to a more common location - ../../../../engine/substrait/protobuf_test_util.cc) + ../../../../engine/substrait/protobuf_test_util.cc ) # ODBC tests must respect ARROW_FLIGHT_TEST_LINKAGE since they depend on Flight libraries From 357efc15675e23b806ec60f2094b576217a6eab0 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Fri, 3 Apr 2026 18:44:43 -0700 Subject: [PATCH 11/43] Update cpp_extra.yml --- .github/workflows/cpp_extra.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/cpp_extra.yml b/.github/workflows/cpp_extra.yml index bbd5a46f4125..6a3380f87b34 100644 --- a/.github/workflows/cpp_extra.yml +++ b/.github/workflows/cpp_extra.yml @@ -718,6 +718,14 @@ jobs: VCPKG_DEFAULT_TRIPLET: amd64-windows-no-absl-sync-release VCPKG_OVERLAY_TRIPLETS: ${{ github.workspace }}/ci/vcpkg steps: + - name: Disable Crash Dialogs + run: | + reg add ` + "HKCU\SOFTWARE\Microsoft\Windows\Windows Error Reporting" ` + /v DontShowUI ` + /t REG_DWORD ` + /d 1 ` + /f - name: Checkout Arrow uses: actions/checkout@v7 with: From 3f51d51101f8b5e040947b3cd38f8a064824b2a4 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Tue, 7 Apr 2026 14:22:16 -0700 Subject: [PATCH 12/43] formatting --- cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index dfa361da2b34..61c9847c60b3 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -40,8 +40,7 @@ set(ARROW_FLIGHT_SQL_ODBC_TEST_SRCS type_info_test.cc # Enable Protobuf cleanup after test execution # GH-46889: move protobuf_test_util to a more common location - ../../../../engine/substrait/protobuf_test_util.cc -) + ../../../../engine/substrait/protobuf_test_util.cc) # ODBC tests must respect ARROW_FLIGHT_TEST_LINKAGE since they depend on Flight libraries # which may be forced to static linkage due to static gRPC/Protobuf From 0af2ae089610f28839283d7218747efdbd5c3db7 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Tue, 7 Apr 2026 14:32:53 -0700 Subject: [PATCH 13/43] Simplify odbc_impl test linkage cmake directives --- .../flight/sql/odbc/odbc_impl/CMakeLists.txt | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt index 4cf273034cf5..b3a823cbe6f1 100644 --- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt @@ -173,26 +173,15 @@ target_link_libraries(arrow_odbc_spi_impl_cli arrow_odbc_spi_impl) # Unit tests -# On Windows, dynamic linking ODBC is supported. -# On unix systems, static linking ODBC is supported, thus the library linking is static. -# 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") - # Static linkage required - pass everything via STATIC_LINK_LIBS +# Respect ARROW_FLIGHT_TEST_LINKAGE, default to shared +if(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) - # Shared linkage - use EXTRA_LINK_LIBS +else() set(ODBC_SPI_IMPL_TEST_STATIC_LIBS "") set(ODBC_SPI_IMPL_TEST_EXTRA_LIBS arrow_odbc_spi_impl - arrow_flight_testing_shared) -else() - # 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 From 8bd5550e682c4bddc1cb10d983d3f30101e805db Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Tue, 7 Apr 2026 15:21:12 -0700 Subject: [PATCH 14/43] cleanup --- cpp/src/arrow/flight/sql/odbc/CMakeLists.txt | 16 +------- .../flight/sql/odbc/odbc_impl/CMakeLists.txt | 2 +- .../flight/sql/odbc/tests/CMakeLists.txt | 37 +++++-------------- 3 files changed, 13 insertions(+), 42 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt index 5559244b4828..83f7a5a19470 100644 --- a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt @@ -59,12 +59,11 @@ 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 AND 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) @@ -74,16 +73,7 @@ if(WIN32 AND ARROW_BUILD_STATIC) list(APPEND ARROW_FLIGHT_SQL_ODBC_STATIC_INSTALL_INTERFACE_LIBS ArrowFlight::arrow_flight_sql_static) list(APPEND ARROW_FLIGHT_SQL_ODBC_SHARED_PRIVATE_LINK_LIBS ODBC::ODBC ${ODBCINST}) -elseif(WIN32) - # Dynamic Arrow deps on Windows (current behavior) - set(ARROW_FLIGHT_SQL_ODBC_DEPENDENCIES arrow_flight_sql) - set(ARROW_FLIGHT_SQL_ODBC_SHARED_LINK_LIBS arrow_odbc_spi_impl) - set(ARROW_FLIGHT_SQL_ODBC_STATIC_LINK_LIBS arrow_flight_sql_static) - list(APPEND ARROW_FLIGHT_SQL_ODBC_STATIC_INSTALL_INTERFACE_LIBS - ArrowFlight::arrow_flight_sql_static) - list(APPEND ARROW_FLIGHT_SQL_ODBC_SHARED_PRIVATE_LINK_LIBS ODBC::ODBC ${ODBCINST}) else() - # Unix set(ARROW_FLIGHT_SQL_ODBC_SHARED_LINK_LIBS arrow_odbc_spi_impl) set(ARROW_FLIGHT_SQL_ODBC_STATIC_LINK_LIBS ODBC::ODBC ${ODBCINST}) endif() @@ -99,8 +89,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 diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt index b3a823cbe6f1..508eb62c367d 100644 --- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt @@ -181,7 +181,7 @@ if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") set(ODBC_SPI_IMPL_TEST_EXTRA_LIBS "") else() set(ODBC_SPI_IMPL_TEST_STATIC_LIBS "") - set(ODBC_SPI_IMPL_TEST_EXTRA_LIBS arrow_odbc_spi_impl + set(ODBC_SPI_IMPL_TEST_EXTRA_LIBS arrow_odbc_spi_impl) endif() add_arrow_test(odbc_spi_impl_test diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index 61c9847c60b3..9abd8587e51a 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -42,8 +42,6 @@ set(ARROW_FLIGHT_SQL_ODBC_TEST_SRCS # GH-46889: move protobuf_test_util to a more common location ../../../../engine/substrait/protobuf_test_util.cc) -# ODBC tests must respect ARROW_FLIGHT_TEST_LINKAGE since they depend on Flight libraries -# which may be forced to static linkage due to static gRPC/Protobuf if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS arrow_flight_sql_odbc_static ${ARROW_TEST_STATIC_LINK_LIBS}) @@ -59,37 +57,22 @@ endif() # On macOS, link `ODBCINST` first to ensure iodbc take precedence over unixodbc 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. -set(ARROW_FLIGHT_SQL_ODBC_TEST_EXTRA_LINK_LIBS "") -set(ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS "") -if(WIN32 AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") - # Static Windows tests +# Respect ARROW_FLIGHT_TEST_LINKAGE, default to shared +if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") + set(ARROW_FLIGHT_SQL_ODBC_TEST_EXTRA_LINK_LIBS "") 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}) -elseif(WIN32) - # Dynamic Windows tests (current behavior) + # When Flight tests require static linkage, we must also add Arrow test libs to STATIC_LINK_LIBS + # to avoid add_arrow_test from adding shared Arrow test libs + if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") + list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS ${ARROW_TEST_STATIC_LINK_LIBS}) + endif() +else() list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_EXTRA_LINK_LIBS arrow_odbc_spi_impl ${ARROW_FLIGHT_SQL_ODBC_TEST_LIBS}) -else() - # Unix - list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS - ${ARROW_FLIGHT_SQL_ODBC_TEST_LIBS} ${ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS}) - - if(NOT APPLE) - # Links static dependencies on Linux to support ARROW_TEST_LINKAGE=static - list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS arrow_odbc_spi_impl - ${ARROW_PROTOBUF_LIBPROTOBUF}) - endif() - -endif() - -# When Flight tests require static linkage, we must also add Arrow test libs to STATIC_LINK_LIBS -# to avoid add_arrow_test from adding shared Arrow test libs -if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") - list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS ${ARROW_TEST_STATIC_LINK_LIBS}) + set(ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS "") endif() add_arrow_test(flight_sql_odbc_test From afa4310020d45e2b780fd84023797a751f92a1fa Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Tue, 7 Apr 2026 15:44:49 -0700 Subject: [PATCH 15/43] Update CMakeLists.txt --- cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index 9abd8587e51a..26c97a9d4d15 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -64,11 +64,6 @@ if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") arrow_odbc_spi_impl ${ARROW_FLIGHT_SQL_ODBC_TEST_LIBS} ${ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS}) - # When Flight tests require static linkage, we must also add Arrow test libs to STATIC_LINK_LIBS - # to avoid add_arrow_test from adding shared Arrow test libs - if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") - list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS ${ARROW_TEST_STATIC_LINK_LIBS}) - endif() else() list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_EXTRA_LINK_LIBS arrow_odbc_spi_impl ${ARROW_FLIGHT_SQL_ODBC_TEST_LIBS}) From 4ba66e375353fde69d3ec2a3b4908a4379bfdff4 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Fri, 10 Apr 2026 15:37:26 -0700 Subject: [PATCH 16/43] format --- .../flight/sql/odbc/odbc_impl/CMakeLists.txt | 17 +++++------------ .../arrow/flight/sql/odbc/tests/CMakeLists.txt | 3 ++- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt index 508eb62c367d..a587ed29a3d9 100644 --- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt @@ -135,18 +135,12 @@ if(WIN32) target_include_directories(arrow_odbc_spi_impl PUBLIC ${ODBC_INCLUDE_DIR}) if(ARROW_BUILD_STATIC) target_link_libraries(arrow_odbc_spi_impl - PUBLIC arrow_flight_sql_static - arrow_compute_static - Boost::locale - arrow::simdjson - ${ODBCINST}) + PUBLIC arrow_flight_sql_static arrow_compute_static + Boost::locale arrow::simdjson ${ODBCINST}) else() target_link_libraries(arrow_odbc_spi_impl - PUBLIC arrow_flight_sql_shared - arrow_compute_shared - Boost::locale - arrow::simdjson - ${ODBCINST}) + PUBLIC arrow_flight_sql_shared arrow_compute_shared + Boost::locale arrow::simdjson ${ODBCINST}) endif() else() # Unix @@ -175,8 +169,7 @@ target_link_libraries(arrow_odbc_spi_impl_cli arrow_odbc_spi_impl) # Respect ARROW_FLIGHT_TEST_LINKAGE, default to shared if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") - set(ODBC_SPI_IMPL_TEST_STATIC_LIBS arrow_odbc_spi_impl - arrow_flight_testing_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 "") else() diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index 26c97a9d4d15..39a29bef8301 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -60,7 +60,8 @@ set(ARROW_FLIGHT_SQL_ODBC_TEST_LIBS ${ODBCINST} ${ODBC_LIBRARIES} ${SQLite3_LIBR # Respect ARROW_FLIGHT_TEST_LINKAGE, default to shared if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") set(ARROW_FLIGHT_SQL_ODBC_TEST_EXTRA_LINK_LIBS "") - list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS + 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}) From c02f769eae43e56055750a205659a20df78d2048 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Fri, 10 Apr 2026 16:40:37 -0700 Subject: [PATCH 17/43] try to fix macos test crash --- .../flight/sql/odbc/odbc_impl/CMakeLists.txt | 20 ++++++++++---- .../flight/sql/odbc/tests/CMakeLists.txt | 26 ++++++++++++++----- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt index a587ed29a3d9..d3690edc7b4b 100644 --- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt @@ -167,14 +167,24 @@ target_link_libraries(arrow_odbc_spi_impl_cli arrow_odbc_spi_impl) # Unit tests -# Respect ARROW_FLIGHT_TEST_LINKAGE, default to shared -if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") - set(ODBC_SPI_IMPL_TEST_STATIC_LIBS arrow_odbc_spi_impl arrow_flight_testing_static +# On Windows, dynamic linking ODBC is supported. +# On unix systems, static linking ODBC is supported, thus the library linking is static. +# 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 "") -else() +elseif(WIN32) set(ODBC_SPI_IMPL_TEST_STATIC_LIBS "") - set(ODBC_SPI_IMPL_TEST_EXTRA_LIBS arrow_odbc_spi_impl) + set(ODBC_SPI_IMPL_TEST_EXTRA_LIBS arrow_odbc_spi_impl + arrow_flight_testing_shared) +else() + # 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 diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index 39a29bef8301..db56fb2dd3d8 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -57,18 +57,30 @@ endif() # On macOS, link `ODBCINST` first to ensure iodbc take precedence over unixodbc set(ARROW_FLIGHT_SQL_ODBC_TEST_LIBS ${ODBCINST} ${ODBC_LIBRARIES} ${SQLite3_LIBRARIES}) -# Respect ARROW_FLIGHT_TEST_LINKAGE, default to shared -if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") - set(ARROW_FLIGHT_SQL_ODBC_TEST_EXTRA_LINK_LIBS "") - list(APPEND - ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS +# On Windows, dynamic linking ODBC is supported, tests link libraries dynamically. +# On unix systems, static linking ODBC is supported, thus tests link libraries statically. +set(ARROW_FLIGHT_SQL_ODBC_TEST_EXTRA_LINK_LIBS "") +set(ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS "") +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}) -else() +elseif(WIN32) + # Dynamic Windows tests (current behavior) list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_EXTRA_LINK_LIBS arrow_odbc_spi_impl ${ARROW_FLIGHT_SQL_ODBC_TEST_LIBS}) - set(ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS "") +else() + # Unix + list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS + ${ARROW_FLIGHT_SQL_ODBC_TEST_LIBS} ${ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS}) +endif() + +# When Flight tests require static linkage, we must also add Arrow test libs to STATIC_LINK_LIBS +# to avoid add_arrow_test from adding shared Arrow test libs +if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") + list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS ${ARROW_TEST_STATIC_LINK_LIBS}) endif() add_arrow_test(flight_sql_odbc_test From a0becd12804a82b030dc55cc2ab33bd5236a5c09 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Fri, 10 Apr 2026 16:59:20 -0700 Subject: [PATCH 18/43] format --- cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt | 9 +++------ cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt | 3 ++- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt index d3690edc7b4b..46f400eafc80 100644 --- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt @@ -171,18 +171,15 @@ target_link_libraries(arrow_odbc_spi_impl_cli arrow_odbc_spi_impl) # On unix systems, static linking ODBC is supported, thus the library linking is static. # 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 + 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) + set(ODBC_SPI_IMPL_TEST_EXTRA_LIBS arrow_odbc_spi_impl arrow_flight_testing_shared) else() # Unix - always static - set(ODBC_SPI_IMPL_TEST_STATIC_LIBS arrow_odbc_spi_impl - arrow_flight_testing_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() diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index db56fb2dd3d8..a93794a69c42 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -63,7 +63,8 @@ set(ARROW_FLIGHT_SQL_ODBC_TEST_EXTRA_LINK_LIBS "") set(ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS "") if(WIN32 AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") # Static Windows tests - list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS + 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}) From f51415af9076d9c20baa76977455199816e58eae Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Fri, 10 Apr 2026 17:02:44 -0700 Subject: [PATCH 19/43] add missing header --- cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt index 46f400eafc80..173815717c1d 100644 --- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt @@ -150,6 +150,7 @@ else() arrow_compute_static Boost::locale Boost::headers + Boost::variant arrow::simdjson) if(NOT APPLE) From 02869a686a26a63907ddb939653adc65854681c7 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Fri, 10 Apr 2026 17:13:54 -0700 Subject: [PATCH 20/43] testing --- cpp/src/arrow/flight/sql/odbc/CMakeLists.txt | 27 +++++++++++++------ .../flight/sql/odbc/odbc_impl/CMakeLists.txt | 1 - .../flight/sql/odbc/tests/CMakeLists.txt | 21 ++++++--------- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt index 83f7a5a19470..e4c7955cf6e8 100644 --- a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt @@ -64,16 +64,27 @@ 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 AND 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) +if(WIN32) + 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/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() diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt index 173815717c1d..46f400eafc80 100644 --- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt @@ -150,7 +150,6 @@ else() arrow_compute_static Boost::locale Boost::headers - Boost::variant arrow::simdjson) if(NOT APPLE) diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index a93794a69c42..bd522c5089ab 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -42,7 +42,7 @@ set(ARROW_FLIGHT_SQL_ODBC_TEST_SRCS # GH-46889: move protobuf_test_util to a more common location ../../../../engine/substrait/protobuf_test_util.cc) -if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") +if(ARROW_TEST_LINKAGE STREQUAL "static") set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS arrow_flight_sql_odbc_static ${ARROW_TEST_STATIC_LINK_LIBS}) else() @@ -58,32 +58,27 @@ 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 AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") # Static Windows tests - list(APPEND - ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS + 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_FLIGHT_SQL_ODBC_TEST_LINK_LIBS} + ${ARROW_TEST_STATIC_LINK_LIBS}) elseif(WIN32) - # Dynamic Windows tests (current behavior) + # 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() -# When Flight tests require static linkage, we must also add Arrow test libs to STATIC_LINK_LIBS -# to avoid add_arrow_test from adding shared Arrow test libs -if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") - list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS ${ARROW_TEST_STATIC_LINK_LIBS}) -endif() - add_arrow_test(flight_sql_odbc_test SOURCES ${ARROW_FLIGHT_SQL_ODBC_TEST_SRCS} From d9f91a74cf483bc65423b96f31cce371faebe374 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Fri, 10 Apr 2026 22:31:14 -0700 Subject: [PATCH 21/43] format --- cpp/src/arrow/flight/sql/odbc/CMakeLists.txt | 6 ++++-- cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt index e4c7955cf6e8..c5afd613658e 100644 --- a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt @@ -67,14 +67,16 @@ set(ARROW_FLIGHT_SQL_ODBC_SHARED_PRIVATE_LINK_LIBS "") if(WIN32) 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_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_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) diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index bd522c5089ab..b50be948a777 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -64,7 +64,8 @@ set(ARROW_FLIGHT_SQL_ODBC_TEST_EXTRA_LINK_LIBS "") set(ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS "") if(WIN32 AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") # Static Windows tests - list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS + 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} From 3fea98a8a8d210a8c2c25c700cdf3089d42a493e Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Tue, 21 Apr 2026 17:03:26 -0700 Subject: [PATCH 22/43] Fix rebase mistake --- cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index b50be948a777..7c17864aa629 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -48,10 +48,6 @@ if(ARROW_TEST_LINKAGE STREQUAL "static") else() set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS arrow_flight_sql_odbc_shared ${ARROW_TEST_SHARED_LINK_LIBS}) -else() - # GH-49651 Link ODBC tests statically on Linux to fix segfault - set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS arrow_flight_sql_odbc_static - ${ARROW_TEST_STATIC_LINK_LIBS}) endif() # On macOS, link `ODBCINST` first to ensure iodbc take precedence over unixodbc From 4b4f98004b93d596c33a6edb5f06abfb9b161304 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Tue, 21 Apr 2026 18:34:20 -0700 Subject: [PATCH 23/43] add workaround --- cpp/src/arrow/flight/CMakeLists.txt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/cpp/src/arrow/flight/CMakeLists.txt b/cpp/src/arrow/flight/CMakeLists.txt index 8974c9581f7c..e7e8c911610e 100644 --- a/cpp/src/arrow/flight/CMakeLists.txt +++ b/cpp/src/arrow/flight/CMakeLists.txt @@ -371,6 +371,23 @@ if(ARROW_BUILD_BENCHMARKS) endif(ARROW_BUILD_BENCHMARKS) +# Workaround for issue found in GH-49585. When building in Debug mode only, the +# linker complains about duplicate absl symbols. This seems to have started +# after GH-48964. Any new Flight tests probably need this. +if(WIN32 AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") + set(FLIGHT_TEST_EXES + arrow-flight-internals-test + arrow-flight-test + flight-test-server + arrow-flight-perf-server + arrow-flight-benchmark) + foreach(test_exe ${FLIGHT_TEST_EXES}) + if(TARGET ${test_exe}) + target_link_options(${test_exe} PRIVATE "/FORCE:MULTIPLE") + endif() + endforeach() +endif() + if(ARROW_FLIGHT_SQL) add_subdirectory(sql) From 087874f7b2ee5f295b7fc5e03de8236704df8de1 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Wed, 22 Apr 2026 05:22:38 +0000 Subject: [PATCH 24/43] update comment --- cpp/src/arrow/flight/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cpp/src/arrow/flight/CMakeLists.txt b/cpp/src/arrow/flight/CMakeLists.txt index e7e8c911610e..4505512d860e 100644 --- a/cpp/src/arrow/flight/CMakeLists.txt +++ b/cpp/src/arrow/flight/CMakeLists.txt @@ -372,8 +372,9 @@ if(ARROW_BUILD_BENCHMARKS) endif(ARROW_BUILD_BENCHMARKS) # Workaround for issue found in GH-49585. When building in Debug mode only, the -# linker complains about duplicate absl symbols. This seems to have started -# after GH-48964. Any new Flight tests probably need this. +# linker complains about duplicate absl symbols. It's not clear when this +# started but it may be related to the mixed dynamic and static linkage used in +# GH-49585. Flight tests probably need this. if(WIN32 AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") set(FLIGHT_TEST_EXES arrow-flight-internals-test From f73203ce0765fe702741b8790cf7b299a5817021 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Wed, 22 Apr 2026 14:19:50 -0700 Subject: [PATCH 25/43] fix rebase issue with linking --- cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index 7c17864aa629..c815bc33123e 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -42,12 +42,13 @@ set(ARROW_FLIGHT_SQL_ODBC_TEST_SRCS # GH-46889: move protobuf_test_util to a more common location ../../../../engine/substrait/protobuf_test_util.cc) -if(ARROW_TEST_LINKAGE STREQUAL "static") - set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS arrow_flight_sql_odbc_static - ${ARROW_TEST_STATIC_LINK_LIBS}) -else() +# GH-49651 Link ODBC tests statically on Linux and dynamically on macOS. +if(APPLE OR (WIN32 AND ARROW_TEST_LINKAGE STREQUAL "shared")) set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS arrow_flight_sql_odbc_shared ${ARROW_TEST_SHARED_LINK_LIBS}) +else() + set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS arrow_flight_sql_odbc_static + ${ARROW_TEST_STATIC_LINK_LIBS}) endif() # On macOS, link `ODBCINST` first to ensure iodbc take precedence over unixodbc From ccbfddd700f5550a10129b57069db69eed90d192 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Wed, 22 Apr 2026 14:21:38 -0700 Subject: [PATCH 26/43] restore comment --- cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index c815bc33123e..39d6afe483fd 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -47,6 +47,7 @@ if(APPLE OR (WIN32 AND ARROW_TEST_LINKAGE STREQUAL "shared")) set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS arrow_flight_sql_odbc_shared ${ARROW_TEST_SHARED_LINK_LIBS}) else() + # GH-49651 Link ODBC tests statically on Linux to fix segfault set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS arrow_flight_sql_odbc_static ${ARROW_TEST_STATIC_LINK_LIBS}) endif() From b188d5a4df8d3067cccc4c234589d2b2862ecd91 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Wed, 22 Apr 2026 14:29:34 -0700 Subject: [PATCH 27/43] update comment --- cpp/src/arrow/flight/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/src/arrow/flight/CMakeLists.txt b/cpp/src/arrow/flight/CMakeLists.txt index 4505512d860e..89331d4b31e7 100644 --- a/cpp/src/arrow/flight/CMakeLists.txt +++ b/cpp/src/arrow/flight/CMakeLists.txt @@ -374,7 +374,7 @@ endif(ARROW_BUILD_BENCHMARKS) # Workaround for issue found in GH-49585. When building in Debug mode only, the # linker complains about duplicate absl symbols. It's not clear when this # started but it may be related to the mixed dynamic and static linkage used in -# GH-49585. Flight tests probably need this. +# GH-49585 or to switching from /MT to /MD linkage. if(WIN32 AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") set(FLIGHT_TEST_EXES arrow-flight-internals-test From 8a2248b41c51b31f5dc32bf4b6e2aaf109e9de98 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Wed, 22 Apr 2026 16:28:03 -0700 Subject: [PATCH 28/43] fix more targets --- cpp/src/arrow/flight/CMakeLists.txt | 13 +++++++++---- cpp/src/arrow/flight/sql/CMakeLists.txt | 6 ++++++ cpp/src/arrow/flight/sql/odbc/CMakeLists.txt | 6 ++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/cpp/src/arrow/flight/CMakeLists.txt b/cpp/src/arrow/flight/CMakeLists.txt index 89331d4b31e7..4c8e75a67b1f 100644 --- a/cpp/src/arrow/flight/CMakeLists.txt +++ b/cpp/src/arrow/flight/CMakeLists.txt @@ -245,6 +245,12 @@ if(ARROW_BUILD_STATIC AND WIN32) target_compile_definitions(arrow_flight_static PUBLIC ARROW_FLIGHT_STATIC) endif() +if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug") + foreach(LIB_TARGET ${ARROW_FLIGHT_LIBRARIES}) + target_link_options(${LIB_TARGET} PRIVATE "/FORCE:MULTIPLE") + endforeach() +endif() + foreach(LIB_TARGET ${ARROW_FLIGHT_LIBRARIES}) target_compile_definitions(${LIB_TARGET} PRIVATE ARROW_FLIGHT_EXPORTING) endforeach() @@ -372,10 +378,9 @@ if(ARROW_BUILD_BENCHMARKS) endif(ARROW_BUILD_BENCHMARKS) # Workaround for issue found in GH-49585. When building in Debug mode only, the -# linker complains about duplicate absl symbols. It's not clear when this -# started but it may be related to the mixed dynamic and static linkage used in -# GH-49585 or to switching from /MT to /MD linkage. -if(WIN32 AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") +# linker complains about duplicate absl symbols. This seems to have started +# after GH-48964. Any new Flight tests probably need this. +if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") set(FLIGHT_TEST_EXES arrow-flight-internals-test arrow-flight-test diff --git a/cpp/src/arrow/flight/sql/CMakeLists.txt b/cpp/src/arrow/flight/sql/CMakeLists.txt index 2299bdfe0a3b..c22afdbc25ca 100644 --- a/cpp/src/arrow/flight/sql/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/CMakeLists.txt @@ -93,6 +93,12 @@ if(ARROW_BUILD_STATIC AND WIN32) target_compile_definitions(arrow_flight_sql_static PUBLIC ARROW_FLIGHT_SQL_STATIC) endif() +if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug") + foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_LIBRARIES}) + target_link_options(${LIB_TARGET} PRIVATE "/FORCE:MULTIPLE") + endforeach() +endif() + if(MSVC) # Suppress warnings caused by Protobuf (casts) set_source_files_properties(protocol_internal.cc PROPERTIES COMPILE_OPTIONS "/wd4267") diff --git a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt index c5afd613658e..6623c8543712 100644 --- a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt @@ -115,6 +115,12 @@ add_arrow_lib(arrow_flight_sql_odbc SHARED_PRIVATE_LINK_LIBS ${ARROW_FLIGHT_SQL_ODBC_SHARED_PRIVATE_LINK_LIBS}) +if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug") + foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_ODBC_LIBRARIES}) + target_link_options(${LIB_TARGET} PRIVATE "/FORCE:MULTIPLE") + endforeach() +endif() + foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_ODBC_LIBRARIES}) target_compile_definitions(${LIB_TARGET} PRIVATE ARROW_FLIGHT_SQL_ODBC_EXPORTING) endforeach() From 407c5608603af8445ac99b906b8ee9118e75ceba Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Wed, 22 Apr 2026 21:17:20 -0700 Subject: [PATCH 29/43] more fixes --- cpp/src/arrow/flight/CMakeLists.txt | 4 ++-- cpp/src/arrow/flight/sql/CMakeLists.txt | 11 +++++++++++ .../arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt | 9 +++++++++ cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt | 6 ++++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/cpp/src/arrow/flight/CMakeLists.txt b/cpp/src/arrow/flight/CMakeLists.txt index 4c8e75a67b1f..0824dd725c05 100644 --- a/cpp/src/arrow/flight/CMakeLists.txt +++ b/cpp/src/arrow/flight/CMakeLists.txt @@ -123,9 +123,9 @@ function(arrow_set_generated_proto_files_properties) set(GENERATED_FILES ${ARGN}) set_source_files_properties(${GENERATED_FILES} PROPERTIES GENERATED TRUE) if(MSVC) - # Suppress missing dll-interface warning + # Suppress missing dll-interface warnings set_source_files_properties(${GENERATED_FILES} - PROPERTIES COMPILE_OPTIONS "/wd4251" + PROPERTIES COMPILE_OPTIONS "/wd4251;/wd4275" SKIP_UNITY_BUILD_INCLUSION TRUE) elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") # Disable -Wmissing-declarations diff --git a/cpp/src/arrow/flight/sql/CMakeLists.txt b/cpp/src/arrow/flight/sql/CMakeLists.txt index c22afdbc25ca..5e7394ff7c60 100644 --- a/cpp/src/arrow/flight/sql/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/CMakeLists.txt @@ -105,6 +105,9 @@ if(MSVC) endif() foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_LIBRARIES}) target_compile_definitions(${LIB_TARGET} PRIVATE ARROW_FLIGHT_SQL_EXPORTING) + if(MSVC) + target_compile_options(${LIB_TARGET} PRIVATE "/wd4275") + endif() endforeach() if(ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static" AND ARROW_BUILD_STATIC) @@ -183,6 +186,14 @@ if(ARROW_BUILD_TESTS OR ARROW_BUILD_EXAMPLES) ARROW_FLIGHT_SQL_STATIC) endforeach() endif() + + if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") + foreach(TEST_TARGET arrow-flight-sql-test flight-sql-test-server flight-sql-test-app) + if(TARGET ${TEST_TARGET}) + target_link_options(${TEST_TARGET} PRIVATE "/FORCE:MULTIPLE") + endif() + endforeach() + endif() endif() if(ARROW_FLIGHT_SQL_ODBC) diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt index 46f400eafc80..25d6f1c80b10 100644 --- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt @@ -204,3 +204,12 @@ add_arrow_test(odbc_spi_impl_test ${ODBC_SPI_IMPL_TEST_EXTRA_LIBS} STATIC_LINK_LIBS ${ODBC_SPI_IMPL_TEST_STATIC_LIBS}) + +if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") + if(TARGET arrow_odbc_spi_impl_cli) + target_link_options(arrow_odbc_spi_impl_cli PRIVATE "/FORCE:MULTIPLE") + endif() + if(TARGET arrow-odbc-spi-impl-test) + target_link_options(arrow-odbc-spi-impl-test PRIVATE "/FORCE:MULTIPLE") + endif() +endif() diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index 39d6afe483fd..665a66773c1c 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -94,3 +94,9 @@ target_link_libraries(arrow-flight-sql-odbc-test PRIVATE ODBC::ODBC) # Disable unity build due to sqlite_sql_info.cc conflict with sql.h and sqlext.h headers. set_target_properties(arrow-flight-sql-odbc-test PROPERTIES UNITY_BUILD OFF) + +if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") + if(TARGET arrow-flight-sql-odbc-test) + target_link_options(arrow-flight-sql-odbc-test PRIVATE "/FORCE:MULTIPLE") + endif() +endif() From 345704c4e13881cce5580b20eb06ea729c6399d2 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Wed, 22 Apr 2026 21:12:15 -0700 Subject: [PATCH 30/43] update comments --- cpp/src/arrow/flight/CMakeLists.txt | 25 +++++++++++++++++--- cpp/src/arrow/flight/sql/CMakeLists.txt | 2 ++ cpp/src/arrow/flight/sql/odbc/CMakeLists.txt | 2 ++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/cpp/src/arrow/flight/CMakeLists.txt b/cpp/src/arrow/flight/CMakeLists.txt index 0824dd725c05..c9a8be409682 100644 --- a/cpp/src/arrow/flight/CMakeLists.txt +++ b/cpp/src/arrow/flight/CMakeLists.txt @@ -245,6 +245,7 @@ if(ARROW_BUILD_STATIC AND WIN32) target_compile_definitions(arrow_flight_static PUBLIC ARROW_FLIGHT_STATIC) endif() +# NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" below. if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug") foreach(LIB_TARGET ${ARROW_FLIGHT_LIBRARIES}) target_link_options(${LIB_TARGET} PRIVATE "/FORCE:MULTIPLE") @@ -377,9 +378,27 @@ if(ARROW_BUILD_BENCHMARKS) endif(ARROW_BUILD_BENCHMARKS) -# Workaround for issue found in GH-49585. When building in Debug mode only, the -# linker complains about duplicate absl symbols. This seems to have started -# after GH-48964. Any new Flight tests probably need this. +# NOTE-49585: Workaround for issue found in GH-49585. When building Flight +# targets with the combination of: +# +# - WIN32 +# - Debug +# - /MD linkage +# +# You get linker errors like this: +# +# absl_synchronization.lib(mutex.cc.obj) : error LNK2005: "private: void __cdecl absl::lts_20250814::Mutex::Dtor(void)" (?Dtor +# @Mutex@lts_20250814@absl@@AEAAXXZ) already defined in arrow_flight_static.lib(grpc_client.obj) [C:\path\to\arrow\cpp\static-debug-build\src\arrow\flight\sql\arrow-flight-sql-test.vcxproj] +# C:\path\to\arrow\cpp\static-debug-build\debug\Debug\arrow-flight-sql-test.exe : +# fatal error LNK1169: one or more multiply defined symbols found [C:\path\to\arrow\cpp\static-debug-build\src\arrow\flight\sql\arrow-flight-sql-test.vcxproj] +# Building Custom Rule C:/path/to/arrow/cpp/src/arrow/flight/CMakeLists.txt +# test_server.cc +# absl_synchronization.lib(mutex.cc.obj) : error LNK2005: "private: void __cdecl absl::lts_20250814::Mutex::Dtor(void)" (?Dtor +# @Mutex@lts_20250814@absl@@AEAAXXZ) already defined in arrow_flight_static.lib(protocol_grpc_internal.obj) [C:\path\to\arrow\cpp\static-debug-build\src\arrow\flight\flight-test-server.vcxproj] +# C:\path\to\arrow\cpp\static-debug-build\debug\Debug\flight-test-server.exe : fatal error +# LNK1169: one or more multiply defined symbols found [C:\path\to\arrow\cpp\static-debug-build\src\arrow\flight\flight-test-server.vcxproj] +# +# If you build in Release mode w/ /MD linkage you don't get these errors. if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") set(FLIGHT_TEST_EXES arrow-flight-internals-test diff --git a/cpp/src/arrow/flight/sql/CMakeLists.txt b/cpp/src/arrow/flight/sql/CMakeLists.txt index 5e7394ff7c60..eb103775919f 100644 --- a/cpp/src/arrow/flight/sql/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/CMakeLists.txt @@ -93,6 +93,8 @@ if(ARROW_BUILD_STATIC AND WIN32) target_compile_definitions(arrow_flight_sql_static PUBLIC ARROW_FLIGHT_SQL_STATIC) endif() +# NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" in +# ../CMakeLists.txt. if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug") foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_LIBRARIES}) target_link_options(${LIB_TARGET} PRIVATE "/FORCE:MULTIPLE") diff --git a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt index 6623c8543712..c801a07863ee 100644 --- a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt @@ -115,6 +115,8 @@ add_arrow_lib(arrow_flight_sql_odbc SHARED_PRIVATE_LINK_LIBS ${ARROW_FLIGHT_SQL_ODBC_SHARED_PRIVATE_LINK_LIBS}) +# NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" in +# ../../CMakeLists.txt. if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug") foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_ODBC_LIBRARIES}) target_link_options(${LIB_TARGET} PRIVATE "/FORCE:MULTIPLE") From 39babea6b9a798725ffb154f3fe402cf556d9c66 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Wed, 22 Apr 2026 21:29:27 -0700 Subject: [PATCH 31/43] update comments --- cpp/src/arrow/flight/CMakeLists.txt | 2 +- cpp/src/arrow/flight/sql/CMakeLists.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cpp/src/arrow/flight/CMakeLists.txt b/cpp/src/arrow/flight/CMakeLists.txt index c9a8be409682..b40171634b80 100644 --- a/cpp/src/arrow/flight/CMakeLists.txt +++ b/cpp/src/arrow/flight/CMakeLists.txt @@ -123,7 +123,7 @@ function(arrow_set_generated_proto_files_properties) set(GENERATED_FILES ${ARGN}) set_source_files_properties(${GENERATED_FILES} PROPERTIES GENERATED TRUE) if(MSVC) - # Suppress missing dll-interface warnings + # Suppress warnings caused by Protobuf (dll-interface) set_source_files_properties(${GENERATED_FILES} PROPERTIES COMPILE_OPTIONS "/wd4251;/wd4275" SKIP_UNITY_BUILD_INCLUSION TRUE) diff --git a/cpp/src/arrow/flight/sql/CMakeLists.txt b/cpp/src/arrow/flight/sql/CMakeLists.txt index eb103775919f..a42e2c862f23 100644 --- a/cpp/src/arrow/flight/sql/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/CMakeLists.txt @@ -108,6 +108,7 @@ endif() foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_LIBRARIES}) target_compile_definitions(${LIB_TARGET} PRIVATE ARROW_FLIGHT_SQL_EXPORTING) if(MSVC) + # Suppress warnings caused by Protobuf (dll-interface) target_compile_options(${LIB_TARGET} PRIVATE "/wd4275") endif() endforeach() From 84d59f647fb4cf2543f21cf47351b482f3b34335 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Wed, 22 Apr 2026 21:19:38 -0700 Subject: [PATCH 32/43] comments --- cpp/src/arrow/flight/sql/CMakeLists.txt | 2 ++ cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/cpp/src/arrow/flight/sql/CMakeLists.txt b/cpp/src/arrow/flight/sql/CMakeLists.txt index a42e2c862f23..cb21b233b1dc 100644 --- a/cpp/src/arrow/flight/sql/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/CMakeLists.txt @@ -190,6 +190,8 @@ if(ARROW_BUILD_TESTS OR ARROW_BUILD_EXAMPLES) endforeach() endif() + # NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" in + # ../CMakeLists.txt. if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") foreach(TEST_TARGET arrow-flight-sql-test flight-sql-test-server flight-sql-test-app) if(TARGET ${TEST_TARGET}) diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt index 25d6f1c80b10..08d449b50727 100644 --- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt @@ -205,6 +205,8 @@ add_arrow_test(odbc_spi_impl_test STATIC_LINK_LIBS ${ODBC_SPI_IMPL_TEST_STATIC_LIBS}) +# NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" in +# ../../../CMakeLists.txt. if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") if(TARGET arrow_odbc_spi_impl_cli) target_link_options(arrow_odbc_spi_impl_cli PRIVATE "/FORCE:MULTIPLE") From 8d9141af6ea0ac7105fcf3bfa79d68c805c725f7 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Wed, 22 Apr 2026 21:37:37 -0700 Subject: [PATCH 33/43] guard overrides better --- cpp/src/arrow/flight/CMakeLists.txt | 2 +- cpp/src/arrow/flight/sql/CMakeLists.txt | 2 +- cpp/src/arrow/flight/sql/odbc/CMakeLists.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cpp/src/arrow/flight/CMakeLists.txt b/cpp/src/arrow/flight/CMakeLists.txt index b40171634b80..f684517f0dbf 100644 --- a/cpp/src/arrow/flight/CMakeLists.txt +++ b/cpp/src/arrow/flight/CMakeLists.txt @@ -246,7 +246,7 @@ if(ARROW_BUILD_STATIC AND WIN32) endif() # NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" below. -if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug") +if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") foreach(LIB_TARGET ${ARROW_FLIGHT_LIBRARIES}) target_link_options(${LIB_TARGET} PRIVATE "/FORCE:MULTIPLE") endforeach() diff --git a/cpp/src/arrow/flight/sql/CMakeLists.txt b/cpp/src/arrow/flight/sql/CMakeLists.txt index cb21b233b1dc..b9fb0bb0862b 100644 --- a/cpp/src/arrow/flight/sql/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/CMakeLists.txt @@ -95,7 +95,7 @@ endif() # NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" in # ../CMakeLists.txt. -if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug") +if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_LIBRARIES}) target_link_options(${LIB_TARGET} PRIVATE "/FORCE:MULTIPLE") endforeach() diff --git a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt index c801a07863ee..f7780fcd0005 100644 --- a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt @@ -117,7 +117,7 @@ add_arrow_lib(arrow_flight_sql_odbc # NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" in # ../../CMakeLists.txt. -if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug") +if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_ODBC_LIBRARIES}) target_link_options(${LIB_TARGET} PRIVATE "/FORCE:MULTIPLE") endforeach() From f58e3f7f3667e45de931666550f01d50621cbea2 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Thu, 23 Apr 2026 04:55:27 +0000 Subject: [PATCH 34/43] cmake-format --- .github/workflows/cpp_extra.yml | 8 -------- .github/workflows/package_odbc.yml | 11 +++++++---- cpp/src/arrow/flight/CMakeLists.txt | 8 ++++++-- cpp/src/arrow/flight/sql/CMakeLists.txt | 8 ++++++-- cpp/src/arrow/flight/sql/odbc/CMakeLists.txt | 4 +++- .../arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt | 4 +++- cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt | 4 +++- 7 files changed, 28 insertions(+), 19 deletions(-) diff --git a/.github/workflows/cpp_extra.yml b/.github/workflows/cpp_extra.yml index 6a3380f87b34..bbd5a46f4125 100644 --- a/.github/workflows/cpp_extra.yml +++ b/.github/workflows/cpp_extra.yml @@ -718,14 +718,6 @@ jobs: VCPKG_DEFAULT_TRIPLET: amd64-windows-no-absl-sync-release VCPKG_OVERLAY_TRIPLETS: ${{ github.workspace }}/ci/vcpkg steps: - - name: Disable Crash Dialogs - run: | - reg add ` - "HKCU\SOFTWARE\Microsoft\Windows\Windows Error Reporting" ` - /v DontShowUI ` - /t REG_DWORD ` - /d 1 ` - /f - name: Checkout Arrow uses: actions/checkout@v7 with: diff --git a/.github/workflows/package_odbc.yml b/.github/workflows/package_odbc.yml index cc2aad00aca7..8bab30e5b4c1 100644 --- a/.github/workflows/package_odbc.yml +++ b/.github/workflows/package_odbc.yml @@ -50,21 +50,24 @@ jobs: permissions: packages: write env: &odbc_msvc_env - ARROW_BUILD_SHARED: ON - ARROW_BUILD_STATIC: OFF + ARROW_BUILD_SHARED: OFF + ARROW_BUILD_STATIC: ON ARROW_BUILD_TESTS: OFF ARROW_BUILD_TYPE: release - # Turn Arrow CSV off to disable `find_package(Arrow)` check on MSVC CI. + # 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: Checkout Arrow uses: actions/checkout@v7 diff --git a/cpp/src/arrow/flight/CMakeLists.txt b/cpp/src/arrow/flight/CMakeLists.txt index f684517f0dbf..bac9090e61a4 100644 --- a/cpp/src/arrow/flight/CMakeLists.txt +++ b/cpp/src/arrow/flight/CMakeLists.txt @@ -246,7 +246,9 @@ if(ARROW_BUILD_STATIC AND WIN32) endif() # NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" below. -if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") +if(WIN32 + AND CMAKE_BUILD_TYPE STREQUAL "Debug" + AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") foreach(LIB_TARGET ${ARROW_FLIGHT_LIBRARIES}) target_link_options(${LIB_TARGET} PRIVATE "/FORCE:MULTIPLE") endforeach() @@ -399,7 +401,9 @@ endif(ARROW_BUILD_BENCHMARKS) # LNK1169: one or more multiply defined symbols found [C:\path\to\arrow\cpp\static-debug-build\src\arrow\flight\flight-test-server.vcxproj] # # If you build in Release mode w/ /MD linkage you don't get these errors. -if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") +if(WIN32 + AND CMAKE_BUILD_TYPE STREQUAL "Debug" + AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") set(FLIGHT_TEST_EXES arrow-flight-internals-test arrow-flight-test diff --git a/cpp/src/arrow/flight/sql/CMakeLists.txt b/cpp/src/arrow/flight/sql/CMakeLists.txt index b9fb0bb0862b..6d60481bbfce 100644 --- a/cpp/src/arrow/flight/sql/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/CMakeLists.txt @@ -95,7 +95,9 @@ endif() # NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" in # ../CMakeLists.txt. -if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") +if(WIN32 + AND CMAKE_BUILD_TYPE STREQUAL "Debug" + AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_LIBRARIES}) target_link_options(${LIB_TARGET} PRIVATE "/FORCE:MULTIPLE") endforeach() @@ -192,7 +194,9 @@ if(ARROW_BUILD_TESTS OR ARROW_BUILD_EXAMPLES) # NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" in # ../CMakeLists.txt. - if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") + if(WIN32 + AND CMAKE_BUILD_TYPE STREQUAL "Debug" + AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") foreach(TEST_TARGET arrow-flight-sql-test flight-sql-test-server flight-sql-test-app) if(TARGET ${TEST_TARGET}) target_link_options(${TEST_TARGET} PRIVATE "/FORCE:MULTIPLE") diff --git a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt index f7780fcd0005..920db65da2be 100644 --- a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt @@ -117,7 +117,9 @@ add_arrow_lib(arrow_flight_sql_odbc # NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" in # ../../CMakeLists.txt. -if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") +if(WIN32 + AND CMAKE_BUILD_TYPE STREQUAL "Debug" + AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_ODBC_LIBRARIES}) target_link_options(${LIB_TARGET} PRIVATE "/FORCE:MULTIPLE") endforeach() diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt index 08d449b50727..6300f5c735af 100644 --- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt @@ -207,7 +207,9 @@ add_arrow_test(odbc_spi_impl_test # NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" in # ../../../CMakeLists.txt. -if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") +if(WIN32 + AND CMAKE_BUILD_TYPE STREQUAL "Debug" + AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") if(TARGET arrow_odbc_spi_impl_cli) target_link_options(arrow_odbc_spi_impl_cli PRIVATE "/FORCE:MULTIPLE") endif() diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index 665a66773c1c..dd67ebef3506 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -95,7 +95,9 @@ target_link_libraries(arrow-flight-sql-odbc-test PRIVATE ODBC::ODBC) # Disable unity build due to sqlite_sql_info.cc conflict with sql.h and sqlext.h headers. set_target_properties(arrow-flight-sql-odbc-test PROPERTIES UNITY_BUILD OFF) -if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") +if(WIN32 + AND CMAKE_BUILD_TYPE STREQUAL "Debug" + AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") if(TARGET arrow-flight-sql-odbc-test) target_link_options(arrow-flight-sql-odbc-test PRIVATE "/FORCE:MULTIPLE") endif() From 7968325206b1b2737d58ba21819340d7696f2aab Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Tue, 9 Jun 2026 15:44:12 -0700 Subject: [PATCH 35/43] format --- .../arrow/flight/sql/odbc/tests/odbc_test_suite.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc b/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc index 3fbc1ceb164b..f3c6ba58c89a 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc +++ b/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc @@ -244,14 +244,16 @@ void ODBCTestBase::TearDownTestSuite() { // When tests are run through CTest (but NOT when run directly from cmd.exe), // SQLFreeHandle(SQL_HANDLE_ENV) crashes during cleanup. The crash occurs only with // static linkage (ARROW_TEST_LINKAGE=static) and happens while freeing the ODBC - // environment handle, which triggers cleanup of statically-linked gRPC/Flight resources. + // environment handle, which triggers cleanup of statically-linked gRPC/Flight + // resources. // - // Root cause appears to be CTest's process management (signal handling, I/O redirection, - // or environment differences) interfering with gRPC cleanup during static destruction. + // Root cause appears to be CTest's process management (signal handling, I/O + // redirection, or environment differences) interfering with gRPC cleanup during + // static destruction. // // This workaround leaks the ODBC handles but allows tests to complete successfully. - // A proper fix would require ensuring gRPC is kept alive until all ODBC handles are freed, - // or switching to dynamic linkage for tests. + // A proper fix would require ensuring gRPC is kept alive until all ODBC handles are + // freed, or switching to dynamic linkage for tests. // // Disconnect(); connected = false; From 24b86b1a8cd938c3e46dabb4171fba02bf7c8e82 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Thu, 24 Sep 2026 07:44:33 -0700 Subject: [PATCH 36/43] use static test linkage --- .github/workflows/cpp_extra.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cpp_extra.yml b/.github/workflows/cpp_extra.yml index bbd5a46f4125..6c12048050f0 100644 --- a/.github/workflows/cpp_extra.yml +++ b/.github/workflows/cpp_extra.yml @@ -708,7 +708,7 @@ jobs: ARROW_CXXFLAGS: -DGPR_DISABLE_ABSEIL_SYNC ARROW_DEPENDENCY_USE_SHARED: OFF ARROW_MIMALLOC: OFF - ARROW_TEST_LINKAGE: shared + ARROW_TEST_LINKAGE: static ARROW_USE_STATIC_CRT: OFF CMAKE_GENERATOR: Ninja CMAKE_INSTALL_PREFIX: /usr From ad2eea62ef899fb0bdcc31a284d8e28a2e8d5069 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Thu, 24 Sep 2026 07:44:58 -0700 Subject: [PATCH 37/43] Update CMakeLists.txt --- cpp/src/arrow/flight/sql/odbc/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt index 920db65da2be..db25ed35c3b6 100644 --- a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt @@ -92,6 +92,8 @@ else() endif() add_arrow_lib(arrow_flight_sql_odbc + BUILD_SHARED + ON CMAKE_PACKAGE_NAME ArrowFlightSqlOdbc PKG_CONFIG_NAME From 648c38e3e59019d13bc9c95049d5d5ba5a713525 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Thu, 24 Sep 2026 07:45:10 -0700 Subject: [PATCH 38/43] format --- .../arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt index 6300f5c735af..aad72563d0c7 100644 --- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt @@ -135,12 +135,18 @@ if(WIN32) target_include_directories(arrow_odbc_spi_impl PUBLIC ${ODBC_INCLUDE_DIR}) if(ARROW_BUILD_STATIC) target_link_libraries(arrow_odbc_spi_impl - PUBLIC arrow_flight_sql_static arrow_compute_static - Boost::locale arrow::simdjson ${ODBCINST}) + PUBLIC arrow_flight_sql_static + arrow_compute_static + Boost::locale + arrow::simdjson + ${ODBCINST}) else() target_link_libraries(arrow_odbc_spi_impl - PUBLIC arrow_flight_sql_shared arrow_compute_shared - Boost::locale arrow::simdjson ${ODBCINST}) + PUBLIC arrow_flight_sql_shared + arrow_compute_shared + Boost::locale + arrow::simdjson + ${ODBCINST}) endif() else() # Unix From ba44f7b46768b1ef254a642538832fc3d1cde6cb Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Thu, 24 Sep 2026 07:45:31 -0700 Subject: [PATCH 39/43] prefer ARROW_FLIGHT_TEST_LINKAGE --- cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index dd67ebef3506..0bec22bf2102 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -43,7 +43,7 @@ set(ARROW_FLIGHT_SQL_ODBC_TEST_SRCS ../../../../engine/substrait/protobuf_test_util.cc) # GH-49651 Link ODBC tests statically on Linux and dynamically on macOS. -if(APPLE OR (WIN32 AND ARROW_TEST_LINKAGE STREQUAL "shared")) +if(APPLE OR (WIN32 AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "shared")) set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS arrow_flight_sql_odbc_shared ${ARROW_TEST_SHARED_LINK_LIBS}) else() @@ -66,8 +66,7 @@ if(WIN32 AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") 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}) + ${ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS}) elseif(WIN32) # Dynamic Windows tests list(APPEND ARROW_FLIGHT_SQL_ODBC_TEST_EXTRA_LINK_LIBS arrow_odbc_spi_impl From 23606fe0dba528c9cd55fdaeef4fed8a0546cca1 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Thu, 24 Sep 2026 07:46:32 -0700 Subject: [PATCH 40/43] cleanup from rebase --- .../flight/sql/odbc/tests/odbc_test_suite.cc | 34 +------------------ 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc b/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc index f3c6ba58c89a..3125c18b92ac 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc +++ b/cpp/src/arrow/flight/sql/odbc/tests/odbc_test_suite.cc @@ -232,39 +232,7 @@ void ODBCTestBase::SetUp() { } void ODBCTestBase::TearDown() { - if (connected) { - ASSERT_EQ(SQL_SUCCESS, SQLFreeHandle(SQL_HANDLE_STMT, stmt)); - } -} - -void ODBCTestBase::TearDownTestSuite() { - if (connected) { - // WORKAROUND GH-49585: Skip Disconnect() to avoid segfault when run through CTest - // - // When tests are run through CTest (but NOT when run directly from cmd.exe), - // SQLFreeHandle(SQL_HANDLE_ENV) crashes during cleanup. The crash occurs only with - // static linkage (ARROW_TEST_LINKAGE=static) and happens while freeing the ODBC - // environment handle, which triggers cleanup of statically-linked gRPC/Flight - // resources. - // - // Root cause appears to be CTest's process management (signal handling, I/O - // redirection, or environment differences) interfering with gRPC cleanup during - // static destruction. - // - // This workaround leaks the ODBC handles but allows tests to complete successfully. - // A proper fix would require ensuring gRPC is kept alive until all ODBC handles are - // freed, or switching to dynamic linkage for tests. - // - // Disconnect(); - connected = false; - } -} - -void FlightSQLODBCRemoteTestBase::CheckForRemoteTest() { - if (arrow::internal::GetEnvVar(kTestConnectStr.data()).ValueOr("").empty()) { - skipping_test = true; - GTEST_SKIP() << "Skipping test: kTestConnectStr not set"; - } + ASSERT_EQ(SQL_SUCCESS, SQLFreeHandle(SQL_HANDLE_STMT, stmt)); } void FlightSQLODBCRemoteTestBase::SetUpTestSuite() { From 07dfafcd3417b15a1d5a6ceba29c73655e424946 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Thu, 24 Sep 2026 08:01:44 -0700 Subject: [PATCH 41/43] simplify ODBC test linkage --- .../flight/sql/odbc/tests/CMakeLists.txt | 60 +++++++++---------- 1 file changed, 27 insertions(+), 33 deletions(-) diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index 0bec22bf2102..0dcab3bbe5f1 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -42,39 +42,35 @@ set(ARROW_FLIGHT_SQL_ODBC_TEST_SRCS # GH-46889: move protobuf_test_util to a more common location ../../../../engine/substrait/protobuf_test_util.cc) -# GH-49651 Link ODBC tests statically on Linux and dynamically on macOS. -if(APPLE OR (WIN32 AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "shared")) - set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS arrow_flight_sql_odbc_shared - ${ARROW_TEST_SHARED_LINK_LIBS}) -else() - # GH-49651 Link ODBC tests statically on Linux to fix segfault - set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS arrow_flight_sql_odbc_static - ${ARROW_TEST_STATIC_LINK_LIBS}) -endif() - -# On macOS, link `ODBCINST` first to ensure iodbc take precedence over unixodbc +# On macOS, link `ODBCINST` first to ensure iodbc takes precedence over unixodbc. set(ARROW_FLIGHT_SQL_ODBC_TEST_LIBS ${ODBCINST} ${ODBC_LIBRARIES} ${SQLite3_LIBRARIES}) -# On Windows, dynamic linking ODBC is supported, tests link libraries dynamically. -# 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 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}) +# STATIC_LINK_LIBS replaces add_arrow_test's default Arrow test libraries, while +# EXTRA_LINK_LIBS supplements them. +if(WIN32 AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "shared") + set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_MODE EXTRA_LINK_LIBS) + set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS arrow_odbc_spi_impl + ${ARROW_FLIGHT_SQL_ODBC_TEST_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}) + set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_MODE STATIC_LINK_LIBS) + set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS + arrow_odbc_spi_impl ${ARROW_FLIGHT_SQL_ODBC_TEST_LIBS} arrow_flight_sql_odbc_static + ${ARROW_TEST_STATIC_LINK_LIBS}) +elseif(APPLE) + # GH-49651: Link the ODBC driver dynamically on macOS. + set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_MODE STATIC_LINK_LIBS) + set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS + ${ARROW_FLIGHT_SQL_ODBC_TEST_LIBS} arrow_flight_sql_odbc_shared + ${ARROW_TEST_SHARED_LINK_LIBS}) else() - # 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}) + # GH-49651: Link the ODBC driver statically on Linux to avoid a segfault. + set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_MODE STATIC_LINK_LIBS) + set(ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS + ${ARROW_FLIGHT_SQL_ODBC_TEST_LIBS} + arrow_flight_sql_odbc_static + ${ARROW_TEST_STATIC_LINK_LIBS} + arrow_odbc_spi_impl + ${ARROW_PROTOBUF_LIBPROTOBUF}) endif() add_arrow_test(flight_sql_odbc_test @@ -83,10 +79,8 @@ add_arrow_test(flight_sql_odbc_test ${ARROW_FLIGHT_SQL_MOCK_SERVER_SRCS} DEFINITIONS UNICODE - EXTRA_LINK_LIBS - ${ARROW_FLIGHT_SQL_ODBC_TEST_EXTRA_LINK_LIBS} - STATIC_LINK_LIBS - ${ARROW_FLIGHT_SQL_ODBC_TEST_STATIC_LINK_LIBS}) + ${ARROW_FLIGHT_SQL_ODBC_TEST_LINK_MODE} + ${ARROW_FLIGHT_SQL_ODBC_TEST_LINK_LIBS}) find_package(ODBC REQUIRED) target_link_libraries(arrow-flight-sql-odbc-test PRIVATE ODBC::ODBC) From da794e5d4dd108b5d1b968bc064d7cf239a76085 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Fri, 25 Sep 2026 12:03:40 -0700 Subject: [PATCH 42/43] GH-49538: Match GTest try-compile configuration --- cpp/cmake_modules/FindGTestAlt.cmake | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cpp/cmake_modules/FindGTestAlt.cmake b/cpp/cmake_modules/FindGTestAlt.cmake index d1873d138e6c..766fbfc94229 100644 --- a/cpp/cmake_modules/FindGTestAlt.cmake +++ b/cpp/cmake_modules/FindGTestAlt.cmake @@ -38,7 +38,12 @@ find_package(GTest ${find_package_args}) set(GTestAlt_FOUND ${GTest_FOUND}) if(GTestAlt_FOUND AND GTestAlt_NEED_CXX_STANDARD_CHECK) set(KEEP_CMAKE_TRY_COMPILE_TARGET_TYPE ${CMAKE_TRY_COMPILE_TARGET_TYPE}) + set(KEEP_CMAKE_TRY_COMPILE_CONFIGURATION ${CMAKE_TRY_COMPILE_CONFIGURATION}) set(CMAKE_TRY_COMPILE_TARGET_TYPE EXECUTABLE) + # Match the parent build when dependencies are available for only one configuration. + if(NOT CMAKE_TRY_COMPILE_CONFIGURATION) + set(CMAKE_TRY_COMPILE_CONFIGURATION ${CMAKE_BUILD_TYPE}) + endif() set(GTestAlt_CXX_STANDARD_TEST_SOURCE "${CMAKE_CURRENT_BINARY_DIR}/gtest_cxx_standard_test.cc") file(WRITE ${GTestAlt_CXX_STANDARD_TEST_SOURCE} @@ -56,6 +61,7 @@ TEST(CXX_STANDARD, MatcherStringView) { LINK_LIBRARIES GTest::gtest_main OUTPUT_VARIABLE GTestAlt_CXX_STANDARD_OUTPUT) set(CMAKE_TRY_COMPILE_TARGET_TYPE ${KEEP_CMAKE_TRY_COMPILE_TARGET_TYPE}) + set(CMAKE_TRY_COMPILE_CONFIGURATION ${KEEP_CMAKE_TRY_COMPILE_CONFIGURATION}) if(NOT GTestAlt_CXX_STANDARD_AVAILABLE) message(STATUS "GTest can't be used with C++${CMAKE_CXX_STANDARD}.") message(STATUS "Use -DGTest_SOURCE=BUNDLED.") From 746f8c84a1c7a2f71a6470f1043efda091ca5c97 Mon Sep 17 00:00:00 2001 From: Bryce Mecum Date: Fri, 25 Sep 2026 15:31:23 -0700 Subject: [PATCH 43/43] test better fix --- cpp/src/arrow/flight/CMakeLists.txt | 46 ------------------- cpp/src/arrow/flight/sql/CMakeLists.txt | 21 --------- cpp/src/arrow/flight/sql/odbc/CMakeLists.txt | 10 ---- .../flight/sql/odbc/odbc_impl/CMakeLists.txt | 13 ------ .../flight/sql/odbc/tests/CMakeLists.txt | 8 ---- .../flight/transport/grpc/customize_grpc.h | 38 ++++++++++++--- 6 files changed, 32 insertions(+), 104 deletions(-) diff --git a/cpp/src/arrow/flight/CMakeLists.txt b/cpp/src/arrow/flight/CMakeLists.txt index bac9090e61a4..91afab15702a 100644 --- a/cpp/src/arrow/flight/CMakeLists.txt +++ b/cpp/src/arrow/flight/CMakeLists.txt @@ -245,15 +245,6 @@ if(ARROW_BUILD_STATIC AND WIN32) target_compile_definitions(arrow_flight_static PUBLIC ARROW_FLIGHT_STATIC) endif() -# NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" below. -if(WIN32 - AND CMAKE_BUILD_TYPE STREQUAL "Debug" - AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") - foreach(LIB_TARGET ${ARROW_FLIGHT_LIBRARIES}) - target_link_options(${LIB_TARGET} PRIVATE "/FORCE:MULTIPLE") - endforeach() -endif() - foreach(LIB_TARGET ${ARROW_FLIGHT_LIBRARIES}) target_compile_definitions(${LIB_TARGET} PRIVATE ARROW_FLIGHT_EXPORTING) endforeach() @@ -380,43 +371,6 @@ if(ARROW_BUILD_BENCHMARKS) endif(ARROW_BUILD_BENCHMARKS) -# NOTE-49585: Workaround for issue found in GH-49585. When building Flight -# targets with the combination of: -# -# - WIN32 -# - Debug -# - /MD linkage -# -# You get linker errors like this: -# -# absl_synchronization.lib(mutex.cc.obj) : error LNK2005: "private: void __cdecl absl::lts_20250814::Mutex::Dtor(void)" (?Dtor -# @Mutex@lts_20250814@absl@@AEAAXXZ) already defined in arrow_flight_static.lib(grpc_client.obj) [C:\path\to\arrow\cpp\static-debug-build\src\arrow\flight\sql\arrow-flight-sql-test.vcxproj] -# C:\path\to\arrow\cpp\static-debug-build\debug\Debug\arrow-flight-sql-test.exe : -# fatal error LNK1169: one or more multiply defined symbols found [C:\path\to\arrow\cpp\static-debug-build\src\arrow\flight\sql\arrow-flight-sql-test.vcxproj] -# Building Custom Rule C:/path/to/arrow/cpp/src/arrow/flight/CMakeLists.txt -# test_server.cc -# absl_synchronization.lib(mutex.cc.obj) : error LNK2005: "private: void __cdecl absl::lts_20250814::Mutex::Dtor(void)" (?Dtor -# @Mutex@lts_20250814@absl@@AEAAXXZ) already defined in arrow_flight_static.lib(protocol_grpc_internal.obj) [C:\path\to\arrow\cpp\static-debug-build\src\arrow\flight\flight-test-server.vcxproj] -# C:\path\to\arrow\cpp\static-debug-build\debug\Debug\flight-test-server.exe : fatal error -# LNK1169: one or more multiply defined symbols found [C:\path\to\arrow\cpp\static-debug-build\src\arrow\flight\flight-test-server.vcxproj] -# -# If you build in Release mode w/ /MD linkage you don't get these errors. -if(WIN32 - AND CMAKE_BUILD_TYPE STREQUAL "Debug" - AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") - set(FLIGHT_TEST_EXES - arrow-flight-internals-test - arrow-flight-test - flight-test-server - arrow-flight-perf-server - arrow-flight-benchmark) - foreach(test_exe ${FLIGHT_TEST_EXES}) - if(TARGET ${test_exe}) - target_link_options(${test_exe} PRIVATE "/FORCE:MULTIPLE") - endif() - endforeach() -endif() - if(ARROW_FLIGHT_SQL) add_subdirectory(sql) diff --git a/cpp/src/arrow/flight/sql/CMakeLists.txt b/cpp/src/arrow/flight/sql/CMakeLists.txt index 6d60481bbfce..6e01672248d5 100644 --- a/cpp/src/arrow/flight/sql/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/CMakeLists.txt @@ -93,16 +93,6 @@ if(ARROW_BUILD_STATIC AND WIN32) target_compile_definitions(arrow_flight_sql_static PUBLIC ARROW_FLIGHT_SQL_STATIC) endif() -# NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" in -# ../CMakeLists.txt. -if(WIN32 - AND CMAKE_BUILD_TYPE STREQUAL "Debug" - AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") - foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_LIBRARIES}) - target_link_options(${LIB_TARGET} PRIVATE "/FORCE:MULTIPLE") - endforeach() -endif() - if(MSVC) # Suppress warnings caused by Protobuf (casts) set_source_files_properties(protocol_internal.cc PROPERTIES COMPILE_OPTIONS "/wd4267") @@ -192,17 +182,6 @@ if(ARROW_BUILD_TESTS OR ARROW_BUILD_EXAMPLES) endforeach() endif() - # NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" in - # ../CMakeLists.txt. - if(WIN32 - AND CMAKE_BUILD_TYPE STREQUAL "Debug" - AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") - foreach(TEST_TARGET arrow-flight-sql-test flight-sql-test-server flight-sql-test-app) - if(TARGET ${TEST_TARGET}) - target_link_options(${TEST_TARGET} PRIVATE "/FORCE:MULTIPLE") - endif() - endforeach() - endif() endif() if(ARROW_FLIGHT_SQL_ODBC) diff --git a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt index db25ed35c3b6..178d144bac32 100644 --- a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt @@ -117,16 +117,6 @@ add_arrow_lib(arrow_flight_sql_odbc SHARED_PRIVATE_LINK_LIBS ${ARROW_FLIGHT_SQL_ODBC_SHARED_PRIVATE_LINK_LIBS}) -# NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" in -# ../../CMakeLists.txt. -if(WIN32 - AND CMAKE_BUILD_TYPE STREQUAL "Debug" - AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") - foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_ODBC_LIBRARIES}) - target_link_options(${LIB_TARGET} PRIVATE "/FORCE:MULTIPLE") - endforeach() -endif() - foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_ODBC_LIBRARIES}) target_compile_definitions(${LIB_TARGET} PRIVATE ARROW_FLIGHT_SQL_ODBC_EXPORTING) endforeach() diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt index aad72563d0c7..4d990b3e89a1 100644 --- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/CMakeLists.txt @@ -210,16 +210,3 @@ add_arrow_test(odbc_spi_impl_test ${ODBC_SPI_IMPL_TEST_EXTRA_LIBS} STATIC_LINK_LIBS ${ODBC_SPI_IMPL_TEST_STATIC_LIBS}) - -# NOTE-49585: Workaround for issue found in GH-49585. See "NOTE-49585" in -# ../../../CMakeLists.txt. -if(WIN32 - AND CMAKE_BUILD_TYPE STREQUAL "Debug" - AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") - if(TARGET arrow_odbc_spi_impl_cli) - target_link_options(arrow_odbc_spi_impl_cli PRIVATE "/FORCE:MULTIPLE") - endif() - if(TARGET arrow-odbc-spi-impl-test) - target_link_options(arrow-odbc-spi-impl-test PRIVATE "/FORCE:MULTIPLE") - endif() -endif() diff --git a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt index 0dcab3bbe5f1..21936d50936f 100644 --- a/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt @@ -87,11 +87,3 @@ target_link_libraries(arrow-flight-sql-odbc-test PRIVATE ODBC::ODBC) # Disable unity build due to sqlite_sql_info.cc conflict with sql.h and sqlext.h headers. set_target_properties(arrow-flight-sql-odbc-test PROPERTIES UNITY_BUILD OFF) - -if(WIN32 - AND CMAKE_BUILD_TYPE STREQUAL "Debug" - AND ARROW_FLIGHT_TEST_LINKAGE STREQUAL "static") - if(TARGET arrow-flight-sql-odbc-test) - target_link_options(arrow-flight-sql-odbc-test PRIVATE "/FORCE:MULTIPLE") - endif() -endif() diff --git a/cpp/src/arrow/flight/transport/grpc/customize_grpc.h b/cpp/src/arrow/flight/transport/grpc/customize_grpc.h index 7836f7c161d6..4a64e4e07214 100644 --- a/cpp/src/arrow/flight/transport/grpc/customize_grpc.h +++ b/cpp/src/arrow/flight/transport/grpc/customize_grpc.h @@ -20,16 +20,42 @@ #include #include +#if __has_include() + // HACK: Workaround absl::Mutex ABI incompatibility by making sure the // non-debug version of Abseil is included // (https://github.com/conda-forge/abseil-cpp-feedstock/issues/104, // https://github.com/abseil/abseil-cpp/issues/1624) - -#if __has_include() - -# ifndef NDEBUG -# define ARROW_NO_NDEBUG -# define NDEBUG +// +// Abseil picks where Mutex::Dtor lives based on NDEBUG: +// +// mutex.h: #if defined(NDEBUG) && !ABSL_HAVE_THREAD_SANITIZER && +// !ABSL_BUILD_DLL -> inline, emitted into this TU +// mutex.cc: #if !defined(NDEBUG) || ABSL_HAVE_THREAD_SANITIZER || +// ABSL_BUILD_DLL -> strong, out-of-line +// +// Defining NDEBUG here makes this TU emit its own inline Mutex::Dtor. Whether +// that helps or hurts depends on how the Abseil we link against was built: +// +// - Abseil built *with* NDEBUG (the conda case above): it inlined Dtor away +// and never exported it, so a debug TU that expects the out-of-line symbol +// gets an undefined reference. Emitting our own copy fixes that. +// +// - Abseil built *without* NDEBUG (a Debug vcpkg/system build): it has the +// strong out-of-line Dtor. Emitting our own copy is then a duplicate +// definition, which a *static* Abseil turns into LNK2005 (GH-49585). With a +// shared Abseil it is harmless, since the definitions live in separate +// images. +// +// So restrict the hack to the cases where it cannot produce a duplicate: +// anything that is not MSVC-linking-static-Abseil. On MSVC, Abseil's CMake puts +// ABSL_CONSUME_DLL in the INTERFACE compile definitions of its targets, so its +// presence tells us we are consuming the DLL rather than the static library. +# if !defined(_MSC_VER) || defined(ABSL_CONSUME_DLL) +# ifndef NDEBUG +# define ARROW_NO_NDEBUG +# define NDEBUG +# endif # endif # include