[ 
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}
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 pass the original operand is ok.


{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}
> 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)

Reply via email to