Code review comment: This is easy to obtain a unstandard format content. For example: ``` BEGIN  def a(b): retrun b END ``` Should we check it here?

Code under review:
public ParseNode visitCreateFunctionStatement(StarRocksParser.CreateFunctionStatementContext context) {
        String functionType = "SCALAR";
        boolean isGlobal = context.GLOBAL() != null;
        if (context.functionType != null) {
            functionType = context.functionType.getText();
        }

        QualifiedName qualifiedName = getQualifiedName(context.qualifiedName());
        String functionName = qualifiedName.toString();

        TypeDef returnTypeDef = new TypeDef(getType(context.returnType), createPos(context.returnType));

        Map<String, String> properties = null;
        if (context.properties() != null) {
            properties = new HashMap<>();
            List<Property> propertyList = visit(context.properties().property(), Property.class);
            for (Property property : propertyList) {
                properties.put(property.getKey(), property.getValue());
            }
        }
        String inlineContent = null;
        if (context.content != null) {
            String text = context.content.getText();
            inlineContent = text.substring(5, text.length() - 3);
        }

        FunctionName fnName = FunctionName.createFnName(functionName);
        if (isGlobal) {
            if (!Strings.isNullOrEmpty(fnName.getDb())) {
                throw new ParsingException(PARSER_ERROR_MSG.invalidUDFName(functionName), qualifiedName.getPos());
            }
            fnName.setAsGlobalFunction();
        }

        return new CreateFunctionStmt(functionType, fnName,
                getFunctionArgsDef(context.typeList()), returnTypeDef, properties, inlineContent);
    }

Line commented on: inlineContent = text.substring(5, text.length() - 3);

Revised code:
public ParseNode visitCreateFunctionStatement(StarRocksParser.CreateFunctionStatementContext context) {
        String functionType = "SCALAR";
        boolean isGlobal = context.GLOBAL() != null;
        if (context.functionType != null) {
            functionType = context.functionType.getText();
        }

        QualifiedName qualifiedName = getQualifiedName(context.qualifiedName());
        String functionName = qualifiedName.toString();

        TypeDef returnTypeDef = new TypeDef(getType(context.returnType), createPos(context.returnType));

        Map<String, String> properties = null;
        if (context.properties() != null) {
            properties = new HashMap<>();
            List<Property> propertyList = visit(context.properties().property(), Property.class);
            for (Property property : propertyList) {
                properties.put(property.getKey(), property.getValue());
            }
        }
        String inlineContent = null;
        if (context.inlineFunction() != null) {
            String content = context.inlineFunction().ATTACHMENT().getText();
            inlineContent = context.inlineFunction().ATTACHMENT().getText().substring(2, content.length() - 2);
        }

        FunctionName fnName = FunctionName.createFnName(functionName);
        if (isGlobal) {
            if (!Strings.isNullOrEmpty(fnName.getDb())) {
                throw new ParsingException(PARSER_ERROR_MSG.invalidUDFName(functionName), qualifiedName.getPos());
            }
            fnName.setAsGlobalFunction();
        }

        return new CreateFunctionStmt(functionType, fnName,
                getFunctionArgsDef(context.typeList()), returnTypeDef, properties, inlineContent);
    }