diff --git a/be/src/exprs/string_functions.cpp b/be/src/exprs/string_functions.cpp index 7f9e80b394..c805519aad 100644 --- a/be/src/exprs/string_functions.cpp +++ b/be/src/exprs/string_functions.cpp @@ -995,4 +995,14 @@ StringVal StringFunctions::replace(FunctionContext* context, const StringVal& or } return AnyValUtil::from_string_temp(context, orig_str); } +// Implementation of BIT_LENGTH +// int bit_length(string input) +// Returns the length in bits of input. If input == NULL, returns +// NULL per MySQL +IntVal StringFunctions::bit_length(FunctionContext* context, const StringVal& str) { + if (str.is_null) { + return IntVal::null(); + } + return IntVal(str.len * 8); +} } // namespace doris diff --git a/be/src/exprs/string_functions.h b/be/src/exprs/string_functions.h index 58bdba5591..05a548d213 100644 --- a/be/src/exprs/string_functions.h +++ b/be/src/exprs/string_functions.h @@ -177,6 +177,9 @@ public: static StringVal replace(FunctionContext* context, const StringVal& origStr, const StringVal& oldStr, const StringVal& newStr); + + static doris_udf::IntVal bit_length(doris_udf::FunctionContext* context, + const doris_udf::StringVal& str); }; } // namespace doris diff --git a/be/test/exprs/string_functions_test.cpp b/be/test/exprs/string_functions_test.cpp index f9d75345c4..abfa96928c 100644 --- a/be/test/exprs/string_functions_test.cpp +++ b/be/test/exprs/string_functions_test.cpp @@ -609,6 +609,20 @@ TEST_F(StringFunctionsTest, parse_url) { StringVal("port"))); } +TEST_F(StringFunctionsTest, bit_length) { + doris_udf::FunctionContext* context = new doris_udf::FunctionContext(); + + ASSERT_EQ(IntVal(40), StringFunctions::bit_length(context, StringVal("hello"))); + + ASSERT_EQ(IntVal::null(), StringFunctions::bit_length(context, StringVal::null())); + + ASSERT_EQ(IntVal(0), StringFunctions::bit_length(context, StringVal(""))); + + ASSERT_EQ(IntVal(88), StringFunctions::bit_length(context, StringVal("hello你好"))); + + delete context; +} + } // namespace doris int main(int argc, char** argv) { diff --git a/docs/.vuepress/sidebar/en.js b/docs/.vuepress/sidebar/en.js index 719e2733d6..ad8633e3c3 100644 --- a/docs/.vuepress/sidebar/en.js +++ b/docs/.vuepress/sidebar/en.js @@ -294,6 +294,7 @@ module.exports = [ children: [ "append_trailing_char_if_absent", "ascii", + "bit_length", "char_length", "concat", "concat_ws", diff --git a/docs/.vuepress/sidebar/zh-CN.js b/docs/.vuepress/sidebar/zh-CN.js index 41c4f9e471..67fd9516e3 100644 --- a/docs/.vuepress/sidebar/zh-CN.js +++ b/docs/.vuepress/sidebar/zh-CN.js @@ -299,6 +299,7 @@ module.exports = [ children: [ "append_trailing_char_if_absent", "ascii", + "bit_length", "char_length", "concat", "concat_ws", diff --git a/docs/en/sql-reference/sql-functions/string-functions/bit_length.md b/docs/en/sql-reference/sql-functions/string-functions/bit_length.md new file mode 100644 index 0000000000..134e0e24d8 --- /dev/null +++ b/docs/en/sql-reference/sql-functions/string-functions/bit_length.md @@ -0,0 +1,54 @@ +--- +{ + "title": "bit_length", + "language": "en" +} +--- + + + +# bit_length +## Description +### Syntax + +'INT bit_length (VARCHAR str)' + + +Return length of argument in bits。 + +## example + +``` +mysql> select bit_length("abc"); ++-------------------+ +| bit_length('abc') | ++-------------------+ +| 24 | ++-------------------+ + +mysql> select bit_length("中国"); ++----------------------+ +| bit_length('中国') | ++----------------------+ +| 48 | ++----------------------+ +``` +## keyword +BIT_LENGTH diff --git a/docs/zh-CN/sql-reference/sql-functions/string-functions/bit_length.md b/docs/zh-CN/sql-reference/sql-functions/string-functions/bit_length.md new file mode 100644 index 0000000000..be76317f38 --- /dev/null +++ b/docs/zh-CN/sql-reference/sql-functions/string-functions/bit_length.md @@ -0,0 +1,54 @@ +--- +{ + "title": "bit_length", + "language": "zh-CN" +} +--- + + + +# bit_length +## description +### Syntax + +`INT bit_length(VARCHAR str)` + + +返回字符串的位长度。 + +## example + +``` +mysql> select bit_length("abc"); ++-------------------+ +| bit_length('abc') | ++-------------------+ +| 24 | ++-------------------+ + +mysql> select bit_length("中国"); ++----------------------+ +| bit_length('中国') | ++----------------------+ +| 48 | ++----------------------+ +``` +## keyword +BIT_LENGTH diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py index 3ce5056872..bc69c0d122 100755 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -677,6 +677,8 @@ visible_functions = [ '_ZN5doris15StringFunctions30append_trailing_char_if_absentEPN9doris_udf15FunctionContextERKNS1_9StringValES6_'], [['length'], 'INT', ['VARCHAR'], '_ZN5doris15StringFunctions6lengthEPN9doris_udf15FunctionContextERKNS1_9StringValE'], + [['bit_length'], 'INT', ['VARCHAR'], + '_ZN5doris15StringFunctions10bit_lengthEPN9doris_udf15FunctionContextERKNS1_9StringValE'], [['char_length', 'character_length'], 'INT', ['VARCHAR'], '_ZN5doris15StringFunctions16char_utf8_lengthEPN9doris_udf15FunctionContextERKNS1_9StringValE'], [['lower', 'lcase'], 'VARCHAR', ['VARCHAR'],