[ https://issues.apache.org/jira/browse/CALCITE-5960?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Ran Tao updated CALCITE-5960: ----------------------------- Description: current RexToLixTranslator#scaleIntervalToNumber will scale interval to number. but it throw NPE when family is null. It will cause some types such as row type (family is null) raise a NPE. In fact this function should do its logic for expected type, otherwise just return the original operand is ok. {code:java} private static Expression scaleIntervalToNumber( RelDataType sourceType, RelDataType targetType, Expression operand) { switch (requireNonNull(targetType.getSqlTypeName().getFamily(), --> error () -> "SqlTypeFamily for " + targetType)) { case NUMERIC: switch (sourceType.getSqlTypeName()) { case INTERVAL_YEAR: // omitm default: break; } break; default: break; } return operand; } {code} {code:java} CAST(row(1, 2) as row(a integer, b tinyint)){code} {code:java} Suppressed: java.lang.NullPointerException: SqlTypeFamily for RecordType(INTEGER A, TINYINT B) at java.base/java.util.Objects.requireNonNull(Objects.java:347) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.scaleIntervalToNumber(RexToLixTranslator.java:976) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.translateCast(RexToLixTranslator.java:293) at org.apache.calcite.adapter.enumerable.RexImpTable$CastImplementor.implementSafe(RexImpTable.java:3200) at org.apache.calcite.adapter.enumerable.RexImpTable$AbstractRexCallImplementor.genValueStatement(RexImpTable.java:3768) at org.apache.calcite.adapter.enumerable.RexImpTable$AbstractRexCallImplementor.implement(RexImpTable.java:3730) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.visitCall(RexToLixTranslator.java:1184) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.visitCall(RexToLixTranslator.java:101) at org.apache.calcite.rex.RexCall.accept(RexCall.java:189) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.visitLocalRef(RexToLixTranslator.java:1060) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.visitLocalRef(RexToLixTranslator.java:101) at org.apache.calcite.rex.RexLocalRef.accept(RexLocalRef.java:77) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.translate(RexToLixTranslator.java:253) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.translate(RexToLixTranslator.java:247) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.translateList(RexToLixTranslator.java:899) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.translateProjects(RexToLixTranslator.java:201) at org.apache.calcite.adapter.enumerable.EnumerableCalc.implement(EnumerableCalc.java:192) at org.apache.calcite.adapter.enumerable.EnumerableRelImplementor.implementRoot(EnumerableRelImplementor.java:114) ... 89 more {code} was: current RexToLixTranslator#scaleIntervalToNumber will scale interval to number. but it throw NPE when family is null. It will cause some types such as row type (family is null) raise a NPE. In fact this function should do its logic for expected type, otherwise just return the original operand is ok. {code:java} private static Expression scaleIntervalToNumber( RelDataType sourceType, RelDataType targetType, Expression operand) { switch (requireNonNull(targetType.getSqlTypeName().getFamily(), () -> "SqlTypeFamily for " + targetType)) { case NUMERIC: switch (sourceType.getSqlTypeName()) { case INTERVAL_YEAR: // omitm default: break; } break; default: break; } return operand; } {code} {code:java} CAST(row(1, 2) as row(a integer, b tinyint)){code} {code:java} Suppressed: java.lang.NullPointerException: SqlTypeFamily for RecordType(INTEGER A, TINYINT B) at java.base/java.util.Objects.requireNonNull(Objects.java:347) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.scaleIntervalToNumber(RexToLixTranslator.java:976) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.translateCast(RexToLixTranslator.java:293) at org.apache.calcite.adapter.enumerable.RexImpTable$CastImplementor.implementSafe(RexImpTable.java:3200) at org.apache.calcite.adapter.enumerable.RexImpTable$AbstractRexCallImplementor.genValueStatement(RexImpTable.java:3768) at org.apache.calcite.adapter.enumerable.RexImpTable$AbstractRexCallImplementor.implement(RexImpTable.java:3730) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.visitCall(RexToLixTranslator.java:1184) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.visitCall(RexToLixTranslator.java:101) at org.apache.calcite.rex.RexCall.accept(RexCall.java:189) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.visitLocalRef(RexToLixTranslator.java:1060) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.visitLocalRef(RexToLixTranslator.java:101) at org.apache.calcite.rex.RexLocalRef.accept(RexLocalRef.java:77) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.translate(RexToLixTranslator.java:253) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.translate(RexToLixTranslator.java:247) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.translateList(RexToLixTranslator.java:899) at org.apache.calcite.adapter.enumerable.RexToLixTranslator.translateProjects(RexToLixTranslator.java:201) at org.apache.calcite.adapter.enumerable.EnumerableCalc.implement(EnumerableCalc.java:192) at org.apache.calcite.adapter.enumerable.EnumerableRelImplementor.implementRoot(EnumerableRelImplementor.java:114) ... 89 more {code} > Unexpected type should pass through the > RexToLixTranslator#scaleIntervalToNumber instead of NPE > ----------------------------------------------------------------------------------------------- > > Key: CALCITE-5960 > URL: https://issues.apache.org/jira/browse/CALCITE-5960 > Project: Calcite > Issue Type: Bug > Components: core > Affects Versions: 1.35.0 > Reporter: Ran Tao > Assignee: Ran Tao > Priority: Major > > current RexToLixTranslator#scaleIntervalToNumber will scale interval to > number. but it throw NPE when family is null. It will cause some types such > as row type (family is null) raise a NPE. In fact this function should do its > logic for expected type, otherwise just return the original operand is ok. > {code:java} > private static Expression scaleIntervalToNumber( > RelDataType sourceType, > RelDataType targetType, > Expression operand) { > switch (requireNonNull(targetType.getSqlTypeName().getFamily(), --> error > () -> "SqlTypeFamily for " + targetType)) { > case NUMERIC: > switch (sourceType.getSqlTypeName()) { > case INTERVAL_YEAR: > // omitm > default: > break; > } > break; > default: > break; > } > return operand; > } {code} > > {code:java} > CAST(row(1, 2) as row(a integer, b tinyint)){code} > > {code:java} > Suppressed: java.lang.NullPointerException: SqlTypeFamily for > RecordType(INTEGER A, TINYINT B) at > java.base/java.util.Objects.requireNonNull(Objects.java:347) at > org.apache.calcite.adapter.enumerable.RexToLixTranslator.scaleIntervalToNumber(RexToLixTranslator.java:976) > at > org.apache.calcite.adapter.enumerable.RexToLixTranslator.translateCast(RexToLixTranslator.java:293) > at > org.apache.calcite.adapter.enumerable.RexImpTable$CastImplementor.implementSafe(RexImpTable.java:3200) > at > org.apache.calcite.adapter.enumerable.RexImpTable$AbstractRexCallImplementor.genValueStatement(RexImpTable.java:3768) > at > org.apache.calcite.adapter.enumerable.RexImpTable$AbstractRexCallImplementor.implement(RexImpTable.java:3730) > at > org.apache.calcite.adapter.enumerable.RexToLixTranslator.visitCall(RexToLixTranslator.java:1184) > at > org.apache.calcite.adapter.enumerable.RexToLixTranslator.visitCall(RexToLixTranslator.java:101) > at org.apache.calcite.rex.RexCall.accept(RexCall.java:189) > at > org.apache.calcite.adapter.enumerable.RexToLixTranslator.visitLocalRef(RexToLixTranslator.java:1060) > at > org.apache.calcite.adapter.enumerable.RexToLixTranslator.visitLocalRef(RexToLixTranslator.java:101) > at org.apache.calcite.rex.RexLocalRef.accept(RexLocalRef.java:77) > at > org.apache.calcite.adapter.enumerable.RexToLixTranslator.translate(RexToLixTranslator.java:253) > at > org.apache.calcite.adapter.enumerable.RexToLixTranslator.translate(RexToLixTranslator.java:247) > at > org.apache.calcite.adapter.enumerable.RexToLixTranslator.translateList(RexToLixTranslator.java:899) > at > org.apache.calcite.adapter.enumerable.RexToLixTranslator.translateProjects(RexToLixTranslator.java:201) > at > org.apache.calcite.adapter.enumerable.EnumerableCalc.implement(EnumerableCalc.java:192) > at > org.apache.calcite.adapter.enumerable.EnumerableRelImplementor.implementRoot(EnumerableRelImplementor.java:114) > ... 89 more > {code} -- This message was sent by Atlassian Jira (v8.20.10#820010)