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("哈哈");