在MySQL中创建UDF函数时出错

时间:2012-03-13 23:17:57

标签: mysql c

我正在尝试为MySQL创建一个UDF函数(一个可由MySQL执行的C函数),而且我遇到了左右问题。我只是直接给你代码。我有一个文件levenshtein.c,其中包含以下声明和相应的实现:

my_bool     sql_levenshtein_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
void        sql_levenshtein_deinit(UDF_INIT *initid);
longlong    sql_levenshtein(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);

我编译文件(针对std = c99和arch = i386,如果相关的话)。我将创建的.so文件复制到我的mysql插件文件夹中。我进入mysql并执行命令

mysql> create function sql_levenshtein returns int soname 'levenshtein.so';

我没有成功创建该函数,而是收到此错误

ERROR 1127 (HY000): Can't find symbol 'sql_levenshtein' in library

在尝试解决问题时,我没有提出太多有用的信息。谷歌搜索后,我使用命令nm来查看.so文件。我得到了这个输出:

00001600 t ___inline_memset_chk
00001870 t ___inline_strcpy_chk
         U ___memset_chk
         U ___stack_chk_fail
         U ___stack_chk_guard
         U ___strcpy_chk
00001220 T _cell_value
         U _free
00001180 T _is_levenshtein_within_normthresh
00001100 T _is_levenshtein_within_thresh
00001460 T _levenshtein
00000cf0 T _levenshtein_k
         U _malloc
00001400 t _minimum
00001660 T _normlevenshtein
000018f0 T _sql_levenshtein
000018c0 T _sql_levenshtein_deinit
00001710 T _sql_levenshtein_init
00001df0 T _sql_levenshtein_within_normthreshold
00001dd0 T _sql_levenshtein_within_normthreshold_deinit
00001d00 T _sql_levenshtein_within_normthreshold_init
00001c00 T _sql_normlevenshtein
00001be0 T _sql_normlevenshtein_deinit
00001b20 T _sql_normlevenshtein_init
         U dyld_stub_binder

注意_sql_levenshtein,所以看起来函数存在。不确定还有什么有用的。谢谢你的指导!

库尔特

====== 更新以回应评论: 嗯,为了它的价值,我也做了

mysql> create function _sql_levenshtein returns int soname 'levenshtein.so';
ERROR 1127 (HY000): Can't find symbol '_sql_levenshtein' in library

所以这似乎不是问题的根本原因。也许我错过了什么。

1 个答案:

答案 0 :(得分:1)

我不知道您是否找到了答案,但在MySQL中创建函数时,必须使用您定义的函数的名称。所以,如果你有一个名为“my_func_udf”的UDF,并且在你的代码中你有一个名为My_Func()的东西,在你的情况下你称之为:

 longlong sql_levenshtein(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);

这是所有魔法发生的地方,你必须在你的创建语句中使用这个函数的名称,即CREATE FUNCTION My_Func RETURNS(STRING,INTEGER,REAL)SONAME“你的SO文件的名称”。

来自上述代码的示例:

 CREATE FUNCTION sql_levenshtein RETURNS INTEGER SONAME "levenshtein.so";

你已经定义了一些东西,然后把它称之为其他东西,这是你的错误。