in connectors/rocketmq-connect-jdbc/src/main/java/org/apache/rocketmq/connect/jdbc/converter/DefaultColumnConverter.java [289:427]
public String convertToConnectFieldSchema(ColumnDefinition columnDefinition, SchemaBuilder builder) {
int precision = columnDefinition.precision();
int scale = columnDefinition.scale();
int sqlType = columnDefinition.type();
boolean optional = columnDefinition.isOptional();
String fieldName = fieldNameFor(columnDefinition);
switch (sqlType) {
case Types.NULL:
log.debug("JDBC type 'NULL' not currently supported for column '{}'", fieldName);
return null;
case Types.BOOLEAN:
builder.field(fieldName, SchemaBuilder.bool().build());
break;
case Types.BIT:
builder.field(fieldName, SchemaBuilder.int8().build());
break;
case Types.TINYINT:
if (columnDefinition.isSignedNumber()) {
builder.field(fieldName, SchemaBuilder.int8().build());
} else {
builder.field(fieldName, SchemaBuilder.int32().build());
}
break;
case Types.SMALLINT:
builder.field(fieldName, SchemaBuilder.int32().build());
break;
case Types.INTEGER:
if (columnDefinition.isSignedNumber()) {
builder.field(fieldName, SchemaBuilder.int32().build());
} else {
builder.field(fieldName, SchemaBuilder.int64().build());
}
break;
case Types.BIGINT:
builder.field(fieldName, SchemaBuilder.int64().build());
break;
case Types.REAL:
builder.field(fieldName, SchemaBuilder.float32().build());
break;
case Types.FLOAT:
case Types.DOUBLE:
builder.field(fieldName, SchemaBuilder.float64().build());
break;
case Types.DECIMAL:
scale = decimalScale(columnDefinition);
SchemaBuilder fieldBuilder = Decimal.builder(scale);
if (optional) {
fieldBuilder.optional();
}
builder.field(fieldName, fieldBuilder.build());
break;
case Types.NUMERIC:
if (numericMapping == NumericMapping.PRECISION_ONLY) {
log.debug("NUMERIC with precision: '{}' and scale: '{}'", precision, scale);
if (scale == 0 && precision <= MAX_INTEGER_TYPE_PRECISION) { // integer
builder.field(fieldName, integerSchema(optional, precision));
break;
}
} else if (numericMapping == NumericMapping.BEST_FIT) {
log.debug("NUMERIC with precision: '{}' and scale: '{}'", precision, scale);
if (precision <= MAX_INTEGER_TYPE_PRECISION) {
if (scale < 1 && scale >= NUMERIC_TYPE_SCALE_LOW) {
builder.field(fieldName, integerSchema(optional, precision));
break;
} else if (scale > 0) {
builder.field(fieldName, SchemaBuilder.float64().build());
break;
}
}
} else if (numericMapping == NumericMapping.BEST_FIT_EAGER_DOUBLE) {
log.debug("NUMERIC with precision: '{}' and scale: '{}'", precision, scale);
if (scale < 1 && scale >= NUMERIC_TYPE_SCALE_LOW) { // integer
if (precision <= MAX_INTEGER_TYPE_PRECISION) { // fits in primitive data types.
builder.field(fieldName, integerSchema(optional, precision));
break;
}
} else if (scale > 0) {
builder.field(fieldName, SchemaBuilder.float64().build());
break;
}
}
case Types.CHAR:
case Types.VARCHAR:
case Types.LONGVARCHAR:
case Types.NCHAR:
case Types.NVARCHAR:
case Types.LONGNVARCHAR:
case Types.CLOB:
case Types.NCLOB:
case Types.DATALINK:
case Types.SQLXML:
builder.field(fieldName, SchemaBuilder.string().build());
break;
case Types.BINARY:
case Types.BLOB:
case Types.VARBINARY:
case Types.LONGVARBINARY:
builder.field(fieldName, SchemaBuilder.bytes().build());
break;
case Types.DATE:
SchemaBuilder dateSchemaBuilder = Date.builder();
builder.field(fieldName, dateSchemaBuilder.build());
break;
case Types.TIME:
SchemaBuilder timeSchemaBuilder = Time.builder();
builder.field(fieldName, timeSchemaBuilder.build());
break;
case Types.TIMESTAMP:
SchemaBuilder tsSchemaBuilder = io.openmessaging.connector.api.data.logical.Timestamp.builder();
builder.field(fieldName, tsSchemaBuilder.build());
break;
case Types.ARRAY:
case Types.JAVA_OBJECT:
case Types.OTHER:
case Types.DISTINCT:
case Types.STRUCT:
case Types.REF:
case Types.ROWID:
default:
log.warn("JDBC type {} ({}) not supported", sqlType, columnDefinition.typeName());
return null;
}
return fieldName;
}