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.

{
public:
    RegexpsConstructor() = default;
    void setConstructor(std::function<Regexps()> constructor_) { constructor = std::move(constructor_); }
    Regexps * operator()()
    {
        std::lock_guard lock(mutex);
        if (regexp)
            return &*regexp;
        regexp = constructor();
        return &*regexp;
    }
private:
    std::function<Regexps()> constructor;
    std::optional<Regexps> regexp;
    std::mutex mutex;
};
struct Pool
{
    
    std::mutex mutex;
    
    std::map<std::pair<std::vector<String>, std::optional<UInt32>>, RegexpsConstructor> storage;
};
template <bool save_indices, bool WithEditDistance>
inline Regexps constructRegexps(const std::vector<String> & str_patterns, [[maybe_unused]] std::optional<UInt32> edit_distance)