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