9.2.2.2 Последовательность вызова UDF для агрегатных функций
Ниже приведено описание функций, которые необходимо определить при
создании агрегатной UDF-функции.
char *xxx_reset(UDF_INIT *initid, UDF_ARGS *args,
char *is_null, char *error);
Эта функция вызывается, когда MySQL находит первую строку в новой группе.
В функции необходимо сбросить все внутренние переменные, в которых
накапливаются значения, и затем установить переданный аргумент как первый
аргумент в группе.
Во многих случаях это реализуется путем сброса всех переменных и
последующего вызова xxx_add()
.
char *xxx_add(UDF_INIT *initid, UDF_ARGS *args,
char *is_null, char *error);
Эта функция вызывается для всех строк, принадлежащих к одной группе, за
исключением первой. В функции к внутренней накопительной переменной
следует добавить значение UDF_ARGS
.
Функция xxx()
должна быть объявлена точно так же, как это делается при
определении простой UDF-функции (see section 9.2.2.1 Последовательность вызова UDF для простых функций).
Вызов этой функции происходит, когда все строки в группе обработаны.
Обычно функция не должна обращаться к переменной args
, а возвращаемое
значение должно базироваться на внутренних накопительных переменных.
Какая бы то ни было, обработка аргументов в xxx_reset()
и xxx_add()
должна
проводиться точно так же, как для нормальных UDF-функций (see section 9.2.2.3 Обработка аргументов).
Организация возврата значений в xxx()
эквивалентна используемой для
нормальной UDF (see section 9.2.2.4 Возвращаемые значения и обработка ошибок).
Аргументы-указатели is_null
и error
одинаковы для всех вызовов
xxx_reset()
, xxx_add()
и xxx()
. Их можно использовать для запоминания
того, что произошла ошибка, или когда функция xxx()
должна возвращать
NULL
. Заметьте, что сохранять строку в *error
нельзя! Это всего лишь
1-байтовый флаг!
is_null
сбрасывается для каждой группы (перед вызовом xxx_reset()
). error
не сбрасывается никогда.
Если is_null
или error
окажется установленным после xxx()
, MySQL вернет
NULL
в качестве результата групповой функции.