La procédure pour ajouter une nouvelle fonction native est décrite ici. Notez que vous ne pouvez ajouter de fonctions natives à une distribution binaire car la procédure implique la modifications du code source de MySQL. Vous devez compiler MySQL vous-même à partir d'une distribution des sources. Notez aussi que si vous migrez vers une autre version de MySQL (par exemple, quand une nouvelle version est réalisée), vous devrez répéter la procédure avec la nouvelle version.
Pour ajouter une nouvelle fonction native à MySQL, suivez les étapes suivantes :
Ajoutez une ligne dans lex.h
qui
définit le nom de la fonction dans le tableau
sql_functions[]
.
Si le prototype de la fonction est simple (elle prend zéro,
un, deux ou trois arguments), vous devez spécifier dans
lex.h
SYM(FUNC_ARG#
)
(où # est le nombre d'arguments) en tant que second
argument dans le tableau sql_functions[]
et ajouter une fonction qui crée un objet fonction dans
item_create.cc
. Regardez
"ABS"
et
create_funcs_abs()
pour un exemple.
Si le prototype de la fonction est compliqué (par exemple,
elle prend un nombre variable d'arguments), vous devez
ajouter deux lignes à sql_yacc.yy
. Une
qui indique le symbole preprocesseur que
yacc
doit définir (cela doit être
ajouté au début du fichier). Puis définir les paramètres
de la fonction et un ``item'' avec ces paramètres à la
règle simple_expr
. Pour un exemple,
vérifiez toutes les occurrences de ATAN
dans sql_yacc.yy
pour voir comment cela
se fait.
Dans item_func.h
, déclarez une classe
héritant de Item_num_func
ou de
Item_str_func
, selon que votre fonction
retourne une nombre ou un chaîne.
Dans le fichier item_func.cc
, ajoutez
l'une des déclaration suivantes, selon que vous définissez
une fonction numérique ou de chaîne de caractères :
double Item_func_newname::val() longlong Item_func_newname::val_int() String *Item_func_newname::Str(String *str)
Si vous héritez votre objet de l'un des éléments
standards (comme Item_num_func
) vous
n'aurez probablement qu'à définir l'une des fonctions
décrites ci-dessus et laisser l'objet parent prendre soin
des autres fonctions. Par exemple, la classe
Item_str_func
définit une fonction
val()
qui exécute
atof()
sur la valeur retournée par
::str()
.
Vous devez aussi probablement définir la fonction objet suivante :
void Item_func_newname::fix_length_and_dec()
Cette fonction doit au moins calculer
max_length
en se basant sur les arguments
donnés. max_length
est le nombre maximal
de caractères que la fonction peut retourner. Cette
fonction doit aussi définir maybe_null =
0
si la fonction principale ne peut pas retourner
une valeur NULL
. La fonction peut
vérifier si l'un de ses arguments peut retourner
NULL
en vérifiant la variable
maybe_null
des arguments. Vous pouvez
regarder
Item_func_mod::fix_length_and_dec
pour
avoir un exemple concret.
Toutes les fonctions doivent être sûres pour les threads (en d'autres termes, n'utilisez aucune variable statique ou globale dans la fonction sans les protéger avec mutex).
Si vous voulez retourner NULL
, à partir de
::val()
, ::val_int()
ou
::str()
vous devez mettre
null_value
à 1 et retourner 0.
Pour les fonctions de l'objet ::str()
, il y a
d'autres considérations à prendre en compte :
L'argument String *str
fournit un tampon
de chaîne qui peut être utilisé pour contenir le
résultat. (Pour plus d'informations à propos du type
String
, regardez le fichier
sql_string.h
.)
La fonction ::str()
doit retourner la
chaîne contenant le résultat ou (char*)
0
si celui-ci est NULL
.
Aucune des fonctions de chaînes n'essaye d'allouer de mémoire tant que ce n'est pas nécessaire !
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.