Skip to content

Commit a47ab44

Browse files
committed
Support sql-udt conversion of composite types (1881/2028)
Signed-off-by: Yuanchun Shen <yuanchu@amazon.com>
1 parent 0dbfd61 commit a47ab44

1 file changed

Lines changed: 25 additions & 1 deletion

File tree

core/src/main/java/org/opensearch/sql/calcite/validate/PplValidator.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
import org.apache.calcite.rel.type.RelRecordType;
1616
import org.apache.calcite.sql.SqlNode;
1717
import org.apache.calcite.sql.SqlOperatorTable;
18+
import org.apache.calcite.sql.type.ArraySqlType;
19+
import org.apache.calcite.sql.type.MapSqlType;
20+
import org.apache.calcite.sql.type.MultisetSqlType;
21+
import org.apache.calcite.sql.type.ObjectSqlType;
1822
import org.apache.calcite.sql.type.SqlTypeName;
1923
import org.apache.calcite.sql.validate.SqlValidatorCatalogReader;
2024
import org.apache.calcite.sql.validate.SqlValidatorImpl;
@@ -122,11 +126,31 @@ private RelDataType sqlTypeToUserDefinedType(RelDataType type) {
122126

123127
private RelDataType convertType(RelDataType type, Function<RelDataType, RelDataType> convert) {
124128
if (type == null) return null;
129+
125130
if (type instanceof RelRecordType recordType) {
126131
List<RelDataType> subTypes =
127132
recordType.getFieldList().stream().map(RelDataTypeField::getType).map(convert).toList();
128-
return typeFactory.createStructType(subTypes, recordType.getFieldNames());
133+
return typeFactory.createTypeWithNullability(
134+
typeFactory.createStructType(subTypes, recordType.getFieldNames()),
135+
recordType.isNullable());
136+
}
137+
if (type instanceof ArraySqlType arrayType) {
138+
return typeFactory.createTypeWithNullability(
139+
typeFactory.createArrayType(convert.apply(arrayType.getComponentType()), -1),
140+
arrayType.isNullable());
141+
}
142+
if (type instanceof MapSqlType mapType) {
143+
return typeFactory.createTypeWithNullability(
144+
typeFactory.createMapType(
145+
convert.apply(mapType.getKeyType()), convert.apply(mapType.getValueType())),
146+
mapType.isNullable());
129147
}
148+
if (type instanceof MultisetSqlType multisetType) {
149+
return typeFactory.createTypeWithNullability(
150+
typeFactory.createMultisetType(convert.apply(multisetType.getComponentType()), -1),
151+
multisetType.isNullable());
152+
}
153+
130154
return convert.apply(type);
131155
}
132156
}

0 commit comments

Comments
 (0)