Repository navigation
Releases: pola-rs/polars
Release list
Python Polars 2.1.0
💥 Breaking changes
- Disallow mixed string <=> numeric arithmetic in eager (#30071)
🚀 Performance improvements
- Limit the memory of buckets sorted ahead in the sort flush (#30297)
- Make file readers wait for spills while over the memory budget (#30296)
- Count unspilled frames in the memory estimate right away (#30295)
- Simplify more boolean expressions and drop redundant null checks (#30293)
- Wait for spills while over the out-of-core memory budget (#30294)
- Lower the default out-of-core prefetch fraction to 0.5 (#30292)
- Aggregate unique and n_unique in the streaming group-by itself (#30281)
- Return freed memory to the OS right away while out-of-core data is spilled (#30280)
- Gather
List(Array)andArraycolumns without per-row slices (#30278) - Evaluate the streaming window node out of core (#30282)
- Avoid deep copies when building a DataFrame from flat dataclasses (#30275)
- Sort the window partitions by each order key instead of their row encoding (#30277)
- Scan the haystack for a single needle in
is_in(#30276) - Prefer fixed-width columns when only the row count is needed (#30274)
- Native gather for List arrays (#30019)
- Evaluate windows in filter predicates in the streaming window node (#30272)
- Don't busy-wait in RAYON.block_on (#30259)
- Encode nested Parquet levels directly from the level buffers (#30251)
- Reduce memory of CSV scans on wide rows (#30165)
- Avoid quadratic JSON serialization of nested lists and maps (#30203)
- Skip the gather when exploding lists without nulls (#30234)
- Speed up writing nested Parquet columns (#30245)
- Don't keep whole parquet string dictionaries alive for a few selected rows (#30248)
- Set default spill compression level to 1 (#30237)
- Reuse zstd contexts in compression and avoid memcpys (#30233)
- Remove repeated and scalar ordering keys before the sort rewrites (#30231)
- Remove repeated keys from by's (#30095)
- Keep only one guessed unique key per join order leaf (#30191)
- Don't let extra join keys shrink an estimate once one key is unique (#30190)
- Reduce binary size of asof join with
bykeys (#30192) - Reduce binary size of SQL visitors and parallel group-by collect (#30171)
- Push as-of join key filters to the right input (#30123)
- Drop null as-of right keys with a parallel filter before the join node (#30125)
- Keep as-of nearest join state small (#30126)
- Explode lists in group_by aggregations without a per-group apply (#30020)
- Streaming OOC group-by with shuffles (#29911)
- Drop scalar ordering keys in the optimizer (#30063)
- Merge union inputs that scan files of the same kind into one multi-file scan (#30056)
- Use the streaming scalar window for std, var and combined reductions in
over(#30066) - Limit the bytes of local CSV and NDJSON files read at once in multi-file scans (#30055)
- Check the matched flag of join keys in the table entry before the bitset (#30067)
- Track matched build rows of all join tables in a bitset (#30050)
- Add dedicated list gather kernels (#30049)
- Emit unmatched build rows of single-key joins in row order (#30037)
- Use
TopKfor sorts sliced at a nonzero offset (#29989) - Add constant folding for more datetime ops (#30016)
- Rewrite the sum of a column plus a literal to a sum and a count of the column (#30011)
- Push predicates through order-keeping columns (#30007)
- Fix dead early exit in
coalesce(#30013) - Count distinct non-null values in SQL with one group-by in the streaming engine (#30009)
- Skip parquet row groups with the running top-k threshold (#30006)
- Keep decompressed plain string pages as the string data buffer (#29984)
- Fix some in-memory filter regressions (#29988)
- Decompress snappy and zstd parquet pages without zeroing the buffer (#29980)
- Speed up
str.len_chars(#29972) - Speed up
str.replacefor patterns that end in.*$(#29971) - Use the Parquet string prefilter for literal
str.containsand SQLLIKE(#29953) - Keep single-chunk output when filtering wide frames in parallel (#29847)
- Add dedicated list slice kernels (#29938)
- Principled execution order of accumulating streaming nodes (#29933)
- Huge speedup creating wide
Structdata (#29813) - Speed up
arg_minandarg_max(especially on data with nulls) (#29849) - Huge reduction in
from_rowsandfrom_dictsmemory usage during nested value conversion (#29739) - Safely push down nested struct field filters to Iceberg (#29665)
- Compare Parquet dictionaries of Categorical and Enum columns as strings for
==andis_in(#29885) - Filter Categorical and Enum Parquet columns while decoding (#29882)
- Rewrite
sort().first()tomin()and single-keysort_by().first()tomin_by()(#29860) - Decode fixed-length binary Parquet decimals directly into i128 (#29866)
- Look up each dictionary value once when importing Arrow dictionaries as Categorical (#29865)
- Reduce requests and raise concurrency for cloud CSV scans (#29863)
- Reduce requests and raise concurrency for cloud NDJSON scans (#29857)
- Track sortedness through joins (#29852)
- Keep sortedness through widening numeric casts (#29851)
- Rewrite
sort_by().first()tomin_byand limit sorts read withhead()(#29831) - Cache parsed Iceberg metadata for metadata-path scans (#29791)
- Drop memory when Done in streaming asof_join/is_first_distinct (#29783)
- Drop scalar
sort_bykeys in the optimizer (#29812) - Parallel CSV chunk analysis and pread default (#29818)
- Hash inline binview values directly from their view (#29820)
- Use iceberg statistics (#29798)
- Reuse Iceberg catalog and cache REST catalog scans (#29790)
- Preserve sortedness of computed join keys (#29782)
- TopK was holding onto too much data (#29784)
- Write CSV temporal values straight into the buffer (#29778)
- Parse strftime format once and reuse buffer in regex replace (#29777)
- Reduce needless allocations in various kernels (#29775)
- Cache http object store (#29757)
- Fetch each record batch group in its own task (#29755)
✨ Enhancements
- Support SQL
CREATE TABLEwith column definitions in attached Iceberg catalogs (#30260) - Support SQL
CREATE [OR REPLACE] TEMP TABLE(#30256) - Support recursive SQL CTEs (#30188)
- Writing encrypted Parquet files (#29905)
- Support SQL
DROP TABLE [PURGE]on tables of attached catalogs (#30247) - Add conversion to/from masked numpy arrays (#30232)
- Add
overwrite_filterand dynamic partition overwrite tosink_iceberg(#29909) - Support SQL
JOIN ... ONsubqueries that read only one input (#30206) - Support full joins in join_where (#30169)
- Expose fused and nested loop join predicates in the IR visitor (#30176)
- Support LIMIT 1 in correlated SQL scalar subqueries (#30168)
- Support SQL
WITH RECURSIVEwhen no CTE reads itself (#30166) - Support correlated IN and EXISTS that read both inputs of a SQL join in ON (#30159)
- Support
CURRENT_DATE,CURRENT_TIMEandCURRENT_TIMESTAMPin SQL (#30144) - Allow
reinterpretbetweenInt128andDecimal(#30133) - Add
Expr.truncdivfor division rounding toward zero (#30138) - Support uncorrelated subqueries in SQL JOIN ... ON (#30141)
- Support correlated subqueries in SQL
JOIN ... ONand correlated scalar subqueries without an aggregate (#30131) - Support sinking to Iceberg table with bucket partitioned field (#30091)
- Add
create_namespace_if_not_existstosink_iceberg(#30087) - Attach Iceberg catalogs to
SQLContextviaregister_catalog(#30113) - Support OOC kill fraction (#30104)
- Support qualified table names in SQL (#29963)
- Reverse node for streaming engine (#29259)
- Add
pl.delete_iceberg(#30032) - Support named options in SQL
read_ipctable function (#30054) - Support named options in SQL
read_parquettable function (#29998) - Add experimental geoparquet read/write (#29987)
- Accept a list of paths in SQL read_* table functions (#30047)
- Add SQL
read_ndjsontable function with named options (#29954) - Support STRUCT and MAP type names in SQL (#29951)
- Support unstable column/schema options in SQL
read_csv(#29975) - Add sampling to KLL approx-quantile sketch (#29424)
- Rust resolver for scan_iceberg (#29753)
- Add
REGEXP_REPLACEandDATE_TRUNCto SQL (#29967) - Add
generate_seriesandrangeto SQL (#29912) - Add
create_if_not_existstosink_iceberg(#29908) - Support named options in SQL
read_csvtable function (#29917) - Add query-level IO active time and thread count metrics (#29792)
- Support time-zone-aware timestamps in SQL (#29899)
- Add support for reading encrypted Parquet files (#29606)
- Add SQL ASOF join (#29834)
🐞 Bug fixes
- Compare
Array(Struct)rows field by field (#30290) - Don't revive a dropped out-of-core spill context through a weak reference (#30291)
- Do not read the values stored under null
Arrayrows (#30286) - Return freed memory to the OS right away while out-of-core data is spilled (#30280)
- Propagate nulls through all nesting levels before row encoding (#30269)
- Add a method to merge finalized
approx_quantilesketches deterministically (#30263) - Use the supertype of both inputs for the
cov/corroutput dtype (#30262) - Keep buffered frames spillable while a streaming sort partitions (#30268)
- Respect memory limits of nested cgroups (#30266)
- Correct schema for integer literal divided by
Float16/Float32(#30158) - Correct
str.replacefor nested repetitions before.*$(#30258) - Allow
write_iceberginto Iceberg tables with required columns (#30253) - Correct operator overloading for reflect ops (#29946)
- Raise on unsupported Avro codecs in
read_avro(#30240) - Support several inputs to anonymous aggregations in the in-memory engine (#30152)
- Stop SQL
FROMitem aliases from acting as tables (#30207) - Correct unsigned parquet stats merging (#30199)
- Read Parquet schema in lockstep with arrow metadata hints (#30202)
- Raise on Delta tables with column mapping (#30204)
- Correct comparison with numpy array (#30241)
- Don't keep...
Python Polars 2.0.0
💥 Breaking changes
- Run SQL window functions over grouped rows on the aggregated rows, and evaluate QUALIFY before the projection (#29746)
- Type exact SQL numeric literals as Decimal and truncate SQL
%/DIV (#29536) - Allow deterministic expression plugins to opt into CSE/CSPE (#29428)
- Read Parquet ENUM type as pl.String (#29331)
- More map operations (#29296)
- Deprecate cut/qcut (#29329)
🚀 Performance improvements
- Fix phases ending too soon due to join sampling (#29752)
- Group record batch fetches of remote IPC scans (#29750)
- Mark group-by node as memory intensive pipeline blocker (#29749)
- Don't inline slow OOC memory drift path (#29745)
- Only prefetch on unspill when there is memory headroom (#29701)
- Pushdown filters to scan_lance (#29538)
- Do not materialize equal
ScalarColumns inColumn::append/extend(#28989) - Evaluate scalar windows in the streaming window node (#29698)
- Don't materialize scalar columns in
DataFrame::estimated_size(#29711) - Defer cached pread from prefetch to decode for Parquet (#29702)
- Decode IPC scans out of order when order is not observed (#29675)
- IPC metadata suffix fetch (#29692)
- Speed up null tracking in streaming group-by sum, min and max (#29691)
- Cache Iceberg manifest files across scans (#29623)
- Improve pushdown support for fallible Hive predicates (#29594)
- Streamline
BytecodeParsermethod rewriting (#29632) - Stream
from_dictsrecords straight into column buffers (#29656) - Read correlated SQL aggregates from the outer join when the subquery repeats it (#29685)
- Emit files unordered for remote IPC files when order not observed (#29678)
- Don't keep input order for order-insensitive windows in all engines (#29680)
- Fix parallelization in top-k reducer (#29684)
- Share one bloom filter between the build threads of a runtime filter (#29677)
- Add streaming (out-of-core) sort (#29657)
- Insert keys that start a run of equal keys into the hot group-by table right away (#29673)
- Prefetch key-row hash table lookups in blocks (#29663)
- Lower count-guarded sums to a sum that is null on empty input (#29668)
- Use single PUT for small cloud uploads (#29603)
- Don't cache plain scans in the streaming engine (#29654)
- Change single-key group-by hash table layout and add prefetching (#29661)
- Use the integer ranges of sampled parquet row groups in filter estimates (#29655)
- Raise HTTP rate-limiter read init default (#29584)
- Change join hash table layout and add prefetching (#29653)
- Add a fast-path for
as_listwith only a single input (#29592) - Use one runtime filter builder per thread for a finished sample (#29646)
- Compute decimal addition, subtraction and multiplication in i64 when values fit (#29638)
- Spread decimal sums and means over lanes and check the sum's 38 digits once (#29637)
- Compute decimal addition, subtraction and multiplication without per-row validity (#29634)
- Skip or reuse UDF disassembly in
BytecodeParser(#29625) - Rescale a single decimal operand once in addition and subtraction (#29631)
- Dynamic hot table size in streaming GroupBy (#29629)
- Lower gathering from literal as elementwise (#29605)
- Execute fixed-size rolling windows on streaming engine (#29602)
- Use the finite rule of equi joins to determine build side of semi/anti (#29617)
- Drop the byte limit on runtime filter build sides (#29618)
- Add eviction-free path to GroupedReduction, with lanes (#29613)
- Improve window functions (#29591)
- Push down
is_nan/is_not_nanfilters to Iceberg (#29579) - Compute shared group-by agg input subexpressions once (#29574)
- Emit files unordered for remote Parquet files when order not observed (#29581)
- Filter rows by the runtime join key range (#29576)
- Update few-group sums, means and counts in lanes (#29573)
- Loop over 4k arrays in group-by update (#29572)
- Decode parquet scans out of order when order is not observed (#29546)
- Don't always row-encode multi-column group-by (#29570)
- Push down
str.starts_withfilters to Iceberg (#29545) - Trace join runtime filters through unions (#29565)
- Fold SQL temporal literals into plain values (#29562)
- Don't rehash stored key on every TotalIndexMap probe (#29561)
- Fuse drops into all filters on streaming engine (#29550)
- Join probe on Arrays directly (#29558)
- Better build side selection in equi-join sampler (#29524)
- Large optimisation for
BytecodeParserrewrite/dispatch (#29548) - Parallelize expressions in in-memory map fallback (#29535)
- Push down
!=filters to Iceberg (#29455) - Improve predicate stats (#29495)
- Scale bloom filters from keys seen (#29477)
- Optimize simple like queries (#29459)
- Insert head slice below select(len() <cmp> n) to enable slice pushdown (#29209)
- Parallelize row encoding in the row_encode expression (#29434)
- Degrade outer join optimization (#29432)
- Optionally reorder semi join (#29443)
- Borrow the cached regex instead of cloning it per page (#29422)
- Lower SQL LIKE '%x%' to a literal substring match (#29431)
- Optimize
is_inexpression (#29425) - Pushdown bloom filters in probe side (#29423)
- Narrow the decimal rescale to 64 bits when the value fits (#29396)
- Use a thread-local copy of a pushed-down regex predicate (#29411)
- Sample anti-join build side (#29416)
- Improve performance importing from arrow (#29412)
- Sample table size to determine build side in semi joins (#29375)
- Optimize row-encoding (#29405)
- Order pushed parquet predicate columns by measured selectivity (#29397)
- Coerce float literals to decimal instead of casting the column (#29395)
- Fix OOM on TPCH SQL and fix fuzzing errors (#29389)
- Restrict correlated SQL aggregates to requested keys (#29383)
- Prepare Parquet scans for row-group splitting in Polars Cloud (#29295)
- Skip row groups by join runtime ranges without a statistics frame (#29370)
- Reduce copy in
scan_lines(#29310) - Increase HTTP read rate-limit default (#29363)
- Evaluate a pushed parquet predicate sequentially per conjuct (#29352)
- Disable system certificates for
CloudScheme::Httpsources (#29284) - Reduce rechunk in
sort_in_place(#29343) - Dynamic predicates for hash joins (#29312)
- Use HTTP suffix range for Parquet size and footer (#29308)
- Derive predicates from join conditions (#29304)
- Lower uncorrelated subqueries to semi joins and push semi/anti joins below inner joins (#29289)
- Make leaf name iterator unique (#29291)
- Don't clone the full frame per arm in when/then/otherwise (#29258)
- Push inner joins before outer joins and rewrite left-join-is-null to anti join (#29277)
- Use stats to decide cross join buffering side (#29270)
- Improve cache-removal and join-order cost estimates (#29263)
- Improve CSPE cost evaluation (#29250)
- Fuse group-by pre-select into node after partition (#29251)
- Inline hot small functions (#29244)
- Fix plan-time regressions in projection pushdown for wide frames (#28724)
- Rechunk before selecting in group-by pre-select (#29219)
- Reuse Iceberg data file sizes (#29063)
✨ Enhancements
- Python Polars 2.0 (#29723)
- Enable OOC by default with 80% of available RAM as threshold (#29741)
- Support window frames in SQL FIRST_VALUE and LAST_VALUE, and add NTH_VALUE and a LAG/LEAD default (#29740)
- Set default OOC disk budget to 64 GB (#29734)
- Add POLARS_OOMKILL_THRESHOLD_MB (#29735)
- Improve estimated DataFrame memory usage (#29712)
- Extend pipe_with_dtype for multiple expressions (#29676)
- Attribute physical nodes to IR nodes (#29522)
- Make approx_quantile sketch states mergeable across processes (#29660)
- Add unstable scan_lance (#29413)
- New Expression and function: pipe_with_dtype (#29547)
- Resolve
is_inand Map lookup coercion from dtypes alone (#29487) - Cast the needle of
is_inand Map lookups exactly or not at all (#29486) - Support
Mapin JSON and NDJSON reading and writing (#29478) - Add
scan_external_reader(#29232) - Add
struct.eval(#29454) - Improve
BytecodeParserUDF variable resolution (#29553) - Type exact SQL numeric literals as Decimal and truncate SQL
%/DIV (#29536) - Make Iceberg sink commits idempotent across re-executions (#29512)
- Allow deterministic expression plugins to opt into CSE/CSPE (#29428)
- Improve cloud object_store IO error types and messages (#29471)
- Add erf(c) function (#29501)
- Update
BytecodeParserfor Python 3.15 (#29491) - Expose the registered source as
scan_fn.io_source(#28897) - Support selectors in
joinkeys (#29233) - Honor Iceberg sort orders in native sinks (#29318)
- Add
APPROX_QUANTILEto the SQL frontend (#29288) - Add support for
approx_quantilein the streaming engine (#29237) - Read Parquet ENUM type as pl.String (#29331)
- Expose more
scan_iceberg/delta-related attributes in the visitor for cudf_polars (#29297) - More map operations (#29296)
- Binning functions (#28888)
- Support
collectandcollect_batchesusingRemoteEngine(#28914) - Support GROUP BY GROUPING SETS, ROLLUP, CUBE and GROUPING() (#29278)
- Fix tpch SQL issues (#29269)
- Fuse filters in (inner) join operation (#29218)
- Add in-memory support for approximate quantile (#29206)
- Disable casts from
StringtoTime(#29215)
🐞 Bug fixes
- Find SQL aggregates by their function name, and raise on nested aggregate calls (#29751)
- Run SQL window functions over grouped rows on the aggregated rows, and evaluate QUALIFY before the projection (#29746)
- Match categories added after
is_inprepares a string haystack (#29744) - Give tied rows the same running aggregate in SQL windows, and support more window frames (#29736)
- Fix scan_lance CI error (#29737)
- Rank NULLs and ties in SQL window functions, and add PERCENT_RANK, CUME_DIST and NTILE (#29729)
- Read from database without requiring SQLAlchemy
asyncioextra (#29713) - Don't slice the input of a select that has a window expression (#29725)
- Fix named SQL windows and raise for window shapes that gave wrong results (#29720)
- Preserve projections ...
Python Polars 2.0.0-rc.2
💥 Breaking changes
- Read Parquet ENUM type as pl.String (#29331)
- More map operations (#29296)
- Deprecate cut/qcut (#29329)
- Remove legacy POLARS_STREAMING_CHUNK_SIZE (#29046)
- Introduce the
Mapdtype (#28984) - Update behavior of DataFrame/LazyFrame functions on 0-width input (#29099)
🚀 Performance improvements
- Order pushed parquet predicate columns by measured selectivity (#29397)
- Coerce float literals to decimal instead of casting the column (#29395)
- Fix OOM on TPCH SQL and fix fuzzing errors (#29389)
- Restrict correlated SQL aggregates to requested keys (#29383)
- Prepare Parquet scans for row-group splitting in Polars Cloud (#29295)
- Skip row groups by join runtime ranges without a statistics frame (#29370)
- Reduce copy in
scan_lines(#29310) - Increase HTTP read rate-limit default (#29363)
- Evaluate a pushed parquet predicate sequentially per conjuct (#29352)
- Disable system certificates for
CloudScheme::Httpsources (#29284) - Reduce rechunk in
sort_in_place(#29343) - Dynamic predicates for hash joins (#29312)
- Use HTTP suffix range for Parquet size and footer (#29308)
- Derive predicates from join conditions (#29304)
- Lower uncorrelated subqueries to semi joins and push semi/anti joins below inner joins (#29289)
- Make leaf name iterator unique (#29291)
- Don't clone the full frame per arm in when/then/otherwise (#29258)
- Push inner joins before outer joins and rewrite left-join-is-null to anti join (#29277)
- Use stats to decide cross join buffering side (#29270)
- Improve cache-removal and join-order cost estimates (#29263)
- Improve CSPE cost evaluation (#29250)
- Fuse group-by pre-select into node after partition (#29251)
- Inline hot small functions (#29244)
- Fix plan-time regressions in projection pushdown for wide frames (#28724)
- Rechunk before selecting in group-by pre-select (#29219)
- Reuse Iceberg data file sizes (#29063)
- Avoid gather for >= 75% cold keys in streaming group-by (#29217)
- Elide memset on pread for FileByteSource (#29162)
- Add prefetching to OOC (#29081)
- Push more predicates past caches (#29182)
- Prevent cache trashing in row encoding for fixed width types (#29175)
- Improve group-by cardinality estimates (#29174)
- Split join clusters across filters and bound key domains by value range (#29166)
- Make file read concurrency semaphore global (#29163)
- Skip redundant output validity construction in all-valid arr.dot (#29115)
- Default
posix_fadvtoNormal(#29157) - Avoid a full fsync per file when writing Parquet (#29108)
- Replace
mmapwith file I/O for parquet scan (#29091) - Use adaptive concurrency for
headrequests (#29131) - Improve join-reordering (#29092)
✨ Enhancements
- Expose the registered source as
scan_fn.io_source(#28897) - Support selectors in
joinkeys (#29233) - Honor Iceberg sort orders in native sinks (#29318)
- Add
APPROX_QUANTILEto the SQL frontend (#29288) - Add support for
approx_quantilein the streaming engine (#29237) - Read Parquet ENUM type as pl.String (#29331)
- Expose more
scan_iceberg/delta-related attributes in the visitor for cudf_polars (#29297) - More map operations (#29296)
- Binning functions (#28888)
- Support
collectandcollect_batchesusingRemoteEngine(#28914) - Support GROUP BY GROUPING SETS, ROLLUP, CUBE and GROUPING() (#29278)
- Fix tpch SQL issues (#29269)
- Fuse filters in (inner) join operation (#29218)
- Add in-memory support for approximate quantile (#29206)
- Disable casts from
StringtoTime(#29215) - Add
organizationtoConfig.enable_monitoring(#29221) - Add a workspace argument to Config.enable_monitoring (#29196)
- Remove legacy POLARS_STREAMING_CHUNK_SIZE (#29046)
- Add LazyFrame resolver API (#29003)
- Support incremental append Iceberg scans (#28820)
- Support date/integer arithmetic and decimal non-equi join comparisons (#29156)
- Update documentation analytics implementation (#29127)
- Introduce the
Mapdtype (#28984) - Update behavior of DataFrame/LazyFrame functions on 0-width input (#29099)
🐞 Bug fixes
- Fix OOM on TPCH SQL and fix fuzzing errors (#29389)
- Size row-index table statistics from the statistics frame (#29381)
- Preserve categories object in pyo3-polars (#29385)
- Strip the leading slash from Windows Delta table roots (#29386)
- Isolate expanded Python dataset scans (#29378)
- Make Iceberg bucket sort keys serializable (#29376)
- Apply "schema_overrides" in
read_databasefor Arrow-based drivers (#29273) - Remove duplicated word in rate-limit comment (#29372)
- Check whether Datetime is monotonically increasing dynamically (#29293)
- Keep input order of unmatched build rows in ordered streaming equi join (#29371)
- Unaliased constants in SQL SELECT with GROUP BY (#29367)
- Consistent
DateandDecimalmeans between the streaming and in-memory engines (#29359) - Respect string statistics for enum columns during parquet scanning (#29366)
- Support selectors properly in DataFrame n_unique (#29360)
- Decimal Parquet statistics for decimal/i128/f16 (#29350)
- Early check for converting integer map keys (#29348)
- Lowering for input-independent filter (#29340)
- Correlation of constant column returning non-NaN for larger inputs (#29319)
- Incorrect height in multi-input GroupBy (#29332)
- Fix panic in scan_iceberg for snapshot_id before a schema change (#28895)
- Resolve arithmetic
Structsupertypes per-field (#29261) - Fix comparison expression method comment (#29257)
- Don't panic on an empty or null quantile expression input (#29240)
- Detect list-valued quantile literals in approx_quantile
auto(#29236) - Various map issues (#29147)
- Rolling quantile should respect window trimming (#29200)
- Ensure ignored columns are excluded from dtype
Wildcardselector (#29220) - Include the library path in the plugin dlopen error message (#29213)
- Respect Parquet schema when reading Int96 timestamps (#29208)
- Wrap IoError in PathIoError such that callers can extract untruncated path (#29128)
- Slice on Series with negative index beyond length (#29191)
- Fix OOB access due to empty chunks (#29177)
- Compare struct
AnyValues through their field dtypes (#29185) - Improve group-by cardinality estimates (#29174)
- Preserve scalar arrays in arr.dot dispatch (#29000)
- Empty array collect missing dtype in join (#29095)
- Apply the
OVERclause to multi-argument aggregates (#29160) - Respect NULLS FIRST/LAST in a window's ORDER BY (#29159)
- Resolve relation aliases declared inside a parenthesized JOIN (#29158)
- Fix a
DataFrameconstruction race (and generator data loss) (#29132) - Properly compute null count in parquet statistics for list of categorical/enum (#29140)
- Address
read_databaseOracle regression, following introduction of Arrow fast-path (#29142) - Synchronize PR label matchers (#29144)
- Unblock Python thread during collect_all_async (#29097)
- Match engine output dtype in planner for
Decimaltrue division with integers (#29122) - Error instead of segfault for
exp/log1pon non-numeric dtypes (#29112) - Prevent panic in
offset_bywhen target date is out-of-range (#29059) - Incorrect broadcast height min/max_horizontal for scalar inputs (#29083)
- Proper seq id relabeling before distributing (#29060)
📖 Documentation
- Clarify that ambiguous parameter refers to DST transitions (#28873)
- Document gzip/zstd compression for read_csv and scan_csv (#29387)
- Add LazyFrameResolver to reference guide (#29379)
- Add user-guide for new enable_monitoring feature (#29358)
- Improve join_where engine tag (#29234)
- Add 2 to the version switcher dropdown (#29194)
- Show more information in engine tags (#29154)
- Engine tags for
is_empty/has_nulls(#29152) - More engine tags (#29148)
- Fix misleading reinterpret() docstring (#29075)
📦 Build system
- Add a
fast-releaseprofile without LTO (#29168)
🛠️ Other improvements
- Add dymanicpredicates to preferred build sides (#29335)
- Deprecate cut/qcut (#29329)
- Mark test as slow (#29336)
- Bump maturin (#29282)
- Bump object_store crate to 0.14.2 (#29317)
- Update rustls dependency to version
0.23.45(#29303) - Bump build deps used in ARM64 Windows release pipeline (#29280)
- Fix the stalling
test_fused_many_morsels_and_skewtest (#29290) - Use
SpillFrames inDataFrameSearchBuffers(#29207) - More obvious
MapChunkedstorage handling (#29248) - Centralize hoisted aggregate bookkeeping and clarify grouping predicates (#29287)
- Update analytics endpoint config (#29222)
- Add a blanket
lf.collect().schema == lf.collect_schema()check (#29224) - Add expand_paths parameter to toggle path expansion (#29210)
- Remove auto-streaming jobs (#29214)
- Bump
object_storefor newDnsResolvertrait (#29145) - The in-memory engine is no longer the default in the docstrings (#29137)
- Test list-of-structs in
map_elements(#24925) - Update existing comment instead of new comment for file size on PR (#29134)
- Output stdout/stderr of crashed pytest-xdist workers (#29094)
- Remove batched_reader.py (#29098)
- Update test for latest pyiceberg (#29090)
Thank you to all our contributors for making this release possible!
@0guban0v, @ATL2001, @Aidavdw, @AlessandroKuz, @BitWeaverDev, @DeflateAwning, @EndPositive, @Kevin-Patyk, @MarcoGorelli, @SatvikMishra08, @aarushkandukoori, @abokhalill, @alexander-beedie, @atharva7905k, @ayushh0110, @borchero, @carnarez, @dancsi, @dsprenkels, @freundTech, @fsimkovic, @jonasdedden, @kafka1991, @kdn36, @lun3x, @madsbk, @matthewbayer, @mikhail5555, @mroeschke, @nameexhaustion, @orlp, @r-brink and @ritchie46
Python Polars 1.44.2
🛠️ Other improvements
- Backport 1.44.2 (#29216)
Thank you to all our contributors for making this release possible!
@EndPositive, @dsprenkels, @kdn36, @lun3x, @nameexhaustion and @orlp
Python Polars 2.0.0-rc.1
💥 Breaking changes
- Set the default engine for SQL to the streaming engine (#28973)
🚀 Performance improvements
- Reuse native metadata for Iceberg sinks (#29062)
- SQL exists predicate pushdown before subqueries (#29078)
- Collect primitive group-by aggregations into single chunk (#28825)
- Use cost information to determine whether to keep cached nodes (#29042)
- Use scan cardinality in build side if sampling is exhausted (#29040)
✨ Enhancements
- Defer SQL resolving until we convert to IR (#29077)
- Expose Iceberg sink writer options (#29065)
- Support partitioned Iceberg sinks (#28823)
- Expose fixed-array inner product in SQL (#29033)
- Add strip_prefix and strip_suffix to expression names (#29041)
- Use scan information in join reordering (#29038)
- Add cardinality information (#29024)
- Allow customizing explain output for debugging custom io sources (#23978)
- Add more expression properties to
metanamespace (#28091) - Improve SQL coverage (#29010)
- Improve SQL coverage (#29006)
- Add Join reordering. (#28985)
- Merge 2.0 into main (#28982)
- Set the default engine for SQL to the streaming engine (#28973)
🐞 Bug fixes
- Don't keep incrementing morsel id in MergeSortedNode pass-through (#29055)
- Ensure show_graph shows physical plan for auto engine (#29011)
- Assign SQL JOIN literal comparisons to the correct input (#28701)
- Make distributor linearizer capacity consistent (#29057)
- Correct peak visitors, dictionary bounds, and
Datefeature gating (#29031) - Keep extension type schema consistent (#29039)
- Fix
Series.sampleorder when with_replacement=True and shuffle=False (#28990) - Reduce memory in multi_scan pipeline
PostApplyExtraOps(#29049) - Fix SO in rayon caused by join_where (#29051)
- Clarify GPU installation guidance (#29037)
- Remove POLARS_AUTO_STRUCTIFY env var backdoor (#29032)
- Ensure metrics are flushed between phases and before logging (#29014)
- SQL parse a typed DATE literal instead of casting it (#29007)
- Fix parquet decode of plain pages in dictionary column (#29001)
- Reserve fixed-size-list child capacity (#28980)
- Fix SQL casts (#28986)
- Fix incorrect condition in
combine_validities_and_manyand add test (#28909) - Give
sink_batcheslazy: Literal[False]overload a default (#28951)
📖 Documentation
- Update 2.0.0-rc1 migration guide with latest changes (#28983)
- Fix invalid output in DataFrame.sample example (#28998)
🛠️ Other improvements
- Bump rust toolchain (#29080)
- Increase rustc stack size (#29076)
- Log pytest worker crashes and disable restarting (#29058)
- Replace FileInfo row_estimation tuple with typed ScanStats (#29023)
- Use an
ifforcfg(debug_assertions)to fix the benchmark job (#29002) - Remove 2.0 branch from ci-tested branches (#28981)
- Skip tests that are currently failing on windows (#28962)
Thank you to all our contributors for making this release possible!
@0guban0v, @0xC61, @Aniket-a14, @LarryHu0217, @MatteoPossamai, @NeejWeej, @TNieuwdorp, @WaterWhisperer, @adamreeve, @dsprenkels, @jonasdedden, @kdn36, @math-hiyoko, @matthewbayer, @nameexhaustion, @orlp, @ritchie46, @severinh and @sivakumar-mahalingam
Python Polars 1.44.1
Thank you to all our contributors for making this release possible!
@Kevin-Patyk, @henrytsanford, @jonasdedden, @orlp and @ritchie46
Python Polars 1.44.0
⚠️ Deprecations
- Deprecate
rechunkparameter for all read/scan functions (#28063) - Deprecate
Expr.rechunk()(#28692) - Deprecate
struct.rename_fields()with an incorrect number of fields (#28672)
🚀 Performance improvements
- Add private env var toggle for HTTP rate limit (#28882)
- Relax default
CloudRetryConfigfor rate limit stability (#28885) - Elide generic cross join on subquery decorrelation in equality predicates (#28876)
- cache CTE's in SQL layer (#28864)
- Allow CSPE if manual caches are set (#28859)
- Lower unqualified join predicates to inner joins in SQL (#28854)
- Rechunk
maskfor DataFramefilter(#28762) - Improve performance of when/then/otherwise by masking out unevaluated elements (#28498)
- Drop unused projections in filter on streaming engine (#28713)
- Retain Parquet
Partialmetadata on filter (#28737)
✨ Enhancements
- Support integer fixed-array dot products (#28829)
- SQL correlated in (#28927)
- Support more join_types in
join_where(#28880) - Support Iceberg schema evolution (#28794)
- SQL conformance (#28494)
- Introduce
RemoteEngineand a common base class for all engines (#28800) - Support Iceberg table with V3 deletion vectors in native
scan_iceberg(#28772) - Support Iceberg snapshot properties (#28793)
- Expose
sinked_paths_callbackonsink_parquetas unstable parameter (#28814) - Add
infer_schema_filesto CSV inference hint (#28809) - Add native fixed-array dot (#28504)
- Export query metrics to polars_cloud (#28757)
- Support Iceberg object storage paths (#28634)
- More CSEE simplification (#28731)
- Improve error in Series constructor with name in context (#28743)
- Add adaptive HTTP rate-limiter for cloud IO (#28591)
- 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)
- Expose array and plugin function views in Python visitor (#28635)
🐞 Bug fixes
- SQL handle quantified comparisons against a subquery (#28929)
- Fix SQL subquery qualified lowering and cache row-index (#28926)
- Clippy-stable failures (#28919)
- Use uuidv7 for cloud observed queries (#28910)
- Unsoundness in AnyValue::into_static for structs (#28889)
- Invalidate suborders on projection (#28866)
- Ensure SQL function registry is available in isolated subqueries (#28881)
- Handle null in Expr.is_not_nan (#28883)
- Ensure eager
unpivotcolumn selection aligns with the lazy engine (#28846) - Fix assertion error / incorrect data load from parquet written by fastparquet (#28656)
- Fix projection pushdown incorrect
select()height (#28751) - Restore
monitoringas an engine-level parameter (#28821) - Bincode serialization of IR hints (#28837)
- Retain datetime inference across CSV fallback (#28663)
- Avoid chunk fragmentation on bool agg
minandmax(#28789) - Merge join with coalesce and empty suffix (#28799)
- Wrong function name call in test (#28801)
- Preserve row mapping in nested over expressions (#28767)
- Restore CI compatibility with NumPy 2.5.2 (#28782)
- Do not deduplicate inherently nondeterministic plan nodes (#28768)
- Fix OOC spilling of categoricals (#28761)
- Correct partitionable filter handling for pivot (#28749)
- Small typo in docstring (#28763)
- Avoid chunk fragmentation on bool agg
anyandall(#28754) - Ignore nans in (min|max)_horizontal (#28710)
- Correct function display for str.replace_all (#28742)
- Exclude debug tests from nodebug streaming run (#28747)
- Convert predicate series dtype during prefiltered parquet reading (#28711)
- Do not remove nested caches when performing predicate pushdown past a cache node (#28740)
- Correct handling of nulls at the start of business day functions (#28703)
- Do not panic when exceeding Parquet metadata scan cache (#28721)
- Remove cryptographic hashing from CSPE (#28716)
- Unsoundness in rayon block_on (#28709)
- Check for (shallow) IR node equality on top of hashing in CSPE (#28506)
- Don't hand IO plugins a predicate they cannot evaluate (#28643)
- Raise on overflow in Decimal sum instead of silently wrapping (#28688)
- Preserve nulls when importing Arrow maps (#28680)
- Propagate null
bycolumn values inrolling_*_by(#27367) - Fix self-referencing
fieldinstruct.with_fieldswithover(#28678) - Fix Arrow buffer offset for
Utf8andBinary(#28662) - Clamp group-by slice offset (#28579)
- Release the GIL while resolving the schema in
__arrow_c_stream__(#28642) - Fix data corruption on Series from nested Arrow
LargeList(#28632)
📖 Documentation
- Interlink join docstrings (#28907)
- Migration guide for 2.0 release (#28788)
- Clarify
read_database_urirequirements for SQLAlchemy (#28366) - Update engine tags (#28852)
- Clarify "that that side" comment in asof_join (#28847)
- Update mage.ai documentation link (#28813)
- Add engine tags (#28708)
- Document that arg_extremum functions return any index on ties (#28691)
- Fix Polars Cloud API reference link (#28693)
🛠️ Other improvements
- Bump runtime toolchains (#28924)
- Add min-publish-age for cargo (#28906)
- Tighten join invariants DSL (#28913)
- Bump Rust toolchain (#28900)
- Ensure that predicates are pushed down to the scans (#28857)
- Clarify "that that side" comment in asof_join (#28847)
- Restore
monitoringas an engine-level parameter (#28821) - Remove workaround for inconsistent CSE (#28834)
- Introduce
RemoteEngineand a common base class for all engines (#28800) - Add row count and file byte size to sinked paths callback (#28522)
- Use canonical expression IDs in CSEE (#28786)
- Enforce 100% type coverage in CI with Pyrefly (#28795)
- Attribute annotations for
CredentialProviderAWSandCredentialProviderAzure(#28790) - Attribute annotations for
ScanCastOptions(#27906) - Disable credentials in upload chunk size tests (#28745)
- Improve backtrace path formatting (#28732)
- Exclude debug tests from nodebug streaming run (#28747)
- Mark
test_grouped_agg_parametricas slow (and add param ids) (#28715) - Fix first
expectintest_group_by_arg_max_boolean_26978(#28690) - Fix the name of
struct.drop()inrename_fields()deprecation message (#28687) - Add
dist=loadgroupto the pytest config (#28676) - Enable a lot of
may_fail_auto_streamingtests (#28675) - Re-enable
test_extension()for streaming engine (#28611) - Update
test_hive_join_rewrite_semi_jointest to work with streaming engine (#28610)
Thank you to all our contributors for making this release possible!
@0guban0v, @JakubValtar, @Joosboy, @Kevin-Patyk, @MatteoPossamai, @NicoOhR, @TNieuwdorp, @VedantMadane, @aarushkandukoori, @alexander-beedie, @azimafroozeh, @borchero, @carnarez, @dancsi, @dependabot[bot], @dsprenkels, @gautamvarmadatla, @jonasdedden, @jorenham, @kdn36, @lzcmian, @malhotrashivam, @matthewbayer, @mikhail5555, @nameexhaustion, @orlp, @ritchie46, @subotac and dependabot[bot]
Rust Polars 0.55.2
✨ Enhancements
- Add adaptive HTTP rate-limiter for cloud IO (#28591)
🐞 Bug fixes
- Unsoundness in rayon block_on (#28709)
- Check for (shallow) IR node equality on top of hashing in CSPE (#28506)
📖 Documentation
- Document that arg_extremum functions return any index on ties (#28691)
Thank you to all our contributors for making this release possible!
@dancsi, @dsprenkels, @kdn36, @orlp and @ritchie46
Rust Polars 0.55.1
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_filesparameter toscan_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_equalerror (#27816) - Add Clone to SpillFrame/Token (#28302)
- Add Series.degrees/radians and clarify trig functions use radians (#22961)
- Merge sorted with multikey (#28067)
- Add
listexpression 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::Fusedin 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
JOINsyntax (#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
bycolumn values inrolling_*_by(#27367) - Fix self-referencing
fieldinstruct.with_fieldswithover(#28678) - Fix Arrow buffer offset for
Utf8andBinary(#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
StringChunkedsubstring kernels (#28573) - Bad mask handling when reading optional parquet column (#28547)
- Any operation on
Unknown(Int)andUnknown(Float)should result inUnknown(Float)(#28545) - Flip
nulls_lastafterExpr.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_lastinfunction_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 INinteraction withNULLvalues and joins (#28484) - Use total comparison in Expr literal values (#28482)
- Ensure SQL
SUMandCORRaggregates return NULL for all-null inputs, addTOTAL(#28475) - Share
null_count_dtypehelper between Delta and Iceberg, fixingSchemaError(#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.replacewhen there were multiple chunks (#28437) - Propagate
is_scalarfrom 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()tosort(descending=True)whenmaintain_order=True(#28403) - Propagate bigidx to
polars-planfrompolars(#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 inArraycolumns being written incorrectly asnull(#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_algorithmwhen 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
Objectdtype instead of creating invalidList(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_stdvalue (#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 rig...
Python Polars 1.43.2
⚠️ Deprecations
- Deprecate casts from
Categoricalto integer dtypes (#28525) - Deprecate not setting the
plan_stageargument inshow_graph()(#28391)
🚀 Performance improvements
- Pushdown
len()to concat/union inputs (#28570)
✨ Enhancements
- Issue FutureWarning on using
from_arrowof ArrowStreamExportable (#28442) - Add
infer_schema_filesparameter toscan_csv(#28440)
🐞 Bug fixes
- 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)
- 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
StringChunkedsubstring kernels (#28573) - Bad mask handling when reading optional parquet column (#28547)
- Any operation on
Unknown(Int)andUnknown(Float)should result inUnknown(Float)(#28545) - Flip
nulls_lastafterExpr.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_lastinfunction_expr_sortedness(#28544) - Incorrect slicing when a join requires sorting (#28541)
🛠️ Other improvements
- Fix duckdb delta extension install collision (#28607)
Thank you to all our contributors for making this release possible!
@BitWeaverDev, @Matt711, @Samoilov2004, @borchero, @dancsi, @dsprenkels, @kdn36, @masumi-ryugo, @nameexhaustion and @ritchie46