{"url":"https://api.github.com/repos/pola-rs/polars/releases/259373560","assets_url":"https://api.github.com/repos/pola-rs/polars/releases/259373560/assets","upload_url":"https://uploads.github.com/repos/pola-rs/polars/releases/259373560/assets{?name,label}","html_url":"https://github.com/pola-rs/polars/releases/tag/rs-0.53.0","id":259373560,"author":{"login":"github-actions[bot]","id":41898282,"node_id":"MDM6Qm90NDE4OTgyODI=","avatar_url":"https://avatars.githubusercontent.com/in/15368?v=4","gravatar_id":"","url":"https://api.github.com/users/github-actions%5Bbot%5D","html_url":"https://github.com/apps/github-actions","followers_url":"https://api.github.com/users/github-actions%5Bbot%5D/followers","following_url":"https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/github-actions%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/github-actions%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/github-actions%5Bbot%5D/repos","events_url":"https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/github-actions%5Bbot%5D/received_events","type":"Bot","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOD7gq784Pdbn4","tag_name":"rs-0.53.0","target_commitish":"16c0d998e6a29d50f8c78c6e4d7ea6d90ca8c3a1","name":"Rust Polars 0.53.0","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-02-09T08:40:49Z","updated_at":"2026-02-09T09:16:01Z","published_at":"2026-02-09T09:16:01Z","assets":[],"tarball_url":"https://api.github.com/repos/pola-rs/polars/tarball/rs-0.53.0","zipball_url":"https://api.github.com/repos/pola-rs/polars/zipball/rs-0.53.0","body":"## 🏆 Highlights\r\n\r\n- Add Extension types (#25322)\r\n\r\n## 🚀 Performance improvements\r\n\r\n- Don't always rechunk on gather of nested types (#26478)\r\n- Enable zero-copy object\\_store `put` upload for IPC sink (#26288)\r\n- Resolve file schema's and metadata concurrently (#26325)\r\n- Run elementwise CSEE for the streaming engine (#26278)\r\n- Disable morsel splitting for fast-count on streaming engine (#26245)\r\n- Implement streaming decompression for scan\\_ndjson and scan\\_lines (#26200)\r\n- Improve string slicing performance (#26206)\r\n- Refactor `scan_delta` to use python dataset interface (#26190)\r\n- Add dedicated kernel for group-by `arg_max/arg_min` (#26093)\r\n- Add streaming merge-join (#25964)\r\n- Generalize Bitmap::new\\_zeroed opt for Buffer::zeroed (#26142)\r\n- Reduce fs stat calls in path expansion (#26173)\r\n- Lower streaming group\\_by n\\_unique to unique().len() (#26109)\r\n- Speed up `SQL` interface \"UNION\" clauses (#26039)\r\n- Speed up `SQL` interface \"ORDER BY\" clauses (#26037)\r\n- Add fast kernel for is\\_nan and use it for numpy NaN->null conversion (#26034)\r\n- Optimize ArrayFromIter implementations for ObjectArray (#25712)\r\n- New streaming NDJSON sink pipeline (#25948)\r\n- New streaming CSV sink pipeline (#25900)\r\n- Dispatch partitioned usage of `sink_*` functions to new-streaming by default (#25910)\r\n- Replace ryu with faster zmij (#25885)\r\n- Reduce memory usage for .item() count in grouped first/last (#25787)\r\n- Skip schema inference if schema provided for `scan_csv/ndjson` (#25757)\r\n- Add width-aware chunking to prevent degradation with wide data (#25764)\r\n- Use new sink pipeline for write/sink\\_ipc (#25746)\r\n- Reduce memory usage when scanning multiple parquet files in streaming (#25747)\r\n- Don't call cluster\\_with\\_columns optimization if not needed (#25724)\r\n- Tune partitioned sink\\_parquet cloud performance (#25687)\r\n- New single file IO sink pipeline enabled for sink\\_parquet (#25670)\r\n- New partitioned IO sink pipeline enabled for sink\\_parquet (#25629)\r\n- Correct overly eager local predicate insertion for unpivot (#25644)\r\n- Reduce HuggingFace API calls (#25521)\r\n- Use strong hash instead of traversal for CSPE equality (#25537)\r\n- Fix panic in is\\_between support in streaming Parquet predicate push down (#25476)\r\n- Faster kernels for rle\\_lengths (#25448)\r\n- Allow detecting plan sortedness in more cases (#25408)\r\n- Enable predicate expressions on unsigned integers (#25416)\r\n- Mark output of more non-order-maintaining ops as unordered (#25419)\r\n- Fast find start window in `group_by_dynamic` with large `offset` (#25376)\r\n- Add streaming native `LazyFrame.group_by_dynamic` (#25342)\r\n- Add streaming sorted Group-By (#25013)\r\n- Add parquet prefiltering for string regexes (#25381)\r\n- Use fast path for `agg_min`/`agg_max` when nulls present (#25374)\r\n- Fuse positive `slice` into streaming `LazyFrame.rolling` (#25338)\r\n- Mark `Expr.reshape((-1,))` as row separable (#25326)\r\n- Use bitmap instead of Vec\\<bool> in first/last w. skip\\_nulls (#25318)\r\n- Return references from `aexpr_to_leaf_names_iter` (#25319)\r\n\r\n## ✨ Enhancements\r\n\r\n- Add primitive filter -> agg lowering in streaming GroupBy (#26459)\r\n- Support for the SQL `FETCH` clause (#26449)\r\n- Add get() to retrieve a byte from binary data (#26454)\r\n- Remove with\\_context in SQL lowering (#26416)\r\n- Avoid OOM for scan\\_ndjson and scan\\_lines if input is compressed and negative slice (#26396)\r\n- Add JoinBuildSide (#26403)\r\n- Support annoymous agg in-mem (#26376)\r\n- Add unstable `arrow_schema` parameter to `sink_parquet` (#26323)\r\n- Improve error message formatting for structs (#26349)\r\n- Remove parquet field overwrites (#26236)\r\n- Enable zero-copy object\\_store `put` upload for IPC sink (#26288)\r\n- Improved disambiguation for qualified wildcard columns in SQL projections (#26301)\r\n- Expose `upload_concurrency` through env var (#26263)\r\n- Allow quantile to compute multiple quantiles at once (#25516)\r\n- Allow empty LazyFrame in `LazyFrame.group_by(...).map_groups` (#26275)\r\n- Use delta file statistics for batch predicate pushdown (#26242)\r\n- Add streaming UnorderedUnion (#26240)\r\n- Implement compression support for sink\\_ndjson (#26212)\r\n- Add unstable record batch statistics flags to `{sink/scan}_ipc` (#26254)\r\n- Cloud retry/backoff configuration via `storage_options` (#26204)\r\n- Use same sort order for expanded paths across local / cloud / directory / glob (#26191)\r\n- Expose physical plan `NodeStyle` (#26184)\r\n- Add streaming merge-join (#25964)\r\n- Serialize optimization flags for cloud plan (#26168)\r\n- Add compression support to write\\_csv and sink\\_csv (#26111)\r\n- Add `scan_lines` (#26112)\r\n- Support regex in `str.split` (#26060)\r\n- Add unstable IPC Statistics read/write to `scan_ipc`/`sink_ipc` (#26079)\r\n- Add nulls support for all rolling\\_by operations (#26081)\r\n- ArrowStreamExportable and sink\\_delta (#25994)\r\n- Release musl builds (#25894)\r\n- Implement streaming decompression for CSV `COUNT(*)` fast path (#25988)\r\n- Add nulls support for rolling\\_mean\\_by (#25917)\r\n- Add lazy `collect_all` (#25991)\r\n- Add streaming decompression for NDJSON schema inference (#25992)\r\n- Improved handling of unqualified SQL `JOIN` columns that are ambiguous (#25761)\r\n- Expose record batch size in `{sink,write}_ipc` (#25958)\r\n- Add `null_on_oob` parameter to `expr.get` (#25957)\r\n- Suggest correct timezone if timezone validation fails (#25937)\r\n- Support streaming IPC scan from S3 object store (#25868)\r\n- Implement streaming CSV schema inference (#25911)\r\n- Support hashing of meta expressions (#25916)\r\n- Improve `SQLContext` recognition of possible table objects in the Python globals (#25749)\r\n- Add pl.Expr.(min|max)\\_by (#25905)\r\n- Improve MemSlice Debug impl (#25913)\r\n- Implement or fix json encode/decode for (U)Int128, Categorical, Enum, Decimal (#25896)\r\n- Expand scatter to more dtypes (#25874)\r\n- Implement streaming CSV decompression (#25842)\r\n- Add Series `sql` method for API consistency (#25792)\r\n- Mark Polars as safe for free-threading (#25677)\r\n- Support Binary and Decimal in arg\\_(min|max) (#25839)\r\n- Allow Decimal parsing in str.json\\_decode (#25797)\r\n- Add `shift` support for Object data type (#25769)\r\n- Add node status to NodeMetrics (#25760)\r\n- Allow scientific notation when parsing Decimals (#25711)\r\n- Allow creation of `Object` literal (#25690)\r\n- Don't collect schema in SQL union processing (#25675)\r\n- Add `bin.slice()`, `bin.head()`, and `bin.tail()` methods (#25647)\r\n- Add SQL support for the `QUALIFY` clause (#25652)\r\n- New partitioned IO sink pipeline enabled for sink\\_parquet (#25629)\r\n- Add SQL syntax support for `CROSS JOIN UNNEST(col)` (#25623)\r\n- Add separate env var to log tracked metrics (#25586)\r\n- Expose fields for generating physical plan visualization data (#25562)\r\n- Allow pl.Object in pivot value (#25533)\r\n- Extend SQL `UNNEST` support to handle multiple array expressions (#25418)\r\n- Minor improvement for `as_struct` repr (#25529)\r\n- Temporal `quantile` in rolling context (#25479)\r\n- Add support for `Float16` dtype (#25185)\r\n- Add strict parameter to pl.concat(how='horizontal') (#25452)\r\n- Add leftmost option to `str.replace_many / str.find_many / str.extract_many` (#25398)\r\n- Add `quantile` for missing temporals (#25464)\r\n- Expose and document pl.Categories (#25443)\r\n- Support decimals in search\\_sorted (#25450)\r\n- Use reference to Graph pipes when flushing metrics (#25442)\r\n- Add SQL support for named `WINDOW` references (#25400)\r\n- Add Extension types (#25322)\r\n- Add `having` to `group_by` context (#23550)\r\n- Allow elementwise `Expr.over` in aggregation context (#25402)\r\n- Add SQL support for `ROW_NUMBER`, `RANK`, and `DENSE_RANK` functions (#25409)\r\n- Automatically Parquet dictionary encode floats (#25387)\r\n- Add `empty_as_null` and `keep_nulls` to `{Lazy,Data}Frame.explode` (#25369)\r\n- Allow `hash` for all `List` dtypes (#25372)\r\n- Support `unique_counts` for all datatypes (#25379)\r\n- Add `maintain_order` to `Expr.mode` (#25377)\r\n- Display function of streaming physical plan `map` node (#25368)\r\n- Allow `slice` on scalar in aggregation context (#25358)\r\n- Allow `implode` and aggregation in aggregation context (#25357)\r\n- Add `empty_as_null` and `keep_nulls` flags to `Expr.explode` (#25289)\r\n- Add `ignore_nulls` to `first` / `last` (#25105)\r\n- Move GraphMetrics into StreamingQuery (#25310)\r\n- Allow `Expr.unique` on `List`/`Array` with non-numeric types (#25285)\r\n- Allow `Expr.rolling` in aggregation contexts (#25258)\r\n- Support additional forms of SQL `CREATE TABLE` statements (#25191)\r\n- Add `LazyFrame.pivot` (#25016)\r\n- Support column-positional SQL `UNION` operations (#25183)\r\n- Allow arbitrary expressions as the `Expr.rolling` `index_column` (#25117)\r\n- Allow arbitrary Expressions in \"subset\" parameter of `unique` frame method (#25099)\r\n- Support arbitrary expressions in SQL `JOIN` constraints (#25132)\r\n\r\n## 🐞 Bug fixes\r\n\r\n- Do not overwrite used names in cluster\\_with\\_columns pushdown (#26467)\r\n- Do not mark output of concat\\_str on multiple inputs as sorted (#26468)\r\n- Fix CSV schema inference content line duplication bug (#26452)\r\n- Fix InvalidOperationError using `scan_delta` with filter (#26448)\r\n- Alias giving missing column after streaming GroupBy CSE (#26447)\r\n- Ensure `by_name` selector selects only names (#26437)\r\n- Restore compatibility of strings written to parquet with pyarrow filter (#26436)\r\n- Update schema in cluster\\_with\\_columns optimization (#26430)\r\n- Fix negative slice in groups slicing (#26442)\r\n- Don't run CPU check on aarch64 musl (#26439)\r\n- Remove the `POLARS_IDEAL_MORSEL_SIZE` monkeypatching in the parametric merge-join test (#26418)\r\n- Correct off-by-one in RLE row counting for nullable dictionary-encoded columns (#26411)\r\n- Support very large integers in env var limits (#26399)\r\n- Fix PlPath panic from incorrect slicing of UTF8 boundaries (#26389)\r\n- Fix Float dtype for spearman correlation (#26392)\r\n- Fix optimizer panic in right joins with type coercion (#26365)\r\n- Don't serialize retry config from local environment vars (#26289)\r\n- Fix `PartitionBy` with scalar key expressions and `diff()` (#26370)\r\n- Add {Float16, Float32} -> Float32 lossless upcast (#26373)\r\n- Fix panic using `with_columns` and `collect_all` (#26366)\r\n- Add multi-page support for writing dictionary-encoded Parquet columns (#26360)\r\n- Ensure slice advancement when skipping non-inlinable values in `is_in` with inlinable needles (#26361)\r\n- Pin `xlsx2csv` version temporarily (#26352)\r\n- Bugs in ViewArray total\\_bytes\\_len (#26328)\r\n- Overflow in i128::abs in Decimal fits check (#26341)\r\n- Make Expr.hash on Categorical mapping-independent (#26340)\r\n- Clone shared GroupBy node before mutation in physical plan creation (#26327)\r\n- Fix lazy evaluation of replace\\_strict by making it fallible (#26267)\r\n- Consider the \"current location\" of an item when computing `rolling_rank_by` (#26287)\r\n- Reset `is_count_star` flag between queries in collect\\_all (#26256)\r\n- Fix incorrect is\\_between filter on scan\\_parquet (#26284)\r\n- Lower AnonymousStreamingAgg in group-by as aggregate (#26258)\r\n- Avoid overflow in `pl.duration` scalar arguments case (#26213)\r\n- Broadcast arr.get on single array with multiple indices (#26219)\r\n- Fix panic on CSPE with sorts (#26231)\r\n- Fix UB in `DataFrame::transpose_from_dtype` (#26203)\r\n- Eager `DataFrame.slice` with negative offset and `length=None` (#26215)\r\n- Use correct schema side for streaming merge join lowering (#26218)\r\n- Implement expression keys for merge-join (#26202)\r\n- Overflow panic in `scan_csv` with multiple files and `skip_rows + n_rows` larger than total row count (#26128)\r\n- Respect `allow_object` flag after cache (#26196)\r\n- Raise error on non-elementwise PartitionBy keys (#26194)\r\n- Allow ordered categorical dictionary in scan\\_parquet (#26180)\r\n- Allow excess bytes on IPC bitmap compressed length (#26176)\r\n- Address buggy quadratic scaling fix in scan\\_csv (#26175)\r\n- Address a macOS-specific compile issue (#26172)\r\n- Fix deadlock on `hash_rows()` of 0-width DataFrame (#26154)\r\n- Fix NameError filtering pyarrow dataset (#26166)\r\n- Fix concat\\_arr panic when using categoricals/enums (#26146)\r\n- Fix NDJSON/scan\\_lines negative slice splitting with extremely long lines (#26132)\r\n- Incorrect group\\_by min/max fast path (#26139)\r\n- Remove a source of non-determinism from lowering (#26137)\r\n- Error when `with_row_index` or `unpivot` create duplicate columns on a `LazyFrame` (#26107)\r\n- Panics on shift with head (#26099)\r\n- Optimize slicing support on compressed IPC (#26071)\r\n- CPU check for musl builds (#26076)\r\n- Fix slicing on compressed IPC (#26066)\r\n- Release GIL on collect\\_batches (#26033)\r\n- Missing buffer update in String is\\_in Parquet pushdown (#26019)\r\n- Make `struct.with_fields` data model coherent (#25610)\r\n- Incorrect output order for order sensitive operations after join\\_asof (#25990)\r\n- Use SeriesExport for pyo3-polars FFI (#26000)\r\n- Don't write Parquet min/max statistics for i128 (#25986)\r\n- Ensure chunk consistency in in-memory join (#25979)\r\n- Fix varying block metadata length in IPC reader (#25975)\r\n- Implement collect\\_batches properly in Rust (#25918)\r\n- Fix panic on arithmetic with bools in list (#25898)\r\n- Convert to index type with strict cast in some places (#25912)\r\n- Empty dataframe in streaming non-strict hconcat (#25903)\r\n- Infer large u64 in json as i128 (#25904)\r\n- Set http client timeouts to 10 minutes (#25902)\r\n- Prevent panic when comparing `Date` with `Duration` types (#25856)\r\n- Correct lexicographic ordering for Parquet BYTE\\_ARRAY statistics (#25886)\r\n- Raise error on duplicate `group_by` names in `upsample()` (#25811)\r\n- Correctly export view buffer sizes nested in Extension types (#25853)\r\n- Fix `DataFrame.estimated_size` not handling overlapping chunks correctly (#25775)\r\n- Ensure Kahan sum does not introduce NaN from infinities (#25850)\r\n- Trim excess bytes in parquet decode (#25829)\r\n- Reshape checks size to match exactly (#25571)\r\n- Fix panic/deadlock sinking parquet with rows larger than 64MB estimated size (#25836)\r\n- Fix quantile `midpoint` interpolation (#25824)\r\n- Don't use cast when converting from physical in list.get (#25831)\r\n- Invalid null count on int -> categorical cast (#25816)\r\n- Update groups in `list.eval` (#25826)\r\n- Use downcast before FFI conversion in PythonScan (#25815)\r\n- Double-counting of row metrics (#25810)\r\n- Cast nulls to expected type in streaming union node (#25802)\r\n- Incorrect slice pushdown into map\\_groups (#25809)\r\n- Fix panic writing parquet with single bool column (#25807)\r\n- Fix upsample with `group_by` incorrectly introduced NULLs on group key columns (#25794)\r\n- Panic in top\\_k pruning (#25798)\r\n- Fix documentation for new() (#25791)\r\n- Fix incorrect `collect_schema` for unpivot followed by join (#25782)\r\n- Fix documentation for `tail()` (#25784)\r\n- Verify `arr` namespace is called from array column (#25650)\r\n- Ensure `LazyFrame.serialize()` unchanged after `collect_schema()` (#25780)\r\n- Function map\\_(rows|elements) with return\\_dtype = pl.Object (#25753)\r\n- Avoid visiting nodes multiple times in PhysicalPlanVisualizationDataGenerator (#25737)\r\n- Fix incorrect cargo sub-feature (#25738)\r\n- Fix deadlock on empty scan IR (#25716)\r\n- Don't invalidate node in cluster-with-columns (#25714)\r\n- Move `boto3` extra from s3fs in dev requirements (#25667)\r\n- Binary slice methods missing from Series and docs (#25683)\r\n- Mix-up of variable\\_name/value\\_name in unpivot (#25685)\r\n- Invalid usage of `drop_first` in `to_dummies` when nulls present (#25435)\r\n- Rechunk on nested dtypes in `take_unchecked_impl` parallel path (#25662)\r\n- New single file IO sink pipeline enabled for sink\\_parquet (#25670)\r\n- Fix streaming `SchemaMismatch` panic on `list.drop_nulls` (#25661)\r\n- Correct overly eager local predicate insertion for unpivot (#25644)\r\n- Fix \"dtype is unknown\" panic in cross joins with literals (#25658)\r\n- Fix panic on Boolean `rolling_sum` calculation for list or array eval (#25660)\r\n- Preserve List inner dtype during chunked take operations (#25634)\r\n- Fix `panic` edge-case when scanning hive partitioned data (#25656)\r\n- Fix lifetime for `AmortSeries` lazy group iterator (#25620)\r\n- Improve SQL `GROUP BY` and `ORDER BY` expression resolution, handling aliasing edge-cases (#25637)\r\n- Fix empty format handling (#25638)\r\n- Prevent false positives in is\\_in for large integers (#25608)\r\n- Optimize projection pushdown through HConcat (#25371)\r\n- Differentiate between empty list an no list for unpivot (#25597)\r\n- Properly resolve `HAVING` clause during SQL `GROUP BY` operations (#25615)\r\n- Fix spearman panicking on nulls (#25619)\r\n- Increase precision when constructing `float` Series (#25323)\r\n- Make sum on strings error in group\\_by context (#25456)\r\n- Hang in multi-chunk DataFrame .rows() (#25582)\r\n- Bug in boolean unique\\_counts (#25587)\r\n- Set `Float16` parquet schema type to `Float16` (#25578)\r\n- Correct arr\\_to\\_any\\_value for object arrays (#25581)\r\n- Have `PySeries::new_f16` receive `pf16`s instead of `f32`s (#25579)\r\n- Fix occurence of exact matches of `.join_asof(strategy=\"nearest\", allow_exact_matches=False, ...)` (#25506)\r\n- Raise error on out-of-range dates in temporal operations (#25471)\r\n- Fix incorrect `.list.eval` after slicing operations (#25540)\r\n- Reduce HuggingFace API calls (#25521)\r\n- Strict conversion AnyValue to Struct (#25536)\r\n- Fix panic in is\\_between support in streaming Parquet predicate push down (#25476)\r\n- Always respect return\\_dtype in map\\_elements and map\\_rows (#25504)\r\n- Rolling `mean`/`median` for temporals (#25512)\r\n- Add `.rolling_rank()` support for temporal types and `pl.Boolean` (#25509)\r\n- Fix dictionary replacement error in `write_ipc()` (#25497)\r\n- Fix group lengths check in `sort_by` with `AggregatedScalar` (#25503)\r\n- Fix expr slice pushdown causing shape error on literals (#25485)\r\n- Allow empty list in `sort_by` in `list.eval` context (#25481)\r\n- Prevent panic when joining sorted LazyFrame with itself (#25453)\r\n- Apply CSV dict overrides by name only (#25436)\r\n- Incorrect result in aggregated `first`/`last` with `ignore_nulls` (#25414)\r\n- Fix off-by-one bug in `ColumnPredicates` generation for inequalities operating on integer columns (#25412)\r\n- Fix `arr.{eval,agg}` in aggregation context (#25390)\r\n- Support `AggregatedList` in `list.{eval,agg}` context (#25385)\r\n- Improve SQL `UNNEST` behaviour (#22546)\r\n- Remove `ClosableFile` (#25330)\r\n- Use Cargo.template.toml to prevent git dependencies from using template (#25392)\r\n- Resolve edge-case with SQL aggregates that have the same name as one of the `GROUP BY` keys (#25362)\r\n- Revert `pl.format` behavior with nulls (#25370)\r\n- Remove `Expr` casts in `pl.lit` invocations (#25373)\r\n- Nested dtypes in streaming `first_non_null`/`last_non_null` (#25375)\r\n- Correct `eq_missing` for struct with nulls (#25363)\r\n- Unique on literal in aggregation context (#25359)\r\n- Allow `implode` and aggregation in aggregation context (#25357)\r\n- Aggregation with `drop_nulls` on literal (#25356)\r\n- Address multiple issues with SQL `OVER` clause behaviour for window functions (#25249)\r\n- Schema mismatch with `list.agg`, `unique` and scalar (#25348)\r\n- Correct `drop_items` for scalar input (#25351)\r\n- SQL `NATURAL` joins should coalesce the key columns (#25353)\r\n- Mark `{forward,backward}_fill` as `length_preserving` (#25352)\r\n- Nested dtypes in streaming `first`/`last` (#25298)\r\n- AnyValue::to\\_physical for categoricals (#25341)\r\n- Fix link errors reported by `markdown-link-check` (#25314)\r\n- Parquet `is_in` for mixed validity pages (#25313)\r\n- Fix length preserving check for `eval` expressions in streaming engine (#25294)\r\n- Fix building polars-plan with features lazy,concat\\_str (but no strings) (#25306)\r\n- Fix building polars-mem-engine with the async feature (#25300)\r\n- Don't quietly allow unsupported SQL `SELECT` clauses (#25282)\r\n- Fix small bug with `PyExpr` to `PyObject` conversion (#25265)\r\n- Reverse on chunked `struct` (#25281)\r\n- Panic exception when calling `Expr.rolling` in `.over` (#25283)\r\n- Correct `{first,last}_non_null` if there are empty chunks (#25279)\r\n- Incorrect results for aggregated `{n_,}unique` on bools (#25275)\r\n- Fix building polars-expr without timezones feature (#25254)\r\n- Ensure out-of-range integers and other edge case values don't give wrong results for index\\_of() (#24369)\r\n- Correctly prune projected columns in hints (#25250)\r\n- Allow `Null` dtype values in `scatter` (#25245)\r\n- Correct handle requested stops in streaming shift (#25239)\r\n- Make `str.json_decode` output deterministic with lists (#25240)\r\n- Wide-table join performance regression (#25222)\r\n- Fix single-column CSV header duplication with leading empty lines (#25186)\r\n- Enhanced column resolution/tracking through multi-way SQL joins (#25181)\r\n- Fix serialization of lazyframes containing huge tables (#25190)\r\n- Use (i64, u64) for VisualizationData (offset, length) slices (#25203)\r\n- Fix assertion panic on `group_by` (#25179)\r\n- Fix `format_str` in case of multiple chunks (#25162)\r\n- Fix incorrect `drop_nans()` result when used in `group_by()` / `over()` (#25146)\r\n\r\n## 📖 Documentation\r\n\r\n- Fix typo in max\\_by docstring (#26404)\r\n- Remove deprecated `cublet_id` (#26260)\r\n- Update for new release (#26255)\r\n- Update MCP server section with new URL (#26241)\r\n- Fix unmatched paren and punctuation in pandas migration guide (#26251)\r\n- Add observatory database\\_path to docs (#26201)\r\n- Note plugins in Python user-defined functions (#26138)\r\n- Clarify min\\_by/max\\_by behavior on ties (#26077)\r\n- Add `QUALIFY` clause and `SUBSTRING` function to the SQL docs (#25779)\r\n- Update mixed-offset datetime parsing example in user guide (#25915)\r\n- Update bare-metal docs for mounted anonymous results (#25801)\r\n- Fix credential parameter name in cloud-storage.py (#25788)\r\n- Configuration options update (#25756)\r\n- Fix typos in Excel and Pandas migration guides (#25709)\r\n- Add \"right\" to `how` options in `join()` docstrings (#25678)\r\n- Document schema parameter in meta methods (#25543)\r\n- Correct link to `datetime_range` instead of `date_range` in resampling page (#25532)\r\n- Explain aggregation \\& sorting of lists (#25260)\r\n- Update `LazyFrame.collect_schema()` docstring (#25508)\r\n- Remove lzo from parquet write options (#25522)\r\n- Update on-premise documentation (#25489)\r\n- Fix incorrect 'bitwise' in `any_horizontal`/`all_horizontal` docstring (#25469)\r\n- Add Extension and BaseExtension to doc index (#25444)\r\n- Add polars-on-premise documentation (#25431)\r\n- Fix link errors reported by `markdown-link-check` (#25314)\r\n- Fix LanceDB URL (#25198)\r\n\r\n## 📦 Build system\r\n\r\n- Address remaining Python 3.14 issues with `make requirements-all` (#26195)\r\n- Address a macOS-specific compile issue (#26172)\r\n- Fix `make fmt` and `make lint` commands (#25200)\r\n\r\n## 🛠️ Other improvements\r\n\r\n- Move IO source metrics instrumentation to `PolarsObjectStore` (#26414)\r\n- More SQL to IR conversion `execute_isolated` (#26455)\r\n- Cleanup unused attributes in optimizer (#26464)\r\n- Use `Expr::Display` as catch all for IR - DSL asymmetry (#26471)\r\n- Remove the `POLARS_IDEAL_MORSEL_SIZE` monkeypatching in the parametric merge-join test (#26418)\r\n- Move IO metrics struct to `polars-io` and use new timer (#26397)\r\n- Reduce blocking on computational executor threads in multiscan init (#26407)\r\n- Cleanup the parametric merge-join test (#26413)\r\n- Ensure local doctests skip `from_torch` if module not installed (#26405)\r\n- Implement various deprecations (#26314)\r\n- Refactor `MinBy` and `MaxBy` as `IRFunctions` (#26307)\r\n- Rename `Operator::Divide` to `RustDivide` (#26339)\r\n- Properly disable the Pyodide tests (#26382)\r\n- Add LiveTimer (#26384)\r\n- Use derived serialization on `PlRefPath` (#26167)\r\n- Add metadata to `ArrowSchema` struct (#26318)\r\n- Remove unused field (#26367)\r\n- Fix runtime nesting (#26359)\r\n- Remove `xlsx2csv` dependency pin (#26355)\r\n- Allow unchecked IPC reads (#26354)\r\n- Use outer runtime if exists in to\\_alp (#26353)\r\n- Make CategoricalMapping::new pub(crate) to avoid misuse (#26308)\r\n- Clarify IPC buffer read limit/length paramter (#26334)\r\n- Improve accuracy of active IO time metric (#26315)\r\n- Mark `VarState` as `repr(C)` (#26309)\r\n- IO metrics for streaming Parquet / IPC sources (#26300)\r\n- Replace panicking index access with error handling in `dictionaries_to_encode` (#26059)\r\n- Remove unnecessary match and move early return in testing (#26297)\r\n- Add dtype test coverage for delta predicate filter (#26291)\r\n- Add property-based tests for `Scalar::cast_with_options` (#25744)\r\n- Add AI policy (#26286)\r\n- Remove MemSlice (#26259)\r\n- Remove recursion from `upsample_impl` (#26250)\r\n- Remove all non CSV fast-count paths (#26233)\r\n- Replace MemReader with Cursor (#26216)\r\n- Add `serde(default)` to new CSV compression fields (#26210)\r\n- Add a couple of `SAFETY` comments in merge-join node (#26197)\r\n- Expose physical plan `NodeStyle` (#26184)\r\n- Ensure optimization flag modification happens local (#26185)\r\n- Use NullChunked as default for Series (#26181)\r\n- In merge-sorted node, when buffering, request a stop on \\*every\\* unbuffered morsel (#26178)\r\n- Rename `io_sinks2 -> io_sinks` (#26159)\r\n- Lint leftover fixme (#26122)\r\n- Move Buffer and SharedStorage to polars-buffer crate (#26113)\r\n- Remove old sink IR (#26130)\r\n- Use derived serialization on `PlRefPath` (#26062)\r\n- Improve backtrace for `POLARS_PANIC_ON_ERR` (#26125)\r\n- Fix Python docs build (#26117)\r\n- Remove old streaming sink implementation (#26102)\r\n- Disable `unused-ignore` mypy lint (#26110)\r\n- Remove unused equality impls for IR / FunctionIR (#26106)\r\n- Ignore mypy warning (#26105)\r\n- Preserve order for string concatenation (#26101)\r\n- Raise error on `file://hostname/path` (#26061)\r\n- Disable debug info for docs workflow (#26086)\r\n- Remove IR / physical plan visualization data generators (#26090)\r\n- Update docs for next polars cloud release (#26091)\r\n- Support Python 3.14 in dev environment (#26073)\r\n- Mark top slow normal tests as slow (#26080)\r\n- Simplify `PlPath` (#26053)\r\n- Update breaking deps (#26055)\r\n- Fix for upstream url bug and update deps (#26052)\r\n- Properly pin chrono (#26051)\r\n- Don't run rust doctests (#26046)\r\n- Update deps (#26042)\r\n- Ignore very slow test (#26041)\r\n- Add Send bound for SharedStorage owner (#26040)\r\n- Update rust compiler (#26017)\r\n- Improve csv test coverage (#25980)\r\n- Use `from_any_values_and_dtype` in `Series::extend_constant` (#26006)\r\n- Pass `sync_on_close` and `num_pipelines` via `start_file_writer` for IO sinks (#25950)\r\n- Add `broadcast_nulls` field to `RowEncodingVariant` and `_get_rows_encoded_{ca,arr}` (#26001)\r\n- Ramp up CSV read size (#25997)\r\n- Rename `FileType` to `FileWriteFormat` (#25951)\r\n- Don't unwrap first sink morsel send (#25981)\r\n- Update `ruff` action and simplify version handling (#25940)\r\n- Cleanup Rust DataFrame interface (#25976)\r\n- Export PhysNode related struct (#25987)\r\n- Restructure Sort variant in logical and physical plans visualization data (#25978)\r\n- Run python lint target as part of pre-commit (#25982)\r\n- Allow multiple inputs to streaming GroupBy node (#25961)\r\n- Disable HTTP timeout for receiving response body (#25970)\r\n- Add AI contribution policy (#25956)\r\n- Remove unused sink code (#25949)\r\n- Add detailed Sink info to IRNodeProperties (#25954)\r\n- Wrap `FileScanIR::Csv` enum variant in `Arc` (#25952)\r\n- Use PlSmallStr for CSV format strings (#25901)\r\n- Add unsafe bound to MemSlice::from\\_arc (#25920)\r\n- Improve MemSlice Debug impl (#25913)\r\n- Remove manual cmp impls for `&[u8]` (#25890)\r\n- Remove and deprecate batched csv reader (#25884)\r\n- Remove unused AnonymousScan functions (#25872)\r\n- Use Buffer\\<T> instead of Arc\\<[T]> to store stringview buffers (#25870)\r\n- Add `TakeableRowsProvider` for IO sinks (#25858)\r\n- Filter DeprecationWarning from pyparsing indirectly through pyiceberg (#25854)\r\n- Various small improvements (#25835)\r\n- Clear venv with appropriate version of Python (#25851)\r\n- Move CSV write logic to `CsvSerializer` (#25828)\r\n- Ensure Polars Object extension type is registered (#25813)\r\n- Harden Python object process ID (#25812)\r\n- Skip schema inference if schema provided for `scan_csv/ndjson` (#25757)\r\n- Ensure proper async connection cleanup on DB test exit (#25766)\r\n- Flip `has_residual_predicate` -> `no_residual_predicate` (#25755)\r\n- Track original length before file filtering in scan IR (#25717)\r\n- Ensure we uninstall other Polars runtimes in CI (#25739)\r\n- Make 'make requirements' more robust (#25693)\r\n- Remove duplicate compression level types (#25723)\r\n- Replace async blocks with named components in new parquet write pipeline (#25695)\r\n- Move Object `lit` fix earlier in the function (#25713)\r\n- Remove unused decimal file (#25701)\r\n- Move `boto3` extra from s3fs in dev requirements (#25667)\r\n- Upgrade to latest version of `sqlparser-rs` (#25673)\r\n- Update slab to version without RUSTSEC (#25686)\r\n- Fix typo (#25684)\r\n- Avoid rechunk requirement for Series.iter() (#25603)\r\n- Use dtype for group\\_aware evaluation on `ApplyExpr` (#25639)\r\n- Make polars-plan constants more consistent (#25645)\r\n- Add \"panic\" and \"streaming\" tagging to `issue-labeler` workflow (#25657)\r\n- Add support for multi-column reductions (#25640)\r\n- Fix rolling kernel dispatch with `monotonic` group attribute (#25494)\r\n- Simplify \\_write\\_any\\_value (#25622)\r\n- Ensure we hash all attributes and visit all children in `traverse_and_hash_aexpr` (#25627)\r\n- Ensure literal-only `SELECT` broadcast conforms to SQL semantics (#25633)\r\n- Add parquet file write pipeline for new IO sinks (#25618)\r\n- Rename polars-on-premise to polars-on-premises (#25617)\r\n- Constrain new `issue-labeler` workflow to the Issue title (#25614)\r\n- Add streaming IO sink components (#25594)\r\n- Help categorise Issues by automatically applying labels (using the same patterns  used for labelling PRs) (#25599)\r\n- Show on streaming engine (#25589)\r\n- Add `arg_sort()` and `Writeable::as_buffered()` (#25583)\r\n- Take task priority argument in `parallelize_first_to_local` (#25563)\r\n- Skip existing files in pypi upload (#25576)\r\n- Fix template path in release-python workflow (#25565)\r\n- Skip rust integration tests for coverage in CI (#25558)\r\n- Add asserts and tests for `list.eval` on multiple chunks with slicing (#25559)\r\n- Rename `URL_ENCODE_CHARSET` to `HIVE_ENCODE_CHARSET` (#25554)\r\n- Add `assert_sql_matches` coverage for SQL `DISTINCT` and `DISTINCT ON` syntax (#25440)\r\n- Use strong hash instead of traversal for CSPE equality (#25537)\r\n- Update partitioned sink IR (#25524)\r\n- Print expected DSL schema hashes if mismatched (#25526)\r\n- Remove verbose prints on file opens (#25523)\r\n- Add `proptest` `AnyValue` strategies (#25510)\r\n- Fix --uv argument for benchmark-remote (#25513)\r\n- Add `proptest` `DataFrame` strategy (#25446)\r\n- Run `maturin` with `--uv` option (#25490)\r\n- Remove some dead argminmax impl code (#25501)\r\n- Fix feature gating TZ\\_AWARE\\_RE again (#25493)\r\n- Take `sync` parameter in `Writeable::close()` (#25475)\r\n- Fix unsoundness in ChunkedArray::{first, last} (#25449)\r\n- Add some cleanup (#25445)\r\n- Test for `group_by(...).having(...)` (#25430)\r\n- Accept multiple files in `pipe_with_schema` (#25388)\r\n- Remove aggregation context `Context` (#25424)\r\n- Take `&dyn Any` instead of `Box<dyn Any>` in python object converters (#25421)\r\n- Refactor sink IR (#25308)\r\n- Remove `ClosableFile` (#25330)\r\n- Remove debug file write from test suite (#25393)\r\n- Add `ElementExpr` for `_eval` expressions (#25199)\r\n- Dispatch `Series.set` to `zip_with_same_dtype` (#25327)\r\n- Better coverage for `group_by` aggregations (#25290)\r\n- Add oneshot channel to polars-stream (#25378)\r\n- Enable more streaming tests (#25364)\r\n- Remove `Column::Partitioned` (#25324)\r\n- Remove incorrect cast in reduce code (#25321)\r\n- Add toolchain file to runtimes for sdist (#25311)\r\n- Remove `PyPartitioning` (#25303)\r\n- Directly take `CloudScheme` in `parse_cloud_options()` (#25304)\r\n- Refactor `dt_range` functions (#25225)\r\n- Fix typo in CI release workflow (#25309)\r\n- Use dedicated runtime packages from template (#25284)\r\n- Add `proptest` strategies for Series nested types (#25220)\r\n- Simplify sink parameter passing from Python (#25302)\r\n- Add test for unique with column subset (#25241)\r\n- Fix Decimal precision annotation (#25227)\r\n- Add `LazyFrame.pivot` (#25016)\r\n- Clean up CSPE callsite (#25215)\r\n- Avoid relabelling changes-dsl on every commit (#25216)\r\n- Move ewm variance code to polars-compute (#25188)\r\n- Upgrade to schemars 0.9.0 (#25158)\r\n- Update markdown link checker (#25201)\r\n- Automatically label pull requests that change the DSL (#25177)\r\n- Add reliable test for `pl.format` on multiple chunks (#25164)\r\n- Move supertype determination and casting to IR for `date_range` and related functions (#24084)\r\n- Make python docs build again (#25165)\r\n- Make `pipe_with_schema` work on Arced schema (#25155)\r\n- Add functions for `scan_lines` (#25136)\r\n- Remove lower\\_ir conversion from Scan to InMemorySource (#25150)\r\n- Update versions (#25141)\r\n\r\nThank you to all our contributors for making this release possible!\r\n@AndreaBozzo, @Atarust, @DannyStoll1, @EndPositive, @JakubValtar, @Jesse-Bakker, @Kevin-Patyk, @LeeviLindgren, @MarcoGorelli, @Matt711, @MrAttoAttoAtto, @TNieuwdorp, @Voultapher, @WaffleLapkin, @agossard, @alex-gregory-ds, @alexander-beedie, @anosrepenilno, @arlyon, @azimafroozeh, @bayoumi17m, @borchero, @c-peters, @cBournhonesque, @camriddell, @carnarez, @cmdlineluser, @coastalwhite, @cr7pt0gr4ph7, @davanstrien, @davidia, @dependabot[bot], @dsprenkels, @edizeqiri, @eitanf, @etiennebacher, @feliblo, @gab23r, @guilhem-dvr, @hallmason17, @hamdanal, @henryharbeck, @hutch3232, @ion-elgreco, @itamarst, @jamesfricker, @jannickj, @jetuk, @jqnatividad, @kdn36, @lun3x, @m1guelperez, @marinegor, @mcrumiller, @nameexhaustion, @orlp, @pomo-mondreganto, @qxzcode, @r-brink, @ritchie46, @sachinn854, @stijnherfst, @sweb, @tlauli, @vyasr, @wtn, @yonikremer and [dependabot[bot]](https://github.com/apps/dependabot)\r\n","reactions":{"url":"https://api.github.com/repos/pola-rs/polars/releases/259373560/reactions","total_count":26,"+1":2,"-1":0,"laugh":0,"hooray":21,"confused":0,"heart":2,"rocket":1,"eyes":0},"mentions_count":67}