private static LogicalType toLogicalTypeNotNull()

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