RelCommon.Hint.LoadedComputation and RelCommon.Hint.SavedComputation each carry an advanced_extension field in the protobuf, but neither POJO models it, so it is unmapped in both conversion directions.
Hint, Hint.Stats and Hint.RuntimeConstraint all implement HasExtension (core/src/main/java/io/substrait/hint/Hint.java lines 11, 99 and 180), and both converters map their extensions. SavedComputation (line 126) and LoadedComputation (line 153) do not, so:
ProtoRelConverter.optionalHint has nowhere to put an incoming extension and silently discards it.
RelProtoConverter.common has nothing to write.
Verified against the pinned io.substrait:protobuf:0.99.0 artifact — javap shows hasAdvancedExtension() / getAdvancedExtension() on both RelCommon$Hint$LoadedComputation and RelCommon$Hint$SavedComputation.
Concretely: a producer emitting a COMPUTATION_TYPE_BLOOM_FILTER loaded computation with an engine-specific advanced extension loses it on import, and no test can catch it because the POJO has no accessor.
This is the same class of gap as #297, and it is also a limitation of the guard added in #1069: RelCommonRoundtripTest enforces coverage per relation type, not per RelCommon subfield, so an unmapped subfield like this slips through.
Fix: have both POJOs implement HasExtension and map the field in ProtoRelConverter.optionalHint and RelProtoConverter.common, plus a round-trip test.
RelCommon.Hint.LoadedComputationandRelCommon.Hint.SavedComputationeach carry anadvanced_extensionfield in the protobuf, but neither POJO models it, so it is unmapped in both conversion directions.Hint,Hint.StatsandHint.RuntimeConstraintall implementHasExtension(core/src/main/java/io/substrait/hint/Hint.javalines 11, 99 and 180), and both converters map their extensions.SavedComputation(line 126) andLoadedComputation(line 153) do not, so:ProtoRelConverter.optionalHinthas nowhere to put an incoming extension and silently discards it.RelProtoConverter.commonhas nothing to write.Verified against the pinned
io.substrait:protobuf:0.99.0artifact —javapshowshasAdvancedExtension()/getAdvancedExtension()on bothRelCommon$Hint$LoadedComputationandRelCommon$Hint$SavedComputation.Concretely: a producer emitting a
COMPUTATION_TYPE_BLOOM_FILTERloaded computation with an engine-specific advanced extension loses it on import, and no test can catch it because the POJO has no accessor.This is the same class of gap as #297, and it is also a limitation of the guard added in #1069:
RelCommonRoundtripTestenforces coverage per relation type, not perRelCommonsubfield, so an unmapped subfield like this slips through.Fix: have both POJOs implement
HasExtensionand map the field inProtoRelConverter.optionalHintandRelProtoConverter.common, plus a round-trip test.