Releases: substrait-io/substrait-java
Releases · substrait-io/substrait-java
Release list
v0.101.0
0.101.0 (2026-08-23)
⚠ BREAKING CHANGES
- isthmus: Substrait→Calcite conversion now represents a nullable
literal as a cast of the literal to its nullable type where it
previously produced a bare literal with a non-nullable type, and
converted row types become nullable accordingly. Calcite→Substrait
conversion folds nullability-only casts over literals into nullable
literals instead of Expression.Cast. - isthmus: an
interval_dayprecision outside 0 to 9 is now
rejected instead of silently narrowed to 6. The bound is
getMaxScale(INTERVAL_DAY_SECOND), the same one Calcite validates an
interval qualifier against, so nothing that parses from SQL is refused.
Converted Calcite types and generated SQL now carry the interval's
declared precision, soINTERVAL ... DAY TO SECOND(P)replaces the
previous fixedDAY TO SECOND(3). A Calcite interval literal whose
declared scale is below 3 now converts to a Substraitinterval_dayat
that scale, dropping the millisecond remainder towards zero, where it
previously reportedinterval_day<6>and kept it. - isthmus: Converted Substrait datetime subtraction expressions
now use an Isthmus-owned operator without a Calcite Enumerable
implementation. Consumers executing these plans through the Enumerable
convention must provide an implementation or handle this operator before
execution. - core:
DefaultExtensionCatalog.EXTENSION_TYPESis removed
andextension:io.substrait:extension_typesis no longer loaded into
DEFAULT_COLLECTION, so code referencing the constant no longer
compiles and plans referencing that URN — including previously
serialized ones — no longer import. To keep reading existing plans,
declare the point and line types in your own YAML under the original
URN.
Features
- core: add HasExtension.withExtension for type-agnostic copies (#1135) (14dc253)
- core: handle RelCommon data for every relation type (#1069) (6b5ba4e)
- core: update to Substrait v0.101.0 (#1103) (317a3ec)
Bug Fixes
- core: derive MergeJoin's record type from both inputs (#1112) (e4c5a9e)
- core: derive precision_time from PrecisionTimeLiteral (#1136) (102bece)
- core: report the missing path when an extension resource is absent (#1115) (45181fb)
- core: write rel-level advanced extensions on exchange rels (#1101) (c08f84d)
- isthmus: preserve interval_day precision in both conversion directions (#1120) (741d4bf)
- isthmus: preserve literal nullability converting to Calcite (#1110) (3b46130)
- isthmus: use a distinct datetime subtraction operator (#1099) (d14f0fd)
- spark: accept Substrait precisions coarser than microseconds (#1128) (961f83e)
v0.100.0
0.100.0 (2026-08-16)
⚠ BREAKING CHANGES
- core:
ExpressionVisitorgains
visit(Expression.NestedMap). Direct implementors must add it;
implementors extendingAbstractExpressionVisitorinherit the
visitFallbackdefault and need no change.NestedList.getType()now
reports a nullable element type when any value is nullable, rather than
the type of the first value. Importing anExpression.Nestedwith no
arm set now throwsIllegalArgumentExceptionrather than
UnsupportedOperationException. - validation that previously used
assertnow throws
unconditionally. Callers catchingAssertionErrormust catch
IllegalArgumentExceptionorIllegalStateExceptioninstead, and code
running without-ea— i.e. most deployments — will now see these
checks fire:VirtualTableScanandExpression.NestedListreject
malformed input both from their builders and fromProtoRelConverter/
ProtoExpressionConverter, andVariadicParameterConsistencyValidator
throwsIllegalArgumentExceptionrather thanAssertionError. - isthmus: removed LiteralConverter#convert(RexLiteral, boolean)
- isthmus-cli:
isthmuswith no arguments reports the missing SQL on
stderr and exits 2, where it used to print the usage on stdout and exit
0;--helpstill does the latter. Passing a query together with-e/
--expressionis now rejected instead of silently ignoring the query. - isthmus: An aggregate converted from Substrait to Calcite now
carries the plan's declared output type instead of Calcite's inferred
one, and may carry a binding-transport operator instead of the plain
SqlAggFunction.
- Output types follow the plan by default
(OutputTypeSource.PLAN_OUTPUT); pass an AggregateConversion with
OutputTypeSource.CALCITE_INFERENCE to
ConverterProvider.builder().aggregateConversion(...) to restore the
previous type behavior. - Operator identity checks on a converted AggregateCall
(call.getAggregation() == SUM) no longer hold for wrapped calls: read
the invocation through AggregateFunctions.boundBinding, and call
AggregateFunctions.unwrapBound(Aggregate) before executing a
converted plan to replace bound calls with their delegates. - Rollup, splitting, singleton flattening and static flattening are
disabled for wrapped calls, each of which would re-infer the
transformed call's type or discard the call, losing the carried type
or binding. - An aggregate with no groupings converts back to Substrait as a single
empty grouping rather than none. - ParameterizedType.StringLiteral.isWildcard() now follows the type
grammar exactly (any, any0-any9), so a declaration whose parameter
name merely starts with "any" no longer matches every argument type
nor shares the signature key of any. No shipped extension is
affected.
- isthmus: the public
io.substrait.isthmus.expression.WindowRelFunctionConverteris removed.
No shippedConverterProviderever instantiated it, so no configured
conversion path reached it, but it was public API with public
constructors and a publicconvert(...), so a downstream that
constructed it directly will no longer compile. There is no drop-in
replacement:WindowFunctionConverterperforms the same signature
matching againstSimpleExtension.WindowFunctionVariant, but yields an
Expression.WindowFunctionInvocationrather than a
ConsistentPartitionWindow.WindowRelFunctionInvocation.
Features
- core: support nested map expressions and import nested structs (#1062) (64a08b7)
- core: update to substrait v0.100.0 (#1082) (e65e9d4)
- isthmus-cli: explain common SQL conversion errors instead of dumping stack traces (#1060) (4a97f9b)
- isthmus: convert nested struct and map expressions to and from Calcite (#1063) (054be1b)
- isthmus: observe field reference types (#1080) (45d64e1)
- isthmus: preserve aggregate output types and semantics through Calcite (#1017) (ac000bc)
Bug Fixes
- core: make ProtoRelConverter.newTopN keep relAnchor on the way back from proto (#1088) (186ef55)
- isthmus: preserve field types in sort and aggregate references (#1090) (43da396)
- isthmus: use schema types for virtual table literals (#1065) (94900fe)
- replace assert-based validation with real exceptions (#1058) (c6e0f08)
- spark: omit dialect entries for types with no Spark sample value (#1086) (4736310)
Code Refactoring
v0.99.0
0.99.0 (2026-08-09)
⚠ BREAKING CHANGES
- core: adds
Type.Unboundand a new
TypeVisitor.visit(Type.Unbound)method that directTypeVisitor
implementors must handle.
Features
- core: bump substrait to v0.99.0 (#1042) (af0d989)
- isthmus: configurable unquoted identifier casing via the ConverterProvider builder (#1037) (0af28cc), closes #983 #983 #1035 #1036
- isthmus: observe scalar function types (#1015) (243be42)
- isthmus: observe window function return types (#1059) (353fe7b)
Bug Fixes
v0.98.0
0.98.0 (2026-08-02)
⚠ BREAKING CHANGES
- isthmus: the isthmus fat jar (
isthmus-<version>-all.jar— the
allclassifier /shadowRuntimeElementsvariant) is no longer
published to Maven Central. Consumers that referenced it explicitly
should depend on the regularisthmusartifact and its transitive
dependencies instead.
🤖 Generated with AI
- the substrait git submodule is gone. Checkouts no longer need
--recurse-submodules; the spec inputs come entirely from the substrait-packaging
artifacts pinned in the version catalog.
Features
Build System
v0.97.0
0.97.0 (2026-07-26)
⚠ BREAKING CHANGES
- isthmus: The
SqlParser.Config-based SQL parsing entry points (public
since v0.94.0) have been removed in favour of passing aConverterProvider:
SubstraitSqlStatementParser.parseStatements(String, SqlParser.Config)SubstraitSqlToCalcite.convertQueries(String, Prepare.CatalogReader, SqlParser.Config)
and its 5-argconvertQueries(..., SqlValidator, RelOptCluster, SqlParser.Config)overload
To customise parser behaviour, subclass ConverterProvider, override
getSqlParserConfig(), and pass it to the ConverterProvider-based parsing methods.
- core:
Fetch.getOffset()/getCount()now return
Optional<Expression>instead oflong/OptionalLong. The generated
protobuf API also dropsFetchRel.offset/count,
HashJoinRel/MergeJoinRel.left_keys/right_keys,
ReadRel.VirtualTable.values, and
Expression.Literal.IntervalDayToSecond.microseconds. Reading an
IntervalDaytype with an unset precision now throws instead of
defaulting to 6. - core: ** type expressions in extension YAMLs are now parsed
with conventional operator precedence, changing the parse of expressions
that relied on the previous uniform left-to-right precedence. The
generated protobuf API also dropsType.user_defined_type_reference.
Verification
./gradlew :core:check :isthmus:check :core:javadoc, both Spark Scala
variants (spark-3.5_2.12, spark-4.0_2.13), and
examples:substrait-spark all pass.
- core: ** the generated protobuf API drops
Expression.Enum
and the deprecatedargsaccessors on the scalar, window, and aggregate
function messages. UseFunctionArgument(theargumentsfield)
instead.
Verification
./gradlew :core:check :isthmus:check :core:javadoc, both Spark Scala
variants (spark-3.5_2.12, spark-4.0_2.13), and
examples:substrait-spark all pass.
- Isthmus now emits id-based outer references
(rel_anchor / rel_reference) instead of offset-based steps_out. It still
consumes both forms, but downstream consumers that only handle steps_out
must be updated to read rel_reference. Rel also gains an abstract
getRelAnchor() that non-Immutables Rel implementations must implement. - core: remove deprecated Join.JoinType.SEMI/ANTI (#1006)
- isthmus: Converting a Substrait plan that uses
MINUS_MULTISETorINTERSECTION_PRIMARYto Calcite now throws
UnsupportedOperationExceptioninstead of producing an incorrect
Calcite relation. The supported set-difference operations are
MINUS_PRIMARY(Minus all=false) andMINUS_PRIMARY_ALL(Minus all=true); the supported intersection operations are
INTERSECTION_MULTISET(Intersect all=false) and
INTERSECTION_MULTISET_ALL(Intersect all=true).
Features
- core: add TopNRel physical operator (#1007) (daef55b)
- core: bump substrait to v0.91.0 (#1026) (482b898), closes #870 #871
- core: bump substrait to v0.93.0 (#1027) (97db19b), closes #872 #873 #868
- core: bump substrait to v0.95.0 (#1028) (1792014), closes #1107 #863 #965
- core: bump substrait to v0.97.0 (#1032) (598350b)
- core: bump substrait to v0.98.0 (#1033) (a968058)
- id-based outer-reference resolution (Substrait 0.89.0) (#982) (2375c2e), closes #869
- isthmus: inject ConverterProvider into the SQL statement parsers (#1035) (e018342)
- isthmus: map RIGHTSHIFT to Substrait shift_right (#986) (6a44814)
- isthmus: map Substrait concat to Calcite CONCAT_FUNCTION (#1025) (a054f4f)
- isthmus: remove invalid SetOp to Calcite relation mappings (#998) (5281a1c)
Bug Fixes
- core: type outer references against the enclosing scope on proto import (#1034) (1dd1bf6)
- isthmus: elide redundant identity projections (#1009) (aa51ae9)
Code Refactoring
v0.96.0
0.96.0 (2026-07-19)
Features
Bug Fixes
- ci: pin semantic-release tooling and restore v0.95.0 and v0.95.1 notes (#989) (cff0d50)
- isthmus: std_dev, variance function mappings (#780) (17d3c30), closes substrait-io/substrait#1011 substrait-io/substrait#1019 #803 #807 substrait-io/substrait#1012
- isthmus: support variadic concat conversion (#1001) (91bb733)
v0.95.1
v0.95.0
0.95.0 (2026-07-05)
⚠ BREAKING CHANGES
- core: remove deprecated Time, Timestamp, TimestampTZ types and literals (#950)
- deps: Protobuf bindings are now generated using the v4
protobuf libraries, released in March 2024. Ensure that dependent
projects also use the v4 protobuf-java libraries, and be aware of the
breaking changes within the protobuf-java APIs documented at
https://protobuf.dev/news/v26/#java-breaking-changes
Features
- core: add Substrait dialect support (#861) (ff76c77)
- core: remove deprecated Time, Timestamp, TimestampTZ types and literals (#950) (71b940f)
- isthmus: map execution context variables to/from Calcite (#976) (08c2889)
Bug Fixes
- core: add compiled output to javadocImmutable classpath (#953) (1d3ea51)
- core: validate Plan.Root output name count (#812) (4bd6b69)
- isthmus: avoid NPE from dangling correlations left by partial decorrelation (fbf2930)
- isthmus: handle LITERAL_AGG in aggregate conversion (52a32ba)
- isthmus: use reachability-metadata.json for native image build (#979) (a1e48c6)
- isthmus: use Substrait type system when building Calcite RelBuilder (#973) (b370df5), closes #954 #955
Build System
v0.94.0
v0.93.0
0.93.0 (2026-06-14)
⚠ BREAKING CHANGES
- core: protobuf Aggregate.Grouping.grouping_expressions field is no longer supported
- extensions: changes the visibility of the
ScalarFunctionVariant.resolve()function from public to package-private
Features
- core: remove AggregateRel.Grouping.grouping_expressions (#857) (b38ca00)
- extend substrait builder api (#773) (594a168)
- extensions: support deprecation info in extensions (#846) (f7768d9)
- extensions: support impl-level description in extensions (#848) (eb453f2)
- pojo: support plan execution behavior (#791) (50acd03)