我正在尝试为mysql编写一个自定义的用例定义函数,所以我以http://www.mysqludf.org/index.php中的str_ucwords函数为例来构建我自己的函数。
my_bool str_ucwords_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
{
/* make sure user has provided exactly one string argument */
if (args->arg_count != 1 || args->arg_type[0] != STRING_RESULT || args->args[0] == NULL)
{
strcpy(message,"str_ucwords requires one string argument");
return 1;
}
/* str_ucwords() will not be returning null */
initid->maybe_null=0;
return 0;
}
char *str_ucwords(UDF_INIT *initid, UDF_ARGS *args,
char *result, unsigned long *res_length,
char *null_value, char *error)
{
int i;
int new_word = 0;
// copy the argument string into result
strncpy(result, args->args[0], args->lengths[0]);
*res_length = args->lengths[0];
// capitalize the first character of each word in the string
for (i = 0; i < *res_length; i++)
{
if (my_isalpha(&my_charset_latin1, result[i]))
{
if (!new_word)
{
new_word = 1;
result[i] = my_toupper(&my_charset_latin1, result[i]);
}
}
else
{
new_word = 0;
}
}
return result;
}
如果我尝试select str_ucwords("test string");
,这样可以正常工作,但如果我尝试从像select str_ucwords(name) from name;
这样的数据库中选择一个字段,我什么也没有回复。
如何更改此功能以便我可以从数据库中的字段中提取数据?
我已尝试从init函数中删除args->arg_type[0] != STRING_RESULT
。
答案 0 :(得分:2)
问题不在于参数的类型,而是调用NULL
时str_ucwords_init
(因为在检索任何行之前调用str_ucwords_init
)。要让str_ucwords
使用字段,您必须通过在initid->maybe_null
函数中将_init
设置为1并将*null_value
设置为1(以及{{1}来支持NULL值当实际参数为空时,在result
中为NULL,尽管这可能没有必要。
str_ucwords
lib_mysqludf_str的后续版本应该支持函数中的NULL值而不进行更改,这意味着它们也应该使用表列。