ClickHouse is using infinite cache for compiled regular expressions.
Hyperscan can use several megabytes per compiled regexp.
It makes infinite memory growth possible:

```
clickhouse-benchmark --query "SELECT multiFuzzyMatchAny('Hello, world', 5, ['(' || (SELECT toString(rand(1))) || '|' || (SELECT toString(rand(2))) || ')+(' || (SELECT toString(rand(3))) || '|' || (SELECT toString(rand(4))) || ')+(' || (SELECT toString(rand(5))) || ')+'])"
```

Possible solutions:
- simply drop cache if its size is 1000 entries;
- replace to LRU cache with 1000 entries.

{
        StringAndRegexp & bucket = known_regexps[hasher(pattern) % max_regexp_cache_size];
        if (likely(bucket.regexp != nullptr))
        {
            if (pattern == bucket.pattern)
                regexp = bucket.regexp;
            else
            {
                regexp = std::make_shared<Regexp>(createRegexp<like, no_capture, case_insensitive>(pattern));
                bucket = {pattern, regexp};
            }
        }
        else
        {
            regexp = std::make_shared<Regexp>(createRegexp<like, no_capture, case_insensitive>(pattern));
            bucket = {pattern, regexp};
        }
    }
private:
    constexpr static size_t max_regexp_cache_size = 100; 
    std::hash<std::string> hasher;
    struct StringAndRegexp
    {
        std::string pattern;
        RegexpPtr regexp;
    };