import com.taobao.tddl.optimizer.core.datatype.DataType; //导入方法依赖的package包/类
/**
*
* BINARY[(N)]
* CHAR[(N)]
* DATE
* DATETIME
* DECIMAL[(M[,D])]
* SIGNED [INTEGER]
* TIME
* UNSIGNED [INTEGER]
*
*/
protected CastType getType() {
CastType castType = new CastType();
List args = function.getArgs();
String type = DataType.StringType.convertFrom(args.get(1));
if (type.equalsIgnoreCase("BINARY")) {
if (args.size() > 2) {
castType.type1 = DataType.IntegerType.convertFrom(args.get(2));
}
castType.type = DataType.BytesType;
} else if (type.equalsIgnoreCase("CHAR")) {
if (args.size() > 2) {
castType.type1 = DataType.IntegerType.convertFrom(args.get(2));
}
castType.type = DataType.StringType;
} else if (type.equalsIgnoreCase("DATE")) {
castType.type = DataType.DateType;
} else if (type.equalsIgnoreCase("DATETIME")) {
castType.type = DataType.DatetimeType;
} else if (type.equalsIgnoreCase("TIME")) {
castType.type = DataType.TimeType;
} else if (type.equalsIgnoreCase("DECIMAL")) {
castType.type = DataType.BigDecimalType;
if (args.size() > 2) {
castType.type1 = DataType.IntegerType.convertFrom(args.get(2));
}
if (args.size() > 3) {
castType.type2 = DataType.IntegerType.convertFrom(args.get(3));
}
if (castType.type1 != null) {
if (castType.type2 == null) {
castType.type2 = 0;
}
if (castType.type1 < castType.type2) {
throw new TddlRuntimeException(ErrorCode.ERR_EXECUTOR,
"For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '')");
}
}
} else if (type.equalsIgnoreCase("SIGNED")) {
castType.type = DataType.BigIntegerType;
castType.signed = true;
} else if (type.equalsIgnoreCase("UNSIGNED")) {
castType.type = DataType.BigIntegerType;
castType.signed = false;
} else {
throw new TddlRuntimeException(ErrorCode.ERR_NOT_SUPPORT, "cast type:" + type);
}
return castType;
}