Документация MySQL
Для того чтобы работал механизм UDF, функции должны быть написаны на C
или на C++, а используемая операционная система должна поддерживать
динамическую загрузку. В поставку исходного кода входит файл
'sql/udf_example.cc'
, в котором определены пять новых функций. К этому файлу
следует обращаться, если нужно узнать, как работает соглашение о вызовах
UDF.
имел возможность использовать UDF-функции, необходимо
сконфигурировать MySQL с
. Причина здесь в
том, что на многих платформах (включая Linux) можно загружать динамическую
библиотеку (посредством
) из статически скомпонованной программы,
получаемой при использовании
. Если есть
потребность использовать UDF, которой нужно обращаться к символам из
mysqld (как в примере функции
'sql/udf_example.cc'
, которая
использует
), то программу необходимо компоновать с
).
Для каждой функции, которую предполагается использовать в командах SQL,
следует определять соответствующие функции C (или C++). В дальнейшем в
качестве имени для примера функции мы будем использовать имя xxx. Чтобы
различать применение в SQL и C/C++, для вызова SQL-функции мы будем
использовать обозначение
(прописными), а
(строчными) - для
вызова функции C/C++.
Главная функция. Она вычисляет результат функции. Соответствие между
типами SQL и возвращаемым типом функции C/C++ показано в приведенной ниже
таблице:
. Может быть использована:
для проверки того, что аргументы имеют требуемый тип или, в противном
случае, для указания MySQL приводить аргументы к нужным типам при вызове
главной функции;
для распределения всей памяти, требуемой основной функцией;
для указания, может ли результатом быть NULL.
. Должна освобождать всю память,
выделенную функцией инициализации.
, чтобы дать ей возможность выполнить все необходимые установки,
такие как проверка аргументов и распределение памяти. Если
возвращает ошибку, то выполнение SQL-команды прерывается с сообщением об
ошибке, а главная функция и функция деинициализации не вызываются. В
противном случае для каждой строки вызывается главная функция
. После
того как будут обработаны все строки, вызывается функция деинициализации
, чтобы выполнить необходимую очистку.
Сбрасывает сумму и обрабатывает аргумент как начальное значение для новой
группы.
Добавляет аргумент к имеющейся сумме.
, чтобы агрегатная функция могла распределить
память, которая понадобится для хранения результатов.
.
.
Для каждой новой строки, принадлежащей к той же группе, вызывается
функция
.
Когда группа меняется, или после завершения обработки последней строки
вызывается
для получения итога.
Повторяются шаги 3-5, пока не будут обработаны все строки.
, чтобы UDF могла освободить всю распределенную
ею память.
Все функции должны поддерживать многопоточность (не только главная, но
также и функции инициализации и деинициализации). Это означает, что
непозволительно распределять какие-либо глобальные или статические
переменные с изменяющимися значениями! Если требуется память, то ее
следует распределять в
.
Рубрики: Без рубрики |

