El procedimiento para añadir una nueva función nativa se describe aquí. Tenga en cuenta que no puede añadir funciones nativas a una distribución binaria ya que el procedimiento implica modificar código fuente MySQL. Debe compilar MySQL de una distribución fuente. También tenga en cuenta que si migra a otra versión de MySQL (por ejemplo, cuando una nueva versión aparece), necesita repetir el procedimiento con la nueva versión.
Para añadir una nueva función MySQL nativa, siga estos pasos:
            Añada una línea en lex.h que defina
            el nombre de función en la matriz
            sql_functions[].
          
            Si el prototipo de función es simple (sólo tiene cero,
            uno, dos o tres argumentos), debe especificar en
            lex.h
            SYM(FUNC_ARG
            (donde N)N es el número de
            argumentos) como el segundo argumento en la matriz
            sql_functions[] y añadir una nueva
            función que cree un objeto función en
            item_create.cc. Consulte
            "ABS" y
            create_funcs_abs() para un ejemplo.
          
            Si la función prototipo es complicada (por ejemplo, tiene
            un número variable de argumentos), debe añadir dos líneas
            en sql_yacc.yy. Una indica el símbolo
            de preprocesador que yacc debe definir
            (debe añadirse al principio del fichero). Luego defina los
            parámetros de función y añada un “item” con
            estos parámetros a la regla de parseo
            simple_expr . Para un ejemplo, consulte
            todas las ocurrencias de ATAN en
            sql_yacc.yy para ver cómo se hace.
          
            En item_func.h, declare una clase
            heredando de Item_num_func o
            Item_str_func, en función de si su
            función retorna un número o una cadena de caracteres.
          
            En item_func.cc, añada una de las
            siguientes declaraciones, dependiendo de si está definiendo
            una función numérica o de cadena de caracteres:
          
double Item_func_newname::val() longlong Item_func_newname::val_int() String *Item_func_newname::Str(String *str)
            Si hereda su objeto de cualquiera de los objetos estándar
            (como Item_num_func), probablemente sólo
            tiene que definier una de estas funciones y dejar que el
            objeto padre se ocupe de las otras funciones. Por ejemplo,
            la clase Item_str_func define una
            función val() que ejecuta
            atof() en el valor retornado por
            ::str().
          
Debería probablemente definir la siguiente función objeto:
void Item_func_newname::fix_length_and_dec()
            Esta función debe calcular al menos
            max_length basándose en los argumentos
            dados. max_length es el máximo número
            de caracteres que la función puede retornar. Esta función
            debería también asignar maybe_null = 0
            si la función principal no puede retornar un valor
            NULL . La función puede chequear si
            algunos de los argumentos de la función puede retornar
            NULL chequeando la variable
            maybe_null de los argumentos. Puede
            consultar
            Item_func_mod::fix_length_and_dec para un
            ejemplo típico de cómo hacer esto.
          
Todas las funciones deben ser flujos seguros. En otras palabras, no usar ninguna variable global o estática en las funciones sin protegerlas con semáforos
        Si quiere retornar NULL, desde
        ::val(), ::val_int() or
        ::str() debe asignar a
        null_value 1 y retornar 0.
      
        Para funciones objeto ::str() , hay algunas
        consideraciones adicionales a tener en cuenta:
      
            El argumento String *str proporciona un
            búffer de cadenas de caracteres que puede usarse para
            guardar el resultado. (Para más información acerca del
            tipo String , consulte el fichero
            sql_string.h .)
          
            La función ::str() debe retornar la
            cadena de caracteres que tiene el resultado o
            (char*) 0 si el resultado es
            NULL.
          
Todas las funciones de cadenas de caracteres tratan de evitar cualquier reserva de memoria a no ser que sea absolutamente necesario!
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.

