CREATE [AGGREGATE] FUNCTION [IF NOT EXISTS] function_name
    RETURNS {STRING|INTEGER|REAL|DECIMAL}
    SONAME shared_library_name
        This statement loads the loadable function named
        function_name. (CREATE
        FUNCTION is also used to created stored functions; see
        Section 15.1.18, “CREATE PROCEDURE and CREATE FUNCTION Statements”.)
      
        A loadable function is a way to extend MySQL with a new function
        that works like a native (built-in) MySQL function such as
        ABS() or
        CONCAT(). See
        Adding a Loadable Function.
      
        function_name is the name that should
        be used in SQL statements to invoke the function. The
        RETURNS clause indicates the type of the
        function's return value. DECIMAL is a legal
        value after RETURNS, but currently
        DECIMAL functions return string values and
        should be written like STRING functions.
      
        IF NOT EXISTS prevents an error from
        occurring if there already exists a loadable function with the
        same name. It does not prevent an error
        from occurring if there already exists a built-in function
        having the same name. IF NOT EXISTS is also
        supported for CREATE FUNCTION statements. See
        Function Name Resolution.
      
        The AGGREGATE keyword, if given, signifies
        that the function is an aggregate (group) function. An aggregate
        function works exactly like a native MySQL aggregate function
        such as SUM() or
        COUNT().
      
        shared_library_name is the base name
        of the shared library file containing the code that implements
        the function. The file must be located in the plugin directory.
        This directory is given by the value of the
        plugin_dir system variable. For
        more information, see Section 7.7.1, “Installing and Uninstalling Loadable Functions”.
      
        CREATE
        FUNCTION requires the
        INSERT privilege for the
        mysql system schema because it adds a row to
        the mysql.func system table to register the
        function.
      
        CREATE
        FUNCTION also adds the function to the Performance
        Schema user_defined_functions table
        that provides runtime information about installed loadable
        functions. See
        Section 29.12.22.12, “The user_defined_functions Table”.
          Like the mysql.func system table, the
          Performance Schema
          user_defined_functions table
          lists loadable functions installed using
          CREATE
          FUNCTION. Unlike the mysql.func
          table, the user_defined_functions
          table also lists loadable functions installed automatically by
          server components or plugins. This difference makes
          user_defined_functions preferable
          to mysql.func for checking which loadable
          functions are installed.
        During the normal startup sequence, the server loads functions
        registered in the mysql.func table. If the
        server is started with the
        --skip-grant-tables option,
        functions registered in the table are not loaded and are
        unavailable.
          To upgrade the shared library associated with a loadable
          function, issue a
          DROP
          FUNCTION statement, upgrade the shared library, and
          then issue a
          CREATE
          FUNCTION statement. If you upgrade the shared
          library first and then use
          DROP
          FUNCTION, the server may unexpectedly shut down.