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

zhaoc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git


The following commit(s) were added to refs/heads/master by this push:
     new a656a7d  Support append_trailing_char_if_absent  function (#3439)
a656a7d is described below

commit a656a7ddd402c71f2b3c541497277cdc036fbac7
Author: Youngwb <yangwenbo_mail...@163.com>
AuthorDate: Sat May 9 08:59:34 2020 +0800

    Support append_trailing_char_if_absent  function (#3439)
---
 be/src/exprs/string_functions.cpp                  | 19 +++++++
 be/src/exprs/string_functions.h                    |  5 +-
 be/test/exprs/string_functions_test.cpp            | 40 +++++++++++++--
 docs/.vuepress/sidebar/en.js                       |  1 +
 docs/.vuepress/sidebar/zh-CN.js                    |  1 +
 .../append_trailing_char_if_absent.md              | 60 ++++++++++++++++++++++
 .../append_trailing_char_if_absent.md              | 60 ++++++++++++++++++++++
 gensrc/script/doris_builtins_functions.py          |  2 +
 8 files changed, 184 insertions(+), 4 deletions(-)

diff --git a/be/src/exprs/string_functions.cpp 
b/be/src/exprs/string_functions.cpp
index 06895ce..b02bf56 100644
--- a/be/src/exprs/string_functions.cpp
+++ b/be/src/exprs/string_functions.cpp
@@ -256,6 +256,25 @@ StringVal StringFunctions::rpad(
     }
     return result;
 }
+
+StringVal 
StringFunctions::append_trailing_char_if_absent(doris_udf::FunctionContext* 
context,
+        const doris_udf::StringVal& str, const doris_udf::StringVal& 
trailing_char) {
+    if (str.is_null || trailing_char.is_null || trailing_char.len != 1) {
+        return StringVal::null();
+    }
+    if (str.len == 0) {
+        return trailing_char;
+    }
+    if (str.ptr[str.len - 1] == trailing_char.ptr[0]) {
+        return str;
+    }
+
+    StringVal result(context, str.len + 1);
+    memcpy(result.ptr, str.ptr, str.len);
+    result.ptr[str.len] = trailing_char.ptr[0];
+    return result;
+}
+
 // Implementation of LENGTH
 //   int length(string input)
 // Returns the length in bytes of input. If input == NULL, returns
diff --git a/be/src/exprs/string_functions.h b/be/src/exprs/string_functions.h
index 3c395c9..13b96bc 100644
--- a/be/src/exprs/string_functions.h
+++ b/be/src/exprs/string_functions.h
@@ -67,7 +67,10 @@ public:
         const doris_udf::IntVal& len, const doris_udf::StringVal& pad); 
     static doris_udf::StringVal rpad(
         doris_udf::FunctionContext* context, const doris_udf::StringVal& str,
-        const doris_udf::IntVal& len, const doris_udf::StringVal& pad); 
+        const doris_udf::IntVal& len, const doris_udf::StringVal& pad);
+    static doris_udf::StringVal append_trailing_char_if_absent(
+            doris_udf::FunctionContext* context, const doris_udf::StringVal& 
str,
+            const doris_udf::StringVal& trailing_char);
     static doris_udf::IntVal length(
         doris_udf::FunctionContext* context, const doris_udf::StringVal& str);
     static doris_udf::IntVal char_utf8_length(
diff --git a/be/test/exprs/string_functions_test.cpp 
b/be/test/exprs/string_functions_test.cpp
index 3b257b9..2670f57 100644
--- a/be/test/exprs/string_functions_test.cpp
+++ b/be/test/exprs/string_functions_test.cpp
@@ -28,8 +28,19 @@ namespace doris {
 
 class StringFunctionsTest : public testing::Test {
 public:
-    StringFunctionsTest() {
+    StringFunctionsTest() = default;
+
+    void SetUp() {
+        utils = new FunctionUtils();
+        ctx = utils->get_fn_ctx();
+    }
+    void TearDown() {
+        delete utils;
     }
+
+private:
+    FunctionUtils* utils;
+    FunctionContext* ctx;
 };
 
 TEST_F(StringFunctionsTest, money_format_bigint) {
@@ -319,14 +330,37 @@ TEST_F(StringFunctionsTest, length) {
             StringFunctions::length(context, StringVal("")));
     ASSERT_EQ(IntVal(0),
             StringFunctions::char_utf8_length(context, StringVal("")));
-            
+
     ASSERT_EQ(IntVal(11),
             StringFunctions::length(context, StringVal("hello你好")));
-            
+
     ASSERT_EQ(IntVal(7),
             StringFunctions::char_utf8_length(context, StringVal("hello你好")));
 }
 
+TEST_F(StringFunctionsTest, append_trailing_char_if_absent) {
+    ASSERT_EQ(StringVal("ac"), 
StringFunctions::append_trailing_char_if_absent(ctx,
+            StringVal("a"), StringVal("c")));
+
+    ASSERT_EQ(StringVal("c"), 
StringFunctions::append_trailing_char_if_absent(ctx,
+            StringVal("c"), StringVal("c")));
+
+    ASSERT_EQ(StringVal("123c"), 
StringFunctions::append_trailing_char_if_absent(ctx,
+            StringVal("123c"), StringVal("c")));
+
+    ASSERT_EQ(StringVal("c"), 
StringFunctions::append_trailing_char_if_absent(ctx,
+            StringVal(""), StringVal("c")));
+
+    ASSERT_EQ(StringVal::null(), 
StringFunctions::append_trailing_char_if_absent(ctx,
+            StringVal::null(), StringVal("c")));
+
+    ASSERT_EQ(StringVal::null(), 
StringFunctions::append_trailing_char_if_absent(ctx,
+            StringVal("a"), StringVal::null()));
+
+    ASSERT_EQ(StringVal::null(), 
StringFunctions::append_trailing_char_if_absent(ctx,
+            StringVal("a"), StringVal("abc")));
+}
+
 }
 
 int main(int argc, char** argv) {
diff --git a/docs/.vuepress/sidebar/en.js b/docs/.vuepress/sidebar/en.js
index 9cbbac3..c603bbd 100644
--- a/docs/.vuepress/sidebar/en.js
+++ b/docs/.vuepress/sidebar/en.js
@@ -195,6 +195,7 @@ module.exports = [
             title: "String Functions",
             directoryPath: "string-functions/",
             children: [
+              "append_trailing_char_if_absent",
               "ascii",
               "concat",
               "concat_ws",
diff --git a/docs/.vuepress/sidebar/zh-CN.js b/docs/.vuepress/sidebar/zh-CN.js
index fe66697..7326f71 100644
--- a/docs/.vuepress/sidebar/zh-CN.js
+++ b/docs/.vuepress/sidebar/zh-CN.js
@@ -207,6 +207,7 @@ module.exports = [
             title: "字符串函数",
             directoryPath: "string-functions/",
             children: [
+              "append_trailing_char_if_absent",
               "ascii",
               "concat",
               "concat_ws",
diff --git 
a/docs/en/sql-reference/sql-functions/string-functions/append_trailing_char_if_absent.md
 
b/docs/en/sql-reference/sql-functions/string-functions/append_trailing_char_if_absent.md
new file mode 100644
index 0000000..cd24883
--- /dev/null
+++ 
b/docs/en/sql-reference/sql-functions/string-functions/append_trailing_char_if_absent.md
@@ -0,0 +1,60 @@
+---
+{
+    "title": "append_trailing_char_if_absent",
+    "language": "en"
+}
+---
+
+<!-- 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# append_trailing_char_if_absent
+
+## description
+
+### Syntax
+
+`VARCHAR append_trailing_char_if_absent(VARCHAR str, VARCHAR trailing_char)`
+
+If the s string is non-empty and does not contain the c character at the end, 
it appends the c character to the end.
+Trailing_char contains only one character, and it will return NULL if contains 
more than one character
+
+## example
+
+```
+MySQL [test]> select append_trailing_char_if_absent('a','c');
++------------------------------------------+
+| append_trailing_char_if_absent('a', 'c') |
++------------------------------------------+
+| ac                                       |
++------------------------------------------+
+1 row in set (0.02 sec)
+
+MySQL [test]> select append_trailing_char_if_absent('ac','c');
++-------------------------------------------+
+| append_trailing_char_if_absent('ac', 'c') |
++-------------------------------------------+
+| ac                                        |
++-------------------------------------------+
+1 row in set (0.00 sec)
+```
+
+## keyword
+
+APPEND_TRAILING_CHAR_IF_ABSENT
diff --git 
a/docs/zh-CN/sql-reference/sql-functions/string-functions/append_trailing_char_if_absent.md
 
b/docs/zh-CN/sql-reference/sql-functions/string-functions/append_trailing_char_if_absent.md
new file mode 100644
index 0000000..b6770ef
--- /dev/null
+++ 
b/docs/zh-CN/sql-reference/sql-functions/string-functions/append_trailing_char_if_absent.md
@@ -0,0 +1,60 @@
+---
+{
+    "title": "append_trailing_char_if_absent",
+    "language": "zh-CN"
+}
+---
+
+<!-- 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# append_trailing_char_if_absent
+
+## description
+
+### Syntax
+
+`VARCHAR append_trailing_char_if_absent(VARCHAR str, VARCHAR trailing_char)`
+
+如果's'字符串非空并且末尾不包含'c'字符,则将'c'字符附加到末尾。
+trailing_char只包含一个字符,如果包含多个字符,将返回NULL
+
+## example
+
+```
+MySQL [test]> select append_trailing_char_if_absent('a','c');
++------------------------------------------+
+| append_trailing_char_if_absent('a', 'c') |
++------------------------------------------+
+| ac                                       |
++------------------------------------------+
+1 row in set (0.02 sec)
+
+MySQL [test]> select append_trailing_char_if_absent('ac','c');
++-------------------------------------------+
+| append_trailing_char_if_absent('ac', 'c') |
++-------------------------------------------+
+| ac                                        |
++-------------------------------------------+
+1 row in set (0.00 sec)
+```
+
+## keyword
+
+APPEND_TRAILING_CHAR_IF_ABSENT
diff --git a/gensrc/script/doris_builtins_functions.py 
b/gensrc/script/doris_builtins_functions.py
index a2d9727..9516371 100755
--- a/gensrc/script/doris_builtins_functions.py
+++ b/gensrc/script/doris_builtins_functions.py
@@ -531,6 +531,8 @@ visible_functions = [
     [['rpad'], 'VARCHAR', ['VARCHAR', 'INT', 'VARCHAR'],
             '_ZN5doris15StringFunctions4rpadEPN9doris_udf'
             '15FunctionContextERKNS1_9StringValERKNS1_6IntValES6_'],
+    [['append_trailing_char_if_absent'], 'VARCHAR', ['VARCHAR', 'VARCHAR'],
+       
'_ZN5doris15StringFunctions30append_trailing_char_if_absentEPN9doris_udf15FunctionContextERKNS1_9StringValES6_'],
     [['length'], 'INT', ['VARCHAR'],
             
'_ZN5doris15StringFunctions6lengthEPN9doris_udf15FunctionContextERKNS1_9StringValE'],
     [['char_length', 'character_length'], 'INT', ['VARCHAR'],


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to