[improvement](function) do not use hyperscan for non-const partterns in like function (#23495)

This commit is contained in:
Jerry Hu
2023-08-25 20:40:23 +08:00
committed by GitHub
parent 2b7d60eb4d
commit 9d1c702b3a

View File

@ -272,27 +272,14 @@ Status FunctionLikeBase::regexp_fn_scalar(LikeSearchState* state, const StringRe
const StringRef& pattern, unsigned char* result) {
std::string re_pattern(pattern.data, pattern.size);
hs_database_t* database = nullptr;
hs_scratch_t* scratch = nullptr;
if (hs_prepare(nullptr, re_pattern.c_str(), &database, &scratch).ok()) { // use hyperscan
auto ret = hs_scan(database, val.data, val.size, 0, scratch,
doris::vectorized::LikeSearchState::hs_match_handler, (void*)result);
if (ret != HS_SUCCESS && ret != HS_SCAN_TERMINATED) {
return Status::RuntimeError(fmt::format("hyperscan error: {}", ret));
}
hs_free_scratch(scratch);
hs_free_database(database);
} else { // fallback to re2
RE2::Options opts;
opts.set_never_nl(false);
opts.set_dot_nl(true);
re2::RE2 re(re_pattern, opts);
if (re.ok()) {
*result = RE2::PartialMatch(re2::StringPiece(val.data, val.size), re);
} else {
return Status::RuntimeError("Invalid pattern: {}", pattern.debug_string());
}
RE2::Options opts;
opts.set_never_nl(false);
opts.set_dot_nl(true);
re2::RE2 re(re_pattern, opts);
if (re.ok()) {
*result = RE2::PartialMatch(re2::StringPiece(val.data, val.size), re);
} else {
return Status::RuntimeError("Invalid pattern: {}", pattern.debug_string());
}
return Status::OK();