9.2.2 Добавление новой определяемой пользователем функции | Оглавление | 9.2.2.2 Последовательность вызова UDF для агрегатных функций |
Главная функция должна быть определена, как это показано здесь. Обратите
внимание на то, что тип возвращаемого значения и параметры варьируются в
зависимости от того, как определена 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
unsigned int max_length
initid->decimals
(для числовых функций длина включает знак и символ
десятичной точки). Если требуется возвращать значение типа BLOB
, то поле
можно установить равным либо 65 Kб либо 16 Mб; эта память не
распределяется, а применяется для определения того, какой использовать тип
столбцов, если понадобится временно хранить данные.
char *ptr
initid->ptr
для передачи между функциями распределенной
памяти. В xxx_init()
память распределяется и назначается этому указателю:
initid->ptr = allocated_memory;В
xxx()
и xxx_deinit()
должны обращаться к initid->ptr
для использования
или освобождения памяти.
9.2.2 Добавление новой определяемой пользователем функции | Оглавление | 9.2.2.2 Последовательность вызова UDF для агрегатных функций |