0.31.0 (2026-08-16)
- emitted extension anchors are numbered per plan, so
plans compared byte-for-byte against output from an earlier release will
differ. Anchors are plan-local by spec, so plan semantics are
unaffected.
ExtensionRegistry.lookup_urnandFunctionEntry.anchorare removed; usehas_urn()/urns()for URN membership, and(entry.urn, str(entry))as a function's durable identity.ExtensionCollector.adoptraises on an input declaring two different functions at one anchor, andaggregateraises on a measure that is not an aggregate function; both previously produced a plan with an ambiguous or dangling function reference.
0.30.0 (2026-07-29)
- DataFrame-produced plans now encode correlated
references as
rel_referencerather thansteps_out(except a reducing join's condition scope, which cannot be expressed id-based and stayssteps_out). The builders and inference are backward-compatible (both forms are read; builders still emitsteps_out). - make OuterReference.steps_out 1-based per the Substrait spec (#233)
- deps: Requires substrait 0.98.0, whose protobuf definitions drop several long-deprecated fields. Plans or code that read the removed fields will break:
- FetchRel.offset / FetchRel.count → offset_expr / count_expr
- ReadRel.VirtualTable.values → expressions
- HashJoinRel/MergeJoinRel.left_keys/right_keys → keys
- IntervalDayToSecond.microseconds → subseconds (+ precision)
substrait-python's builders already emit the replacement fields, so no
builder/consumer API change is required. The only user-visible change is the
plan printer's virtual-table output, which now renders literal: <value> via
the shared expression renderer instead of the removed field-typed struct
renderer.
- deps: An unset
IntervalDay.precisionno longer defaults to microseconds (6). Producers must set precision explicitly and consumers should reject an unset precision; picosecond precision (12) is now allowed. Theinterval_day()builder already requires an explicit precision, so no API change is needed.
- add LateralJoinRel support (inference + builders) (#228) (68df5fb)
- add Plan.ExecutionBehavior support (#224) (4d183f5)
- builders: add ConsistentPartitionWindowRel builder (#158) (23d4274)
- bump substrait packages to 0.86.0 and support additional extension metadata (#168) (1e34f42)
- ergonomic native DataFrame/Expr API (substrait.api) (#204) (702e045)
- expose residual_expression and post_join_filter on join builders (#225) (5814bab)
- id-based outer-reference resolution (Substrait v0.89.0) (#239) (9a0fa08)
- shared subplans (ReferenceRel) / DataFrame.cache() (CTEs) (#235) (4436530)
- add missing interval_day derivation expression (#175) (077859b), closes #174
- combine set-operation nullability across all inputs (#221) (be531c4), closes #206 #220
- extensions: expose top-level metadata in YAML extension files (#170) (6e6b956), closes #149
- make OuterReference.steps_out 1-based per the Substrait spec (#233) (6632b69)
- raise clear parse error for invalid derivation expressions (#222) (8a0beae)
- read SetRel.common in set-relation schema inference (#218) (0edecbb)