[Improve](map) support map cast with map literal and implicate nested scala cast (#26126)

This commit is contained in:
amory
2023-11-02 22:56:42 +08:00
committed by GitHub
parent 3f47eb5e89
commit 93a934e775
9 changed files with 291 additions and 9 deletions

View File

@ -268,7 +268,7 @@ public class CastExpr extends Expr {
} else if (type.isMapType()) {
fn = ScalarFunction.createBuiltin(getFnName(Type.MAP),
type, Function.NullableMode.ALWAYS_NULLABLE,
Lists.newArrayList(Type.VARCHAR), false,
Lists.newArrayList(getActualArgTypes(collectChildReturnTypes())[0]), false,
"doris::CastFunctions::cast_to_map_val", null, null, true);
} else if (type.isStructType()) {
fn = ScalarFunction.createBuiltin(getFnName(Type.STRUCT),

View File

@ -28,6 +28,7 @@ import org.apache.doris.catalog.Env;
import org.apache.doris.catalog.Function;
import org.apache.doris.catalog.Function.NullableMode;
import org.apache.doris.catalog.FunctionSet;
import org.apache.doris.catalog.MapType;
import org.apache.doris.catalog.MaterializedIndexMeta;
import org.apache.doris.catalog.PrimitiveType;
import org.apache.doris.catalog.ScalarFunction;
@ -2516,6 +2517,8 @@ public abstract class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl
return getActualScalarType(originType);
} else if (originType.getPrimitiveType() == PrimitiveType.ARRAY) {
return getActualArrayType((ArrayType) originType);
} else if (originType.getPrimitiveType().isMapType()) {
return getActualMapType((MapType) originType);
} else {
return originType;
}
@ -2550,6 +2553,10 @@ public abstract class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl
return Arrays.stream(originType).map(this::getActualType).toArray(Type[]::new);
}
private MapType getActualMapType(MapType originMapType) {
return new MapType(getActualType(originMapType.getKeyType()), getActualType(originMapType.getValueType()));
}
private ArrayType getActualArrayType(ArrayType originArrayType) {
return new ArrayType(getActualType(originArrayType.getItemType()));
}