You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by sn...@apache.org on 2023/09/10 21:15:52 UTC

[flink] branch master updated: [FLINK-33010][table] GREATEST/LEAST should work with other functions as input (#23345)

This is an automated email from the ASF dual-hosted git repository.

snuyanzin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/master by this push:
     new 5775fbbf02b [FLINK-33010][table] GREATEST/LEAST should work with other functions as input (#23345)
5775fbbf02b is described below

commit 5775fbbf02b962243d3fbe2d755be350ee98847a
Author: Sergey Nuyanzin <sn...@gmail.com>
AuthorDate: Sun Sep 10 23:15:45 2023 +0200

    [FLINK-33010][table] GREATEST/LEAST should work with other functions as input (#23345)
---
 .../table/planner/codegen/calls/ScalarOperatorGens.scala |  7 ++++---
 .../planner/functions/GreatestLeastFunctionsITCase.java  | 16 ++++++++++++++++
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/ScalarOperatorGens.scala b/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/ScalarOperatorGens.scala
index c653223f5d2..084b3aa503e 100644
--- a/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/ScalarOperatorGens.scala
+++ b/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/ScalarOperatorGens.scala
@@ -1369,11 +1369,12 @@ object ScalarOperatorGens {
       }
     }
 
-    val elementsCode = elements
+    val elementsCode = elements.zipWithIndex
       .map {
-        element =>
+        case (element, index) =>
           s"""
              | ${element.code}
+             | ${if (index == 0) s"$tmpResult = ${castIfNumeric(elements.head)};" else ""}
              | if (!$nullTerm) {
              |   $boxedResultTypeTerm $cur = ${castIfNumeric(element)};
              |   if (${element.nullTerm}) {
@@ -1391,7 +1392,7 @@ object ScalarOperatorGens {
 
     val code =
       s"""
-         | $boxedResultTypeTerm $tmpResult = ${castIfNumeric(elements.head)};
+         | $boxedResultTypeTerm $tmpResult;
          | $primitiveResultTypeTerm $result = ${primitiveDefaultValue(widerType.get)};
          | boolean $nullTerm = false;
          | $elementsCode
diff --git a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/GreatestLeastFunctionsITCase.java b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/GreatestLeastFunctionsITCase.java
index 7fbee4ab467..a455c4e0c84 100644
--- a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/GreatestLeastFunctionsITCase.java
+++ b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/GreatestLeastFunctionsITCase.java
@@ -73,6 +73,14 @@ class GreatestLeastFunctionsITCase extends BuiltInFunctionTestBase {
                                 "GREATEST(f4, f5)",
                                 "world",
                                 DataTypes.STRING().notNull())
+                        .testResult(
+                                call(
+                                        "GREATEST",
+                                        call("IFNULL", $("f4"), $("f5")),
+                                        call("IFNULL", $("f5"), $("f4"))),
+                                "GREATEST(IFNULL(f4, f5), IFNULL(f5, f4))",
+                                "world",
+                                DataTypes.STRING().notNull())
                         .testResult(
                                 call("GREATEST", $("f6"), $("f7")),
                                 "GREATEST(f6, f7)",
@@ -157,6 +165,14 @@ class GreatestLeastFunctionsITCase extends BuiltInFunctionTestBase {
                                 "LEAST(f0, f1) = LEAST(f0, f1)",
                                 null,
                                 DataTypes.BOOLEAN())
+                        .testResult(
+                                call(
+                                        "LEAST",
+                                        call("IFNULL", $("f4"), $("f5")),
+                                        call("IFNULL", $("f5"), $("f4"))),
+                                "LEAST(IFNULL(f4, f5), IFNULL(f5, f4))",
+                                "hello",
+                                DataTypes.STRING().notNull())
                         .testSqlValidationError(
                                 "LEAST(f5, f6)",
                                 "SQL validation failed. Invalid function call:\n"