Числовые значения возвращаются непосредственно, а строковые — через указатели. Программа MySQL резервирует 255 — символьный буфер для аргумента result. В аргументе length должен быть указан размер возвращаемого значения. Если размер превышает 255 байтов, нужно создать собственный буфер в инициализирующей функции и передать указатель на него в поле ptr структуры UDF_INIT. Описание полей структуры приведено в табл. 13.4.
Таблица 13.4.
Поле
Описание
my bool maybe null
Указывает на то, может ли функция возвращать пустое значение. Если один из аргументов функции может быть пустым, в это поле будет записана единица
unsigned int decimals
Содержит количество цифр после запятой, если функция возвращает числовое значение. Будет указана максимальная точность среди всех аргументов
unsigned int max length
Определяет максимальную длину возвращаемой строки
char *ptr
С помощью этого указателя осуществляется обмен данными между инициализирующей функцией и другими двумя функциями. Например, можно выделить блок памяти и записать сюда адрес этого блока
Если функция возвращает пустое значение, аргумент is_null должен быть равен 1. В случае ошибки в аргумент error записывается значение 1. В результате текущая запись и все последующие станут пустыми.
Описание структуры UDF_ARGS приведено в табл. 13.5. Через эту структуру программа MySQL передает аргументы функции.
Таблица 13.5.
unsigned int arg_count
Содержит число аргументов функции. Если это значение фиксировано, проверьте его в инициализирующей функции
enum Item_result *arg_type
Содержит массив типов аргументов. Возможные значения массива таковы: INT_RESULT, REAL RESULT иSTRING RESULT. Можно осуществлять проверку типов и в случае несовпадения либо возвращать признак ошибки, либо корректировать содержимое массива, приводя аргументы к нужному типу
char **args
Содержит массив значений аргументов. Если аргумент является строкой, в массиве будет храниться указатель на строку. Длины строковых аргументов приведены в массиве lengths. Если аргумент представляет собой целое число или число с плавающей запятой, приведите значение к типу longили double соответственно
unsigned long *lengths
Содержит массив длин аргументов. В инициализирующей функции эти значения устанавливаются по максимуму на основании определений столбцов. В основной функции длины строковых аргументов являются точными