diff --git a/be/src/exprs/string_functions.cpp b/be/src/exprs/string_functions.cpp index 233be37c2b..1c95f2f57a 100644 --- a/be/src/exprs/string_functions.cpp +++ b/be/src/exprs/string_functions.cpp @@ -120,6 +120,7 @@ StringVal StringFunctions::substring(FunctionContext* context, const StringVal& // string left(string input, int len) // This behaves identically to the mysql implementation. StringVal StringFunctions::left(FunctionContext* context, const StringVal& str, const IntVal& len) { + if (len.val >= str.len) return str; return substring(context, str, 1, len); } diff --git a/be/test/exprs/string_functions_test.cpp b/be/test/exprs/string_functions_test.cpp index fe894cda66..010c1e3ef3 100644 --- a/be/test/exprs/string_functions_test.cpp +++ b/be/test/exprs/string_functions_test.cpp @@ -287,6 +287,13 @@ TEST_F(StringFunctionsTest, null_or_empty) { delete context; } +TEST_F(StringFunctionsTest, left) { + doris_udf::FunctionContext* context = new doris_udf::FunctionContext(); + + ASSERT_EQ(AnyValUtil::from_string(ctx, std::string("")), + StringFunctions::left(context, StringVal(""), 10)); +} + TEST_F(StringFunctionsTest, substring) { doris_udf::FunctionContext* context = new doris_udf::FunctionContext();