Hi Aegeaner,

First of all, the ExpressionReducer actually restores the origin return
type after reducing, see
https://github.com/apache/flink/blob/master/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/ExpressionReducer.scala#L122

So the reduced result and type should be correct. Did you find the wrong
return type?

The `RexBuilder.makeLiteral(Object value, RelDataType type, boolean
allowCast)` accepts any values and will cast Integer back to Date
internally.

Regards,
Jark Wu


2017-06-29 12:38 GMT+08:00 郭健 <guo.j...@immomo.com>:

> Hi all,
>             I am implementing a STR_TO_DATE scalar SQL function to flink,
> and found return type casted from java.sql.Date to Integer in Flink’s
> ExpressionReducer:
> https://github.com/apache/flink/blob/master/flink-
> libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/
> ExpressionReducer.scala#L56
>
> // we need to cast here for RexBuilder.makeLiteral
>
>
>       case (SqlTypeName.DATE, e) =>
>
>
>         Some(
>
>
>           
> rexBuilder.makeCast(typeFactory.createTypeFromTypeInfo(BasicTypeInfo.INT_TYPE_INFO),
> e)
>
>
>         )
>
>
>
>             so str_to_date('01,5,2013','%d,%m,%Y')" must return an
> Integer, which conflicted with my implementation.
>
>             My question is: why should we do this? I have seen in comments
> the reason to do this here is: “we need to cast here for
> RexBuilder.makeLiteral”, But is it reasonale to change user function’s
> return Type? Should we restore the origin return type after the reduce?
>
>
> Thanks,
> Aegeaner
>
>
>

Reply via email to