Ниже приведено описание функций, которые необходимо определить при создании агрегатной 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 Раздел 9.2.2.1, «Последовательность вызова UDF для простых функций»).
Вызов этой функции происходит, когда все строки в группе обработаны.
Обычно функция не должна обращаться к переменной args, а возвращаемое
значение должно базироваться на внутренних накопительных переменных.
Какая бы то ни было, обработка аргументов в xxx_reset() и xxx_add() должна
проводиться точно так же, как для нормальных UDF-функций (see Раздел 9.2.2.3, «Обработка аргументов»).
Организация возврата значений в xxx() эквивалентна используемой для
нормальной UDF (see Раздел 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 в качестве результата групповой функции.