Функция инициализации должна возвращать 0
, если ошибок нет, и 1
в
противном случае. Если происходит ошибка, xxx_init()
должна поместить
сообщение об ошибке с завершающим '\0'
в параметр message. Сообщение будет
возвращено клиенту. Буфер сообщения имеет длину MYSQL_ERRMSG_SIZE
символов, но надо стараться, чтобы сообщение не превышало 80 символов -
для соответствия ширине стандартного экрана терминала.
Возвращаемое главной функцией xxx()
значение является значением функции
для функций long long
и double
. Строковые функции должны возвращать
указатель на результат и помещать длину строки в аргумент length
.
Эти величины следует устанавливать равными содержимому и длине возвращаемого значения. К примеру:
memcpy(result, "result string", 13); *length = 13;
Размер буфера result
, передаваемого вычислительной функции, составляет
255 байтов. Если этого достаточно для полученного результата, то о
распределении памяти для результатов беспокоиться нечего.
Если строковая функция должна возвращать строку длиннее, чем 255 байтов,
то для строки необходимо выделять память с помощью malloc()
в функции
xxx_init()
или в функции xxx()
и освобождать ее в функции xxx_deinit()
.
Указатель на распределенную память можно сохранить в поле ptr
структуры
UDF_INIT
, чтобы в последующих вызовах xxx()
использовать эту память
повторно (see Раздел 9.2.2.1, «Последовательность вызова UDF для простых функций».
Чтобы указать в главной функции на возврат значения NULL
, is_null
устанавливается в 1
:
*is_null = 1;
Чтобы указать в главной функции на возврат ошибки, в 1
устанавливается
параметр error
:
*error = 1;
Если xxx()
устанавливает для какой-либо строки *error
в 1
, то значение
функции будет NULL
для этой и всех последующих строк, обрабатываемых
командой, в которой вызывается XXX()
(для последующих строк xxx()
даже не
будет вызываться). Примечание: в версиях MySQL до 3.22.10 было необходимо
устанавливать как *error
так и *is_null
:
*error = 1; *is_null = 1;