in flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/typeutils/LogicalRelDataTypeConverter.java [474:601]
private static LogicalType toLogicalTypeNotNull(
RelDataType relDataType, DataTypeFactory dataTypeFactory) {
// dataTypeFactory is a preparation for catalog user-defined types
switch (relDataType.getSqlTypeName()) {
case BOOLEAN:
return new BooleanType(false);
case TINYINT:
return new TinyIntType(false);
case SMALLINT:
return new SmallIntType(false);
case INTEGER:
return new IntType(false);
case BIGINT:
return new BigIntType(false);
case DECIMAL:
if (relDataType.getScale() < 0) {
// negative scale is not supported, normalize it
return new DecimalType(
false, relDataType.getPrecision() - relDataType.getScale(), 0);
}
return new DecimalType(false, relDataType.getPrecision(), relDataType.getScale());
case FLOAT:
return new FloatType(false);
case DOUBLE:
return new DoubleType(false);
case DATE:
return new DateType(false);
case TIME:
return new TimeType(false, relDataType.getPrecision());
case TIMESTAMP:
return new TimestampType(
false, getTimestampKind(relDataType), relDataType.getPrecision());
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
return new LocalZonedTimestampType(
false, getTimestampKind(relDataType), relDataType.getPrecision());
case INTERVAL_YEAR:
case INTERVAL_YEAR_MONTH:
case INTERVAL_MONTH:
return new YearMonthIntervalType(
false, getYearMonthResolution(relDataType), relDataType.getPrecision());
case INTERVAL_DAY:
case INTERVAL_DAY_HOUR:
case INTERVAL_DAY_MINUTE:
case INTERVAL_DAY_SECOND:
case INTERVAL_HOUR:
case INTERVAL_HOUR_MINUTE:
case INTERVAL_HOUR_SECOND:
case INTERVAL_MINUTE:
case INTERVAL_MINUTE_SECOND:
return new DayTimeIntervalType(
false,
getDayTimeResolution(relDataType),
relDataType.getPrecision(),
relDataType.getScale());
case INTERVAL_SECOND:
return new DayTimeIntervalType(
false,
getDayTimeResolution(relDataType),
DayTimeIntervalType.DEFAULT_DAY_PRECISION,
relDataType.getScale());
case CHAR:
if (relDataType.getPrecision() == 0) {
return CharType.ofEmptyLiteral();
}
return new CharType(false, relDataType.getPrecision());
case VARCHAR:
if (relDataType.getPrecision() == 0) {
return VarCharType.ofEmptyLiteral();
}
return new VarCharType(false, relDataType.getPrecision());
case BINARY:
if (relDataType.getPrecision() == 0) {
return BinaryType.ofEmptyLiteral();
}
return new BinaryType(false, relDataType.getPrecision());
case VARBINARY:
if (relDataType.getPrecision() == 0) {
return VarBinaryType.ofEmptyLiteral();
}
return new VarBinaryType(false, relDataType.getPrecision());
case NULL:
return new NullType();
case SYMBOL:
return new SymbolType<>(false);
case MULTISET:
return new MultisetType(
false, toLogicalType(relDataType.getComponentType(), dataTypeFactory));
case ARRAY:
return new ArrayType(
false, toLogicalType(relDataType.getComponentType(), dataTypeFactory));
case MAP:
return new MapType(
false,
toLogicalType(relDataType.getKeyType(), dataTypeFactory),
toLogicalType(relDataType.getValueType(), dataTypeFactory));
case DISTINCT:
throw new TableException("DISTINCT type is currently not supported.");
case ROW:
return new RowType(
false,
relDataType.getFieldList().stream()
.map(
f ->
new RowField(
f.getName(),
toLogicalType(
f.getType(), dataTypeFactory)))
.collect(Collectors.toList()));
case STRUCTURED:
case OTHER:
if (relDataType instanceof StructuredRelDataType) {
return ((StructuredRelDataType) relDataType).getStructuredType();
} else if (relDataType instanceof RawRelDataType) {
return ((RawRelDataType) relDataType).getRawType();
}
// fall through
case REAL:
case TIME_WITH_LOCAL_TIME_ZONE:
case ANY:
case CURSOR:
case COLUMN_LIST:
case DYNAMIC_STAR:
case GEOMETRY:
case SARG:
default:
throw new TableException("Unsupported RelDataType: " + relDataType);
}
}