| 77 | }; |
| 78 | |
| 79 | ConversionCheckResult checkConversion(const Type& readType, const Type& fileType) { |
| 80 | ConversionCheckResult ret = {false, false}; |
| 81 | if (readType.getKind() == fileType.getKind()) { |
| 82 | ret.isValid = true; |
| 83 | if (fileType.getKind() == CHAR || fileType.getKind() == VARCHAR) { |
| 84 | ret.needConvert = readType.getMaximumLength() != fileType.getMaximumLength(); |
| 85 | } else if (fileType.getKind() == DECIMAL) { |
| 86 | ret.needConvert = readType.getPrecision() != fileType.getPrecision() || |
| 87 | readType.getScale() != fileType.getScale(); |
| 88 | } |
| 89 | } else { |
| 90 | switch (fileType.getKind()) { |
| 91 | case BOOLEAN: |
| 92 | case BYTE: |
| 93 | case SHORT: |
| 94 | case INT: |
| 95 | case LONG: |
| 96 | case FLOAT: |
| 97 | case DOUBLE: { |
| 98 | ret.isValid = ret.needConvert = isNumeric(readType) || isStringVariant(readType) || |
| 99 | isDecimal(readType) || isTimestamp(readType); |
| 100 | break; |
| 101 | } |
| 102 | case DECIMAL: { |
| 103 | ret.isValid = ret.needConvert = |
| 104 | isNumeric(readType) || isStringVariant(readType) || isTimestamp(readType); |
| 105 | break; |
| 106 | } |
| 107 | case STRING: |
| 108 | case CHAR: |
| 109 | case VARCHAR: { |
| 110 | ret.isValid = ret.needConvert = isStringVariant(readType) || isNumeric(readType) || |
| 111 | isTimestamp(readType) || isDecimal(readType); |
| 112 | break; |
| 113 | } |
| 114 | case TIMESTAMP: |
| 115 | case TIMESTAMP_INSTANT: |
| 116 | case DATE: |
| 117 | case BINARY: |
| 118 | case GEOMETRY: |
| 119 | case GEOGRAPHY: { |
| 120 | // Not support |
| 121 | break; |
| 122 | } |
| 123 | case STRUCT: |
| 124 | case LIST: |
| 125 | case MAP: |
| 126 | case UNION: { |
| 127 | ret.isValid = ret.needConvert = false; |
| 128 | break; |
| 129 | } |
| 130 | default: |
| 131 | break; |
| 132 | } |
| 133 | } |
| 134 | return ret; |
| 135 | } |
| 136 |
no test coverage detected