O procedimento para adicionar uma nova função nativa é descrito aqui. Note que você não pode adicionar funções nativas a distribuição binária porque o procedimento envolve modificação no código fonte do MySQL. Você deve compilar o MySQL de uma distribuição fonte. Note também que se você migrar para outra versão do MySQL (por exemplo, quando uma nova versão é liberada), você precisará repetir o procedimento com a nova versão.
Para adicionar uma função MySQL nativa, siga estes passos:
            Adicionr uma linha a lex.h que defina o
            nome da função no vetor
            sql_functions[].
          
            Na função protótipo é simples (utilize apenas zero, um,
            dois ou três argumentos), você deve especificar
            SYM(FUNC_ARG#) em lex.h (onde # é o número de argumentos)
            como o segundo argumento no vetor
            sql_functions[] e adicionar uma função
            que cria um objeto de função em
            item_create.cc. De uma olhada em
            "ABS" e
            create_funcs_abs() para um exemplo disto.
          
            Se o protótipo da função for complicado (por exemplo,
            tiver um número variável de argumentos), você deve
            adicionar duas linhas a sql_yacc.yy.
            Uma indica o símbolo pre-processador que o
            yacc deve difinir (isto deve ser
            adicionado no começo do arquivo). Então defina os
            parâmetros da função e adicione um ``item'' com estes
            parâmetros a regra simple_expr do
            analizador. Por exemplo, verifique todas as acorrências de
            ATAN em sql_yacc.yy
            para ver como ele é feito.
          
            Em item_func.h, declare uma classe
            herdada de Item_num_func ou
            Item_str_func, dependendo se sua função
            retorna um número ou uma string.
          
            Em item_func.cc, adicione uma das
            seguintes declarações, dependendo se você está definindo
            uma função numérica ou string:
double Item_func_newname::val() longlong Item_func_newname::val_int() String *Item_func_newname::Str(String *str)
            Se você herdar seu objeto de qualquer um dos itens padrões
            (como Item_num_func), você provavelmente
            só deverá definir uma das funções acima e deixar os
            objetos pais cuidar das outras funções. Por exemplo, a
            classe Item_str_func define uma função
            val() que executa
            atof() no valor retornado por
            ::str().
          
Você também deve, provavelmente, definir a seguinte função objeto:
void Item_func_newname::fix_length_and_dec()
            Esta função deve pelo menos calcular
            max_length baseado nos argumentos dados.
            max_length é o número máximo de
            caracteres que a função pode retornar. Esta função
            também deve definir maybe_null = 0 se a
            função principal não puder retornar um valor
            NULL. A função pode verificar se algum
            dos argumentos da função pode retornar
            NULL verificando a variável de
            argumentos maybe_null. Você pode dar uma
            olhada em
            Item_func_mod::fix_length_and_dec para um
            exemplo típico de como fazer isto.
          
Todas as funções devem ser seguras com thread (em outras palavras, não utilize qualquer variável global ou estática nas funções sem protege-las com mutexes).
        Se você retornar NULL, de
        ::val(), ::val_int() ou
        ::str() você deve definir
        null_value com 1 e retornar 0.
      
        Para funções objetos ::str(), existem
        algumas considerações adicionais das quais você deve estar
        ciente:
      
            O arguemto String *str fornece um buffer
            string que pode ser utilizado para guardar o resultado.
            (Para mais informações sobre o tipo
            String, dê uma olhada no arquivo
            sql_string.h.)
          
            A função ::str() deve retornar a string
            que guarda o resultado ou (char*) 0 se o
            resultado é NULL.
          
Todas as funções string atuais tentam evitar a alocação de memória a menos que seja absolutamente necessário!
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.

