my_udf_init 未调用
Posted
技术标签:
【中文标题】my_udf_init 未调用【英文标题】:my_udf_init not called 【发布时间】:2011-09-10 00:01:23 【问题描述】:这是我第一次尝试为 mysql 创建 udf。文档指出 my_func_init
在执行主函数之前被调用,但在我的环境中这似乎没有发生。
long long charmatch(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
return 42;
my_bool charmatch_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
if (args->arg_count != 2)
strncpy(message, "charmatch() requires two arguments", 34);
return EXIT_FAILURE;
// was return EXIT_SUCCESS;
if(args->arg_type[0] != STRING_RESULT)
strncpy(message, "argument 1 must be a string", 27);
return EXIT_FAILURE;
// was return EXIT_SUCCESS;
if(args->arg_type[0] != STRING_RESULT)
strncpy(message, "argument 2 must be a string", 27);
return EXIT_FAILURE;
// was return EXIT_SUCCESS;
return EXIT_SUCCESS;
如您所见,我正在检查是否有两个参数。理论上SELECT CHARMATCH()
应该返回一条消息说我必须设置两个参数,但事实并非如此:它返回 42。
为什么不返回消息?
EDIT 似乎问题出在我的错误返回值为 0 而不是 1。我修复了它,现在使用错误数量的参数调用 SELECT CHARMATCH()
返回一个空集。为什么不显示错误?
【问题讨论】:
【参考方案1】:你总是在charmatch_init()中返回EXIT_SUCCESS,但是
"如果没有发生错误,初始化函数应该返回 0,否则返回 1。如果发生错误,xxx_init() 应该在 message 参数中存储一个以 null 结尾的错误消息。"
http://dev.mysql.com/doc/refman/5.0/en/udf-return-values.html
我想这就是您的错误消息被忽略的原因。
【讨论】:
谢谢,这就是问题所在。我相应地更改了返回值,但没有显示错误消息。 我的第二个猜测是它与 strncpy() 有关,使用此函数,只有当源中 C 字符串的长度小于传递的数字时,目的地才会以空值结尾。您可以尝试将 strncpy() 的长度设置为 MYSQL_ERRMSG_SIZE 吗? 你也知道为什么mysql在cli中显示我的udf的错误,而不是在php脚本中(例如phpMyAdmin)吗? ***.com/questions/4735924/… ? 对不起,我有点太含糊了。它返回一个完全有效的响应,尽管是一个空响应。没有返回错误。当我调用SELECT CHARMATCH(), foo.* FROM foo;
时,也没有返回任何结果。已经很晚了,所以我无法在我的任何应用程序中对此进行测试,但我假设它们也会静默中断。以上是关于my_udf_init 未调用的主要内容,如果未能解决你的问题,请参考以下文章
numberOfRowsInSection 已调用但 cellForRowAt 未调用
调用 textFieldShouldBeginEditing,未调用 textFieldDidBeginEditing
未调用 cellForRowAtIndexPath 但调用 numberOfRowsInSection
调用 ViewDidLoad 但未调用 ViewWillAppear
未调用 UIcollectionView 的 didDeselectItemAt 但调用了 didSelectItemAt?