Главная функция должна быть определена, как это показано здесь. Обратите
внимание на то, что тип возвращаемого значения и параметры варьируются в
зависимости от того, как определена SQL-функция XXX()
в команде CREATE FUNCTION
- как возвращающая STRING
, INTEGER
или REAL
:
Для STRING
-функций:
char *xxx(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error);
Для INTEGER
-функций:
long long xxx(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
Для REAL
-функций:
double xxx(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
Функции инициализации и деинициализации объявляются следующим образом:
my_bool xxx_init(UDF_INIT *initid, UDF_ARGS *args, char *message); void xxx_deinit(UDF_INIT *initid);
Параметр initid
передается всем трем функциям. Он указывает на структуру
UDF_INIT
, используемую для передачи информации между функциями. Поля
структуры UDF_INIT
перечислены ниже. Функция инициализации должна
заполнять все поля, которые ей следует изменить (чтобы использовать для
поля значение по умолчанию, его необходимо оставить в неизменном виде):
-
my_bool maybe_null
xxx_init()
должна устанавливатьmaybe_null
в1
, еслиxxx()
может возвращатьNULL
. Значение по умолчанию будет1
, если хоть один аргумент объявлен какmaybe_null
. -
unsigned int decimals
Количество знаков после запятой. По умолчанию используется максимальное количество знаков для аргументов, переданных в основную функцию. (Например, если функции передаются 1,34, 1,345 и 1,3, то значением по умолчанию будет 3, поскольку 1,345 имеет 3 знака после запятой.
-
unsigned int max_length
Максимальная длина строкового результата. Значение по умолчанию зависит от типа результата функции. Для строковых функций по умолчанию используется размер наиболее длинного аргумента. Для целочисленных функций значение по умолчанию составляет 21 цифру. Для вещественных функций по умолчанию берется 13 плюс количество знаков после запятой, которое задается
initid->decimals
(для числовых функций длина включает знак и символ десятичной точки). Если требуется возвращать значение типаBLOB
, то поле можно установить равным либо 65 Kб либо 16 Mб; эта память не распределяется, а применяется для определения того, какой использовать тип столбцов, если понадобится временно хранить данные. -
char *ptr
Указатель, используемый функцией по своему усмотрению. Например, функции могут применять
initid->ptr
для передачи между функциями распределенной памяти. Вxxx_init()
память распределяется и назначается этому указателю:initid->ptr = allocated_memory;
В
xxx()
иxxx_deinit()
должны обращаться кinitid->ptr
для использования или освобождения памяти.