Справочное руководство по MySQL версии 4.1.1-alpha


         

для задания максимальной длины результата;


для задания максимальной длины результата;

  • для задания (для REAL-функций) максимального числа десятичных знаков после запятой;

  • для указания, может ли результатом быть NULL.
    xxx_deinit() (необязательная)
    Функция деинициализации для xxx(). Должна освобождать всю память, выделенную функцией инициализации.
    При запуске SQL-команды XXX() MySQL вызывает функцию инициализации xxx_init(), чтобы дать ей возможность выполнить все необходимые установки, такие как проверка аргументов и распределение памяти. Если xxx_init() возвращает ошибку, то выполнение SQL-команды прерывается с сообщением об ошибке, а главная функция и функция деинициализации не вызываются. В противном случае для каждой строки вызывается главная функция xxx(). После того как будут обработаны все строки, вызывается функция деинициализации xxx_deinit(), чтобы выполнить необходимую очистку.
    Для агрегатных функций (подобных SUM()) необходимо также подготовить следующие функции:
    xxx_reset() (обязательная)
    Сбрасывает сумму и обрабатывает аргумент как начальное значение для новой группы. xxx_add() (обязательная)
    Добавляет аргумент к имеющейся сумме.
    При использовании агрегатных UDF-функций MySQL работает следующим образом:


    1. Вызывается xxx_init(), чтобы агрегатная функция могла распределить память, которая понадобится для хранения результатов.

    2. Таблица сортируется в соответствии с выражением GROUP BY.

    3. Для первой строки новой группы вызывается функция xxx_reset().

    4. Для каждой новой строки, принадлежащей к той же группе, вызывается функция xxx_add().

    5. Когда группа меняется, или после завершения обработки последней строки вызывается xxx() для получения итога.

    6. Повторяются шаги 3-5, пока не будут обработаны все строки.

    7. Вызывается xxx_deinit(), чтобы UDF могла освободить всю распределенную ею память.
      Все функции должны поддерживать многопоточность (не только главная, но также и функции инициализации и деинициализации). Это означает, что непозволительно распределять какие-либо глобальные или статические переменные с изменяющимися значениями! Если требуется память, то ее следует распределять в xxx_init() и освобождать в xxx_deinit().

      Содержание  Назад  Вперед