rs-0.55.1

daytonaio/daytonars-0.55.1Aug 5, 2026by github-actions[bot]

AI Summary

A performance-heavy release featuring optimizations for joins, hive partitioning, and streaming, alongside new expressions like `ewm_sum` and `list` packing.

Key Highlights

  • Significant performance improvements for joins and hive partitioning
  • New expressions: `ewm_sum`, `ewm_sum_by`, and `list` packing
  • Enhanced DNS caching and cloud IO concurrency control

New Features

  • New `struct.drop()` method
  • Support reading IEEE 754 total order Parquet column order
  • New `ewm_sum` and `ewm_sum_by` expressions
  • New `Expr.is_sorted` and `DataFrame.is_sorted()`
  • SQL's implicit JOIN syntax support

Full Release Notes

This Releases' DSL matches Python 1.43.2.

## 🚀 Performance improvements

- Pushdown `len()` to concat/union inputs (#28570)
- Optimize not(bool\_f) to not\_bool\_f (#28474)
- Split multiplexers that directly scan from in-memory DataFrame (#28376)
- Make DNS cache global (#28352)
- Do not remove cache if predicates not pushed to all inputs (#28341)
- Environment variable for logging slow DNS lookup (#28211)
- Pre-partition on left, right and semi joins on hive partitioned data (#28374)
- Rewrite inner joins on hive partitioned data to a union of partitions filtered joins (#28327)
- Tighten redundant comparisons and propagate filter constraints (#27999)
- Canonicalize predicates (#28212)
- Remove excess memory copy in streaming IPC sink (#28141)
- Parallelize scan\_iceberg resolve (#28168)
- Chunk-aware morsel splitting on single-file IO sink (#27950)
- Don't allocate for `full_null()` with small lengths (#28181)
- Use monotonic deque for rolling min\_by/max\_by (O(n)) (#27436)
- Add a sampled resolve mode for multi-file parquet metadata (#28111)
- Speed up small dtype series sums with a upcast sum kernel (#27958)
- Don't block on path expansion (#28073)
- Add bytes-based concurrency control for cloud IO (#27924)
- Stop flushing multiplexer on phase change (#28013)
- Prevent empty chunks from triggering copy in rechunk (#27953)
- Improve performance of struct unnest inside list eval on streaming (#27905)

## ✨ Enhancements

- Add `struct.drop()` (#28666)
- Improve error message when CSV name de-duplication fails (#28658)
- Always keep first metadata per source for Parquet (#28661)
- Improve plan-time row estimates for multi-file parquet scans (#28380)
- Serialize and deserialize `SinkTypeIR::Partitioned` (#28112)
- Add `infer_schema_files` parameter to `scan_csv` (#28440)
- Support reading IEEE 754 total order Parquet column order (#27896)
- Expose more Expr nodes for cudf\_polars (pt 2) (#28404)
- Allow callback sinks on cloud (#28458)
- Pre-partition group-by on hive keys  (#28444)
- Add ewm\_sum and ewm\_sum\_by #28151 (#28215)
- Serve stale records from object\_store DNS cache (#28256)
- Expose more expr nodes for cudf-polars (#28117)
- Make partition\_hive an opt flag (#28345)
- When displaying IRExprs, only add parentheses when needed for disambiguation (#28319)
- Show only differing dtypes in `assert_frame_equal` error (#27816)
- Add Clone to SpillFrame/Token (#28302)
- Add Series.degrees/radians and clarify trig functions use radians (#22961)
- Merge sorted with multikey (#28067)
- Add `list` expression which consistently packs elements together into new List type (#27990)
- Construct pyarrow predicates via PyO3 instead of eval str (#27271)
- Optimize joins with redundant equi-join keys (#28017)
- Implement missing datetime options for `CastColumnsPolicy` (#28084)
- Add Expr.cat.to and Expr.cat.physical (#28096)
- Add POLARS\_OOC\_DISK\_BUDGET\_MB (#28045)
- Close ResourceWarning leaks in database tests (#28066)
- Expose `IRFunctionExpr::Fused` in the python node visitor (#27889)
- Deprecate casts from string to temporal dtypes (#28056)
- Add naive out-of-core spilling to Polars (#27998)
- Add experimental strict mode (#28023)
- Optimize non-negative len and null\_count comparisons (#28002)
- Optimize len and null\_count comparisons (#27727)
- Support SQL's implicit `JOIN` syntax (#27890)
- Sample from bivariate distribution for spill context Thompson sampling (#27973)
- Add `Expr.is_sorted` (#26708)
- Add suggestions in wrong api usage or mismatched column names (#27954)
- Add external object\_store support for non-native schemes (#27871)
- Skip Delta files and parquet row groups using per-field struct statistics (#27887)
- Add re-registration of OOC SpillTokens (#27909)
- Improve IR sortedness detection for with\_row\_index and explode (#27875)
- Add `DataFrame.is_sorted()` (#27870)

## 🐞 Bug fixes

- Don't hand IO plugins a predicate they cannot evaluate (#28643)
- Don't hang or crash on `sqrt`/`cbrt`/`pct_change`/`ewm_*` with a Struct column (#28696)
- Raise on overflow in Decimal sum instead of silently wrapping (#28688)
- Preserve nulls when importing Arrow maps (#28680)
- Propagate null `by` column values in `rolling_*_by` (#27367)
- Fix self-referencing `field` in `struct.with_fields` with `over` (#28678)
- Fix Arrow buffer offset for `Utf8` and `Binary` (#28662)
- Clamp group-by slice offset (#28579)
- Ensure categorical `fill_null(strategy="min"/"max")` uses lexical min/max (#28636)
- Release the GIL while resolving the schema in `__arrow_c_stream__` (#28642)
- Fix data corruption on Series from nested Arrow `LargeList` (#28632)
- Properly propagate enum metadata for iceberg column mapping (#28580)
- Correctly write parquet field IDs for enums and categoricals (#28581)
- Fix arrow C interop binview offset (#28623)
- Fix duplicate hive values in hive pre-partition rewrite (#28621)
- Double-counted offset for Arrow export of sliced `Series(Array)` (#28602)
- Struct/List/Array equality handling in sort and join (#28601)
- Use try\_new in StructArray construction in polars-json (#27489)
- Raise ComputeError instead of panicking in repeat\_by when output exceeds IdxSize::MAX (#27892)
- Run type coercion pass on pivot's internally generated group\_by (#27897)
- More careful slice pushdown into joins (#28578)
- Preserve ordering in sliced unions (#28576)
- Drop input sortedness when casting to a string (#28574)
- Clear sortedness flags in `StringChunked` substring kernels (#28573)
- Bad mask handling when reading optional parquet column (#28547)
- Any operation on `Unknown(Int)` and `Unknown(Float)` should result in `Unknown(Float)` (#28545)
- Flip `nulls_last` after `Expr.reverse()` (#28572)
- Fix high blocking thread use in sink\_parquet with async local path (#28543)
- Serialize LazyFrames backed by bytes (#28568)
- Release GIL in `SQLContext.execute()` (#28549)
- Propagate `nulls_last` in `function_expr_sortedness` (#28544)
- Incorrect slicing when a join requires sorting (#28541)
- Fix panic on self join of scan\_delta / scan\_iceberg (#28468)
- Decrement ParkGroup worker count when worker exits (#28492)
- Add missing Send bounds in Connector (#28497)
- Fix UB on first/last\_non\_null with empty chunk (#28495)
- Do not CSE non-column height expr on streaming engine (#28480)
- Propagate adjusted sortedness through Gather (#28493)
- Deduplicate the expression equality checks (#28483)
- Address 3VL issue with SQL `NOT IN` interaction with `NULL` values and joins (#28484)
- Use total comparison in Expr literal values (#28482)
- Ensure SQL `SUM` and `CORR` aggregates return NULL for all-null inputs, add `TOTAL` (#28475)
- Share `null_count_dtype` helper between Delta and Iceberg, fixing `SchemaError` (#28479)
- Remove non-output columns from the equi-join and semi/anti-join operators (#28446)
- Fix dropped slice on multiple unions (#28477)
- Fix in-memory engine incorrect slice on maintain order join (#28478)
- Check join schema by position (#28455)
- Block predicate pushdown past overwritten window keys (#28429)
- Avoid panic when union slice skips all rows (#28420)
- Solve panic in `dt.replace` when there were multiple chunks (#28437)
- Propagate `is_scalar` from the input to the output of `.sort()` and `.sort_by()` (#28438)
- Insert missing coercions from `Unknown(_)` in list/array arithmetic (#28411)
- Resolve CSV column names overwrite in DSL->IR conversion (#28383)
- Avoid IEJoin rewrite for Categorical comparisons (#28427)
- Do not rewrite `sort().reverse()` to `sort(descending=True)` when `maintain_order=True` (#28403)
- Propagate bigidx to `polars-plan` from `polars` (#28396)
- Ensure BinaryView offset+len does not exceed i32::MAX where possible (#28048)
- Invalid offset in strptime (#28388)
- Incorrect schema type for decimal \<-> primitive division (#28373)
- Panic in in-memory CSEE handling (#28371)
- Apply same type coercion to IsBetween as binary comparisons (#28300)
- Fix offset in arrow ffi export of sliced struct arrays (#28369)
- Fix cross filter not applied with sink and CSE (#28297)
- Fix panic on projection pushdown with caches (#28280)
- Fix `write_json()` null values in `Array` columns being written incorrectly as `null` (#28330)
- Fix EntityTooSmall on sink\_ipc to S3 (#28255)
- Raise error instead of silent wrapping for `select(len())` (#28355)
- Float16 groupby aggregates (#28361)
- Respect lexical ordering of Categorical in `top_k`/`bottom_k` (#28359)
- Support dtype-list schema overrides in scan\_csv (#28226)
- Resolve unknown type in fused multiply add (#28321)
- Honor `aws_checksum_algorithm` when provided (#28328)
- Fix regression in sourcing HF\_TOKEN (#28317)
- Raise on addition/subtraction between temporal and non-temporal Series (#28266)
- Rewrite with\_columns on empty df to select during DSL -> IR (#28298)
- Fix sink deadlock regression (#28296)
- Avoid panic when consumer of vertical concat is done (#28272)
- Ensure predicate simplification is deterministically ordered (#28269)
- Don't attribute untimed execution to optimization in profile (#28273)
- Harden IPC mmap API (#28258)
- Classify S3 region request failures as IO errors (#28225)
- Incorrect inner dtype in ArrayChunked::from\_aligned\_values (#28249)
- Unsoundness in arg\_sort\_ascending (#28245)
- Add column length check to row encoding (#28248)
- Raise on implode of `Object` dtype instead of creating invalid `List(Object)` (#28246)
- Don't panic in qcut on degenerate float input (all-NaN, infinite, include\_breaks) (#28220)
- Fix streaming Strptime feature flags (#28242)
- Return null not 0 for the first unbiased `ewm_var`/`ewm_std` value (#28235)
- Use after free in file cache (#28236)
- Incorrect length calculation in parallel hashmap (#28227)
- Avoid slice pushdown panic on shared cache inputs (#28157)
- Incorrect dtype for Unknown right literal in arithmetic (#28184)
- Remove unnecessary unsafe Python object downcast (#28189)
- Use-after-free in numpy ufunc FFI (#28195)
- Use-after-free in plugin registry (#28194)
- Unpickling for pl.when().then() (#28165)
- Reduce unknown casts (#28145)
- Consider a `rolling_rank` position invalid if `ost.len() < min_samples` (#28142)
- Incorrect broadcast with empty len in pl.concat\_list (#28134)
- Incorrect sorted fast-path returning nan for grouped max (#28129)
- Fix panic on scan\_parquet filter of fixed-size binary column (#28122)
- Fix decimal dynamic float cast (#28126)
- Fix pyiceberg key dot HDFS prefix filter (#28109)
- Fix projection pushdown panic on `select(len())` after `groupby` (#28108)
- Close ResourceWarning leaks in database tests (#28066)
- Bad array len in UnionArray (#28079)
- Avoid panic on temporal extraction for datetime columns with nulls (#28054)
- Prevent panic in `replace` when `old`/`new` contain Expr or object dtype values (#27433)
- Fix qcut panic and incorrect bins on NaN input (#28020)
- Remove TrustedLen from Scan (#28055)
- Add a deprecation warning for `.explode()` without `empty_as_null` argument (#28040)
- Fix `select(len())` incorrectly returned 0 when using `scan_iceberg` with `pyiceberg` as reader override (#28044)
- Ensure slice expr always observes input order (#28041)
- Fix projection pushdown with row index out of order (#28043)
- Fix cross-join predicates not applied when using `sink_*` functions (#28042)
- Grammar corrections (recommend to → recommend, allows to → allows using) (#28038)
- Ensure optimisations aren't omitted by cached IR nodes (#28004)
- Computed GROUP keys in SQL projections (#27989)
- Handle empty DataFrames in `dt.truncate` and `dt.round` (#26120)
- Address join alias state leakage in SQL CTEs (#27985)
- Support scanning `file://` URIs with percent-encoded paths (#27876)
- Lower SQL `[NOT] IN (subquery)` to semi/anti join (#27888)
- Check for continuity across morsels in AsOf join node (#27461)
- Add test for projection pushdown with hconcat regression (#27937)
- Traverse caches only once in explain (#27939)
- Preserve null placement when collapsing `sort.reverse()` into single sort (#27918)
- Incorrect schema order for hstack in projection pushdown optimizer (#27920)
- Fix duplicated map\_elements warning on streaming engine (#27919)

## 📖 Documentation

- Update and restructure README (#28490)
- Minor fixes to Spark migration guide (#27730)
- Relocate Polars Cloud \& On-Prem User Guide (#28462)
- Add notes on k8s operator (#28445)
- Update comparison page (#28418)
- Update GPU support documentation with the cudf-polars 26.06 release (#27830)
- Fix dev docs being canonical for SEO (#28306)
- Document experimental HDFS support on-premises (#28115)
- Add Series.degrees/radians and clarify trig functions use radians (#22961)
- Add polars-bio to community plugins (#28103)
- Add AWS Marketplace walkthrough to Cloud User Guide (#28214)
- Update config reference (#28150)
- Correct that `merge_sorted()` null inputs should be nulls first (#28177)
- Clarify parts of the Polars Cloud and On-prem user guide (#28170)
- Add On-Premise release 0.6.3 to releases page (#28175)
- Update PolarsCloud snippets for 0.9.0 release  (#28166)
- Fix to\_titlecase incorrectly claiming alphanumeric separation (#28136)
- Fix dataset regression in the examples (#28131)
- Emphasize to generally not ever write Rust tests (#28082)
- Mention Polars skill in User Guide's LLM section (#28113)
- Add StringNameSpaceImpl contains example (#27713)
- Add note on OOM behavior on Kubernetes (#27972)
- Add entry for `DataFrame.is_sorted()` (#27913)
- Add robots.txt disallowing stale docs and added sitemap for better SEO (#27901)
- Update Polars \<> Spark comparison (#27873)

## 📦 Build system

- Propagate `bigidx` to `polars-plan` indirectly included via `pyo3-polars` (#28406)
- Propagate bigidx to `polars-plan` from `polars` (#28396)
- Set the default `dev` profile to `line-tables-only` (#28358)
- Reduce binary size by optimizing for size in the SQL transpilation (#28336)
- Fix test compilation for polars-stream (#27951)

## 🛠️ Other improvements

- Add (with\_)context to PolarsResult for easier annotation (#28677)
- Clean up polars-utils import structure (#28668)
- Deprecate `struct.rename_fields()` with an incorrect number of fields (#28672)
- Re-enable `test_extension()` for streaming engine (#28611)
- Clean up vec utils (#28667)
- Remove Rust compiler intrinsics, use nightly functions (#28665)
- Update `test_hive_join_rewrite_semi_join` test to work with streaming engine (#28610)
- Fix duckdb delta extension install collision (#28607)
- Deprecate casts from `Categorical` to integer dtypes (#28525)
- Deprecate not setting the `plan_stage` argument in `show_graph()` (#28391)
- Make hive\_part extraction a function and public (#28507)
- Deduplicate the expression equality checks (#28483)
- Assert parameter in `filter_scan_ir` (#28472)
- Make the fmt macro exportable (#28459)
- Fix flaky test (#28454)
- Update AI policy for comments (#28436)
- Fix flaky ordering expectation in top\_k\_by (#28435)
- Re-work `shuffle` parameter for `sample()` (#27460)
- SpillFrame instead of DataFrame in Morsel (#28270)
- Deprecate casting numeric types to categoricals (#28349)
- Deprecate `cat.get_categories()` and `cat.to_local()` (#28299)
- Update `spin` dependency to `v0.10.1` (#28360)
- Bloat dispatch reduction (#28337)
- Show only differing dtypes in `assert_frame_equal` error (#27816)
- Accept IR in `optimize` (#28318)
- Fix 1.97 Rust clippy hints (#28305)
- Disallow HashMap/Set in polars-plan (#28276)
- Remove unencountered deny entries (#28260)
- Bump crossbeam-epoch dependency (#28259)
- Deprecate casts from non-nested dtypes into Lists (#28193)
- Deprecate bitwise ops between integers and booleans (#28186)
- Change `object_store` custom DNS resolver patch to rev-based (#28241)
- Remove PartitionedHashMap (#28244)
- Construct pyarrow predicates via PyO3 instead of eval str (#27271)
- Store current SpillContext inside SpillToken (#28076)
- Add `serde(default)` to new cast options DSL (#28209)
- Clarify AI policy, explicitly forbid agents from interacting with our repository (#28206)
- Tighten first-time-contributor screenshot requirements (#28207)
- Ignore quickxml DoS rustsec (#28185)
- Update `typos` to `v1.48.0` (#28162)
- Impl Eq for Scalar (#28144)
- Disallow usage of `tokio::spawn` in clippy (#28123)
- Remove legacy prelude glob imports from leaf files (#28114)
- Set row count estimates for scan\_iceberg (#28075)
- Fix `test_select_explode_height_filter_order_by` failure when `POLARS_MAX_THREADS=2` (#28090)
- Add Morsel::height (#28060)
- Add AI agent disclsoure (#28064)
- Deprecate casts from string to temporal dtypes (#28056)
- Bump memmap2 version (#28050)
- Update `sqlparser` dependency (#28021)
- Update `pyo3` and `rust-numpy` to `0.29.0` (#27970)
- Rename `agg_state.original_len` to `original_groups`, ensure `agg_state.groups` only updated through `with_groups()` (#27747)
- Add `2.0` branch as primary branch (#27978)
- Patch jemalloc-sys for Makefile bug (#27945)
- Restore Cargo.lock (#27964)
- Add test for projection pushdown with hconcat regression (#27937)
- Update `deny.toml` configuration (#27949)
- Doctest skip refactor and add hugging face rate limited tests (#27885)
- Bump Rust dependencies (#27874)

Thank you to all our contributors for making this release possible!
@0guban0v, @AnirudhRahul, @April-Sonnet, @Bharath-970, @BitWeaverDev, @CodingSelim, @EndPositive, @JakubValtar, @Jesse-Bakker, @Kevin-Patyk, @LarryHu0217, @Liyixin95, @MarcoGorelli, @Matt711, @MatteoPossamai, @NicoOhR, @Samoilov2004, @TNieuwdorp, @alex-h-sun, @alexander-beedie, @azimafroozeh, @borchero, @cBournhonesque, @carnarez, @dancsi, @dependabot[bot], @dsprenkels, @gautamvarmadatla, @harrywhalen, @jonasdedden, @jorenham, @kdn36, @kinoko-001, @lzcmian, @makinzm, @malhotrashivam, @masumi-ryugo, @mdavis-xyz, @mdroogh, @mikhail5555, @mkzung, @mroeschke, @nameexhaustion, @nchammas, @orlp, @r-brink, @raphaelroshan, @ritchie46, @subotac, @tylerriccio33, @useredsa, @uurl, @wence-, @xixixao, @yannbolliger, @zichen0116 and [dependabot[bot]](https://github.com/apps/dependabot)