Repository: flink Updated Branches: refs/heads/release-1.5 ac043c460 -> 2582a2e77
[FLINK-9332] [table] Fix handling of null return values in CallGenerator. This closes #5988. Project: http://git-wip-us.apache.org/repos/asf/flink/repo Commit: http://git-wip-us.apache.org/repos/asf/flink/commit/2582a2e7 Tree: http://git-wip-us.apache.org/repos/asf/flink/tree/2582a2e7 Diff: http://git-wip-us.apache.org/repos/asf/flink/diff/2582a2e7 Branch: refs/heads/release-1.5 Commit: 2582a2e77d801344135fcc222e271900fab43c57 Parents: ac043c4 Author: Xpray <[email protected]> Authored: Fri May 11 22:47:32 2018 +0800 Committer: Fabian Hueske <[email protected]> Committed: Sat May 12 00:43:24 2018 +0200 ---------------------------------------------------------------------- .../table/codegen/calls/CallGenerator.scala | 21 +++++++++++++++----- .../table/expressions/ScalarFunctionsTest.scala | 2 ++ 2 files changed, 18 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flink/blob/2582a2e7/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/CallGenerator.scala ---------------------------------------------------------------------- diff --git a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/CallGenerator.scala b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/CallGenerator.scala index 48f5a95..4fbabd6 100644 --- a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/CallGenerator.scala +++ b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/CallGenerator.scala @@ -21,6 +21,7 @@ package org.apache.flink.table.codegen.calls import org.apache.flink.api.common.typeinfo.TypeInformation import org.apache.flink.table.codegen.CodeGenUtils._ import org.apache.flink.table.codegen.{CodeGenerator, GeneratedExpression} +import org.apache.flink.table.typeutils.TypeCheckUtils trait CallGenerator { @@ -64,17 +65,26 @@ object CallGenerator { val (auxiliaryStmt, result) = call(operands.map(_.resultTerm)) + val nullTermCode = if ( + nullCheck && + isReference(returnType) && + !TypeCheckUtils.isTemporal(returnType)) { + s""" + |$nullTerm = ($resultTerm == null); + """.stripMargin + } else { + "" + } + val resultCode = if (nullCheck && operands.nonEmpty) { s""" |${operands.map(_.code).mkString("\n")} |boolean $nullTerm = ${operands.map(_.nullTerm).mkString(" || ")}; - |$resultTypeTerm $resultTerm; - |if ($nullTerm) { - | $resultTerm = $defaultValue; - |} - |else { + |$resultTypeTerm $resultTerm = $defaultValue; + |if (!$nullTerm) { | ${auxiliaryStmt.getOrElse("")} | $resultTerm = $result; + | $nullTermCode |} |""".stripMargin } else if (nullCheck && operands.isEmpty) { @@ -83,6 +93,7 @@ object CallGenerator { |boolean $nullTerm = false; |${auxiliaryStmt.getOrElse("")} |$resultTypeTerm $resultTerm = $result; + |$nullTermCode |""".stripMargin } else{ s""" http://git-wip-us.apache.org/repos/asf/flink/blob/2582a2e7/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala ---------------------------------------------------------------------- diff --git a/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala b/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala index d449fba..9338412 100644 --- a/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala +++ b/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala @@ -364,6 +364,8 @@ class ScalarFunctionsTest extends ScalarTypesTestBase { testSqlApi("LPAD('â¨â¨',1,'??')", "â¨") testSqlApi("LPAD('äääääääää',2,'??')", "ää") testSqlApi("LPAD('äääääääää',10,'??')", "?äääääääää") + testSqlApi("LPAD('Hello', -1, 'x') IS NULL", "true") + testSqlApi("LPAD('Hello', -1, 'x') IS NOT NULL", "false") testAllApis( "äää".lpad(13, "12345"),
