Creo que tiene el siguiente problema:
- En la función levenshtein_init pides la memoria necesaria para calcular la distancia según la longitud de las dos cadenas que se pasan como argumento:
malloc(sizeof(int) * (args->lengths[0] + 1) * (args->lengths[1] + 1))
- MySQL sólo ejecuta la función init la primera vez que va a usar la función, las siguientes veces llama directamente a la función levenshtein. Puedes leerlo aquí:
https://dev.mysql.com/doc/refman/5.6/en/adding-udf.html
- Por tanto, en sucesivas llamadas, si las cadenas de entrada son de longitud superior a las que se usaron por primera vez con la función init, la función levenshtein usará memora sin haberla reservado previamente, haciendo que la estabilidad de MySQL se vea comprometida.
He visto otras funciones UDF, y lo que suelen hacer en estos casos en los que se necesita usar memoria de forma dinámica es reservarla directamente en la función, no en el init.
Saludos