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

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

commit 5e697cf148f2d4ea09b0117d4c22102de98440c4
Author: Zhenghua Gao <doc...@gmail.com>
AuthorDate: Fri Aug 2 17:29:47 2019 +0800

    [FLINK-13547][table-planner-blink] Refactor CONCAT() and CONCAT_WS() to 
keep it compatible with old planner
    
    CONCAT(string1, string2, ...) should returns NULL if any argument is NULL.
    CONCAT_WS(sep, string1, string2,...) should returns NULL if sep is NULL and 
automatically skips NULL arguments.
---
 .../planner/expressions/ScalarFunctionsTest.scala  |  6 ++---
 .../flink/table/dataformat/BinaryStringUtil.java   | 28 +++++++++++-----------
 .../flink/table/dataformat/BinaryStringTest.java   | 12 +++++-----
 3 files changed, 23 insertions(+), 23 deletions(-)

diff --git 
a/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/expressions/ScalarFunctionsTest.scala
 
b/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/expressions/ScalarFunctionsTest.scala
index 0fb58bf..56fa16d 100644
--- 
a/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/expressions/ScalarFunctionsTest.scala
+++ 
b/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/expressions/ScalarFunctionsTest.scala
@@ -731,7 +731,7 @@ class ScalarFunctionsTest extends ScalarTypesTestBase {
       concat("xx", 'f33),
       "concat('xx', f33)",
       "CONCAT('xx', f33)",
-      "xx")
+      "null")
     testAllApis(
       concat("AA", "BB", "CC", "---"),
       "concat('AA','BB','CC','---')",
@@ -745,7 +745,7 @@ class ScalarFunctionsTest extends ScalarTypesTestBase {
 
     testSqlApi("concat(f35)", "a")
     testSqlApi("concat(f35,f36)", "ab")
-    testSqlApi("concat(f35,f36,f33)", "ab")
+    testSqlApi("concat(f35,f36,f33)", "null")
   }
 
   @Test
@@ -754,7 +754,7 @@ class ScalarFunctionsTest extends ScalarTypesTestBase {
       concat_ws('f33, "AA"),
       "concat_ws(f33, 'AA')",
       "CONCAT_WS(f33, 'AA')",
-      "AA")
+      "null")
     testAllApis(
       concat_ws("~~~~", "AA"),
       "concat_ws('~~~~','AA')",
diff --git 
a/flink-table/flink-table-runtime-blink/src/main/java/org/apache/flink/table/dataformat/BinaryStringUtil.java
 
b/flink-table/flink-table-runtime-blink/src/main/java/org/apache/flink/table/dataformat/BinaryStringUtil.java
index ecc6152..6faa51a 100644
--- 
a/flink-table/flink-table-runtime-blink/src/main/java/org/apache/flink/table/dataformat/BinaryStringUtil.java
+++ 
b/flink-table/flink-table-runtime-blink/src/main/java/org/apache/flink/table/dataformat/BinaryStringUtil.java
@@ -717,22 +717,22 @@ public class BinaryStringUtil {
 
        /**
         * Concatenates input strings together into a single string.
+        * Returns NULL if any argument is NULL.
         */
        public static BinaryString concat(BinaryString... inputs) {
                return concat(Arrays.asList(inputs));
        }
 
-       /**
-        * Concatenates input strings together into a single string.
-        */
        public static BinaryString concat(Iterable<BinaryString> inputs) {
                // Compute the total length of the result.
                int totalLength = 0;
                for (BinaryString input : inputs) {
-                       if (input != null) {
-                               input.ensureMaterialized();
-                               totalLength += input.getSizeInBytes();
+                       if (input == null) {
+                               return null;
                        }
+
+                       input.ensureMaterialized();
+                       totalLength += input.getSizeInBytes();
                }
 
                // Allocate a new byte array, and copy the inputs one by one 
into it.
@@ -749,21 +749,21 @@ public class BinaryStringUtil {
        }
 
        /**
-        * Concatenates input strings together into a single string using the 
separator.
-        * A null input is skipped. For example, concat(",", "a", null, "c") 
would yield "a,c".
+        * <p>Concatenates input strings together into a single string using 
the separator.
+        * Returns NULL If the separator is NULL.</p>
+        *
+        * <p>Note: CONCAT_WS() does not skip any empty strings, however it 
does skip any NULL values after
+        * the separator. For example, concat_ws(",", "a", null, "c") would 
yield "a,c".</p>
         */
        public static BinaryString concatWs(BinaryString separator, 
BinaryString... inputs) {
                return concatWs(separator, Arrays.asList(inputs));
        }
 
-       /**
-        * Concatenates input strings together into a single string using the 
separator.
-        * A null input is skipped. For example, concat(",", "a", null, "c") 
would yield "a,c".
-        */
        public static BinaryString concatWs(BinaryString separator, 
Iterable<BinaryString> inputs) {
-               if (null == separator || EMPTY_UTF8.equals(separator)) {
-                       return concat(inputs);
+               if (null == separator) {
+                       return null;
                }
+
                separator.ensureMaterialized();
 
                int numInputBytes = 0;  // total number of bytes from the inputs
diff --git 
a/flink-table/flink-table-runtime-blink/src/test/java/org/apache/flink/table/dataformat/BinaryStringTest.java
 
b/flink-table/flink-table-runtime-blink/src/test/java/org/apache/flink/table/dataformat/BinaryStringTest.java
index 59c93ec..a3e2c63 100644
--- 
a/flink-table/flink-table-runtime-blink/src/test/java/org/apache/flink/table/dataformat/BinaryStringTest.java
+++ 
b/flink-table/flink-table-runtime-blink/src/test/java/org/apache/flink/table/dataformat/BinaryStringTest.java
@@ -247,22 +247,22 @@ public class BinaryStringTest {
        @Test
        public void concatTest() {
                assertEquals(empty, concat());
-               assertEquals(empty, concat((BinaryString) null));
+               assertEquals(null, concat((BinaryString) null));
                assertEquals(empty, concat(empty));
                assertEquals(fromString("ab"), concat(fromString("ab")));
                assertEquals(fromString("ab"), concat(fromString("a"), 
fromString("b")));
                assertEquals(fromString("abc"), concat(fromString("a"), 
fromString("b"), fromString("c")));
-               assertEquals(fromString("ac"), concat(fromString("a"), null, 
fromString("c")));
-               assertEquals(fromString("a"), concat(fromString("a"), null, 
null));
-               assertEquals(empty, concat(null, null, null));
+               assertEquals(null, concat(fromString("a"), null, 
fromString("c")));
+               assertEquals(null, concat(fromString("a"), null, null));
+               assertEquals(null, concat(null, null, null));
                assertEquals(fromString("数据砖头"), concat(fromString("数据"), 
fromString("砖头")));
        }
 
        @Test
        public void concatWsTest() {
                // Returns empty if the separator is null
-               assertEquals(empty, concatWs(null, (BinaryString) null));
-               assertEquals(fromString("a"), concatWs(null, fromString("a")));
+               assertEquals(null, concatWs(null, (BinaryString) null));
+               assertEquals(null, concatWs(null, fromString("a")));
 
                // If separator is null, concatWs should skip all null inputs 
and never return null.
                BinaryString sep = fromString("哈哈");

Reply via email to