From 0d31c67cde4e7ee803c0f3337d6cb83d2bed4d11 Mon Sep 17 00:00:00 2001 From: "paul@iqmo.com" Date: Tue, 25 Aug 2026 18:24:07 -0400 Subject: [PATCH 1/9] ci: Add 3.15.0rc0 builds --- .github/actions/build-wheel/action.yml | 2 +- .github/workflows/packaging_wheels.yml | 2 +- pyproject.toml | 25 +++++++++++++++++++++---- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/.github/actions/build-wheel/action.yml b/.github/actions/build-wheel/action.yml index a945a68f..6c5071da 100644 --- a/.github/actions/build-wheel/action.yml +++ b/.github/actions/build-wheel/action.yml @@ -122,7 +122,7 @@ runs: # traversing the full filesystem, which produces an error on Windows. # - CIBW_TEST_SKIP we always skip tests for *-macosx_universal2 builds, because we run tests for arm64 and x86_64. - name: Build${{ inputs.testsuite != 'none' && ' and test ' || ' ' }}wheel - uses: pypa/cibuildwheel@v3.2 + uses: pypa/cibuildwheel@v4.2.0 env: CIBW_ARCHS: ${{ inputs.arch == 'amd64' && 'AMD64' || inputs.arch }} CIBW_BUILD: ${{ inputs.python }}-${{ inputs.cibw-system }}_${{ inputs.arch }} diff --git a/.github/workflows/packaging_wheels.yml b/.github/workflows/packaging_wheels.yml index b86ec800..e45ca448 100644 --- a/.github/workflows/packaging_wheels.yml +++ b/.github/workflows/packaging_wheels.yml @@ -127,7 +127,7 @@ jobs: strategy: fail-fast: false matrix: - python: [ cp311, cp312, cp313 ] + python: [ cp311, cp312, cp313, cp315 ] platform: - { os: windows-2022, arch: amd64, cibw_system: win } - { os: windows-11-arm, arch: ARM64, cibw_system: win } # cibw requires ARM64 to be uppercase diff --git a/pyproject.toml b/pyproject.toml index 098c1a19..ade8cbb1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Programming Language :: C++", ] authors = [{name = "DuckDB Foundation"}] @@ -233,9 +234,21 @@ name = "pytorch-cpu" url = "https://download.pytorch.org/whl/cpu" explicit = true +[[tool.uv.index]] +# TODO: Remove after 3.15.0 release +name = "scientific-python-nightly" +url = "https://pypi.anaconda.org/scientific-python-nightly-wheels/simple" +explicit = true + [tool.uv.sources] torch = [ { index = "pytorch-cpu" } ] torchvision = [ { index = "pytorch-cpu" } ] +pandas = [ + { index = "scientific-python-nightly", marker = "python_version >= '3.15'" }, +] +pyarrow = [ + { index = "scientific-python-nightly", marker = "python_version >= '3.15'" }, +] # todo: adjust for windows arm64 while test dependencies become available [dependency-groups] # used for development only, requires pip >=25.1.0 @@ -270,9 +283,11 @@ test = [ # dependencies used for running tests "requests", "urllib3", "fsspec>=2022.11.0; sys_platform != 'win32' or platform_machine != 'ARM64'", - "pandas>=3.0.0; python_version > '3.10'", + "pandas>=3.0.0; python_version >= '3.11' and python_version < '3.15'", + "pandas>=3.0.0.dev0; python_version >= '3.15'", "pandas<3.0.0; python_version < '3.11'", - "pyarrow>=23.0.0; python_version >= '3.10' and (sys_platform != 'win32' or platform_machine != 'ARM64')", + "pyarrow>=23.0.0; python_version >= '3.10' and python_version < '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", + "pyarrow>=23.0.0.dev0; python_version >= '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "pyarrow>=18.0.0; python_version < '3.10' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "torch>=2.2.2; python_version < '3.13' and ( sys_platform != 'win32' or platform_machine != 'ARM64' )", "torch>=2.2.2,<2.12.1; python_version > '3.11' and python_version < '3.13' and sys_platform == 'win32' and platform_machine == 'ARM64'", @@ -296,9 +311,11 @@ bench = [ # Pinned deps for the benchmark suite (see benchmarks/README.md). Mini "numpy<2; ( sys_platform != 'win32' or platform_machine != 'ARM64' ) and python_version < '3.12'", "numpy>=2; ( sys_platform != 'win32' or platform_machine != 'ARM64' ) and python_version >= '3.12'", "numpy>=2.3; sys_platform == 'win32' and platform_machine == 'ARM64' and python_version >= '3.11'", - "pandas>=3.0.0; python_version > '3.10'", + "pandas>=3.0.0; python_version >= '3.11' and python_version < '3.15'", + "pandas>=3.0.0.dev0; python_version >= '3.15'", "pandas<3.0.0; python_version < '3.11'", - "pyarrow>=23.0.0; python_version >= '3.10' and (sys_platform != 'win32' or platform_machine != 'ARM64')", + "pyarrow>=23.0.0; python_version >= '3.10' and python_version < '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", + "pyarrow>=23.0.0.dev0; python_version >= '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "pyarrow>=18.0.0; python_version < '3.10' and (sys_platform != 'win32' or platform_machine != 'ARM64')", ] scripts = [ # dependencies used for running scripts From ce85b04d4ef86aa761785efffb92bc53028d9ae3 Mon Sep 17 00:00:00 2001 From: "paul@iqmo.com" Date: Thu, 27 Aug 2026 07:23:14 -0400 Subject: [PATCH 2/9] exclude win32_arm64 --- pyproject.toml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ade8cbb1..994ada55 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,7 +47,8 @@ all = [ # users can install duckdb with 'duckdb[all]', which will install this l "fsspec", # used in duckdb.filesystem "numpy", # used in duckdb.experimental.spark and in duckdb.fetchnumpy() "pandas", # used for pandas dataframes all over the place - "pyarrow", # used for pyarrow support + # TODO: Remove after 3.15.0 release + "pyarrow; sys_platform != 'win32' or platform_machine != 'ARM64'", # used for pyarrow support "adbc-driver-manager", # for the adbc driver ] @@ -63,7 +64,7 @@ build-backend = "duckdb_packaging.build_backend" backend-path = ["./"] requires = [ "scikit-build-core>=0.11.4", - "nanobind>=2.0", + "nanobind>=2.0,<3.0", "setuptools_scm>=8.0", # numpy C API headers (PyArray_Empty in the result path). Building against numpy 2.x yields a # binary compatible with numpy >=1.19 AND 2.x at runtime (numpy 2.0 backward-compat), so the @@ -262,19 +263,19 @@ stubdeps = [ # dependencies used for typehints in the stubs "typing-extensions", ] test = [ # dependencies used for running tests - "adbc-driver-manager>=1.10.0; python_version >= '3.10' and (sys_platform != 'win32' or platform_machine != 'ARM64')", + "adbc-driver-manager>=1.10.0; python_version >= '3.10' and python_version < '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "adbc-driver-manager>=1.7.0; python_version < '3.10' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "pytest", "pytest-reraise", "pytest-timeout", "pytest-timestamper", "pytest-xdist", # parallel test execution (-n auto); without this `uv sync --reinstall` prunes a manual install - "pytest_codspeed", + "pytest_codspeed; python_version < '3.15' or sys_platform != 'win32'", "coverage", "gcovr; sys_platform != 'win32' or platform_machine != 'ARM64'", - "gcsfs; sys_platform != 'win32' or platform_machine != 'ARM64'", + "gcsfs; python_version < '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "packaging", - "polars>=1.33.0", + "polars>=1.33.0; python_version < '3.15'", "psutil", "py4j", "pyotp", @@ -292,7 +293,9 @@ test = [ # dependencies used for running tests "torch>=2.2.2; python_version < '3.13' and ( sys_platform != 'win32' or platform_machine != 'ARM64' )", "torch>=2.2.2,<2.12.1; python_version > '3.11' and python_version < '3.13' and sys_platform == 'win32' and platform_machine == 'ARM64'", "torch>=2.2.2,<2.11.0; python_version >= '3.13' and python_version < '3.14' and ( sys_platform != 'darwin' or platform_machine != 'x86_64' ) and ( sys_platform != 'win32' or platform_machine != 'ARM64' )", - "torch>=2.10.0; python_version >= '3.14' and ( sys_platform != 'darwin' or platform_machine != 'x86_64' ) and ( sys_platform != 'win32' or platform_machine != 'ARM64' )", + "torch>=2.10.0; python_version >= '3.14' and python_version < '3.15' and ( sys_platform != 'darwin' or platform_machine != 'x86_64' ) and ( sys_platform != 'win32' or platform_machine != 'ARM64' )", + # cp315: torch only ships manylinux wheels on the cpu index; skip elsewhere (torch tests importorskip) + "torch>=2.10.0; python_version >= '3.15' and sys_platform == 'linux'", "tensorflow==2.14.0; sys_platform == 'darwin' and python_version < '3.12'", "tensorflow-cpu>=2.14.0; sys_platform == 'linux' and platform_machine != 'aarch64' and python_version < '3.12'", "tensorflow-cpu>=2.14.0; sys_platform == 'win32' and platform_machine != 'ARM64' and python_version < '3.12'", From a7ed7744ad5486fc5d304fb45300b294f5edd31d Mon Sep 17 00:00:00 2001 From: "paul@iqmo.com" Date: Thu, 27 Aug 2026 08:03:41 -0400 Subject: [PATCH 3/9] bind nanobind <3.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 994ada55..31bc76ed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -339,7 +339,7 @@ pypi = [ # dependencies used by the pypi cleanup script build = [ "cmake>=3.29.0", "ninja>=1.10", - "nanobind>=2.0", + "nanobind>=2.0,<3.0", "scikit_build_core>=0.11.4", "setuptools_scm>=8.0", ] From 470265950da65f2e808f4d48b594060524672bc1 Mon Sep 17 00:00:00 2001 From: "paul@iqmo.com" Date: Thu, 27 Aug 2026 09:40:40 -0400 Subject: [PATCH 4/9] build: revert codspeed and polars marker ; works on 3.15 --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 31bc76ed..30625392 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -270,12 +270,12 @@ test = [ # dependencies used for running tests "pytest-timeout", "pytest-timestamper", "pytest-xdist", # parallel test execution (-n auto); without this `uv sync --reinstall` prunes a manual install - "pytest_codspeed; python_version < '3.15' or sys_platform != 'win32'", + "pytest_codspeed", "coverage", "gcovr; sys_platform != 'win32' or platform_machine != 'ARM64'", "gcsfs; python_version < '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "packaging", - "polars>=1.33.0; python_version < '3.15'", + "polars>=1.33.0", "psutil", "py4j", "pyotp", From ecce1df17dda0d0d5bd7075d86161bf79af21507 Mon Sep 17 00:00:00 2001 From: "paul@iqmo.com" Date: Thu, 27 Aug 2026 11:04:10 -0400 Subject: [PATCH 5/9] ci: redisabling: polars fails on cp315 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 30625392..0b024a26 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -275,7 +275,7 @@ test = [ # dependencies used for running tests "gcovr; sys_platform != 'win32' or platform_machine != 'ARM64'", "gcsfs; python_version < '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "packaging", - "polars>=1.33.0", + "polars>=1.33.0; python_version < '3.15'", "psutil", "py4j", "pyotp", From 88a49b8bd3681c75fc339ceb96d74670d8016c00 Mon Sep 17 00:00:00 2001 From: "paul@iqmo.com" Date: Thu, 27 Aug 2026 12:28:33 -0400 Subject: [PATCH 6/9] tests: ignore Pandas4warnings --- pyproject.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 0b024a26..ae66b595 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -377,6 +377,8 @@ filterwarnings = [ # Pyspark is throwing these warnings "ignore:distutils Version classes are deprecated:DeprecationWarning", "ignore:is_datetime64tz_dtype is deprecated:DeprecationWarning", + # pandas 3.1.0.dev0deprecates the inplace keyword with a warning + "ignore::pandas.errors.Pandas4Warning", ] [tool.mypy] From 2ed31ffd37f12d95a978eb08fd8795b177bf16bb Mon Sep 17 00:00:00 2001 From: Paul T Date: Sat, 5 Sep 2026 14:53:30 -0400 Subject: [PATCH 7/9] bump to 4.2.1 for 3.15.0rc2 --- .github/actions/build-wheel/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/build-wheel/action.yml b/.github/actions/build-wheel/action.yml index 6c5071da..4a98e26a 100644 --- a/.github/actions/build-wheel/action.yml +++ b/.github/actions/build-wheel/action.yml @@ -122,7 +122,7 @@ runs: # traversing the full filesystem, which produces an error on Windows. # - CIBW_TEST_SKIP we always skip tests for *-macosx_universal2 builds, because we run tests for arm64 and x86_64. - name: Build${{ inputs.testsuite != 'none' && ' and test ' || ' ' }}wheel - uses: pypa/cibuildwheel@v4.2.0 + uses: pypa/cibuildwheel@v4.2.1 env: CIBW_ARCHS: ${{ inputs.arch == 'amd64' && 'AMD64' || inputs.arch }} CIBW_BUILD: ${{ inputs.python }}-${{ inputs.cibw-system }}_${{ inputs.arch }} From fbb39b5e61e35deb190d3006b1afa821b51d1407 Mon Sep 17 00:00:00 2001 From: Paul T Date: Sun, 6 Sep 2026 10:56:59 -0400 Subject: [PATCH 8/9] bump uv versions to catch latest 3.15.0 build --- .github/actions/build-wheel/action.yml | 4 ++-- .github/workflows/cleanup_pypi.yml | 4 ++-- .github/workflows/code_quality.yml | 4 ++-- .github/workflows/coverage.yml | 4 ++-- .github/workflows/packaging_sdist.yml | 4 ++-- .github/workflows/targeted_test.yml | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/actions/build-wheel/action.yml b/.github/actions/build-wheel/action.yml index 4a98e26a..c819359a 100644 --- a/.github/actions/build-wheel/action.yml +++ b/.github/actions/build-wheel/action.yml @@ -104,9 +104,9 @@ runs: save: ${{ inputs.ccache-save }} # Install Astral UV, which will be used as build-frontend for cibuildwheel - - uses: astral-sh/setup-uv@v7 + - uses: astral-sh/setup-uv@v10.0.1 with: - version: "0.9.0" + version: "0.12.10" enable-cache: false ### cibuildwheel configuration diff --git a/.github/workflows/cleanup_pypi.yml b/.github/workflows/cleanup_pypi.yml index 51c8b257..599124a8 100644 --- a/.github/workflows/cleanup_pypi.yml +++ b/.github/workflows/cleanup_pypi.yml @@ -70,9 +70,9 @@ jobs: exit 1 - name: Install Astral UV - uses: astral-sh/setup-uv@v7 + uses: astral-sh/setup-uv@v10.0.1 with: - version: "0.9.0" + version: "0.12.10" - name: Install dependencies run: uv sync --only-group pypi --no-install-project diff --git a/.github/workflows/code_quality.yml b/.github/workflows/code_quality.yml index bec5f886..7193f119 100644 --- a/.github/workflows/code_quality.yml +++ b/.github/workflows/code_quality.yml @@ -29,9 +29,9 @@ jobs: persist-credentials: false - name: Install Astral UV - uses: astral-sh/setup-uv@v7 + uses: astral-sh/setup-uv@v10.0.1 with: - version: "0.9.0" + version: "0.12.10" python-version: "3.12" - name: pre-commit (cache) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 3b51e641..8bf2cf30 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -68,9 +68,9 @@ jobs: sudo apt-get -y install ccache - name: Install Astral UV and enable the cache - uses: astral-sh/setup-uv@v7 + uses: astral-sh/setup-uv@v10.0.1 with: - version: "0.9.0" + version: "0.12.10" python-version: 3.12 enable-cache: true cache-suffix: -${{ github.workflow }} diff --git a/.github/workflows/packaging_sdist.yml b/.github/workflows/packaging_sdist.yml index 912b26d1..a5c846f8 100644 --- a/.github/workflows/packaging_sdist.yml +++ b/.github/workflows/packaging_sdist.yml @@ -70,9 +70,9 @@ jobs: fi - name: Install Astral UV - uses: astral-sh/setup-uv@v7 + uses: astral-sh/setup-uv@v10.0.1 with: - version: "0.9.0" + version: "0.12.10" python-version: 3.12 - name: Build sdist diff --git a/.github/workflows/targeted_test.yml b/.github/workflows/targeted_test.yml index eff62fe2..b3729674 100644 --- a/.github/workflows/targeted_test.yml +++ b/.github/workflows/targeted_test.yml @@ -55,9 +55,9 @@ jobs: submodules: true - name: Install uv - uses: astral-sh/setup-uv@v7 + uses: astral-sh/setup-uv@v10.0.1 with: - version: "0.9.0" + version: "0.12.10" enable-cache: false python-version: ${{ inputs.python_version }} From 92c20b34a23e67bb08e60bbc1c45debb4758c50f Mon Sep 17 00:00:00 2001 From: Paul T Date: Sun, 6 Sep 2026 10:58:54 -0400 Subject: [PATCH 9/9] build: simplify exclusions for 3.15 and add comment about polars not yet ready --- pyproject.toml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ca38eb5b..f960ef64 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,8 +47,7 @@ all = [ # users can install duckdb with 'duckdb[all]', which will install this l "fsspec", # used in duckdb.filesystem "numpy", # used in duckdb.experimental.spark and in duckdb.fetchnumpy() "pandas", # used for pandas dataframes all over the place - # TODO: Remove after 3.15.0 release - "pyarrow; sys_platform != 'win32' or platform_machine != 'ARM64'", # used for pyarrow support + "pyarrow", # used for pyarrow support "adbc-driver-manager", # for the adbc driver ] @@ -255,7 +254,8 @@ pandas = [ { index = "scientific-python-nightly", marker = "python_version >= '3.15'" }, ] pyarrow = [ - { index = "scientific-python-nightly", marker = "python_version >= '3.15'" }, + # win/ARM64 has no pyarrow wheels & nightly doesn't have sdist + { index = "scientific-python-nightly", marker = "python_version >= '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')" }, ] # todo: adjust for windows arm64 while test dependencies become available @@ -282,7 +282,9 @@ test = [ # dependencies used for running tests "gcovr; sys_platform != 'win32' or platform_machine != 'ARM64'", "gcsfs; python_version < '3.15' and (sys_platform != 'win32' or platform_machine != 'ARM64')", "packaging", - "polars>=1.33.0; python_version < '3.15'", + + # polars tests fail on 3.15 due to: https://github.com/pola-rs/polars/issues/28347 + "polars>=1.33.0; python_version < '3.15'", "psutil", "py4j", "pyotp", @@ -300,9 +302,7 @@ test = [ # dependencies used for running tests "torch>=2.2.2; python_version < '3.13' and ( sys_platform != 'win32' or platform_machine != 'ARM64' )", "torch>=2.2.2,<2.12.1; python_version > '3.11' and python_version < '3.13' and sys_platform == 'win32' and platform_machine == 'ARM64'", "torch>=2.2.2,<2.11.0; python_version >= '3.13' and python_version < '3.14' and ( sys_platform != 'darwin' or platform_machine != 'x86_64' ) and ( sys_platform != 'win32' or platform_machine != 'ARM64' )", - "torch>=2.10.0; python_version >= '3.14' and python_version < '3.15' and ( sys_platform != 'darwin' or platform_machine != 'x86_64' ) and ( sys_platform != 'win32' or platform_machine != 'ARM64' )", - # cp315: torch only ships manylinux wheels on the cpu index; skip elsewhere (torch tests importorskip) - "torch>=2.10.0; python_version >= '3.15' and sys_platform == 'linux'", + "torch>=2.10.0; python_version >= '3.14' and ( sys_platform != 'darwin' or platform_machine != 'x86_64' ) and ( sys_platform != 'win32' or platform_machine != 'ARM64' )", "tensorflow==2.14.0; sys_platform == 'darwin' and python_version < '3.12'", "tensorflow-cpu>=2.14.0; sys_platform == 'linux' and platform_machine != 'aarch64' and python_version < '3.12'", "tensorflow-cpu>=2.14.0; sys_platform == 'win32' and platform_machine != 'ARM64' and python_version < '3.12'", @@ -383,7 +383,7 @@ filterwarnings = [ # Pyspark is throwing these warnings "ignore:distutils Version classes are deprecated:DeprecationWarning", "ignore:is_datetime64tz_dtype is deprecated:DeprecationWarning", - # pandas 3.1.0.dev0deprecates the inplace keyword with a warning + # pandas 3.1.0.dev0 deprecates the inplace keyword with a warning "ignore::pandas.errors.Pandas4Warning", ]