You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues-all@impala.apache.org by "Xianqing He (Jira)" <ji...@apache.org> on 2026/10/15 06:13:00 UTC

[jira] [Assigned] (IMPALA-15550) Optimize regexp_replace() for constant patterns

     [ https://issues.apache.org/jira/browse/IMPALA-15550?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Xianqing He reassigned IMPALA-15550:
------------------------------------

    Assignee: Xianqing He

> Optimize regexp_replace() for constant patterns
> -----------------------------------------------
>
>                 Key: IMPALA-15550
>                 URL: https://issues.apache.org/jira/browse/IMPALA-15550
>             Project: IMPALA
>          Issue Type: Improvement
>          Components: Backend
>    Affects Versions: Impala 5.0.0
>            Reporter: Xianqing He
>            Assignee: Xianqing He
>            Priority: Major
>
> h3. Problem
> regexp_replace() with a constant pattern still runs the full RE2 path on every evaluation: std::string conversion, RE2::GlobalReplace() and a copy of the result. BI queries often evaluate simple expressions such as {{upper(regexp_replace(col, '[0-9]', ''))}} repeatedly in grouping expressions, paying this cost several times per row.
> h3. Proposed change
> Add fast paths for constant patterns that are a plain literal or a single ASCII character class:
> * Plain literal: reuse the StringSearch-based replacement loop of replace().
> * Character class: match bytes directly instead of calling RE2. Positive classes support any replacement; negated classes only support deletion on ASCII-only input.
> * Fall back to RE2 with unchanged behavior for everything else: backslash in the replacement (RE2 escapes/backreferences), negated class with non-empty replacement or non-ASCII input, empty pattern, quantifiers/groups/predefined classes/non-ASCII classes, non-constant patterns, and results exceeding StringVal::MAX_LENGTH.
> regexp_replace() also gets its own prepare/close state instead of sharing RegexpPrepare/RegexpClose with regexp_extract() and regexp_match_count().
> h3. Testing
> * New expr-test.cc cases cover the literal and class fast paths, fallbacks (backslash replacement, negated classes with non-ASCII input, '[a-]', groups), empty/no/full matches and invalid UTF-8.
> * expr-benchmark shows ~2.3x for {{regexp_replace(col, '[0-9]', '')}} and ~1.5x for a literal pattern, with larger gains when codegen is enabled.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-all-unsubscribe@impala.apache.org
For additional commands, e-mail: issues-all-help@impala.apache.org