in flink-doris-connector/src/main/java/org/apache/doris/flink/tools/cdc/oracle/OracleType.java [47:112]
public static String toDorisType(String oracleType, Integer precision, Integer scale) {
oracleType = oracleType.toUpperCase();
if (oracleType.startsWith(INTERVAL)) {
oracleType = oracleType.substring(0, 8);
} else if (oracleType.startsWith(TIMESTAMP)) {
return String.format("%s(%s)", DorisType.DATETIME_V2, Math.min(scale, 6));
}
switch (oracleType) {
case NUMBER:
if (scale <= 0) {
precision -= scale;
if (precision < 3) {
return DorisType.TINYINT;
} else if (precision < 5) {
return DorisType.SMALLINT;
} else if (precision < 10) {
return DorisType.INT;
} else if (precision < 19) {
return DorisType.BIGINT;
} else if (precision < 39) {
// LARGEINT supports up to 38 numbers.
return DorisType.LARGEINT;
} else {
return DorisType.STRING;
}
}
// scale > 0
if (precision < scale) {
precision = scale;
}
return precision != null && precision <= 38
? String.format(
"%s(%s,%s)",
DorisType.DECIMAL_V3,
precision,
scale != null && scale >= 0 ? scale : 0)
: DorisType.STRING;
case FLOAT:
return DorisType.DOUBLE;
case DATE:
// can save date and time with second precision
return DorisType.DATETIME_V2;
case CHAR:
case VARCHAR2:
case NCHAR:
case NVARCHAR2:
Preconditions.checkNotNull(precision);
return precision * 3 > 65533
? DorisType.STRING
: String.format("%s(%s)", DorisType.VARCHAR, precision * 3);
case LONG:
case RAW:
case LONG_RAW:
case INTERVAL:
case BLOB:
case CLOB:
case NCLOB:
case XMLTYPE:
return DorisType.STRING;
case BFILE:
case BINARY_FLOAT:
case BINARY_DOUBLE:
default:
throw new UnsupportedOperationException("Unsupported Oracle Type: " + oracleType);
}
}