Eventual-Inc
Daft
Blog
Docs
Changelog
Blog
Docs
Changelog
Overview
Optimizations
Branches
Benchmarks
Runs
Performance History
Latest Results
refactor(temporal): broadcast literal arguments to the batch row count Use the existing `to_struct` idiom (broadcast length-1 inputs to `EvalContext::row_count`) in a single `broadcast_args` helper applied before the arguments are unpacked, instead of a common-length search per kernel. This keeps each kernel's change to one line. Drop the Rust unit tests that duplicated the Python tests; the length-mismatch error they covered no longer exists, since the evaluator guarantees argument lengths.
jonasdedden:fix/7712-temporal-literal-broadcast
7 hours ago
perf(temporal): keep date_trunc in i64 when the interval is a multiple of the time unit Resolve the interval against the column's time unit once per array: a no-op when it divides the unit, i64 arithmetic when it is a whole multiple (with an i128 fallback on overflow), and exact nanosecond math only otherwise. The per-row i128 division regressed ClickBench q42 (DATE_TRUNC('minute', ...)). Also drop tests duplicated between Rust, the Series tests and the DataFrame tests, keeping Rust tests only for parsing and the i64/i128 equivalence.
jonasdedden:fix/7713-date-trunc-sub-unit
7 hours ago
fix(temporal): handle date_trunc intervals finer than the time unit date_trunc converted the parsed interval into the column's time unit with chrono's truncating num_* accessors, so an interval finer than the unit became 0 and panicked with 'attempt to calculate the remainder with a divisor of zero', and an interval that is not a whole multiple of the unit was silently rounded to a different interval. Parse the interval into nanoseconds (i128) and do the bucket arithmetic in nanoseconds, flooring the result back to the column's time unit. Zero and negative intervals now raise a ValueError, and out-of-range results raise instead of overflowing. Closes #7713
jonasdedden:fix/7713-date-trunc-sub-unit
8 hours ago
fix(temporal): broadcast literal arguments in make_date, make_timestamp, add_months and months_between `make_date`, `make_timestamp`, `make_timestamp_ltz`, `add_months` and `months_between` combined their argument arrays with `Iterator::zip`. A literal argument arrives as a length-1 Series, so `zip` stopped after the first row and the length-1 result was then broadcast to every row, i.e. every row got the first row's result. Broadcast length-1 arguments to the common length with `Series::broadcast` (the same idiom as `pmod`, `hash` and `list.contains`) before zipping, and error on mismatched non-1 lengths instead of silently truncating. Closes #7712
jonasdedden:fix/7712-temporal-literal-broadcast
8 hours ago
refactor(catalog): share Glue table lookup between get_table and has_table
nirmalpatel008:fix/glue-has-table
1 day ago
test(sql): check ADBC writes with independent reads Read the written tables back with Python's sqlite3 module and a direct SQLAlchemy query, and check stored column types and NULLs, so Daft's own read path can't hide a write mistake.
Sanskar1724:feat-adbc-write
1 day ago
fix(sql): address review on ADBC reads - Drop SQLAlchemy-only SQLite URL options (e.g. timeout) instead of passing them into the ADBC filename, and keep SQLite URI options such as mode=ro on a file: URI. - Honour backend="connectorx" for queries with a schema (the MIN/MAX partition bounds query) and cast the result, instead of falling back to SQLAlchemy. - Move the sys import in tests to the top of the file.
Sanskar1724:feat-adbc-read
1 day ago
fix(iceberg): match the spec for decimal bucket, string truncate and pre-1970 hour transforms (#7649) ## Changes Made Three Iceberg partition transforms diverged from the spec, so Daft wrote rows to the wrong partitions and pruned away matching files in tables written by other engines: - `bucket` on decimals now hashes the minimal two's-complement bytes with room for the sign bit, as Java's `BigInteger.toByteArray()`. Negatives, zero, and values like `1.28` were hashed wrongly. - `truncate` on strings counts code points (`substring_by_char`) instead of bytes, which failed on non-ASCII values. - `hour` uses floor division, so timestamps before 1970 map to negative hours. `test_partitioning_hours` asserted the old truncating results; it now expects the spec values, which PyIceberg also returns. The Rust decimal hash test computed its expectation with the same algorithm as the code under test; it now checks fixed byte encodings. ## Related Issues Closes #7648 ## AI Disclosure AI-assisted implementation.
main
2 days ago
Latest Branches
CodSpeed Performance Gauge
0%
fix(temporal): broadcast literal arguments in make_date, make_timestamp, add_months and months_between
#7714
7 hours ago
9f8daed
jonasdedden:fix/7712-temporal-literal-broadcast
CodSpeed Performance Gauge
-15%
fix(temporal): handle date_trunc intervals finer than the time unit
#7715
7 hours ago
0e56656
jonasdedden:fix/7713-date-trunc-sub-unit
CodSpeed Performance Gauge
0%
fix(catalog): return False from GlueCatalog.has_table for missing tables
#7633
1 day ago
f938263
nirmalpatel008:fix/glue-has-table
© 2026 CodSpeed Technology
Home
Terms
Privacy
Docs