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