wuchong commented on a change in pull request #10745:
[FLINK-15445][connectors/jdbc] JDBC Table Source didn't work for Type…
URL: https://github.com/apache/flink/pull/10745#discussion_r377440632
##########
File path:
flink-connectors/flink-jdbc/src/main/java/org/apache/flink/api/java/io/jdbc/dialect/JDBCDialects.java
##########
@@ -46,10 +59,84 @@
return Optional.empty();
}
- private static class DerbyDialect implements JDBCDialect {
+ private abstract static class AbstractDialect implements JDBCDialect {
+
+ @Override
+ public void validate(TableSchema schema) throws
ValidationException {
+ for (int i = 0; i < schema.getFieldCount(); i++) {
+ DataType dt = schema.getFieldDataType(i).get();
+ String fieldName = schema.getFieldName(i).get();
+
+ // TODO: We can't convert VARBINARY(n) data
type to
+ //
PrimitiveArrayTypeInfo.BYTE_PRIMITIVE_ARRAY_TYPE_INFO in
LegacyTypeInfoDataTypeConverter
+ // when n is smaller than Integer.MAX_VALUE
+ if
(unsupportedTypes().contains(dt.getLogicalType().getTypeRoot()) ||
+ (!(dt.getLogicalType()
instanceof LegacyTypeInformationType) &&
+ (VARBINARY ==
dt.getLogicalType().getTypeRoot()
+ && Integer.MAX_VALUE !=
((VarBinaryType) dt.getLogicalType()).getLength()))) {
+ throw new ValidationException(
+ String.format("The
dialect don't support type: %s.", dt.toString()));
+ }
+
+ // only validate precision of DECIMAL type for
blink planner
+ if (!(dt.getLogicalType() instanceof
LegacyTypeInformationType)
+ && DECIMAL ==
dt.getLogicalType().getTypeRoot()) {
+ int precision = ((DecimalType)
dt.getLogicalType()).getPrecision();
+ if (precision > maxDecimalPrecision()
+ || precision <
minDecimalPrecision()) {
+ throw new ValidationException(
+
String.format("The precision of %s is out of the range [%d, %d].",
+
fieldName,
+
minDecimalPrecision(),
+
maxDecimalPrecision()));
+ }
+ }
+
+ // only validate precision of DECIMAL type for
blink planner
+ if (!(dt.getLogicalType() instanceof
LegacyTypeInformationType)
+ && TIMESTAMP_WITHOUT_TIME_ZONE
== dt.getLogicalType().getTypeRoot()) {
+ int precision = ((TimestampType)
dt.getLogicalType()).getPrecision();
+ if (precision > maxTimestampPrecision()
+ || precision <
minTimestampPrecision()) {
+ throw new ValidationException(
+
String.format("The precision of %s is out of the range [%d, %d].",
Review comment:
Improve the error message a bit more:
```java
String.format("The precision of filed '%s' is out of the TIMESTAMP precision
range [%d, %d] supported by the %s dialect.",
fieldName,
minTimestampPrecision(),
maxTimestampPrecision(),
dialectName);
```
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services