in c++/src/SchemaEvolution.cc [78:132]
ConversionCheckResult checkConversion(const Type& readType, const Type& fileType) {
ConversionCheckResult ret = {false, false};
if (readType.getKind() == fileType.getKind()) {
ret.isValid = true;
if (fileType.getKind() == CHAR || fileType.getKind() == VARCHAR) {
ret.needConvert = readType.getMaximumLength() != fileType.getMaximumLength();
} else if (fileType.getKind() == DECIMAL) {
ret.needConvert = readType.getPrecision() != fileType.getPrecision() ||
readType.getScale() != fileType.getScale();
}
} else {
switch (fileType.getKind()) {
case BOOLEAN:
case BYTE:
case SHORT:
case INT:
case LONG:
case FLOAT:
case DOUBLE: {
ret.isValid = ret.needConvert = isNumeric(readType) || isStringVariant(readType) ||
isDecimal(readType) || isTimestamp(readType);
break;
}
case DECIMAL: {
ret.isValid = ret.needConvert =
isNumeric(readType) || isStringVariant(readType) || isTimestamp(readType);
break;
}
case STRING:
case CHAR:
case VARCHAR: {
ret.isValid = ret.needConvert = isStringVariant(readType) || isNumeric(readType) ||
isTimestamp(readType) || isDecimal(readType);
break;
}
case TIMESTAMP:
case TIMESTAMP_INSTANT:
case DATE:
case BINARY: {
// Not support
break;
}
case STRUCT:
case LIST:
case MAP:
case UNION: {
ret.isValid = ret.needConvert = false;
break;
}
default:
break;
}
}
return ret;
}