Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,9 +163,11 @@ benchmark.run()
Install from PyPi:

```bash
pip install lakebench[duckdb,polars,daft,tpcds_datagen,tpch_datagen,sparkmeasure]
pip install lakebench[duckdb,polars,tpcds_datagen,tpch_datagen,sparkmeasure]
```

> _Note: the `daft` extra pins `deltalake` to 1.5.x (Daft cannot read the Arrow `Utf8View` parquet that `deltalake` 1.6.x emits from `MERGE`), so it must be installed in its own environment rather than alongside `duckdb`, `polars`, or `sail`._

## Example Usage
To run any LakeBench benchmark, first do a one time generation of the data required for the benchmark and scale of interest. LakeBench provides datagen classes to quickly generate parquet datasets required by the benchmarks.

Expand Down
30 changes: 21 additions & 9 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,20 +25,28 @@ dependencies = [
"numpy>=1.24.4",
"sqlglot==26.30.0",
"fsspec==2025.2.0",
"pyarrow>=15.0.0",
# Keep the floor at 14 so Fabric Runtime 1.3 (pyarrow 14.0.2) and Runtime 2.0
# (24.0.0) are both already satisfied. Forcing an upgrade inside a running
# notebook session leaves the old compiled pyarrow.lib loaded and breaks with
# "cannot import name 'is_threading_enabled' from 'pyarrow.lib'".
"pyarrow>=14.0.0",
"tenacity>=8.2.3,<9; python_version < '3.9'",
"tenacity==9.1.2; python_version >= '3.9'"
]

[project.optional-dependencies]
duckdb = ["duckdb==1.4.4; python_version >= '3.9'", "deltalake==1.3.3; python_version >= '3.10'", "pyarrow>=15.0.0; python_version >= '3.9'"]
polars = ["polars==1.38.1; python_version >= '3.10'", "deltalake==1.3.3; python_version >= '3.10'", "pyarrow>=15.0.0; python_version >= '3.9'"]
daft = ["daft==0.7.3; python_version >= '3.10'", "deltalake==1.3.3; python_version >= '3.10'", "pyarrow>=15.0.0; python_version >= '3.10'"]
tpcds_datagen = ["duckdb==1.4.4; python_version >= '3.9'", "pyarrow>=15.0.0; python_version >= '3.9'"]
tpch_datagen = ["tpchgen-cli>=2.0.1"]
sparkmeasure = ["sparkmeasure==0.24.0"]
spark = ["pyspark>=3.5.0,<4.0.0; python_version >= '3.9'", "delta-spark>=3.2.0,<4.0.0; python_version >= '3.9'", "pyarrow>=15.0.0; python_version >= '3.9'"]
sail = ["pysail>=0.5.2; python_version >= '3.10'", "pyspark[connect]>=4.0.0; python_version >= '3.9'", "deltalake>=1.2.1; python_version >= '3.9'", "pyarrow>=15.0.0; python_version >= '3.9'"]
# The core `pyarrow>=14.0.0` floor is deliberately low (see above); extras that
# write via delta-rs need a newer pyarrow and state it explicitly here.
duckdb = ["duckdb==1.5.5; python_version >= '3.10'", "deltalake==1.6.2; python_version >= '3.10'", "pyarrow>=16.0.0; python_version >= '3.10'"]
polars = ["polars==1.43.2; python_version >= '3.10'", "deltalake==1.6.2; python_version >= '3.10'", "pyarrow>=16.0.0; python_version >= '3.10'"]
# Daft is held on deltalake 1.5.x: 1.6.x emits DataFusion `string_view` parquet
# from MERGE, and Daft's reader rejects Arrow Utf8View.
daft = ["daft[deltalake]==0.7.21; python_version >= '3.10'", "deltalake>=1.5.0,<1.6.0; python_version >= '3.10'", "pyarrow>=16.0.0; python_version >= '3.10'"]
tpcds_datagen = ["duckdb==1.5.5; python_version >= '3.10'"]
tpch_datagen = ["tpchgen-cli>=3.0.0"]
sparkmeasure = ["sparkmeasure==0.28.0; python_version >= '3.9'"]
spark = ["pyspark>=3.5.0,<4.0.0; python_version >= '3.9'", "delta-spark>=3.2.0,<4.0.0; python_version >= '3.9'"]
sail = ["pysail>=0.7.0; python_version >= '3.10'", "pyspark[connect]>=4.0.0; python_version >= '3.10'", "deltalake>=1.6.2; python_version >= '3.10'", "pyarrow>=16.0.0; python_version >= '3.10'"]

[project.urls]
github = "https://github.com/mwc360/LakeBench"
Expand Down Expand Up @@ -101,6 +109,10 @@ ignore = [
[tool.uv]
conflicts = [
[{ extra = "spark" }, { extra = "sail" }],
# daft holds deltalake at 1.5.x; the other Delta engines are on 1.6.x.
[{ extra = "daft" }, { extra = "duckdb" }],
[{ extra = "daft" }, { extra = "polars" }],
[{ extra = "daft" }, { extra = "sail" }],
]

[tool.pytest.ini_options]
Expand Down
53 changes: 26 additions & 27 deletions reports/coverage/daft.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Daft Benchmark Report

_Auto-generated by the LakeBench integration test suite._
_Last updated: 2026-02-25 00:35:03 UTC_
_Last updated: 2026-08-03 22:16:48 UTC_

---

Expand All @@ -13,7 +13,7 @@ _Last updated: 2026-02-25 00:35:03 UTC_

| Querie | Error |
|---|---|
| `q21` | DaftCoreException: DaftError::InternalError Outer reference columns cannot be bound: col(l1.l_suppkey) |
| `q21` | DaftCoreException: DaftError::ValueError Failed to bind predicate for row group pruning on 'C:/Users/milescole/AppData/Local/Temp/pytest-of-milescole/pytest-114/test_tpch_daft0/tpch/lineitem/0-e7aad955-ba4c-471e-a370-70f5d8e09603-0.parquet': DaftError::InternalError Outer reference columns cannot be |

---

Expand All @@ -27,67 +27,67 @@ _Last updated: 2026-02-25 00:35:03 UTC_
|---|---|
| `q2` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Cannot infer supertypes for divide on types: Decimal[precision: 38, scale: 2], Decimal[precision: 38, scale: 2] result precision: 77 exceed bounds of [1, 38]. scale: 41 |
| `q4` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Cannot infer supertypes for divide on types: Decimal[precision: 38, scale: 13], Decimal[precision: 38, scale: 13] result precision: 77 exceed bounds of [1, 38]. scale: 52 |
| `q5` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q5` | InvalidSQLException: Invalid operation: Interval value must be a string |
| `q10` | DaftCoreException: DaftError::ComputeError EXISTS <SUBQUERY> should be optimized away before evaluation. This indicates a bug in the query optimizer. |
| `q11` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Cannot infer supertypes for divide on types: Decimal[precision: 38, scale: 2], Decimal[precision: 38, scale: 2] result precision: 77 exceed bounds of [1, 38]. scale: 41 |
| `q12` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q13` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::AmbiguousReference Column name "ss_ext_wholesale_cost" is ambiguous in schema: [Field { name: "ss_ext_wholesale_cost", dtype: Decimal128(38, 2), metadata: {} }, Field { name: "ss_ext_wholesale |
| `q12` | InvalidSQLException: Invalid operation: Interval value must be a string |
| `q13` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::AmbiguousReference Column name "ss_ext_wholesale_cost" is ambiguous in schema: [Field { name: "ss_ext_sales_price", dtype: Decimal128(38, 6), metadata: {} }, Field { name: "ss_ext_wholesale_co |
| `q14a` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Cannot perform comparison on types: Decimal[precision: 38, scale: 2], Decimal[precision: 38, scale: 6] Details: DaftError::TypeError Cannot infer supertypes for comparison on types: |
| `q14b` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Cannot perform comparison on types: Decimal[precision: 38, scale: 2], Decimal[precision: 38, scale: 6] Details: DaftError::TypeError Cannot infer supertypes for comparison on types: |
| `q16` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q20` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q21` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q16` | InvalidSQLException: Invalid operation: Interval value must be a string |
| `q20` | InvalidSQLException: Invalid operation: Interval value must be a string |
| `q21` | InvalidSQLException: Invalid operation: Interval value must be a string |
| `q22` | InvalidSQLException: Unsupported SQL: 'data type: Signed' |
| `q27` | InvalidSQLException: Unsupported SQL: 'Function `grouping` not found' |
| `q28` | InvalidSQLException: Unsupported SQL: 'Unsupported join type: CrossJoin(None)' |
| `q31` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Cannot infer supertypes for divide on types: Decimal[precision: 38, scale: 2], Decimal[precision: 38, scale: 2] result precision: 77 exceed bounds of [1, 38]. scale: 41 |
| `q32` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q32` | InvalidSQLException: Invalid operation: Interval value must be a string |
| `q35` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::AmbiguousReference Column name "cd_dep_count" is ambiguous in schema: [Field { name: "ca_state", dtype: Utf8, metadata: {} }, Field { name: "cd_gender", dtype: Utf8, metadata: {} }, Field { na |
| `q36` | InvalidSQLException: Unsupported SQL: 'Function `grouping` not found' |
| `q37` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q37` | InvalidSQLException: Invalid operation: Interval value must be a string |
| `q39a` | InvalidSQLException: Unsupported SQL: 'CASE with operand not yet supported' |
| `q39b` | InvalidSQLException: Unsupported SQL: 'CASE with operand not yet supported' |
| `q40` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q41` | DaftCoreException: DaftError::InternalError Outer reference columns cannot be bound: col(i1.i_manufact) |
| `q40` | InvalidSQLException: Invalid operation: Interval value must be a string |
| `q41` | DaftCoreException: DaftError::ValueError Failed to bind predicate for row group pruning on 'C:/Users/milescole/AppData/Local/Temp/pytest-of-milescole/pytest-114/test_tpcds_daft0/tpcds/item/0-041c5dba-fcc9-4d0e-b4c5-44e309e5d062-0.parquet': DaftError::InternalError Outer reference columns cannot be b |
| `q45` | DaftCoreException: DaftError::ComputeError IN <SUBQUERY> should be optimized away before evaluation. This indicates a bug in the query optimizer. |
| `q47` | InvalidSQLException: Daft error: DaftError::ValueError Plan must not have duplicate aliases in the same scope, found: v1 |
| `q49` | DaftCoreException: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError could not determine supertype of Decimal128(7, 2) and Int64 |
| `q47` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Cannot infer supertypes for subtraction on types: Decimal[precision: 38, scale: 2], Decimal[precision: 38, scale: 6] result precision: 43 exceed bounds of [1, 38] |
| `q49` | DaftCoreException: Unable to create logical plan node. Due to Caused by the following errors: 1: DaftError::TypeError could not determine supertype of Decimal128(7, 2) and Int64 |
| `q51` | DaftCoreException: DaftError::InternalError Outer reference columns cannot be bound: col(ws_sales_price) |
| `q53` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Cannot infer supertypes for subtraction on types: Decimal[precision: 38, scale: 2], Decimal[precision: 38, scale: 6] result precision: 43 exceed bounds of [1, 38] |
| `q54` | InvalidSQLException: Unsupported SQL: 'data type: Signed' |
| `q57` | InvalidSQLException: Daft error: DaftError::ValueError Plan must not have duplicate aliases in the same scope, found: v1 |
| `q57` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Cannot infer supertypes for subtraction on types: Decimal[precision: 38, scale: 2], Decimal[precision: 38, scale: 6] result precision: 43 exceed bounds of [1, 38] |
| `q58` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Cannot infer supertypes for addition on types: Decimal[precision: 38, scale: 2], Decimal[precision: 38, scale: 2] result precision: 39 exceed bounds of [1, 38] |
| `q59` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Cannot infer supertypes for divide on types: Decimal[precision: 38, scale: 2], Decimal[precision: 38, scale: 2] result precision: 77 exceed bounds of [1, 38]. scale: 41 |
| `q61` | InvalidSQLException: Unsupported SQL: 'Unsupported join type: CrossJoin(None)' |
| `q63` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Cannot infer supertypes for subtraction on types: Decimal[precision: 38, scale: 2], Decimal[precision: 38, scale: 6] result precision: 43 exceed bounds of [1, 38] |
| `q64` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Cannot infer supertypes for multiply on types: Decimal[precision: 20, scale: 0], Decimal[precision: 38, scale: 2] result precision: 58 exceed bounds of [1, 38] |
| `q65` | DaftCoreException: Not Yet Implemented: Execution of non-equality join |
| `q66` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Expected if_true and if_false arguments for if_else to be castable to the same supertype, but received ws_ext_sales_price#Decimal[precision: 27, scale: 2] and literal#Int64 |
| `q66` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Expected if_true and if_false arguments for if_else to be castable to the same supertype, but received ws_net_profit#Decimal[precision: 27, scale: 2] and literal#Int64 |
| `q67` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError could not determine supertype of Decimal128(27, 2) and Int64 |
| `q70` | InvalidSQLException: Unsupported SQL: 'Function `grouping` not found' |
| `q72` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q72` | InvalidSQLException: Invalid operation: Interval value must be a string |
| `q74` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Cannot infer supertypes for divide on types: Decimal[precision: 38, scale: 6], Decimal[precision: 38, scale: 6] result precision: 77 exceed bounds of [1, 38]. scale: 45 |
| `q75` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError could not determine supertype of Decimal128(7, 2) and Float64 |
| `q77` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q77` | InvalidSQLException: Invalid operation: Interval value must be a string |
| `q78` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError could not determine supertype of Decimal128(38, 2) and Int64 |
| `q80` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q82` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q80` | InvalidSQLException: Invalid operation: Interval value must be a string |
| `q82` | InvalidSQLException: Invalid operation: Interval value must be a string |
| `q86` | InvalidSQLException: Unsupported SQL: 'Function `grouping` not found' |
| `q87` | InvalidSQLException: Unsupported SQL: 'Subqueries are not supported' |
| `q88` | InvalidSQLException: Unsupported SQL: 'Unsupported join type: CrossJoin(None)' |
| `q89` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::TypeError Cannot infer supertypes for subtraction on types: Decimal[precision: 38, scale: 2], Decimal[precision: 38, scale: 6] result precision: 43 exceed bounds of [1, 38] |
| `q90` | InvalidSQLException: Unsupported SQL: 'Unsupported join type: CrossJoin(None)' |
| `q92` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q94` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q95` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q92` | InvalidSQLException: Invalid operation: Interval value must be a string |
| `q94` | InvalidSQLException: Invalid operation: Interval value must be a string |
| `q95` | InvalidSQLException: Invalid operation: Interval value must be a string |
| `q97` | InvalidSQLException: Table not found: ssci |
| `q98` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q98` | InvalidSQLException: Invalid operation: Interval value must be a string |

---

## ClickBench

⚠️ **37/43 queries passed (86.0%)**
⚠️ **38/43 queries passed (88.4%)**

### Failed queries

Expand All @@ -97,8 +97,7 @@ _Last updated: 2026-02-25 00:35:03 UTC_
| `q28` | InvalidSQLException: Unsupported SQL: 'Function `char_length` not found' |
| `q29` | InvalidSQLException: Unsupported SQL: 'Function `char_length` not found' |
| `q30` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::AmbiguousReference Column name "ResolutionWidth" is ambiguous in schema: [Field { name: "ResolutionWidth", dtype: Int64, metadata: {} }, Field { name: "ResolutionWidth", dtype: Int64, metadata |
| `q36` | InvalidSQLException: Daft error: DaftError::External Unable to create logical plan node. Due to: DaftError::AmbiguousReference Column name "ClientIP" is ambiguous in schema: [Field { name: "ClientIP", dtype: Int32, metadata: {} }, Field { name: "ClientIP", dtype: Int64, metadata: {} }, Field { name: |
| `q43` | InvalidSQLException: Unsupported SQL: 'Function `date_add` not found' |
| `q43` | InvalidSQLException: Unsupported SQL: 'Function `timestampdiff` not found' |

---

Expand Down
2 changes: 1 addition & 1 deletion reports/coverage/duckdb.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# DuckDB Benchmark Report

_Auto-generated by the LakeBench integration test suite._
_Last updated: 2026-02-24 23:35:49 UTC_
_Last updated: 2026-08-03 22:16:17 UTC_

---

Expand Down
Loading
Loading