vldpyatkov commented on code in PR #13698:
URL: https://github.com/apache/ignite/pull/13698#discussion_r4335609446
##########
modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/util/TypeUtils.java:
##########
@@ -242,13 +244,44 @@ public static RelDataType getResultType(IgniteTypeFactory
typeFactory, RelOptSch
for (int i = 0; i < sqlType.getFieldCount(); i++) {
List<String> origin = origins == null ? null : origins.get(i);
- b.add(fields.get(i).getName(), typeFactory.createType(
- getResultClass(typeFactory, schema, fields.get(i).getType(),
origin)));
+
+ b.add(fields.get(i).getName(), resultFieldType(typeFactory,
schema, fields.get(i).getType(), origin));
}
return b.build();
}
+ /** Preserves ROW, ARRAY and MAP types and resolves the external Java type
of each leaf. */
+ private static RelDataType resultFieldType(
+ IgniteTypeFactory typeFactory,
+ RelOptSchema schema,
+ RelDataType type,
+ @Nullable List<String> origin
+ ) {
+ // Java types, including byte[], are values rather than SQL containers.
+ if (type instanceof RelDataTypeFactoryImpl.JavaType)
+ return typeFactory.createType(getResultClass(typeFactory, schema,
type, origin));
+
+ RelDataType resultType;
+
+ if (type.isStruct())
+ resultType = getResultType(typeFactory, schema, type, null);
+ else if (type.getSqlTypeName() == SqlTypeName.ARRAY) {
+ RelDataType componentType = resultFieldType(typeFactory, schema,
type.getComponentType(), null);
+
+ resultType = typeFactory.createArrayType(componentType, -1);
+ }
+ else if (type.getSqlTypeName() == SqlTypeName.MAP) {
+ resultType = typeFactory.createMapType(
+ resultFieldType(typeFactory, schema, type.getKeyType(), null),
+ resultFieldType(typeFactory, schema, type.getValueType(),
null));
+ }
+ else
+ return typeFactory.createType(getResultClass(typeFactory, schema,
type, origin));
+
+ return typeFactory.createTypeWithNullability(resultType,
type.isNullable());
Review Comment:
Scalar types did not preserve the original nullability before this change. I
kept that behavior unchanged.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]