[Improve](map) support map cast with map literal and implicate nested scala cast (#26126)
This commit is contained in:
@ -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),
|
||||
|
||||
@ -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()));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user