in paimon-common/src/main/java/org/apache/paimon/utils/TypeUtils.java [52:135]
public static Object castFromString(String s, DataType type) {
BinaryString str = BinaryString.fromString(s);
switch (type.getTypeRoot()) {
case CHAR:
case VARCHAR:
int stringLength = DataTypeChecks.getLength(type);
if (stringLength != VarCharType.MAX_LENGTH && str.numChars() > stringLength) {
throw new IllegalArgumentException(
String.format(
"Length of type %s is %d, but casting result has a length of %d",
type, stringLength, s.length()));
}
return str;
case BOOLEAN:
return BinaryStringUtils.toBoolean(str);
case BINARY:
case VARBINARY:
int binaryLength = DataTypeChecks.getLength(type);
byte[] bytes = s.getBytes();
if (bytes.length > binaryLength) {
throw new IllegalArgumentException(
String.format(
"Length of type %s is %d, but casting result has a length of %d",
type, binaryLength, bytes.length));
}
return bytes;
case DECIMAL:
DecimalType decimalType = (DecimalType) type;
return Decimal.fromBigDecimal(
new BigDecimal(s), decimalType.getPrecision(), decimalType.getScale());
case TINYINT:
return Byte.valueOf(s);
case SMALLINT:
return Short.valueOf(s);
case INTEGER:
return Integer.valueOf(s);
case BIGINT:
return Long.valueOf(s);
case FLOAT:
double d = Double.parseDouble(s);
if (d == ((float) d)) {
return (float) d;
} else {
// Compatible canal-cdc
Float f = Float.valueOf(s);
if (f.toString().length() != s.length()) {
throw new NumberFormatException(
s + " cannot be cast to float due to precision loss");
} else {
return f;
}
}
case DOUBLE:
return Double.valueOf(s);
case DATE:
return BinaryStringUtils.toDate(str);
case TIME_WITHOUT_TIME_ZONE:
return BinaryStringUtils.toTime(str);
case TIMESTAMP_WITHOUT_TIME_ZONE:
TimestampType timestampType = (TimestampType) type;
return BinaryStringUtils.toTimestamp(str, timestampType.getPrecision());
case ARRAY:
ArrayType arrayType = (ArrayType) type;
DataType elementType = arrayType.getElementType();
if (elementType instanceof VarCharType) {
if (s.startsWith("[")) {
s = s.substring(1);
}
if (s.endsWith("]")) {
s = s.substring(0, s.length() - 1);
}
String[] ss = s.split(",");
BinaryString[] binaryStrings = new BinaryString[ss.length];
for (int i = 0; i < ss.length; i++) {
binaryStrings[i] = BinaryString.fromString(ss[i]);
}
return new GenericArray(binaryStrings);
} else {
throw new UnsupportedOperationException("Unsupported type " + type);
}
default:
throw new UnsupportedOperationException("Unsupported type " + type);
}
}