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

morningman pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 6103ea64ff55cde33151e8d6a94028b773fdfa56
Author: HappenLee <[email protected]>
AuthorDate: Tue Mar 21 08:56:19 2023 +0800

    [Bug][Fix] regexp function core dump DCHECK failed and error result (#17953)
    
    CREATE TABLE `test` (
    `name` varchar(64) NULL,
    `age` int(11) NULL
    ) ENGINE=OLAP
    DUPLICATE KEY(`name`)
    COMMENT 'OLAP'
    DISTRIBUTED BY HASH(`name`) BUCKETS 1
    PROPERTIES (
    "replication_allocation" = "tag.location.default: 1",
    "in_memory" = "false",
    "storage_format" = "V2",
    "disable_auto_compaction" = "false"
    );
    insert into `test` values ("lemon",1),("tom",2);
    
    select a.name regexp concat('^', a.name) from test a;
---
 be/src/vec/functions/like.cpp                      | 23 ++++++++++++----------
 .../test_string_function_regexp.out                |  6 ++++++
 .../test_string_function_regexp.groovy             |  1 +
 3 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/be/src/vec/functions/like.cpp b/be/src/vec/functions/like.cpp
index 4e96389b81..557ecf6771 100644
--- a/be/src/vec/functions/like.cpp
+++ b/be/src/vec/functions/like.cpp
@@ -211,11 +211,11 @@ Status 
FunctionLikeBase::constant_regex_fn_scalar(LikeSearchState* state, const
 
 Status FunctionLikeBase::regexp_fn_scalar(LikeSearchState* state, const 
StringRef& val,
                                           const StringValue& pattern, unsigned 
char* result) {
-    std::string_view re_pattern(pattern.ptr, pattern.len);
+    std::string re_pattern(pattern.ptr, pattern.len);
 
     hs_database_t* database = nullptr;
     hs_scratch_t* scratch = nullptr;
-    RETURN_IF_ERROR(hs_prepare(nullptr, re_pattern.data(), &database, 
&scratch));
+    RETURN_IF_ERROR(hs_prepare(nullptr, re_pattern.c_str(), &database, 
&scratch));
 
     auto ret = hs_scan(database, val.data, val.size, 0, scratch, 
state->hs_match_handler,
                        (void*)result);
@@ -248,11 +248,11 @@ Status 
FunctionLikeBase::constant_regex_fn(LikeSearchState* state, const ColumnS
 
 Status FunctionLikeBase::regexp_fn(LikeSearchState* state, const ColumnString& 
val,
                                    const StringValue& pattern, 
ColumnUInt8::Container& result) {
-    std::string_view re_pattern(pattern.ptr, pattern.len);
+    std::string re_pattern(pattern.ptr, pattern.len);
 
     hs_database_t* database = nullptr;
     hs_scratch_t* scratch = nullptr;
-    RETURN_IF_ERROR(hs_prepare(nullptr, re_pattern.data(), &database, 
&scratch));
+    RETURN_IF_ERROR(hs_prepare(nullptr, re_pattern.c_str(), &database, 
&scratch));
 
     auto sz = val.size();
     for (size_t i = 0; i < sz; i++) {
@@ -293,11 +293,11 @@ Status 
FunctionLikeBase::regexp_fn_predicate(LikeSearchState* state,
                                              const StringValue& pattern,
                                              ColumnUInt8::Container& result, 
uint16_t* sel,
                                              size_t sz) {
-    std::string_view re_pattern(pattern.ptr, pattern.len);
+    std::string re_pattern(pattern.ptr, pattern.len);
 
     hs_database_t* database = nullptr;
     hs_scratch_t* scratch = nullptr;
-    RETURN_IF_ERROR(hs_prepare(nullptr, re_pattern.data(), &database, 
&scratch));
+    RETURN_IF_ERROR(hs_prepare(nullptr, re_pattern.c_str(), &database, 
&scratch));
 
     auto data_ptr = reinterpret_cast<const StringRef*>(val.get_data().data());
     for (size_t i = 0; i < sz; i++) {
@@ -368,10 +368,13 @@ Status FunctionLikeBase::execute_impl(FunctionContext* 
context, Block& block,
         const auto pattern_col = block.get_by_position(arguments[1]).column;
 
         if (const auto* str_patterns = 
check_and_get_column<ColumnString>(pattern_col.get())) {
-            DCHECK_EQ(str_patterns->size(), 1);
-            const auto& pattern_val = str_patterns->get_data_at(0);
-            RETURN_IF_ERROR(vector_const(*values, &pattern_val, vec_res, 
state->function,
-                                         &state->search_state));
+            for (int i = 0; i < input_rows_count; i++) {
+                const auto pattern_val = str_patterns->get_data_at(i);
+                const auto value_val = values->get_data_at(i);
+                (state->scalar_function)(
+                        
const_cast<vectorized::LikeSearchState*>(&state->search_state), value_val,
+                        pattern_val, &vec_res[i]);
+            }
         } else if (const auto* const_patterns =
                            
check_and_get_column<ColumnConst>(pattern_col.get())) {
             const auto& pattern_val = const_patterns->get_data_at(0);
diff --git 
a/regression-test/data/query_p0/sql_functions/string_functions/test_string_function_regexp.out
 
b/regression-test/data/query_p0/sql_functions/string_functions/test_string_function_regexp.out
index b7460c5134..8d27c997bb 100644
--- 
a/regression-test/data/query_p0/sql_functions/string_functions/test_string_function_regexp.out
+++ 
b/regression-test/data/query_p0/sql_functions/string_functions/test_string_function_regexp.out
@@ -5,6 +5,12 @@ billie eillish
 -- !sql --
 It's ok
 
+-- !sql --
+Emmy eillish
+It's ok
+It's true
+billie eillish
+
 -- !sql --
 Emmy eillish
 It's ok
diff --git 
a/regression-test/suites/query_p0/sql_functions/string_functions/test_string_function_regexp.groovy
 
b/regression-test/suites/query_p0/sql_functions/string_functions/test_string_function_regexp.groovy
index 3f68b060be..374a5c16c9 100644
--- 
a/regression-test/suites/query_p0/sql_functions/string_functions/test_string_function_regexp.groovy
+++ 
b/regression-test/suites/query_p0/sql_functions/string_functions/test_string_function_regexp.groovy
@@ -36,6 +36,7 @@ suite("test_string_function_regexp") {
         """
     qt_sql "SELECT k FROM ${tbName} WHERE k regexp '^billie' ORDER BY k;"
     qt_sql "SELECT k FROM ${tbName} WHERE k regexp 'ok\$' ORDER BY k;"
+    qt_sql "SELECT k FROM ${tbName} WHERE k regexp concat('^', k) order by k;"
 
     qt_sql "SELECT k FROM ${tbName} WHERE k not regexp '^billie' ORDER BY k;"
     qt_sql "SELECT k FROM ${tbName} WHERE k not regexp 'ok\$' ORDER BY k;"


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to