我正在尝试为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
所以这似乎不是问题的根本原因。也许我错过了什么。
答案 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";
你已经定义了一些东西,然后把它称之为其他东西,这是你的错误。