9.2. Добавление новых функций в MySQL
9.2.2. Добавление новой определяемой пользователем функции
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 Раздел 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 в качестве результата групповой функции.
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|