Skip to content

Releases: pola-rs/polars

Python Polars 2.1.0

Choose a tag to compare

@github-actions github-actions released this 25 Oct 18:24
7f902bd

💥 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) and Array columns 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 by keys (#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 TopK for 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.replace for patterns that end in .*$ (#29971)
  • Use the Parquet string prefilter for literal str.contains and SQL LIKE (#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 Struct data (#29813)
  • Speed up arg_min and arg_max (especially on data with nulls) (#29849)
  • Huge reduction in from_rows and from_dicts memory 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 == and is_in (#29885)
  • Filter Categorical and Enum Parquet columns while decoding (#29882)
  • Rewrite sort().first() to min() and single-key sort_by().first() to min_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() to min_by and limit sorts read with head() (#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_by keys 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 TABLE with 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_filter and dynamic partition overwrite to sink_iceberg (#29909)
  • Support SQL JOIN ... ON subqueries 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 RECURSIVE when 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_TIME and CURRENT_TIMESTAMP in SQL (#30144)
  • Allow reinterpret between Int128 and Decimal (#30133)
  • Add Expr.truncdiv for division rounding toward zero (#30138)
  • Support uncorrelated subqueries in SQL JOIN ... ON (#30141)
  • Support correlated subqueries in SQL JOIN ... ON and correlated scalar subqueries without an aggregate (#30131)
  • Support sinking to Iceberg table with bucket partitioned field (#30091)
  • Add create_namespace_if_not_exists to sink_iceberg (#30087)
  • Attach Iceberg catalogs to SQLContext via register_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_ipc table function (#30054)
  • Support named options in SQL read_parquet table function (#29998)
  • Add experimental geoparquet read/write (#29987)
  • Accept a list of paths in SQL read_* table functions (#30047)
  • Add SQL read_ndjson table 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_REPLACE and DATE_TRUNC to SQL (#29967)
  • Add generate_series and range to SQL (#29912)
  • Add create_if_not_exists to sink_iceberg (#29908)
  • Support named options in SQL read_csv table 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 Array rows (#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_quantile sketches deterministically (#30263)
  • Use the supertype of both inputs for the cov/corr output 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.replace for nested repetitions before .*$ (#30258)
  • Allow write_iceberg into 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 FROM item 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...
Read more

Python Polars 2.0.0

Choose a tag to compare

@github-actions github-actions released this 06 Oct 11:52
22a147d

💥 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 in Column::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 BytecodeParser method rewriting (#29632)
  • Stream from_dicts records 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_list with 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_nan filters 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_with filters 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 BytecodeParser rewrite/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_in expression (#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::Http sources (#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_in and Map lookup coercion from dtypes alone (#29487)
  • Cast the needle of is_in and Map lookups exactly or not at all (#29486)
  • Support Map in JSON and NDJSON reading and writing (#29478)
  • Add scan_external_reader (#29232)
  • Add struct.eval (#29454)
  • Improve BytecodeParser UDF 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 BytecodeParser for Python 3.15 (#29491)
  • Expose the registered source as scan_fn.io_source (#28897)
  • Support selectors in join keys (#29233)
  • Honor Iceberg sort orders in native sinks (#29318)
  • Add APPROX_QUANTILE to the SQL frontend (#29288)
  • Add support for approx_quantile in 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 collect and collect_batches using RemoteEngine (#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 String to Time (#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_in prepares 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 asyncio extra (#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 ...
Read more

Python Polars 2.0.0-rc.2

Pre-release

Choose a tag to compare

@github-actions github-actions released this 20 Sep 17:36
da47b74

💥 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 Map dtype (#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::Http sources (#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_fadv to Normal (#29157)
  • Avoid a full fsync per file when writing Parquet (#29108)
  • Replace mmap with file I/O for parquet scan (#29091)
  • Use adaptive concurrency for head requests (#29131)
  • Improve join-reordering (#29092)

✨ Enhancements

  • Expose the registered source as scan_fn.io_source (#28897)
  • Support selectors in join keys (#29233)
  • Honor Iceberg sort orders in native sinks (#29318)
  • Add APPROX_QUANTILE to the SQL frontend (#29288)
  • Add support for approx_quantile in 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 collect and collect_batches using RemoteEngine (#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 String to Time (#29215)
  • Add organization to Config.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 Map dtype (#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_database for 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 Date and Decimal means 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 Struct supertypes 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 Wildcard selector (#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 OVER clause 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 DataFrame construction race (and generator data loss) (#29132)
  • Properly compute null count in parquet statistics for list of categorical/enum (#29140)
  • Address read_database Oracle 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 Decimal true division with integers (#29122)
  • Error instead of segfault for exp/log1p on non-numeric dtypes (#29112)
  • Prevent panic in offset_by when 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-release profile 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_skew test (#29290)
  • Use SpillFrames in DataFrameSearchBuffers (#29207)
  • More obvious MapChunked storage 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_store for new DnsResolver trait (#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

Choose a tag to compare

@github-actions github-actions released this 09 Sep 07:42

🛠️ Other improvements

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

Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Sep 11:49
4296b83

💥 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 meta namespace (#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 Date feature gating (#29031)
  • Keep extension type schema consistent (#29039)
  • Fix Series.sample order 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_many and add test (#28909)
  • Give sink_batches lazy: 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 if for cfg(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

Choose a tag to compare

@github-actions github-actions released this 26 Aug 07:09
e4ae5ea

Thank you to all our contributors for making this release possible!
@Kevin-Patyk, @henrytsanford, @jonasdedden, @orlp and @ritchie46

Python Polars 1.44.0

Choose a tag to compare

@github-actions github-actions released this 24 Aug 09:38
6f46eb2

⚠️ Deprecations

  • Deprecate rechunk parameter 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 CloudRetryConfig for 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 mask for DataFrame filter (#28762)
  • Improve performance of when/then/otherwise by masking out unevaluated elements (#28498)
  • Drop unused projections in filter on streaming engine (#28713)
  • Retain Parquet Partial metadata 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 RemoteEngine and 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_callback on sink_parquet as unstable parameter (#28814)
  • Add infer_schema_files to 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 unpivot column 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 monitoring as an engine-level parameter (#28821)
  • Bincode serialization of IR hints (#28837)
  • Retain datetime inference across CSV fallback (#28663)
  • Avoid chunk fragmentation on bool agg min and max (#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 any and all (#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 by column values in rolling_*_by (#27367)
  • Fix self-referencing field in struct.with_fields with over (#28678)
  • Fix Arrow buffer offset for Utf8 and Binary (#28662)
  • Clamp group-by slice offset (#28579)
  • 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_uri requirements 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 monitoring as an engine-level parameter (#28821)
  • Remove workaround for inconsistent CSE (#28834)
  • Introduce RemoteEngine and 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 CredentialProviderAWS and CredentialProviderAzure (#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_parametric as slow (and add param ids) (#28715)
  • Fix first expect in test_group_by_arg_max_boolean_26978 (#28690)
  • Fix the name of struct.drop() in rename_fields() deprecation message (#28687)
  • Add dist=loadgroup to the pytest config (#28676)
  • Enable a lot of may_fail_auto_streaming tests (#28675)
  • Re-enable test_extension() for streaming engine (#28611)
  • Update test_hive_join_rewrite_semi_join test 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

Choose a tag to compare

@github-actions github-actions released this 06 Aug 09:48

✨ 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

Choose a tag to compare

@github-actions github-actions released this 05 Aug 07:39

This Releases' DSL matches Python 1.43.2.

🚀 Performance improvements

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

✨ Enhancements

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

🐞 Bug fixes

  • Don't hand IO plugins a predicate they cannot evaluate (#28643)
  • Don't hang or crash on sqrt/cbrt/pct_change/ewm_* with a Struct column (#28696)
  • Raise on overflow in Decimal sum instead of silently wrapping (#28688)
  • Preserve nulls when importing Arrow maps (#28680)
  • Propagate null by column values in rolling_*_by (#27367)
  • Fix self-referencing field in struct.with_fields with over (#28678)
  • Fix Arrow buffer offset for Utf8 and Binary (#28662)
  • Clamp group-by slice offset (#28579)
  • Ensure categorical fill_null(strategy="min"/"max") uses lexical min/max (#28636)
  • Release the GIL while resolving the schema in __arrow_c_stream__ (#28642)
  • Fix data corruption on Series from nested Arrow LargeList (#28632)
  • Properly propagate enum metadata for iceberg column mapping (#28580)
  • Correctly write parquet field IDs for enums and categoricals (#28581)
  • Fix arrow C interop binview offset (#28623)
  • Fix duplicate hive values in hive pre-partition rewrite (#28621)
  • Double-counted offset for Arrow export of sliced Series(Array) (#28602)
  • Struct/List/Array equality handling in sort and join (#28601)
  • Use try_new in StructArray construction in polars-json (#27489)
  • Raise ComputeError instead of panicking in repeat_by when output exceeds IdxSize::MAX (#27892)
  • Run type coercion pass on pivot's internally generated group_by (#27897)
  • More careful slice pushdown into joins (#28578)
  • Preserve ordering in sliced unions (#28576)
  • Drop input sortedness when casting to a string (#28574)
  • Clear sortedness flags in StringChunked substring kernels (#28573)
  • Bad mask handling when reading optional parquet column (#28547)
  • Any operation on Unknown(Int) and Unknown(Float) should result in Unknown(Float) (#28545)
  • Flip nulls_last after Expr.reverse() (#28572)
  • Fix high blocking thread use in sink_parquet with async local path (#28543)
  • Serialize LazyFrames backed by bytes (#28568)
  • Release GIL in SQLContext.execute() (#28549)
  • Propagate nulls_last in function_expr_sortedness (#28544)
  • Incorrect slicing when a join requires sorting (#28541)
  • Fix panic on self join of scan_delta / scan_iceberg (#28468)
  • Decrement ParkGroup worker count when worker exits (#28492)
  • Add missing Send bounds in Connector (#28497)
  • Fix UB on first/last_non_null with empty chunk (#28495)
  • Do not CSE non-column height expr on streaming engine (#28480)
  • Propagate adjusted sortedness through Gather (#28493)
  • Deduplicate the expression equality checks (#28483)
  • Address 3VL issue with SQL NOT IN interaction with NULL values and joins (#28484)
  • Use total comparison in Expr literal values (#28482)
  • Ensure SQL SUM and CORR aggregates return NULL for all-null inputs, add TOTAL (#28475)
  • Share null_count_dtype helper between Delta and Iceberg, fixing SchemaError (#28479)
  • Remove non-output columns from the equi-join and semi/anti-join operators (#28446)
  • Fix dropped slice on multiple unions (#28477)
  • Fix in-memory engine incorrect slice on maintain order join (#28478)
  • Check join schema by position (#28455)
  • Block predicate pushdown past overwritten window keys (#28429)
  • Avoid panic when union slice skips all rows (#28420)
  • Solve panic in dt.replace when there were multiple chunks (#28437)
  • Propagate is_scalar from the input to the output of .sort() and .sort_by() (#28438)
  • Insert missing coercions from Unknown(_) in list/array arithmetic (#28411)
  • Resolve CSV column names overwrite in DSL->IR conversion (#28383)
  • Avoid IEJoin rewrite for Categorical comparisons (#28427)
  • Do not rewrite sort().reverse() to sort(descending=True) when maintain_order=True (#28403)
  • Propagate bigidx to polars-plan from polars (#28396)
  • Ensure BinaryView offset+len does not exceed i32::MAX where possible (#28048)
  • Invalid offset in strptime (#28388)
  • Incorrect schema type for decimal <-> primitive division (#28373)
  • Panic in in-memory CSEE handling (#28371)
  • Apply same type coercion to IsBetween as binary comparisons (#28300)
  • Fix offset in arrow ffi export of sliced struct arrays (#28369)
  • Fix cross filter not applied with sink and CSE (#28297)
  • Fix panic on projection pushdown with caches (#28280)
  • Fix write_json() null values in Array columns being written incorrectly as null (#28330)
  • Fix EntityTooSmall on sink_ipc to S3 (#28255)
  • Raise error instead of silent wrapping for select(len()) (#28355)
  • Float16 groupby aggregates (#28361)
  • Respect lexical ordering of Categorical in top_k/bottom_k (#28359)
  • Support dtype-list schema overrides in scan_csv (#28226)
  • Resolve unknown type in fused multiply add (#28321)
  • Honor aws_checksum_algorithm when provided (#28328)
  • Fix regression in sourcing HF_TOKEN (#28317)
  • Raise on addition/subtraction between temporal and non-temporal Series (#28266)
  • Rewrite with_columns on empty df to select during DSL -> IR (#28298)
  • Fix sink deadlock regression (#28296)
  • Avoid panic when consumer of vertical concat is done (#28272)
  • Ensure predicate simplification is deterministically ordered (#28269)
  • Don't attribute untimed execution to optimization in profile (#28273)
  • Harden IPC mmap API (#28258)
  • Classify S3 region request failures as IO errors (#28225)
  • Incorrect inner dtype in ArrayChunked::from_aligned_values (#28249)
  • Unsoundness in arg_sort_ascending (#28245)
  • Add column length check to row encoding (#28248)
  • Raise on implode of Object dtype instead of creating invalid List(Object) (#28246)
  • Don't panic in qcut on degenerate float input (all-NaN, infinite, include_breaks) (#28220)
  • Fix streaming Strptime feature flags (#28242)
  • Return null not 0 for the first unbiased ewm_var/ewm_std value (#28235)
  • Use after free in file cache (#28236)
  • Incorrect length calculation in parallel hashmap (#28227)
  • Avoid slice pushdown panic on shared cache inputs (#28157)
  • Incorrect dtype for Unknown rig...
Read more

Python Polars 1.43.2

Choose a tag to compare

@github-actions github-actions released this 01 Aug 06:28
ae588a9

⚠️ Deprecations

  • Deprecate casts from Categorical to integer dtypes (#28525)
  • Deprecate not setting the plan_stage argument in show_graph() (#28391)

🚀 Performance improvements

  • Pushdown len() to concat/union inputs (#28570)

✨ Enhancements

  • Issue FutureWarning on using from_arrow of ArrowStreamExportable (#28442)
  • Add infer_schema_files parameter to scan_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 StringChunked substring kernels (#28573)
  • Bad mask handling when reading optional parquet column (#28547)
  • Any operation on Unknown(Int) and Unknown(Float) should result in Unknown(Float) (#28545)
  • Flip nulls_last after Expr.reverse() (#28572)
  • Fix high blocking thread use in sink_parquet with async local path (#28543)
  • Serialize LazyFrames backed by bytes (#28568)
  • Release GIL in SQLContext.execute() (#28549)
  • Propagate nulls_last in function_expr_sortedness (#28544)
  • Incorrect slicing when a join requires sorting (#28541)

🛠️ 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