yisha zhou created FLINK-34656:
----------------------------------

             Summary: Generated code for `ITEM` operator should return null 
when getting element of a null map/array/row
                 Key: FLINK-34656
                 URL: https://issues.apache.org/jira/browse/FLINK-34656
             Project: Flink
          Issue Type: Bug
          Components: Table SQL / Planner
    Affects Versions: 1.20.0
            Reporter: yisha zhou


In FieldAccessFromTableITCase we can find that the expected result of f0[1] is 
null when f0 is a null array. 

However, behavior in generated code for ITEM is not consistent with case above. 
The main code is:

 
{code:java}
val arrayAccessCode =
  s"""
     |${array.code}
     |${index.code}
     |boolean $nullTerm = ${array.nullTerm} || ${index.nullTerm} ||
     |   $idxStr < 0 || $idxStr >= ${array.resultTerm}.size() || $arrayIsNull;
     |$resultTypeTerm $resultTerm = $nullTerm ? $defaultTerm : $arrayGet;
     |""".stripMargin {code}
If `array.nullTerm` is true, a default value of element type will be returned, 
for example -1 for null bigint array.

The reason why FieldAccessFromTableITCase can get expected result is that the 
ReduceExpressionsRule generated an expression code for that case like:
{code:java}
boolean isNull$0 = true || false ||
   ((int) 1) - 1 < 0 || ((int) 1) - 1 >= 
((org.apache.flink.table.data.ArrayData) null).size() || 
((org.apache.flink.table.data.ArrayData) null).isNullAt(((int) 1) - 1);
long result$0 = isNull$0 ? -1L : ((org.apache.flink.table.data.ArrayData) 
null).getLong(((int) 1) - 1);
if (isNull$0) {
  out.setField(0, null);
} else {
  out.setField(0, result$0);
} {code}
The reduced expr will be a null literal.
 

I think the behaviors for getting element of a null value should be unified.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to