Skip to content

Releases: substrait-io/substrait-java

v0.101.0

Choose a tag to compare

@substrait-java-releaser substrait-java-releaser released this 23 Aug 03:14

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_day precision 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, so INTERVAL ... DAY TO SECOND(P) replaces the
    previous fixed DAY TO SECOND(3). A Calcite interval literal whose
    declared scale is below 3 now converts to a Substrait interval_day at
    that scale, dropping the millisecond remainder towards zero, where it
    previously reported interval_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_TYPES is removed
    and extension:io.substrait:extension_types is 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

Choose a tag to compare

@substrait-java-releaser substrait-java-releaser released this 16 Aug 03:12

0.100.0 (2026-08-16)

⚠ BREAKING CHANGES

  • core: ExpressionVisitor gains
    visit(Expression.NestedMap). Direct implementors must add it;
    implementors extending AbstractExpressionVisitor inherit the
    visitFallback default 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 an Expression.Nested with no
    arm set now throws IllegalArgumentException rather than
    UnsupportedOperationException.
  • validation that previously used assert now throws
    unconditionally. Callers catching AssertionError must catch
    IllegalArgumentException or IllegalStateException instead, and code
    running without -ea — i.e. most deployments — will now see these
    checks fire: VirtualTableScan and Expression.NestedList reject
    malformed input both from their builders and from ProtoRelConverter /
    ProtoExpressionConverter, and VariadicParameterConsistencyValidator
    throws IllegalArgumentException rather than AssertionError.
  • isthmus: removed LiteralConverter#convert(RexLiteral, boolean)
  • isthmus-cli: isthmus with no arguments reports the missing SQL on
    stderr and exits 2, where it used to print the usage on stdout and exit
    0; --help still does the latter. Passing a query together with -e /
    --expression is 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.WindowRelFunctionConverter is removed.
    No shipped ConverterProvider ever instantiated it, so no configured
    conversion path reached it, but it was public API with public
    constructors and a public convert(...), so a downstream that
    constructed it directly will no longer compile. There is no drop-in
    replacement: WindowFunctionConverter performs the same signature
    matching against SimpleExtension.WindowFunctionVariant, but yields an
    Expression.WindowFunctionInvocation rather 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

  • isthmus: remove dead WindowRelFunctionConverter and de-duplicate call converters (#1014) (5af64e9)

v0.99.0

Choose a tag to compare

@substrait-java-releaser substrait-java-releaser released this 09 Aug 03:42

0.99.0 (2026-08-09)

⚠ BREAKING CHANGES

  • core: adds Type.Unbound and a new
    TypeVisitor.visit(Type.Unbound) method that direct TypeVisitor
    implementors must handle.

Features

Bug Fixes

  • isthmus: route native-image metadata queries through reflective provider (#1046) (a6d4cb5)

v0.98.0

Choose a tag to compare

@substrait-java-releaser substrait-java-releaser released this 02 Aug 05:28

0.98.0 (2026-08-02)

⚠ BREAKING CHANGES

  • isthmus: the isthmus fat jar (isthmus-<version>-all.jar — the
    all classifier / shadowRuntimeElements variant) is no longer
    published to Maven Central. Consumers that referenced it explicitly
    should depend on the regular isthmus artifact 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

  • isthmus: stop publishing the isthmus fat jar (#1044) (1eb3c54)
  • source spec inputs from substrait-packaging artifacts, drop the submodule (#1043) (8bc8034)

v0.97.0

Choose a tag to compare

@substrait-java-releaser substrait-java-releaser released this 26 Jul 05:28

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 a ConverterProvider:
  • SubstraitSqlStatementParser.parseStatements(String, SqlParser.Config)
  • SubstraitSqlToCalcite.convertQueries(String, Prepare.CatalogReader, SqlParser.Config)
    and its 5-arg convertQueries(..., 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 of long/OptionalLong. The generated
    protobuf API also drops FetchRel.offset/count,
    HashJoinRel/MergeJoinRel.left_keys/right_keys,
    ReadRel.VirtualTable.values, and
    Expression.Literal.IntervalDayToSecond.microseconds. Reading an
    IntervalDay type 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 drops Type.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 deprecated args accessors on the scalar, window, and aggregate
    function messages. Use FunctionArgument (the arguments field)
    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_MULTISET or INTERSECTION_PRIMARY to Calcite now throws
    UnsupportedOperationException instead of producing an incorrect
    Calcite relation. The supported set-difference operations are
    MINUS_PRIMARY (Minus all=false) and MINUS_PRIMARY_ALL (Minus all=true); the supported intersection operations are
    INTERSECTION_MULTISET (Intersect all=false) and
    INTERSECTION_MULTISET_ALL (Intersect all=true).

Features

Bug Fixes

  • core: type outer references against the enclosing scope on proto import (#1034) (1dd1bf6)
  • isthmus: elide redundant identity projections (#1009) (aa51ae9)

Code Refactoring

  • core: remove deprecated Join.JoinType.SEMI/ANTI (#1006) (f625365)

v0.96.0

Choose a tag to compare

@substrait-java-releaser substrait-java-releaser released this 19 Jul 05:17

0.96.0 (2026-07-19)

Features

  • core: support max length, scale, precision in Substrait dialect (#977) (f094981), closes #950 #808

Bug Fixes

v0.95.1

Choose a tag to compare

@substrait-java-releaser substrait-java-releaser released this 12 Jul 05:39

0.95.1 (2026-07-12)

Bug Fixes

v0.95.0

Choose a tag to compare

@substrait-java-releaser substrait-java-releaser released this 05 Jul 06:12

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

Choose a tag to compare

@substrait-java-releaser substrait-java-releaser released this 21 Jun 07:01

0.94.0 (2026-06-21)

Features

  • core: support ExecutionContextVariable (#867) (a649e0d)
  • support new ComparisonJoinKey field in HashJoin/MergeJoin (#845) (9c2c750)

v0.93.0

Choose a tag to compare

@substrait-java-releaser substrait-java-releaser released this 14 Jun 06:49

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)