`SELECT ... WHERE match(key, '^prefix...')`
should use index similarly to
`SELECT ... WHERE key LIKE 'prefix%'`
{
    auto res = std::make_shared<ActionsDAG>();
    std::unordered_map<const ActionsDAG::Node *, const ActionsDAG::Node *> to_inverted;
    for (auto & node : nodes)
        node = &cloneASTWithInversionPushDown(*node, *res, to_inverted, context, false);
    if (nodes.size() > 1)
    {
        auto function_builder = FunctionFactory::instance().get("and", context);
        nodes = {&res->addFunction(function_builder, std::move(nodes), "")};
    }
    res->getOutputs().swap(nodes);
    return res;
}
inline bool Range::equals(const Field & lhs, const Field & rhs) { return applyVisitor(FieldVisitorAccurateEquals(), lhs, rhs); }