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.

template <bool save_indices, bool WithEditDistance>
inline Regexps * get(const std::vector<std::string_view> & patterns, std::optional<UInt32> edit_distance)
{
    static Pool known_regexps; 
    std::vector<String> str_patterns;
    str_patterns.reserve(patterns.size());
    for (const auto & pattern : patterns)
        str_patterns.emplace_back(std::string(pattern.data(), pattern.size()));
    
    std::unique_lock lock(known_regexps.mutex);
    auto it = known_regexps.storage.find({str_patterns, edit_distance});
    
    if (known_regexps.storage.end() == it)
    {
        it = known_regexps.storage
                 .emplace(std::piecewise_construct, std::make_tuple(std::move(str_patterns), edit_distance), std::make_tuple())
                 .first;
        it->second.setConstructor([&str_patterns = it->first.first, edit_distance]()
        {
            return constructRegexps<save_indices, WithEditDistance>(str_patterns, edit_distance);
        });
    }
    
    lock.unlock();
    return it->second();
}
}
#endif 
}