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.