```
SELECT * FROM t0 ASOF LEFT JOIN t1 ON (t1.x = t0.x) AND greater(('\0llall\0ll\0ll\0llall\0llall\0llall\0llall\0llall\0llall\0llall\0llall\0llall\0llall\0ll\0ll\0llall\0llall\0llall', x, x, y), t0.y, t1.y)
```

{
    if (func.name == "and")
        return; 
    if (func.name == "equals")
    {
        if (func.arguments->children.size() != 2)
        {
            throwSyntaxException("Function 'equals' takes two arguments, got '"
                + func.formatForErrorMessage() + "' instead.");
        }
        ASTPtr left = func.arguments->children.at(0);
        ASTPtr right = func.arguments->children.at(1);
        auto table_numbers = getTableNumbers(ast, left, right, data);
        data.addJoinKeys(left, right, table_numbers);
        return;
    }
    ASOF::Inequality inequality = ASOF::getInequality(func.name);
    if (data.is_asof && (inequality != ASOF::Inequality::None))
    {
        if (data.asof_left_key || data.asof_right_key)
            throwSyntaxException("ASOF JOIN expects exactly one inequality in ON section, unexpected " + queryToString(ast) + ".");
        ASTPtr left = func.arguments->children.at(0);
        ASTPtr right = func.arguments->children.at(1);
        auto table_numbers = getTableNumbers(ast, left, right, data);
        data.addAsofJoinKeys(left, right, table_numbers, inequality);
        return;
    }
    throwSyntaxException("Expected equals expression, got " + queryToString(ast) + ".");
}
void CollectJoinOnKeysMatcher::getIdentifiers(const ASTPtr & ast, std::vector<const ASTIdentifier *> & out)