适用于Windows的最基本的MySQL UDF代码

时间:2017-03-18 14:27:16

标签: mysql udf

我正在尝试为MySQL创建最基本的用户定义函数。

#include <mysql.h>

extern "C" {
    my_bool foo_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
    char *foo(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
}

my_bool foo_init(UDF_INIT *initid, UDF_ARGS *args, char *message) {
    return 0;
}

char *foo(UDF_INIT *initid, UDF_ARGS *args,  char *is_null, char *error) {
    return "";
}

它编译得很好,但是当我尝试从中创建函数时

CREATE FUNCTION foo RETURNS STRING SONAME "mysql_plugin2.dll"

它说SQL Error (1127): Can't find symbol 'foo' in library

1 个答案:

答案 0 :(得分:1)

  1. foo()函数必须更改为char *foo(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
  2. 添加foo_deinit()函数。 Mysql UDF需要3个函数,其名称如udf_name_initudf_nameudf_name_deinit
  3. 编译并将dll文件放在<mysql_installation_folder>/lib/plugin/
  4. 以下代码尚未经过测试,但应该可以使用。

    #include <mysql.h>
    
    my_bool
    foo_init(UDF_INIT *initid,
             UDF_ARGS *args,
             char     *message)
    {
        return 0;
    }
    
    char *
    foo(UDF_INIT      *initid,
        UDF_ARGS      *args,
        char          *result,
        unsigned long *length,
        char          *is_null,
        char          *error)
    {
         // specified the return string length
         // see item_func.cc line #3440 and #3454 
         // https://github.com/MariaDB/server/blob/9cc7789e9084e7d59a43f9560870e496843535f9/sql/item_func.cc#L3440
         *length = 0;
         return "";
    }
    
    void
    foo_deinit(UDF_INIT *initid)
    {
        // nothing...
    }