为什么MySQL UDF会返回随机数据?

时间:2015-09-04 13:08:51

标签: mysql c udf

有关出现问题的系统的信息:

操作系统:Debian 8.1 64位 - MySQL版本:5.5.44 - GCC:4.9.2

我正在创建一个简单的UDF函数,它将返回字符串Hello World。问题是它会返回Hello World,它会连续出现,有一个长随机二进制字符串,其中包含可变大小的随机数据,它将从执行变为执行。

hello_world.c

#ifdef STANDARD
/* STANDARD is defined, 
don't use any mysql functions */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifdef __WIN__
typedef unsigned __int64 ulonglong; /* Microsofts 64 bit types */
typedef __int64 longlong;
#else
typedef unsigned long long ulonglong;
typedef long long longlong;
#endif /*__WIN__*/
#else
#include <my_global.h>
#include <my_sys.h>
#if defined(MYSQL_SERVER)
#include <m_string.h>      /* To get strmov() */
#else
/* when compiled as standalone */
#include <string.h>
#define strmov(a,b) stpcpy(a,b)
#define bzero(a,b) memset(a,0,b)
#endif
#endif
#include <mysql.h>
#include <ctype.h>

#ifdef _WIN32
/* inet_aton needs winsock library */
#pragma comment(lib, "ws2_32")
#endif

#ifdef HAVE_DLOPEN

#if !defined(HAVE_GETHOSTBYADDR_R) || !defined(HAVE_SOLARIS_STYLE_GETHOST)
static pthread_mutex_t LOCK_hostname;
#endif

my_bool hello_world_init(UDF_INIT* initid, UDF_ARGS* args __attribute__((unused)),
                     char* is_null __attribute__((unused)), char* message __attribute__((unused)))
{
   return 0;
}

void hello_world_deinit(UDF_INIT* initid, UDF_ARGS* args __attribute__((unused)),
                     char* is_null __attribute__((unused)), char* message __attribute__((unused)))
{}

char* hello_world(UDF_INIT *initid __attribute__((unused)),
               UDF_ARGS *args, char *result, unsigned long *length,
               char *is_null, char *message __attribute__((unused)))
{
    char* hello = "Hello World";

    return hello;
}

#endif /* HAVE_DLOPEN */

我尝试使用相同的输出以两种不同的方式编译源:

gcc $(mysql_config --cflags) -shared -fPIC -o hello_world.so hello_world.c

gcc -shared -fPIC -o hello_world.so helloworld.c -I/usr/include/mysql

我将UDF共享库包含到/usr/lib/mysql/plugin并在MySQL中创建了该函数:CREATE FUNCTION hello_world RETURNS STRING SONAME "hello_world.so";

一切都非常顺利,执行函数时出现问题:

示例输出:

| Hello World    ;,      ��   �����              x
 �  $     ���0    FJ
V                      � ?;      D   ���    A�C
       d   
Q          ��            �       
                               ���o                                                                                                                                                                                                                |

可能是什么问题?

谢谢。

2 个答案:

答案 0 :(得分:2)

您没有正确调用UDF调用。每the documentation

  

主函数xxx()的返回值是函数值,用于   长而双重的功能。字符串函数应该返回一个   指向结果的指针,并将* length设置为长度(以字节为单位)   回报价值。例如:

memcpy(result, "result string", 13);
*length = 13;

该文档还有很多内容。

答案 1 :(得分:0)

MySQL不在C字符串中使用null终止符。 UDF接收参数unsigned long *length,您必须设置此参数。

*length = strlen(hello);
return hello;