DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH
 

(mysql.info.gz) Adding native function

Info Catalog (mysql.info.gz) Adding UDF (mysql.info.gz) Adding functions
 
 25.2.3 Adding a New Native Function
 -----------------------------------
 
 The procedure for adding a new native function is described here.  Note
 that you cannot add native functions to a binary distribution because
 the procedure involves modifying MySQL source code.  You must compile
 MySQL yourself from a source distribution.  Also note that if you
 migrate to another version of MySQL (for example, when a new version is
 released), you will need to repeat the procedure with the new version.
 
 To add a new native MySQL function, follow these steps:
 
   1. Add one line to `lex.h' that defines the function name in the
      `sql_functions[]' array.
 
   2. If the function prototype is simple (just takes zero, one, two or
      three arguments), you should in lex.h specify SYM(FUNC_ARG#)
      (where # is the number of arguments) as the second argument in the
      `sql_functions[]' array and add a function that creates a function
      object in `item_create.cc'.  Take a look at `"ABS"' and
      `create_funcs_abs()' for an example of this.
 
      If the function prototype is complicated (for example takes a
      variable number of arguments), you should add two lines to
      `sql_yacc.yy'. One indicates the preprocessor symbol that `yacc'
      should define (this should be added at the beginning of the file).
      Then define the function parameters and add an "item" with these
      parameters to the `simple_expr' parsing rule.  For an example,
      check all occurrences of `ATAN' in `sql_yacc.yy' to see how this
      is done.
 
   3. In `item_func.h', declare a class inheriting from `Item_num_func'
      or `Item_str_func', depending on whether your function returns a
      number or a string.
 
   4. 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, the `Item_str_func' class defines a
      `val()' function that executes `atof()' on the value returned by
      `::str()'.
 
   5. You should probably also define the following object function:
           void Item_func_newname::fix_length_and_dec()
      This function should at least calculate `max_length' based on the
      given arguments. `max_length' is the maximum number of characters
      the function may return.  This function should also set `maybe_null
      = 0' if the main function can't return a `NULL' value.  The
      function can check whether any of the function arguments can return
      `NULL' by checking the arguments' `maybe_null' variable. You can
      take a look at `Item_func_mod::fix_length_and_dec' for a typical
      example of how to do this.
 
 All functions must be thread-safe (in other words, don't 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, there are some additional
 considerations to be aware of:
 
    * The `String *str' argument provides a string buffer that may be
      used to hold the result. (For more information about the `String'
      type, take a look at the `sql_string.h' file.)
 
    * The `::str()' function should return the string that holds the
      result or `(char*) 0' if the result is `NULL'.
 
    * All current string functions try to avoid allocating any memory
      unless absolutely necessary!
 
Info Catalog (mysql.info.gz) Adding UDF (mysql.info.gz) Adding functions
automatically generated byinfo2html