[ 
https://issues.apache.org/jira/browse/FLINK-25930?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17485877#comment-17485877
 ] 

Marios Trivyzas commented on FLINK-25930:
-----------------------------------------

I think that the *IdenityCastRule* shouldn't use the 
{*}{*}{*}supportsAvoidingCast{*} which is also used for other cases of implicit 
casting, in turn used in equality checks, etc. but instead use a simpler check 
like the {*}isInteroperable{*}{*}.{*}

 

For example there is a test in *ArrayTypeTest#testArrayOperations:*

 
{noformat}
testAllApis(
  'f6 === array(1, 2, 3),
  "f6 === array(1, 2, 3)",
  "f6 = ARRAY[1, 2, 3]",
  "FALSE"){noformat}
which makes use of the ARRAY function where the {*}{*}{*}ArrayTypeStrategy{*} 
returns a *notNull* type, then there is an implicit cast generated to satisfy 
the equality which fails if we rely on *IdenityCastRule* as is currently with 
the *supportsAvoidingCast.*

 

[~slinkydeveloper] [~twalthr] what do you think?

 

> Remove identity casting from ScalarOperatorGens
> -----------------------------------------------
>
>                 Key: FLINK-25930
>                 URL: https://issues.apache.org/jira/browse/FLINK-25930
>             Project: Flink
>          Issue Type: Sub-task
>            Reporter: Marios Trivyzas
>            Priority: Major
>
> Following: [https://github.com/apache/flink/pull/18582]
> we could remove the following code from {*}ScalarOperatorGens{*}:
>  
>  
> {noformat}
> case (_, _) if isInteroperable(operand.resultType, targetType) =>
> operand.copy(resultType = targetType)
>  
> {noformat}
> and use our *IdentityCastRule* instead but there is an issue.
>  
> Currently the *isInteroperable* allows casting between types with different 
> nullability whereas the *IdentityCastRule* uses the 
> {*}LogicalTypeCasts#{*}{*}supportsAvoidingCast{*} which in turn uses the 
> *CastAvoidanceChecker* which doesn't allow to cast from a nullable type to 
> the same but non-nullable type, i.e. INT -> INT NOT NULL
> {noformat}
> if (sourceType.isNullable() && !targetType.isNullable()
>         || sourceType.getClass() != targetType.getClass()
>         || // TODO drop this line once we remove legacy types
>         sourceType.getTypeRoot() != targetType.getTypeRoot()) {
>     return false;
> }{noformat}
>  



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to