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.