```
2021.10.22 07:14:33.963099 [ 3451059 ] {} <Error> Application: DB::Exception: Syntax error (in file ./user_defined/function_a_function.sql): failed at position 39 ('->'): -> ch(2)

$ cat ./user_defined/function_a_function.sql
CREATE FUNCTION a_function AS tuple() -> ch(2)
```
{
    if (!arguments) return {};
    if (name == "array")
    {
        Array array;
        for (const auto & arg : arguments->children)
        {
            if (auto * literal = arg->as<ASTLiteral>())
                array.push_back(literal->value);
            else if (auto * func = arg->as<ASTFunction>())
            {
                if (auto func_literal = func->toLiteral())
                    array.push_back(func_literal->as<ASTLiteral>()->value);
            }
            else
                
                return {};
        }
        return std::make_shared<ASTLiteral>(array);
    }
    return {};
}
/** A special hack. If it's [I]LIKE or NOT [I]LIKE expression and the right hand side is a string literal,
  *  we will highlight unescaped metacharacters % and _ in string literal for convenience.
  * Motivation: most people are unaware that _ is a metacharacter and forgot to properly escape it with two backslashes.
  * With highlighting we make it clearly obvious.
  *
  * Another case is regexp match. Suppose the user types match(URL, 'www.yandex.ru'). It often means that the user is unaware that . is a metacharacter.
  */
static bool highlightStringLiteralWithMetacharacters(const ASTPtr & node, const IAST::FormatSettings & settings, const char * metacharacters)