twalthr commented on a change in pull request #11694:
[FLINK-17064][table-planner] Improve literals conversion in ExpressionConverter
URL: https://github.com/apache/flink/pull/11694#discussion_r408053704
##########
File path:
flink-table/flink-table-planner-blink/src/main/java/org/apache/flink/table/planner/expressions/converter/ExpressionConverter.java
##########
@@ -108,93 +106,78 @@ public RexNode visit(ValueLiteralExpression
valueLiteral) {
LogicalType type =
fromDataTypeToLogicalType(valueLiteral.getOutputDataType());
RexBuilder rexBuilder = relBuilder.getRexBuilder();
FlinkTypeFactory typeFactory = (FlinkTypeFactory)
relBuilder.getTypeFactory();
+
+ RelDataType relDataType =
typeFactory.createFieldTypeFromLogicalType(type);
+
if (valueLiteral.isNull()) {
- return relBuilder.getRexBuilder()
- .makeCast(
-
typeFactory.createFieldTypeFromLogicalType(type),
-
relBuilder.getRexBuilder().constantNull());
+ return rexBuilder.makeNullLiteral(relDataType);
}
+ Object value = null;
switch (type.getTypeRoot()) {
case DECIMAL:
- DecimalType dt = (DecimalType) type;
- BigDecimal bigDecimal =
extractValue(valueLiteral, BigDecimal.class);
- RelDataType decType =
relBuilder.getTypeFactory().createSqlType(SqlTypeName.DECIMAL,
- dt.getPrecision(),
dt.getScale());
- return
relBuilder.getRexBuilder().makeExactLiteral(bigDecimal, decType);
case TINYINT:
- return relBuilder.getRexBuilder().makeLiteral(
- extractValue(valueLiteral,
Object.class),
-
typeFactory.createSqlType(SqlTypeName.TINYINT),
- true);
case SMALLINT:
- return relBuilder.getRexBuilder().makeLiteral(
- extractValue(valueLiteral,
Object.class),
-
typeFactory.createSqlType(SqlTypeName.SMALLINT),
- true);
case INTEGER:
- return relBuilder.getRexBuilder().makeLiteral(
- extractValue(valueLiteral,
Object.class),
-
typeFactory.createSqlType(SqlTypeName.INTEGER),
- true);
case BIGINT:
- // create BIGINT literals for long type
- BigDecimal bigint = extractValue(valueLiteral,
BigDecimal.class);
- return
relBuilder.getRexBuilder().makeBigintLiteral(bigint);
case FLOAT:
- //Float/Double type should be liked as java
type here.
- return
relBuilder.getRexBuilder().makeApproxLiteral(
- extractValue(valueLiteral,
BigDecimal.class),
-
relBuilder.getTypeFactory().createSqlType(SqlTypeName.FLOAT));
case DOUBLE:
- //Float/Double type should be liked as java
type here.
- return rexBuilder.makeApproxLiteral(
- extractValue(valueLiteral,
BigDecimal.class),
-
relBuilder.getTypeFactory().createSqlType(SqlTypeName.DOUBLE));
+ value = extractValue(valueLiteral,
BigDecimal.class);
+ break;
+ case VARCHAR:
+ case CHAR:
+ value = extractValue(valueLiteral,
String.class);
+ break;
+ case BINARY:
+ case VARBINARY:
+ value = new
ByteString(extractValue(valueLiteral, byte[].class));
+ break;
+ case INTERVAL_YEAR_MONTH:
+ // convert to total months
+ value =
BigDecimal.valueOf(extractValue(valueLiteral, Integer.class));
+ break;
+ case INTERVAL_DAY_TIME:
+ // convert to total millis
+ value =
BigDecimal.valueOf(extractValue(valueLiteral, Long.class));
+ break;
case DATE:
- return
relBuilder.getRexBuilder().makeDateLiteral(DateString.fromCalendarFields(
-
valueAsCalendar(extractValue(valueLiteral, java.sql.Date.class))));
+ value =
DateString.fromCalendarFields(valueAsCalendar(extractValue(valueLiteral,
LocalDate.class)));
Review comment:
use `DateString.fromDaysSinceEpoch`. We can add a conversion for `LocalDate`
to `int` in `ValueExpression` using `LocalDate#toEpochDay` as described in
`DateType`:
```
<p>A conversion from and to {@code int} describes the number of days since
epoch.
```
----------------------------------------------------------------
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