Самый базовый код MySQL UDF для Windows

Я пытаюсь создать основную пользовательскую функцию для 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 ответ

  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_init, udf_name а также udf_name_deinit,
  3. Скомпилируйте и поместите файл dll под <mysql_installation_folder>/lib/plugin/,

следующий код не был протестирован, но он должен работать.

#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...
}
Другие вопросы по тегам