Skip to content
16 changes: 14 additions & 2 deletions core/src/main/java/io/substrait/relation/ProtoRelConverter.java
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ public Rel from(io.substrait.proto.Rel rel) {
protected Rel newRead(ReadRel rel) {
if (rel.hasVirtualTable()) {
var virtualTable = rel.getVirtualTable();
if (virtualTable.getValuesCount() == 0) {
if (virtualTable.getValuesCount() == 0 && virtualTable.getExpressionsCount() == 0) {
return newEmptyScan(rel);
} else {
return newVirtualTable(rel);
Expand Down Expand Up @@ -418,9 +418,11 @@ protected FileOrFiles newFileOrFiles(ReadRel.LocalFiles.FileOrFiles file) {
protected VirtualTableScan newVirtualTable(ReadRel rel) {
var virtualTable = rel.getVirtualTable();
var virtualTableSchema = newNamedStruct(rel);

var converter =
new ProtoExpressionConverter(lookup, extensions, virtualTableSchema.struct(), this);
List<Expression.StructLiteral> structLiterals = new ArrayList<>(virtualTable.getValuesCount());

List<Expression.StructLiteral> structLiterals = new ArrayList<>(virtualTable.getValuesCount() + virtualTable.getExpressionsCount());
for (var struct : virtualTable.getValuesList()) {
structLiterals.add(
ImmutableExpression.StructLiteral.builder()
Expand All @@ -430,6 +432,16 @@ protected VirtualTableScan newVirtualTable(ReadRel rel) {
.collect(java.util.stream.Collectors.toList()))
.build());
}
for (var struct : virtualTable.getExpressionsList()) {
structLiterals.add(
ImmutableExpression.StructLiteral.builder()
.fields(
struct.getFieldsList().stream()
.map(io.substrait.proto.Expression::getLiteral)
.map(converter::from)
.collect(java.util.stream.Collectors.toList()))
.build());
}

var builder =
VirtualTableScan.builder()
Expand Down
Loading