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_r408056358
 
 

 ##########
 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)));
+                               break;
                        case TIME_WITHOUT_TIME_ZONE:
-                               return 
relBuilder.getRexBuilder().makeTimeLiteral(TimeString.fromCalendarFields(
-                                               
valueAsCalendar(extractValue(valueLiteral, java.sql.Time.class))), 0);
+                               // TODO type factory strips the precision, for 
literals we can be more lenient already
+                               TimeType timeType = (TimeType) type;
+                               relDataType = 
typeFactory.createSqlType(SqlTypeName.TIME, timeType.getPrecision());
+                               int millisOfDay = extractValue(valueLiteral, 
LocalTime.class).get(ChronoField.MILLI_OF_DAY);
+                               value = TimeString.fromMillisOfDay(millisOfDay);
+                               break;
                        case TIMESTAMP_WITHOUT_TIME_ZONE:
-                               TimestampType timestampType = (TimestampType) 
type;
                                LocalDateTime datetime = 
extractValue(valueLiteral, LocalDateTime.class);
-                               return 
relBuilder.getRexBuilder().makeTimestampLiteral(
-                                       fromLocalDateTime(datetime), 
timestampType.getPrecision());
+                               value = fromLocalDateTime(datetime);
+                               break;
                        case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
-                               LocalZonedTimestampType lzTs = 
(LocalZonedTimestampType) type;
-                               TimeZone timeZone = 
TimeZone.getTimeZone(this.relBuilder.getCluster()
-                                       .getPlanner()
-                                       .getContext()
-                                       .unwrap(FlinkContext.class)
-                                       .getTableConfig()
-                                       .getLocalTimeZone());
+                               TimeZone timeZone = TimeZone.getTimeZone(
+                                       
ShortcutUtils.unwrapContext(this.relBuilder.getCluster())
+                                               .getTableConfig()
+                                               .getLocalTimeZone()
+                               );
                                Instant instant = extractValue(valueLiteral, 
Instant.class);
-                               return 
this.relBuilder.getRexBuilder().makeTimestampWithLocalTimeZoneLiteral(
-                                       
fromLocalDateTime(LocalDateTime.ofInstant(instant, timeZone.toZoneId())),
-                                       lzTs.getPrecision());
-                       case INTERVAL_YEAR_MONTH:
-                               return 
this.relBuilder.getRexBuilder().makeIntervalLiteral(
-                                               
BigDecimal.valueOf(extractValue(valueLiteral, Integer.class)),
-                                               new 
SqlIntervalQualifier(TimeUnit.YEAR, TimeUnit.MONTH, SqlParserPos.ZERO));
-                       case INTERVAL_DAY_TIME:
-                               return 
this.relBuilder.getRexBuilder().makeIntervalLiteral(
-                                               
BigDecimal.valueOf(extractValue(valueLiteral, Long.class)),
-                                               new 
SqlIntervalQualifier(TimeUnit.DAY, TimeUnit.SECOND, SqlParserPos.ZERO));
+                               value = 
fromLocalDateTime(LocalDateTime.ofInstant(instant, timeZone.toZoneId()));
+                               break;
                        default:
+                               value = extractValue(valueLiteral, 
Object.class);
+                               if (value instanceof TimePointUnit) {
+                                       value = 
timePointUnitToTimeUnit((TimePointUnit) value);
+                               } else if (value instanceof TimeIntervalUnit) {
+                                       value = 
intervalUnitToUnitRange((TimeIntervalUnit) value);
+                               }
                                break;
                }
-               Object object = extractValue(valueLiteral, Object.class);
-               if (object instanceof TimePointUnit) {
-                       TimeUnit value = 
timePointUnitToTimeUnit((TimePointUnit) object);
-                       return relBuilder.getRexBuilder().makeFlag(value);
-               } else if (object instanceof TimeIntervalUnit) {
-                       TimeUnitRange value = 
intervalUnitToUnitRange((TimeIntervalUnit) object);
-                       return relBuilder.getRexBuilder().makeFlag(value);
-               } else {
-                       return relBuilder.literal(extractValue(valueLiteral, 
Object.class));
-               }
+
+               return rexBuilder.makeLiteral(
+                       value,
+                       relDataType,
+                       true
 
 Review comment:
   add a comment why we do `true` here

----------------------------------------------------------------
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:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to