wuchong commented on a change in pull request #12436:
URL: https://github.com/apache/flink/pull/12436#discussion_r434317766



##########
File path: 
flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/codegen/calls/ScalarOperatorGens.scala
##########
@@ -1643,19 +1644,32 @@ object ScalarOperatorGens {
     val resultTypeTerm = primitiveTypeTermForType(componentInfo)
     val defaultTerm = primitiveDefaultValue(componentInfo)
 
+    if (index.literalValue.isDefined &&
+        index.literalValue.get.isInstanceOf[Int] &&
+        index.literalValue.get.asInstanceOf[Int] < 1) {
+      throw new ValidationException(s"Array element access needs an index 
starting at 1 but was " +

Review comment:
       Can be simplified to 
   
   ```scala
       index.literalValue match {
         case Some(v: Int) if v < 1 =>
           throw new ValidationException(
             s"Array element access needs an index starting at 1 but was $v")
         case _ => // nothing
       }
   ```

##########
File path: 
flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/codegen/calls/ScalarOperatorGens.scala
##########
@@ -1643,19 +1644,32 @@ object ScalarOperatorGens {
     val resultTypeTerm = primitiveTypeTermForType(componentInfo)
     val defaultTerm = primitiveDefaultValue(componentInfo)
 
+    if (index.literalValue.isDefined &&
+        index.literalValue.get.isInstanceOf[Int] &&
+        index.literalValue.get.asInstanceOf[Int] < 1) {
+      throw new ValidationException(s"Array element access needs an index 
starting at 1 but was " +
+        s"${index.literalValue.get.asInstanceOf[Int]}.")
+    }
     val idxStr = s"${index.resultTerm} - 1"
     val arrayIsNull = s"${array.resultTerm}.isNullAt($idxStr)"
     val arrayGet =
       rowFieldReadAccess(ctx, idxStr, array.resultTerm, componentInfo)
 
+    /**
+     * Return null when array index out of bounds which follows Calcite's 
behaviour.
+     * @see org.apache.calcite.sql.fun.SqlStdOperatorTable

Review comment:
       `* @see [[org.apache.calcite.sql.fun.SqlStdOperatorTable.ITEM]]`
   
   Could you move this Javadoc to the above of method signature? Javadoc is 
usually not used in code. 

##########
File path: 
flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/codegen/calls/ScalarOperatorGens.scala
##########
@@ -1643,19 +1644,35 @@ object ScalarOperatorGens {
     val resultTypeTerm = primitiveTypeTermForType(componentInfo)
     val defaultTerm = primitiveDefaultValue(componentInfo)
 
+    if (index.literalValue.isDefined &&
+        index.literalValue.get.isInstanceOf[Int] &&
+        index.literalValue.get.asInstanceOf[Int] < 1) {
+      throw new ValidationException(s"Array element access needs an index 
starting at 1 but was " +
+        s"${index.literalValue.get.asInstanceOf[Int]}.")
+    }
     val idxStr = s"${index.resultTerm} - 1"
     val arrayIsNull = s"${array.resultTerm}.isNullAt($idxStr)"
     val arrayGet =
       rowFieldReadAccess(ctx, idxStr, array.resultTerm, componentInfo)
 
+    /**
+     * Return null when array index out of bounds which follows Calcite's 
behaviour.
+     * @see org.apache.calcite.sql.fun.SqlStdOperatorTable
+     */
     val arrayAccessCode =
-      s"""
-         |${array.code}
-         |${index.code}
-         |boolean $nullTerm = ${array.nullTerm} || ${index.nullTerm} || 
$arrayIsNull;
-         |$resultTypeTerm $resultTerm = $nullTerm ? $defaultTerm : $arrayGet;
-         |""".stripMargin
-
+    s"""
+        |${array.code}
+        |${index.code}
+        |$resultTypeTerm $resultTerm;
+        |boolean $nullTerm;
+        |if (${idxStr} < 0 || ${idxStr} >= ${array.resultTerm}.size()) {

Review comment:
       I got what's your concern @libenchao . I think we don't have divergency 
on the runtime null behavior, the only concern is the compile exception. But I 
still prefer the current way, because it's very likely a typo if `my_arr[0]` is 
used, so a hint exception is more useful than surprising result. 




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to