Skip to content

Commit e8cb862

Browse files
committed
fix: ensure nullability preserved in calcite roundtrip
1 parent ce7985f commit e8cb862

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

isthmus/src/main/java/io/substrait/isthmus/expression/CallConverters.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ public class CallConverters {
7777
com.google.protobuf.Any.parseFrom(literal.value().toByteArray());
7878

7979
return Expression.UserDefinedAnyLiteral.builder()
80+
.nullable(t.nullable())
8081
.urn(t.urn())
8182
.name(t.name())
8283
.addAllTypeParameters(t.typeParameters())

isthmus/src/test/java/io/substrait/isthmus/CustomFunctionTest.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import io.substrait.dsl.SubstraitBuilder;
88
import io.substrait.expression.Expression.UserDefinedLiteral;
99
import io.substrait.expression.ExpressionCreator;
10-
import io.substrait.extension.ExtensionCollector;
1110
import io.substrait.extension.SimpleExtension;
1211
import io.substrait.isthmus.expression.AggregateFunctionConverter;
1312
import io.substrait.isthmus.expression.FunctionMappings;
@@ -16,9 +15,7 @@
1615
import io.substrait.isthmus.utils.UserTypeFactory;
1716
import io.substrait.proto.Expression;
1817
import io.substrait.proto.Expression.Literal.Builder;
19-
import io.substrait.relation.ProtoRelConverter;
2018
import io.substrait.relation.Rel;
21-
import io.substrait.relation.RelProtoConverter;
2219
import io.substrait.type.Type;
2320
import io.substrait.type.TypeCreator;
2421
import java.io.IOException;
@@ -601,10 +598,24 @@ void customTypesLiteralInFunctionsRoundtrip() {
601598
RelNode calciteRel = substraitToCalcite.convert(rel1);
602599
Rel rel2 = calciteToSubstrait.apply(calciteRel);
603600
assertEquals(rel1, rel2);
601+
}
602+
603+
@Test
604+
void customNullableUserDefinedLiteralRoundtrip() {
605+
Builder bldr = Expression.Literal.newBuilder();
606+
Any anyValue = Any.pack(bldr.setI32(10).build());
607+
UserDefinedLiteral nullableLiteral =
608+
ExpressionCreator.userDefinedLiteralAny(
609+
true, URN, "a_type", java.util.Collections.emptyList(), anyValue);
610+
611+
Rel rel =
612+
b.project(
613+
input -> List.of(nullableLiteral),
614+
b.remap(1),
615+
b.namedScan(List.of("example"), List.of("a"), List.of(N.userDefined(URN, "a_type"))));
604616

605-
ExtensionCollector extensionCollector = new ExtensionCollector();
606-
io.substrait.proto.Rel protoRel = new RelProtoConverter(extensionCollector).toProto(rel1);
607-
Rel rel3 = new ProtoRelConverter(extensionCollector, extensionCollection).from(protoRel);
608-
assertEquals(rel1, rel3);
617+
RelNode calciteRel = substraitToCalcite.convert(rel);
618+
Rel relReturned = calciteToSubstrait.apply(calciteRel);
619+
assertEquals(rel, relReturned);
609620
}
610621
}

0 commit comments

Comments
 (0)