public JdbcDeserializationConverter createInternalConverter()

in flink-connector-jdbc-oceanbase/src/main/java/org/apache/flink/connector/jdbc/oceanbase/database/dialect/OceanBaseDialectConverter.java [56:136]


    public JdbcDeserializationConverter createInternalConverter(LogicalType type) {
        switch (type.getTypeRoot()) {
            case BOOLEAN:
                return val ->
                        val instanceof Number
                                ? ((Number) val).intValue() == 1
                                : Boolean.parseBoolean(val.toString());
            case FLOAT:
                return val -> val instanceof Number ? ((Number) val).floatValue() : val;
            case DOUBLE:
                return val -> val instanceof Number ? ((Number) val).doubleValue() : val;
            case TINYINT:
                return val -> val instanceof Number ? ((Number) val).byteValue() : val;
            case SMALLINT:
                return val -> val instanceof Number ? ((Number) val).shortValue() : val;
            case INTEGER:
                return val ->
                        val instanceof Number
                                ? ((Number) val).intValue()
                                : val instanceof Date ? ((Date) val).toLocalDate().getYear() : val;
            case BIGINT:
                return val -> val instanceof Number ? ((Number) val).longValue() : val;
            case DECIMAL:
                final int precision = ((DecimalType) type).getPrecision();
                final int scale = ((DecimalType) type).getScale();
                // using decimal(20, 0) to support db type bigint unsigned, user should define
                // decimal(20, 0) in SQL,
                // but other precision like decimal(30, 0) can work too from lenient consideration.
                return val ->
                        val instanceof BigInteger
                                ? DecimalData.fromBigDecimal(
                                        new BigDecimal((BigInteger) val, 0), precision, scale)
                                : val instanceof BigDecimal
                                        ? DecimalData.fromBigDecimal(
                                                (BigDecimal) val, precision, scale)
                                        : DecimalData.fromBigDecimal(
                                                new BigDecimal(val.toString()), precision, scale);
            case DATE:
                return val ->
                        val instanceof Date
                                ? (int) (((Date) val).toLocalDate().toEpochDay())
                                : val instanceof Timestamp
                                        ? (int)
                                                (((Timestamp) val)
                                                        .toLocalDateTime()
                                                        .toLocalDate()
                                                        .toEpochDay())
                                        : val;
            case TIME_WITHOUT_TIME_ZONE:
                return val ->
                        val instanceof Time
                                ? (int) (((Time) val).toLocalTime().toNanoOfDay() / 1_000_000L)
                                : val instanceof Timestamp
                                        ? (int)
                                                (((Timestamp) val)
                                                                .toLocalDateTime()
                                                                .toLocalTime()
                                                                .toNanoOfDay()
                                                        / 1_000_000L)
                                        : val;
            case TIMESTAMP_WITHOUT_TIME_ZONE:
                return val ->
                        val instanceof LocalDateTime
                                ? TimestampData.fromLocalDateTime((LocalDateTime) val)
                                : val instanceof Timestamp
                                        ? TimestampData.fromTimestamp((Timestamp) val)
                                        : val;
            case CHAR:
            case VARCHAR:
                return val -> StringData.fromString(val.toString());
            case BINARY:
            case VARBINARY:
            case RAW:
                return val ->
                        val instanceof Blob
                                ? ((Blob) val).getBytes(1, (int) ((Blob) val).length())
                                : val instanceof byte[] ? val : val.toString().getBytes();
            default:
                return super.createInternalConverter(type);
        }
    }