py-1.38.0
pola-rs/polarspy-1.38.0Feb 4, 2026by github-actions[bot]
AI Summary
Feature release with major performance improvements including streaming merge-join, zero-copy IPC uploads, and concurrent schema resolution. Deprecated retries parameter in favor of storage_options.
Key Highlights
- Add streaming merge-join for efficient join operations
- Enable zero-copy object_store put upload for IPC sink
- Concurrent schema and metadata resolution for file scanning
- New streaming UnorderedUnion implementation
- Add compression support to write_csv and sink_csv
Breaking Changes
- Deprecate retries=n in favor of storage_options={'max_retries': n}
New Features
- Streaming merge-join
- Zero-copy IPC uploads
- Concurrent file schema resolution
- Streaming UnorderedUnion
- Compression support for CSV sink
- scan_lines function
- Regex support in str.split
- Multiple quantile computation support
- SQL improvements for qualified wildcard columns
- Cloud retry/backoff configuration via storage_options
Full Release Notes
## ⚠️ Deprecations
- Deprecate `retries=n` in favor of `storage_options={"max_retries": n}` (#26155)
## 🚀 Performance improvements
- Enable zero-copy object\_store `put` upload for IPC sink (#26288)
- Resolve file schema's and metadata concurrently (#26325)
- Run elementwise CSEE for the streaming engine (#26278)
- Disable morsel splitting for fast-count on streaming engine (#26245)
- Implement streaming decompression for scan\_ndjson and scan\_lines (#26200)
- Improve string slicing performance (#26206)
- Refactor `scan_delta` to use python dataset interface (#26190)
- Add dedicated kernel for group-by `arg_max/arg_min` (#26093)
- Add streaming merge-join (#25964)
- Generalize Bitmap::new\_zeroed opt for Buffer::zeroed (#26142)
- Reduce fs stat calls in path expansion (#26173)
- Lower streaming group\_by n\_unique to unique().len() (#26109)
## ✨ Enhancements
- Avoid OOM for scan\_ndjson and scan\_lines if input is compressed and negative slice (#26396)
- Support annoymous agg in-mem (#26376)
- Add unstable `arrow_schema` parameter to `sink_parquet` (#26323)
- Improve error message formatting for structs (#26349)
- Remove parquet field overwrites (#26236)
- Enable zero-copy object\_store `put` upload for IPC sink (#26288)
- Improved disambiguation for qualified wildcard columns in SQL projections (#26301)
- Expose `upload_concurrency` through env var (#26263)
- Allow quantile to compute multiple quantiles at once (#25516)
- Allow empty LazyFrame in `LazyFrame.group_by(...).map_groups` (#26275)
- Use delta file statistics for batch predicate pushdown (#26242)
- Add streaming UnorderedUnion (#26240)
- Implement compression support for sink\_ndjson (#26212)
- Add unstable record batch statistics flags to `{sink/scan}_ipc` (#26254)
- Support CSE for python UDFs on the same address (#26253)
- Cloud retry/backoff configuration via `storage_options` (#26204)
- Use same sort order for expanded paths across local / cloud / directory / glob (#26191)
- Add streaming merge-join (#25964)
- Serialize optimization flags for cloud plan (#26168)
- Add compression support to write\_csv and sink\_csv (#26111)
- Add `scan_lines` (#26112)
- Support regex in `str.split` (#26060)
- Add unstable IPC Statistics read/write to `scan_ipc`/`sink_ipc` (#26079)
- Add unstable `height` parameter to `DataFrame`/`LazyFrame` (#26014)
- Remove old partition sink API (#26100)
- Expose ArrowStreamExportable on python collect batches iterator (#26074)
- Add nulls support for all rolling\_by operations (#26081)
## 🐞 Bug fixes
- Correct off-by-one in RLE row counting for nullable dictionary-encoded columns (#26411)
- Support very large integers in env var limits (#26399)
- Fix PlPath panic from incorrect slicing of UTF8 boundaries (#26389)
- Fix Float dtype for spearman correlation (#26392)
- Fix optimizer panic in right joins with type coercion (#26365)
- Don't serialize retry config from local environment vars (#26289)
- Fix `PartitionBy` with scalar key expressions and `diff()` (#26370)
- Add {Float16, Float32} -> Float32 lossless upcast (#26373)
- Fix panic using `with_columns` and `collect_all` (#26366)
- Add multi-page support for writing dictionary-encoded Parquet columns (#26360)
- Ensure slice advancement when skipping non-inlinable values in `is_in` with inlinable needles (#26361)
- Pin `xlsx2csv` version temporarily (#26352)
- Bugs in ViewArray total\_bytes\_len (#26328)
- Overflow in i128::abs in Decimal fits check (#26341)
- Make Expr.hash on Categorical mapping-independent (#26340)
- Clone shared GroupBy node before mutation in physical plan creation (#26327)
- Fixed "sheet\_name" typing for `read_ods` and `read_excel` (#26317)
- Improve Polars dtype inference from Python `Union` typing (#26303)
- Consider the "current location" of an item when computing `rolling_rank_by` (#26287)
- Reset `is_count_star` flag between queries in collect\_all (#26256)
- Fix incorrect is\_between filter on scan\_parquet (#26284)
- Make polars compatible with ty (#26270)
- Lower AnonymousStreamingAgg in group-by as aggregate (#26258)
- Avoid overflow in `pl.duration` scalar arguments case (#26213)
- Broadcast arr.get on single array with multiple indices (#26219)
- Fix panic on CSPE with sorts (#26231)
- Eager `DataFrame.slice` with negative offset and `length=None` (#26215)
- Use correct schema side for streaming merge join lowering (#26218)
- Overflow panic in `scan_csv` with multiple files and `skip_rows + n_rows` larger than total row count (#26128)
- Respect `allow_object` flag after cache (#26196)
- Raise error on non-elementwise PartitionBy keys (#26194)
- Allow ordered categorical dictionary in scan\_parquet (#26180)
- Allow excess bytes on IPC bitmap compressed length (#26176)
- Address a macOS-specific compile issue (#26172)
- Fix deadlock on `hash_rows()` of 0-width DataFrame (#26154)
- Fix NameError filtering pyarrow dataset (#26166)
- Fix concat\_arr panic when using categoricals/enums (#26146)
- Fix NDJSON/scan\_lines negative slice splitting with extremely long lines (#26132)
- Incorrect group\_by min/max fast path (#26139)
- Remove a source of non-determinism from lowering (#26137)
- Error when `with_row_index` or `unpivot` create duplicate columns on a `LazyFrame` (#26107)
- Panics on shift with head (#26099)
## 📖 Documentation
- Fix `Expr.get` referencing incorrect dtype for `index` parameter (#26364)
- Fix `Expr.quantile` formatting (#26351)
- Drop `sphinx-llms-txt` extension (#26285)
- Remove deprecated `cublet_id` (#26260)
- Update for new release (#26255)
- Update MCP server section with new URL (#26241)
- Fix unmatched paren and punctuation in pandas migration guide (#26251)
- Add observatory database\_path to docs (#26201)
- Note plugins in Python user-defined functions (#26138)
## 📦 Build system
- Address remaining Python 3.14 issues with `make requirements-all` (#26195)
- Address a macOS-specific compile issue (#26172)
## 🛠️ Other improvements
- Ensure local doctests skip `from_torch` if module not installed (#26405)
- Change linked timezones in test suite to canonical timezones (#26310)
- Implement various deprecations (#26314)
- Rename `Operator::Divide` to `RustDivide` (#26339)
- Properly disable the Pyodide tests (#26382)
- Remove unused field (#26367)
- Fix runtime nesting (#26359)
- Remove `xlsx2csv` dependency pin (#26355)
- Use outer runtime if exists in to\_alp (#26353)
- Make CategoricalMapping::new pub(crate) to avoid misuse (#26308)
- Clarify IPC buffer read limit/length paramter (#26334)
- Add dtype test coverage for delta predicate filter (#26291)
- Add AI policy (#26286)
- Unpin "pandas\<3" in dev dependencies (#26249)
- Remove all non CSV fast-count paths (#26233)
- Pin pandas to 2.x for now (#26221)
- Remove unnecessary xfail (#26199)
- Ensure optimization flag modification happens local (#26185)
- Simplify IcebergDataset (#26165)
- Reorganize unit tests into logical subdirectories (#26149)
- Lint leftover fixme (#26122)
- Improve backtrace for `POLARS_PANIC_ON_ERR` (#26125)
- Fix Python docs build (#26117)
- Disable `unused-ignore` mypy lint (#26110)
- Ignore mypy warning (#26105)
- Raise error on `file://hostname/path` (#26061)
- Disable debug info for docs workflow (#26086)
- Update docs for next polars cloud release (#26091)
- Support Python 3.14 in dev environment (#26073)
Thank you to all our contributors for making this release possible!
@Atarust, @EndPositive, @Kevin-Patyk, @LeeviLindgren, @MarcoGorelli, @Matt711, @MrAttoAttoAtto, @Voultapher, @WaffleLapkin, @agossard, @alex-gregory-ds, @alexander-beedie, @azimafroozeh, @bayoumi17m, @c-peters, @carnarez, @dependabot[bot], @dsprenkels, @hallmason17, @hamdanal, @ion-elgreco, @kdn36, @lun3x, @mcrumiller, @nameexhaustion, @orlp, @qxzcode, @r-brink, @ritchie46, @sweb and [dependabot[bot]](https://github.com/apps/dependabot)