[
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 throws 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:
// omit some code
default:
break;
}
break;
default:
break;
}
return operand;
} {code}
e.g. If we call
{code:java}
CAST(row(1, 2) as row(a integer, b tinyint)){code}
it will cause NPE:
however, the right result should be (1,2).
was:
current RexToLixTranslator#scaleIntervalToNumber will scale interval to number.
but it throws 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:
// omit some code
default:
break;
}
break;
default:
break;
}
return operand;
} {code}
e.g. If we call
{code:java}
CAST(row(1, 2) as row(a integer, b tinyint)){code}
it will cause NPE:
{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}
however, the right result should be (1,2).
> CAST failed if SqlTypeFamily of targetType is NULL
> --------------------------------------------------
>
> 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 throws 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:
> // omit some code
> default:
> break;
> }
> break;
> default:
> break;
> }
> return operand;
> } {code}
> e.g. If we call
> {code:java}
> CAST(row(1, 2) as row(a integer, b tinyint)){code}
> it will cause NPE:
> however, the right result should be (1,2).
--
This message was sent by Atlassian Jira
(v8.20.10#820010)