ConversionCheckResult checkConversion()

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;
  }