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]
