From 2932cf52c18966f0138ab5850ebf076dfe37bfa5 Mon Sep 17 00:00:00 2001 From: Manush Murali Date: Wed, 21 Oct 2026 22:41:19 -0700 Subject: [PATCH 1/2] Hold DuckDB below 2 duckdb 2.0.0 was published today and the extra was unbounded, so every CI run since picks it up. 2.0 warns on an Arrow fetch from a DB-API cursor, which the relational engine makes for every DuckDB table and sample it reads, and the engine suite runs warnings as errors, so the required `engine` check fails on main and on every open pull request. The extra is held below 2, and this repository ships against the 1.5 it is tested on. Lifting the bound is its own change, moving those reads off the cursor. Co-Authored-By: Claude Opus 5.5 Signed-off-by: Manush Murali --- CHANGELOG.md | 3 +++ packages/structured-data-models-connectors/pyproject.toml | 5 ++++- uv.lock | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f8734742..2a8ac4cda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,9 @@ these packages. All five distributions share one version and one entry. emulated, and each is smoke-tested on the architecture it targets. The release no longer builds aarch64 under QEMU, which also takes a privileged container image out of the release path. +- The `duckdb` extra holds `duckdb` below 2. The 2.0 release warns on the + Arrow fetch the relational engine reads DuckDB tables through, and this + release is tested against 1.5. ## 1.0.0 - 2026-10-15 diff --git a/packages/structured-data-models-connectors/pyproject.toml b/packages/structured-data-models-connectors/pyproject.toml index b96d010d4..6bce18c6a 100644 --- a/packages/structured-data-models-connectors/pyproject.toml +++ b/packages/structured-data-models-connectors/pyproject.toml @@ -61,7 +61,10 @@ sqlite = [ "adbc-driver-sqlite", ] duckdb = [ - "duckdb>=1.5.0", + # 2.0 warns on an Arrow fetch from a DB-API cursor, which the engine + # makes for every table and sample it reads. Lifting this moves those + # reads off the cursor. + "duckdb>=1.5.0,<2", ] snowflake = [ # 5.0 empties `DEFAULT_CONFIGURATION` and rewrites keyword names through diff --git a/uv.lock b/uv.lock index 99c38bc33..b965e8f79 100644 --- a/uv.lock +++ b/uv.lock @@ -2933,7 +2933,7 @@ requires-dist = [ { name = "databricks-sdk", marker = "extra == 'databricks'", specifier = ">=0.89,<1.0" }, { name = "databricks-sdk", marker = "extra == 'lakebase'", specifier = ">=0.89,<1.0" }, { name = "databricks-sql-connector", marker = "extra == 'databricks'", specifier = ">=4.1.3" }, - { name = "duckdb", marker = "extra == 'duckdb'", specifier = ">=1.5.0" }, + { name = "duckdb", marker = "extra == 'duckdb'", specifier = ">=1.5.0,<2" }, { name = "moto", extras = ["server"], marker = "extra == 'test'", specifier = ">=5" }, { name = "pandas", specifier = ">=2.2.2" }, { name = "psycopg", marker = "extra == 'lakebase'", specifier = ">=3.1" }, From edfa20795a59101926ecd8fdd078b30a91e4af6c Mon Sep 17 00:00:00 2001 From: Manush Murali Date: Thu, 22 Oct 2026 09:27:08 -0700 Subject: [PATCH 2/2] Hold pandas below 3.1 pandas 3.1.0 was published this morning, and neither the client nor the engine bounded it, so CI picked it up within hours. 3.1 raises taking a `DateOffset` from `Timestamp.min`, which is the anchor time the engine derives for every graph without a time column, so every relational request over a static graph fails with OutOfBoundsDatetime: 24 client tests that run with an engine present. 3.1 also builds a frame around an integer past the float range where 3.0 refused one, and a request's description relies on that refusal to leave out the table carrying it. Both are held below 3.1, as DuckDB is below 2, and this ships against the 3.0 it is tested on. Lifting it is its own change. Co-Authored-By: Claude Opus 5.5 Signed-off-by: Manush Murali --- CHANGELOG.md | 4 ++++ packages/structured-data-models-client/pyproject.toml | 5 ++++- packages/structured-data-models-relational-engine/setup.py | 4 +++- uv.lock | 4 ++-- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9341d9321..16e6f6926 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,10 @@ these packages. All five distributions share one version and one entry. - The `duckdb` extra holds `duckdb` below 2. The 2.0 release warns on the Arrow fetch the relational engine reads DuckDB tables through, and this release is tested against 1.5. +- `structured-data-models-client` and the relational engine hold `pandas` + below 3.1. The 3.1 release raises taking a date offset from the earliest + timestamp, which the engine does for every graph without a time column, + and this release is tested against 3.0. ### Fixed diff --git a/packages/structured-data-models-client/pyproject.toml b/packages/structured-data-models-client/pyproject.toml index 9dfbb274b..42c700625 100644 --- a/packages/structured-data-models-client/pyproject.toml +++ b/packages/structured-data-models-client/pyproject.toml @@ -41,7 +41,10 @@ classifiers = [ dependencies = [ "structured-data-models-api==1.0.0", "structured-data-models-pql==1.0.0", - "pandas>=2.2.2", + # 3.1 builds a frame around an integer past the float range where earlier + # releases refused one, and a request's description relies on that + # refusal to leave out the table carrying it. + "pandas>=2.2.2,<3.1", "numpy>=1.23", "requests>=2.28", "urllib3>=1.26", diff --git a/packages/structured-data-models-relational-engine/setup.py b/packages/structured-data-models-relational-engine/setup.py index 0f289c9a9..65c1aa3a5 100644 --- a/packages/structured-data-models-relational-engine/setup.py +++ b/packages/structured-data-models-relational-engine/setup.py @@ -39,7 +39,9 @@ setup( install_requires=[ 'numpy', - 'pandas', + # 3.1 raises taking a `DateOffset` from `Timestamp.min`, which is the + # anchor time of every graph without a time column. + 'pandas<3.1', # The warehouse backends read results as `pd.ArrowDtype`, which pandas # refuses below pyarrow 10.0.1. Databricks Runtime 14.3 LTS and # serverless environment 1 ship pyarrow 8, and failed there on import. diff --git a/uv.lock b/uv.lock index d58c1472b..ba3219cb0 100644 --- a/uv.lock +++ b/uv.lock @@ -3166,7 +3166,7 @@ test = [ requires-dist = [ { name = "databricks-sdk", marker = "extra == 'databricks-serving'", specifier = ">=0.68.0,<1.0" }, { name = "numpy", specifier = ">=1.23" }, - { name = "pandas", specifier = ">=2.2.2" }, + { name = "pandas", specifier = ">=2.2.2,<3.1" }, { name = "pytest", marker = "extra == 'test'" }, { name = "requests", specifier = ">=2.28" }, { name = "requests-mock", marker = "extra == 'test'" }, @@ -3348,7 +3348,7 @@ requires-dist = [ { name = "numpy" }, { name = "openai", marker = "extra == 'explain'", specifier = ">=1.40" }, { name = "packaging", marker = "extra == 'test'" }, - { name = "pandas" }, + { name = "pandas", specifier = "<3.1" }, { name = "pooch", marker = "extra == 'relbench'" }, { name = "pooch", marker = "extra == 'test'" }, { name = "pyarrow", specifier = ">=10.0.1" },