From 65b9bd427360979d4c431067fd56e218874ffc4b Mon Sep 17 00:00:00 2001 From: "Alina (Xi) Li" Date: Wed, 21 Jan 2026 13:36:53 -0800 Subject: [PATCH 01/10] Upload ODBC installer into GitHub release as RC Add ODBC to `05-binary-upload.sh` Undo move path for installer Work on Raul's comments - Modify the tag to be triggered only on RCs. - add ODBC msi to the binary download. Apply kou's suggestion Remove commented out test --- .github/workflows/cpp_extra.yml | 53 +++++++++++++++++++++++++++++++ dev/release/04-binary-download.sh | 1 + dev/release/05-binary-upload.sh | 5 +++ 3 files changed, 59 insertions(+) diff --git a/.github/workflows/cpp_extra.yml b/.github/workflows/cpp_extra.yml index 8d7390dd5281..ddcb372760a4 100644 --- a/.github/workflows/cpp_extra.yml +++ b/.github/workflows/cpp_extra.yml @@ -579,6 +579,59 @@ jobs: remote_key: ${{ secrets.NIGHTLIES_RSYNC_KEY }} remote_host_key: ${{ secrets.NIGHTLIES_RSYNC_HOST_KEY }} + odbc-check-tags: + needs: odbc + name: ODBC Check RC Tag + runs-on: ubuntu-latest + outputs: + rc-tag: ${{ steps.check-rc.outputs.rc-tag }} + if: github.ref_type == 'tag' && github.repository == 'apache/arrow' + steps: + - name: Check Arrow RC Tag + id: check-rc + run: | + if [[ "${GITHUB_REF_NAME}" =~ ^apache-arrow-.*-rc.*$ ]]; then + echo "RC tag found" + echo "rc-tag=true" >> "${GITHUB_OUTPUT}" + else + echo "RC tag not found" + echo "rc-tag=false" >> "${GITHUB_OUTPUT}" + fi + + odbc-release: + needs: odbc-check-tags + name: ODBC release + runs-on: ubuntu-latest + if: needs.odbc-check-tags.outputs.rc-tag == 'true' + permissions: + # Upload to GitHub Release + contents: write + steps: + - name: Checkout Arrow + uses: actions/checkout@v6 + with: + fetch-depth: 0 + submodules: recursive + - name: Download the artifacts + uses: actions/download-artifact@v7 + with: + name: flight-sql-odbc-msi-installer + # Upload ODBC as GitHub release if release candidate tag is used + - name: Wait for creating GitHub Release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + dev/release/utils-watch-gh-workflow.sh \ + ${GITHUB_REF_NAME} \ + release_candidate.yml + - name: Upload the artifacts to GitHub Release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release upload ${GITHUB_REF_NAME} \ + --clobber \ + "Apache Arrow Flight SQL ODBC"-*-win64.msi + report-extra-cpp: if: github.event_name == 'schedule' && always() needs: diff --git a/dev/release/04-binary-download.sh b/dev/release/04-binary-download.sh index 68e1664b5997..923fe450d833 100755 --- a/dev/release/04-binary-download.sh +++ b/dev/release/04-binary-download.sh @@ -54,5 +54,6 @@ gh release download "${tag}" \ --pattern "centos-*.tar.gz" \ --pattern "debian-*.tar.gz" \ --pattern "ubuntu-*.tar.gz" \ + --pattern "Apache Arrow Flight SQL ODBC-*-win64.msi" \ --repo "${REPOSITORY:-apache/arrow}" \ --skip-existing diff --git a/dev/release/05-binary-upload.sh b/dev/release/05-binary-upload.sh index f628cce0e0bf..a3d66bf9aa86 100755 --- a/dev/release/05-binary-upload.sh +++ b/dev/release/05-binary-upload.sh @@ -67,6 +67,7 @@ cd "${SOURCE_DIR}" : "${UPLOAD_CENTOS:=${UPLOAD_DEFAULT}}" : "${UPLOAD_DEBIAN:=${UPLOAD_DEFAULT}}" : "${UPLOAD_DOCS:=${UPLOAD_DEFAULT}}" +: "${UPLOAD_ODBC:=${UPLOAD_DEFAULT}}" : "${UPLOAD_PYTHON:=${UPLOAD_DEFAULT}}" : "${UPLOAD_R:=${UPLOAD_DEFAULT}}" : "${UPLOAD_UBUNTU:=${UPLOAD_DEFAULT}}" @@ -108,6 +109,10 @@ upload_to_github_release() { if [ "${UPLOAD_DOCS}" -gt 0 ]; then upload_to_github_release docs "${ARROW_ARTIFACTS_DIR}"/*-docs/* fi +if [ "${UPLOAD_ODBC}" -gt 0 ]; then + upload_to_github_release odbc \ + "${ARROW_ARTIFACTS_DIR}"/"Apache Arrow Flight SQL ODBC"-*-win64.msi +fi if [ "${UPLOAD_PYTHON}" -gt 0 ]; then upload_to_github_release python \ "${ARROW_ARTIFACTS_DIR}"/{python-sdist,wheel-*}/* From defaba16cc29130f2de223062b5a7b6f356919b9 Mon Sep 17 00:00:00 2001 From: "Alina (Xi) Li" Date: Wed, 28 Jan 2026 12:41:16 -0800 Subject: [PATCH 02/10] Add check for install ODBC MSI and check ODBC dll --- .github/workflows/cpp_extra.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.github/workflows/cpp_extra.yml b/.github/workflows/cpp_extra.yml index ddcb372760a4..b4230ff22e97 100644 --- a/.github/workflows/cpp_extra.yml +++ b/.github/workflows/cpp_extra.yml @@ -532,6 +532,25 @@ jobs: name: flight-sql-odbc-msi-installer path: build/cpp/Apache Arrow Flight SQL ODBC-*-win64.msi if-no-files-found: error + - name: Install ODBC MSI + shell: cmd + run: | + cd build/cpp + for %%f in ("Apache Arrow Flight SQL ODBC-*-win64.msi") do ( + echo Installing %%f silently with logs + msiexec /i "%%f" /qn /l*v "odbc-install.log" & type "odbc-install.log" + ) + - name: Check ODBC DLL installation + shell: cmd + run: | + for /d %%D in ("C:\Program Files\Apache Arrow Flight SQL ODBC *") do ( + if exist "%%D\bin" ( + tree "%%D\bin" /f + if exist "%%D\bin\arrow_flight_sql_odbc.dll" exit 0 + ) + ) + echo ODBC DLL not found + exit 1 odbc-nightly: needs: odbc-msvc From 7f2d7972c8b92da7ffddb3a9686a599206766fde Mon Sep 17 00:00:00 2001 From: "Alina (Xi) Li" Date: Thu, 29 Jan 2026 11:00:31 -0800 Subject: [PATCH 03/10] Minor: add comment to 04-binary-download.sh --- dev/release/04-binary-download.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/release/04-binary-download.sh b/dev/release/04-binary-download.sh index 923fe450d833..e0284cb2d911 100755 --- a/dev/release/04-binary-download.sh +++ b/dev/release/04-binary-download.sh @@ -46,7 +46,7 @@ tag="apache-arrow-${version_with_rc}" archery crossbow download-artifacts --no-fetch ${CROSSBOW_JOB_ID} "$@" -# Download Linux packages. +# Download Linux packages and ODBC MSI. gh release download "${tag}" \ --dir "packages/${CROSSBOW_JOB_ID}" \ --pattern "almalinux-*.tar.gz" \ From 6bb67c58cd06f3df2205d6d59f7db7862e6b2ad0 Mon Sep 17 00:00:00 2001 From: "Alina (Xi) Li" Date: Thu, 29 Jan 2026 11:03:25 -0800 Subject: [PATCH 04/10] Add periods to ODBC msi artifact names Reason: ODBC MSI automatically get added periods in the names, this is behavior by design in GitHub, see: https://github.com/orgs/community/discussions/60449 --- dev/release/04-binary-download.sh | 2 +- dev/release/05-binary-upload.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/release/04-binary-download.sh b/dev/release/04-binary-download.sh index e0284cb2d911..0d26c6952e5d 100755 --- a/dev/release/04-binary-download.sh +++ b/dev/release/04-binary-download.sh @@ -54,6 +54,6 @@ gh release download "${tag}" \ --pattern "centos-*.tar.gz" \ --pattern "debian-*.tar.gz" \ --pattern "ubuntu-*.tar.gz" \ - --pattern "Apache Arrow Flight SQL ODBC-*-win64.msi" \ + --pattern "Apache.Arrow.Flight.SQL.ODBC-*-win64.msi" \ --repo "${REPOSITORY:-apache/arrow}" \ --skip-existing diff --git a/dev/release/05-binary-upload.sh b/dev/release/05-binary-upload.sh index a3d66bf9aa86..055cd714e6c8 100755 --- a/dev/release/05-binary-upload.sh +++ b/dev/release/05-binary-upload.sh @@ -111,7 +111,7 @@ if [ "${UPLOAD_DOCS}" -gt 0 ]; then fi if [ "${UPLOAD_ODBC}" -gt 0 ]; then upload_to_github_release odbc \ - "${ARROW_ARTIFACTS_DIR}"/"Apache Arrow Flight SQL ODBC"-*-win64.msi + "${ARROW_ARTIFACTS_DIR}"/"Apache.Arrow.Flight.SQL.ODBC"-*-win64.msi fi if [ "${UPLOAD_PYTHON}" -gt 0 ]; then upload_to_github_release python \ From 74549fe585969352b0beee38896461ef4659cdd2 Mon Sep 17 00:00:00 2001 From: "Alina (Xi) Li" Date: Tue, 3 Feb 2026 14:04:03 -0800 Subject: [PATCH 05/10] Change to PowerShell format --- .github/workflows/cpp_extra.yml | 42 +++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/.github/workflows/cpp_extra.yml b/.github/workflows/cpp_extra.yml index b4230ff22e97..c26205a6d109 100644 --- a/.github/workflows/cpp_extra.yml +++ b/.github/workflows/cpp_extra.yml @@ -533,23 +533,39 @@ jobs: path: build/cpp/Apache Arrow Flight SQL ODBC-*-win64.msi if-no-files-found: error - name: Install ODBC MSI - shell: cmd run: | cd build/cpp - for %%f in ("Apache Arrow Flight SQL ODBC-*-win64.msi") do ( - echo Installing %%f silently with logs - msiexec /i "%%f" /qn /l*v "odbc-install.log" & type "odbc-install.log" - ) + $odbc_msi = Get-ChildItem -Filter "Apache Arrow Flight SQL ODBC-*-win64.msi" + if (-not $odbc_msi) { + Write-Error "ODBC MSI not found" + exit 1 + } + + foreach ($msi in $odbc_msi) { + Write-Host "Installing $($msi.Name) with logs" + $log = "odbc-install.log" + Start-Process msiexec.exe -Wait -ArgumentList "/i `"$msi`"", "/qn", "/L*V `"$log`"" + Get-Content $log + } - name: Check ODBC DLL installation - shell: cmd run: | - for /d %%D in ("C:\Program Files\Apache Arrow Flight SQL ODBC *") do ( - if exist "%%D\bin" ( - tree "%%D\bin" /f - if exist "%%D\bin\arrow_flight_sql_odbc.dll" exit 0 - ) - ) - echo ODBC DLL not found + $dirs = Get-ChildItem "C:\Program Files" -Directory -Filter "Apache Arrow Flight SQL ODBC*" + + foreach ($dir in $dirs) { + $bin = Join-Path $dir.FullName "bin" + + if (Test-Path $bin) { + tree $bin /f + + $dll = Join-Path $bin "arrow_flight_sql_odbc.dll" + if (Test-Path $dll) { + Write-Host "Found ODBC DLL: $dll" + exit 0 + } + } + } + + Write-Error "ODBC DLL not found" exit 1 odbc-nightly: From 51acfe61dd5ac139bb9c655c6334ffd0d931a8dc Mon Sep 17 00:00:00 2001 From: "Alina (Xi) Li" Date: Wed, 4 Feb 2026 14:25:53 -0800 Subject: [PATCH 06/10] Replace space with `-` in generated ODBC MSI file name Attempt --- .github/workflows/cpp_extra.yml | 8 ++++---- cpp/src/arrow/flight/sql/odbc/CMakeLists.txt | 2 ++ cpp/src/arrow/flight/sql/odbc/README.md | 2 +- dev/release/04-binary-download.sh | 2 +- dev/release/05-binary-upload.sh | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) mode change 100755 => 100644 dev/release/04-binary-download.sh mode change 100755 => 100644 dev/release/05-binary-upload.sh diff --git a/.github/workflows/cpp_extra.yml b/.github/workflows/cpp_extra.yml index c26205a6d109..557636edbc25 100644 --- a/.github/workflows/cpp_extra.yml +++ b/.github/workflows/cpp_extra.yml @@ -530,12 +530,12 @@ jobs: uses: actions/upload-artifact@v6 with: name: flight-sql-odbc-msi-installer - path: build/cpp/Apache Arrow Flight SQL ODBC-*-win64.msi + path: build/cpp/Apache-Arrow-Flight-SQL-ODBC-*-win64.msi if-no-files-found: error - name: Install ODBC MSI run: | cd build/cpp - $odbc_msi = Get-ChildItem -Filter "Apache Arrow Flight SQL ODBC-*-win64.msi" + $odbc_msi = Get-ChildItem -Filter "Apache-Arrow-Flight-SQL-ODBC-*-win64.msi" if (-not $odbc_msi) { Write-Error "ODBC MSI not found" exit 1 @@ -549,7 +549,7 @@ jobs: } - name: Check ODBC DLL installation run: | - $dirs = Get-ChildItem "C:\Program Files" -Directory -Filter "Apache Arrow Flight SQL ODBC*" + $dirs = Get-ChildItem "C:\Program Files" -Directory -Filter "Apache-Arrow-Flight-SQL-ODBC*" foreach ($dir in $dirs) { $bin = Join-Path $dir.FullName "bin" @@ -665,7 +665,7 @@ jobs: run: | gh release upload ${GITHUB_REF_NAME} \ --clobber \ - "Apache Arrow Flight SQL ODBC"-*-win64.msi + "Apache-Arrow-Flight-SQL-ODBC"-*-win64.msi report-extra-cpp: if: github.event_name == 'schedule' && always() diff --git a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt index c18a8e5de95b..39040c45024d 100644 --- a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt @@ -106,6 +106,8 @@ if(ARROW_FLIGHT_SQL_ODBC_INSTALLER) set(CPACK_PACKAGE_VERSION_PATCH ${ODBC_PACKAGE_VERSION_PATCH}) set(CPACK_PACKAGE_NAME ${ODBC_PACKAGE_NAME}) + # Make sure the MSI name contains only hyphens, not spaces + string(REPLACE " " "-" CPACK_PACKAGE_NAME "${CPACK_PACKAGE_NAME}") set(CPACK_PACKAGE_VENDOR ${ODBC_PACKAGE_VENDOR}) set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Apache Arrow Flight SQL ODBC Driver") set(CPACK_PACKAGE_CONTACT "dev@arrow.apache.org") diff --git a/cpp/src/arrow/flight/sql/odbc/README.md b/cpp/src/arrow/flight/sql/odbc/README.md index 8c2d9705a1dc..a8f3bc727f73 100644 --- a/cpp/src/arrow/flight/sql/odbc/README.md +++ b/cpp/src/arrow/flight/sql/odbc/README.md @@ -47,7 +47,7 @@ should show as an available ODBC driver in the x64 ODBC Driver Manager. 3. `cd` to `build` folder. 4. Run `cpack`. -If the generation is successful, you will find `Apache Arrow Flight SQL ODBC--win64.msi` generated under the `build` folder. +If the generation is successful, you will find `Apache-Arrow-Flight-SQL-ODBC--win64.msi` generated under the `build` folder. ## Steps to Enable Logging diff --git a/dev/release/04-binary-download.sh b/dev/release/04-binary-download.sh old mode 100755 new mode 100644 index 0d26c6952e5d..210a9406c2d0 --- a/dev/release/04-binary-download.sh +++ b/dev/release/04-binary-download.sh @@ -54,6 +54,6 @@ gh release download "${tag}" \ --pattern "centos-*.tar.gz" \ --pattern "debian-*.tar.gz" \ --pattern "ubuntu-*.tar.gz" \ - --pattern "Apache.Arrow.Flight.SQL.ODBC-*-win64.msi" \ + --pattern "Apache-Arrow-Flight-SQL-ODBC-*-win64.msi" \ --repo "${REPOSITORY:-apache/arrow}" \ --skip-existing diff --git a/dev/release/05-binary-upload.sh b/dev/release/05-binary-upload.sh old mode 100755 new mode 100644 index 055cd714e6c8..081289d83a80 --- a/dev/release/05-binary-upload.sh +++ b/dev/release/05-binary-upload.sh @@ -111,7 +111,7 @@ if [ "${UPLOAD_DOCS}" -gt 0 ]; then fi if [ "${UPLOAD_ODBC}" -gt 0 ]; then upload_to_github_release odbc \ - "${ARROW_ARTIFACTS_DIR}"/"Apache.Arrow.Flight.SQL.ODBC"-*-win64.msi + "${ARROW_ARTIFACTS_DIR}"/"Apache-Arrow-Flight-SQL-ODBC"-*-win64.msi fi if [ "${UPLOAD_PYTHON}" -gt 0 ]; then upload_to_github_release python \ From b1cf0453a4819afae2b46194d86f8d1743f5f212 Mon Sep 17 00:00:00 2001 From: "Alina (Xi) Li" Date: Thu, 5 Feb 2026 13:55:54 -0800 Subject: [PATCH 07/10] Work on comments from Kou - remove quotes - revert accidental permission change --- .github/workflows/cpp_extra.yml | 2 +- dev/release/04-binary-download.sh | 0 dev/release/05-binary-upload.sh | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) mode change 100644 => 100755 dev/release/04-binary-download.sh mode change 100644 => 100755 dev/release/05-binary-upload.sh diff --git a/.github/workflows/cpp_extra.yml b/.github/workflows/cpp_extra.yml index 557636edbc25..abe833313b6d 100644 --- a/.github/workflows/cpp_extra.yml +++ b/.github/workflows/cpp_extra.yml @@ -665,7 +665,7 @@ jobs: run: | gh release upload ${GITHUB_REF_NAME} \ --clobber \ - "Apache-Arrow-Flight-SQL-ODBC"-*-win64.msi + Apache-Arrow-Flight-SQL-ODBC-*-win64.msi report-extra-cpp: if: github.event_name == 'schedule' && always() diff --git a/dev/release/04-binary-download.sh b/dev/release/04-binary-download.sh old mode 100644 new mode 100755 diff --git a/dev/release/05-binary-upload.sh b/dev/release/05-binary-upload.sh old mode 100644 new mode 100755 index 081289d83a80..45793dd6ec5e --- a/dev/release/05-binary-upload.sh +++ b/dev/release/05-binary-upload.sh @@ -111,7 +111,7 @@ if [ "${UPLOAD_DOCS}" -gt 0 ]; then fi if [ "${UPLOAD_ODBC}" -gt 0 ]; then upload_to_github_release odbc \ - "${ARROW_ARTIFACTS_DIR}"/"Apache-Arrow-Flight-SQL-ODBC"-*-win64.msi + "${ARROW_ARTIFACTS_DIR}"/Apache-Arrow-Flight-SQL-ODBC-*-win64.msi fi if [ "${UPLOAD_PYTHON}" -gt 0 ]; then upload_to_github_release python \ From 2fb7436ea5305b15f9c6421b56149ad45451af53 Mon Sep 17 00:00:00 2001 From: "Alina (Xi) Li" Date: Thu, 5 Feb 2026 15:17:42 -0800 Subject: [PATCH 08/10] Use`startsWith` and `contain` for checking tags This achieves similar effect as tags: - "apache-arrow-*-rc*" --- .github/workflows/cpp_extra.yml | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/.github/workflows/cpp_extra.yml b/.github/workflows/cpp_extra.yml index abe833313b6d..34f1975b7ee0 100644 --- a/.github/workflows/cpp_extra.yml +++ b/.github/workflows/cpp_extra.yml @@ -614,30 +614,11 @@ jobs: remote_key: ${{ secrets.NIGHTLIES_RSYNC_KEY }} remote_host_key: ${{ secrets.NIGHTLIES_RSYNC_HOST_KEY }} - odbc-check-tags: - needs: odbc - name: ODBC Check RC Tag - runs-on: ubuntu-latest - outputs: - rc-tag: ${{ steps.check-rc.outputs.rc-tag }} - if: github.ref_type == 'tag' && github.repository == 'apache/arrow' - steps: - - name: Check Arrow RC Tag - id: check-rc - run: | - if [[ "${GITHUB_REF_NAME}" =~ ^apache-arrow-.*-rc.*$ ]]; then - echo "RC tag found" - echo "rc-tag=true" >> "${GITHUB_OUTPUT}" - else - echo "RC tag not found" - echo "rc-tag=false" >> "${GITHUB_OUTPUT}" - fi - odbc-release: - needs: odbc-check-tags + needs: odbc name: ODBC release runs-on: ubuntu-latest - if: needs.odbc-check-tags.outputs.rc-tag == 'true' + if: ${{ startsWith(github.ref_name, 'apache-arrow-') && contains(github.ref_name, '-rc') }} permissions: # Upload to GitHub Release contents: write From 7bd8429bbb5a66f37759ecf9dbda9c5ccb7910cd Mon Sep 17 00:00:00 2001 From: "Alina (Xi) Li" Date: Mon, 9 Feb 2026 09:57:32 -0800 Subject: [PATCH 09/10] Nit - comment removal --- .github/workflows/cpp_extra.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/cpp_extra.yml b/.github/workflows/cpp_extra.yml index 34f1975b7ee0..74ea692737ce 100644 --- a/.github/workflows/cpp_extra.yml +++ b/.github/workflows/cpp_extra.yml @@ -632,7 +632,6 @@ jobs: uses: actions/download-artifact@v7 with: name: flight-sql-odbc-msi-installer - # Upload ODBC as GitHub release if release candidate tag is used - name: Wait for creating GitHub Release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 195ed13812c381ccfc26f9c1dfaa62d590758621 Mon Sep 17 00:00:00 2001 From: "Alina (Xi) Li" Date: Mon, 9 Feb 2026 10:40:14 -0800 Subject: [PATCH 10/10] Fix odbc-msvc --- .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 74ea692737ce..b38ccaa27795 100644 --- a/.github/workflows/cpp_extra.yml +++ b/.github/workflows/cpp_extra.yml @@ -615,7 +615,7 @@ jobs: remote_host_key: ${{ secrets.NIGHTLIES_RSYNC_HOST_KEY }} odbc-release: - needs: odbc + needs: odbc-msvc name: ODBC release runs-on: ubuntu-latest if: ${{ startsWith(github.ref_name, 'apache-arrow-') && contains(github.ref_name, '-rc') }}