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.

reinterpret_cast<const char *>(haystack_data.data()) + prev_haystack_offset,
                cur_haystack_length,
                0,
                smart_scratch.get(),
                on_match,
                &res[i]);
            if (err != HS_SUCCESS && err != HS_SCAN_TERMINATED)
                throw Exception("Failed to scan with vectorscan", ErrorCodes::HYPERSCAN_CANNOT_SCAN_TEXT);
            prev_haystack_offset = haystack_offsets[i];
            prev_needles_offset = needles_offsets[i];
            needles.clear();
        }
#else
        
        
        
        if constexpr (WithEditDistance)
            throw Exception(
                "Edit distance multi-search is not implemented when vectorscan is off",
                ErrorCodes::NOT_IMPLEMENTED);
        (void)edit_distance;
        memset(res.data(), 0, res.size() * sizeof(res.front()));
        size_t prev_haystack_offset = 0;
        size_t prev_needles_offset = 0;
        const ColumnString * needles_data_string = checkAndGetColumn<ColumnString>(&needles_data);
        std::vector<std::string_view> needles;
        for (size_t i = 0; i < haystack_offsets.size(); ++i)
        {
            const auto * const cur_haystack_data = &haystack_data[prev_haystack_offset];
            const size_t cur_haystack_length = haystack_offsets[i] - prev_haystack_offset - 1;