Polars py-1.42.0 - Cloud IO and SQL Fixes

   |   4 minute read   |   Using 657 words

Polars py-1.42.0 was published on June 24, 2026, as the Python Polars 1.42.0 release. The main user visible work is a mix of cloud IO control, early out of core spilling, SQL fixes, and query optimizer correctness. The release is not marked as a prerelease, so teams using Python Polars should treat it as the current stable release train and read the migration notes before upgrading.

The full release notes and downloads are on the GitHub release page.

Cloud IO and large scans

Cloud IO gets a few practical changes. The release adds bytes based concurrency control for cloud IO, which should help cap work by data size instead of only request shape. It also caches and shuffles DNS for cloud object_store, and adds external object_store support for non native schemes. That matters for teams reading from S3 style or custom object stores, where remote file layout and DNS behavior can decide whether a query is boring or noisy.

The parquet side also gets better pruning. Polars can skip Delta files and parquet row groups using per field struct statistics, and adds a tiered multi file parquet metadata resolver. In plain terms, fewer files and row groups should need to be touched when statistics prove they cannot match the query.

More spill room and optimizer cleanup

py-1.42.0 adds naive out of core spilling to Polars. The word naive is doing work here. This is not a promise that every memory heavy query becomes cheap, but it is an important base for workloads that need a path beyond process memory.

The optimizer work is also worth reading. The release eliminates filters with contradictory predicates, optimizes len and null_count comparisons, and improves sortedness detection around with_row_index and explode. It also stops empty chunks from triggering copies in rechunk, and avoids flushing the multiplexer on phase changes.

These are not flashy API changes. They are the kind of fixes that make the same lazy plan waste less time.

SQL and lazy execution fixes

SQL users get both new syntax and real correctness fixes. Polars now supports SQL implicit JOIN syntax. It also lowers SQL [NOT] IN (subquery) into semi and anti joins, fixes computed group keys in SQL projections, and addresses join alias state leakage in SQL CTEs.

Lazy execution fixes cover several sharp edges. The release fixes projection pushdown with row index ordering, cross join predicates with sink_* functions, schema order for hstack under projection pushdown, and a lazy HConcat to sink SchemaError. It also makes slice expressions observe input order, preserves maintain_order on sliced unique, and keeps null placement when collapsing sort.reverse() into a single sort.

One Iceberg fix is specific and useful: select(len()) no longer returns zero when using scan_iceberg with pyiceberg as the reader override. That is the kind of bug that can quietly break counts if nobody checks the result shape.

New API hints and sorted checks

The release adds Expr.is_sorted and DataFrame.is_sorted(). Those give Python users a direct way to ask whether data is sorted, instead of inferring it through other operations. Polars also exposes fixed size rolling window expressions in the Python visitor.

Another user facing improvement is suggestions for wrong API usage or mismatched column names. This is small, but useful. Bad column names are one of the least interesting ways to spend time in a dataframe job.

Upgrade notes

The main migration note is the deprecation of casts from strings to temporal dtypes. If code currently relies on direct string casts for dates or datetimes, read the release notes and plan an explicit parsing path before this turns into a harder failure in a later release.

There is also a deprecation warning for .explode() calls without the empty_as_null argument. That warning is a signal to make intent explicit. Empty values and null values are not the same thing, and dataframe code gets annoying when that boundary is implicit.

Where to get it



denis256 at denis256.dev