Справочное руководство по MySQL

9.2.2.2 Последовательность вызова UDF для агрегатных функций

    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 в качестве результата групповой функции.




Наш баннер
Вы можете установить наш баннер на своем сайте или блоге, скопировав этот код:
RSS новости