To add a native MySQL function, use the procedure described here, which requires that you use a source distribution. You cannot add native functions to a binary distribution because it is necessary to modify MySQL source code and compile MySQL from the modified source. If you migrate to another version of MySQL (for example, when a new version is released), you must repeat the procedure with the new version.
If the native function will be referred to in statements that will be replicated to replicas, you must ensure that every replica also has the function available. Otherwise, replication will fail on the replicas when they attempt to invoke the function.
        To add a native function, follow these steps to modify source
        files in the sql directory:
      
- 
Create a subclass for the function in item_create.cc:- If the function takes a fixed number of arguments, create a subclass of - Create_func_arg0,- Create_func_arg1,- Create_func_arg2, or- Create_func_arg3, respectively, depending on whether the function takes zero, one, two, or three arguments. For examples, see the- Create_func_uuid,- Create_func_abs,- Create_func_pow, and- Create_func_lpadclasses.
- If the function takes a variable number of arguments, create a subclass of - Create_native_func. For an example, see- Create_func_concat.
 
- 
To provide a name by which the function can be referred to in SQL statements, register the name in item_create.ccby adding a line to this array:static Native_func_registry func_array[]You can register several names for the same function. For example, see the lines for "LCASE"and"LOWER", which are aliases forCreate_func_lcase.
- In - item_func.h, declare a class inheriting from- Item_num_funcor- Item_str_func, depending on whether your function returns a number or a string.
- 
In item_func.cc, add one of the following declarations, depending on whether you are defining a numeric or string function:double Item_func_newname::val() longlong Item_func_newname::val_int() String *Item_func_newname::Str(String *str)If you inherit your object from any of the standard items (like Item_num_func), you probably only have to define one of these functions and let the parent object take care of the other functions. For example, theItem_str_funcclass defines aval()function that executesatof()on the value returned by::str().
- 
If the function is nondeterministic, include the following statement in the item constructor to indicate that function results should not be cached: current_thd->lex->safe_to_cache_query=0;A function is nondeterministic if, given fixed values for its arguments, it can return different results for different invocations. 
- 
You should probably also define the following object function: void Item_func_newname::fix_length_and_dec()This function should at least calculate max_lengthbased on the given arguments.max_lengthis the maximum number of characters the function may return. This function should also setmaybe_null = 0if the main function cannot return aNULLvalue. The function can check whether any of the function arguments can returnNULLby checking the arguments'maybe_nullvariable. Look atItem_func_mod::fix_length_and_decfor a typical example of how to do this.
All functions must be thread-safe. In other words, do not use any global or static variables in the functions without protecting them with mutexes.
        If you want to return NULL from
        ::val(), ::val_int(), or
        ::str(), you should set
        null_value to 1 and return 0.
      
        For ::str() object functions, these
        additional considerations apply:
      
- The - String *strargument provides a string buffer that may be used to hold the result. (For more information about the- Stringtype, take a look at the- sql_string.hfile.)
- The - ::str()function should return the string that holds the result, or- (char*) 0if the result is- NULL.
- All current string functions try to avoid allocating any memory unless absolutely necessary!