This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-4.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-4.1 by this push:
new 31263df4dc1 branch-4.1: [fix](function) prevent count_substrings tail
overmatch #63215 (#67167)
31263df4dc1 is described below
commit 31263df4dc1d4d3a27517d264802cd4d6b92c874
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Thu Aug 27 14:30:08 2026 +0800
branch-4.1: [fix](function) prevent count_substrings tail overmatch #63215
(#67167)
Cherry-picked from #63215
Co-authored-by: Asish Kumar
<[email protected]>
---
be/src/exprs/function/function_string_search.cpp | 9 ++++++++-
be/test/exprs/function/function_string_test.cpp | 6 ++++++
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/be/src/exprs/function/function_string_search.cpp
b/be/src/exprs/function/function_string_search.cpp
index 16027a3c58e..a7e3fa0cbf3 100644
--- a/be/src/exprs/function/function_string_search.cpp
+++ b/be/src/exprs/function/function_string_search.cpp
@@ -839,11 +839,18 @@ private:
size_t find_pos(size_t pos, const StringRef str_ref, const StringRef
pattern_ref) const {
size_t old_size = pos;
size_t str_size = str_ref.size;
- while (pos < str_size &&
+ if (pattern_ref.size > str_size || pos > str_size - pattern_ref.size) {
+ return str_size - old_size;
+ }
+ const size_t last_match_pos = str_size - pattern_ref.size;
+ while (pos <= last_match_pos &&
memcmp_small_allow_overflow15((const uint8_t*)str_ref.data +
pos,
(const uint8_t*)pattern_ref.data,
pattern_ref.size)) {
pos++;
}
+ if (pos > last_match_pos) {
+ return str_size - old_size;
+ }
return pos - old_size;
}
diff --git a/be/test/exprs/function/function_string_test.cpp
b/be/test/exprs/function/function_string_test.cpp
index fc10591f0ff..8926a3e4aab 100644
--- a/be/test/exprs/function/function_string_test.cpp
+++ b/be/test/exprs/function/function_string_test.cpp
@@ -3798,6 +3798,9 @@ TEST(function_string_test, function_count_substring_test)
{
{{std::string("hello world"), std::string("")},
std::int32_t(0)},
{{std::string(""), std::string("l")},
std::int32_t(0)},
{{std::string(""), std::string("")},
std::int32_t(0)},
+ {{std::string("ccc"), std::string("cc")},
std::int32_t(1)},
+ {{std::string("aaaa"), std::string("aa")},
std::int32_t(2)},
+ {{std::string("ab"), std::string("abc")},
std::int32_t(0)},
// utf-8 characters
{{std::string("你好123世界"), std::string("世")},
std::int32_t(1)},
{{std::string("你好123世界"), std::string("你")},
std::int32_t(1)},
@@ -3823,6 +3826,9 @@ TEST(function_string_test, function_count_substring_test)
{
{{std::string("hello world"), std::string(""),
std::int32_t(0)}, std::int32_t(0)},
{{std::string(""), std::string("l"), std::int32_t(1)},
std::int32_t(0)},
{{std::string(""), std::string(""), std::int32_t(1)},
std::int32_t(0)},
+ {{std::string("ccc"), std::string("cc"), std::int32_t(1)},
std::int32_t(1)},
+ {{std::string("ccc"), std::string("cc"), std::int32_t(3)},
std::int32_t(0)},
+ {{std::string("ab"), std::string("abc"), std::int32_t(1)},
std::int32_t(0)},
// utf-8 characters
{{std::string("你好123世界"), std::string("世"), std::int32_t(3)},
std::int32_t(1)},
{{std::string("你好123世界"), std::string("你"), std::int32_t(1)},
std::int32_t(1)},
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]