[ 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)