9.2.2.5 Компиляция и установка определяемых пользователем функций | Оглавление | 9.3 Добавление новой процедуры в MySQL |
В этом разделе приведена процедура добавления новой ``родной'' функции. Следует учитывать, что в бинарную поставку ``родные'' функции добавить невозможно, поскольку эта процедура требует изменения исходного кода MySQL. Поэтому необходимо собственноручно компилировать MySQL из поставки исходного текста. Кроме того, при переходе на другую версию MySQL (например, при выпуске новой версии) все изменения придется повторить для этой новой версии.
Чтобы добавить новую ``родную'' функцию MySQL, необходимо выполнить следующие действия:
sql_functions[]
.
sql_functions[]
следует указать SYM(FUNC_ARG#)
(где # количество
аргументов) и добавить в `item_create.cc' функцию, создающую объект
функции. В качестве примеров можно рассмотреть ABS
и
create_funcs_abs()
. Если прототип функции сложный (например,
принимает переменное число аргументов), то следует добавить две
строки в `sql_yacc.yy'. Одна строка служит для указания препроцессору,
какой символ должен определить yacc
(строку следует добавить в
начало файла). Затем определяются параметры функции и правило
разбора simple_expr
пополняется "элементом" с этими параметрами.
Чтобы получить представление о том, как это делается, в качестве
примера просмотрите все вхождения ATAN
в `sql_yacc.yy'.
Item_num_func
или
Item_str_func
, в зависимости от того, какое значение возвращает
функция - числовое или строковое.
double Item_func_newname::val() longlong Item_func_newname::val_int() String *Item_func_newname::Str(String *str)Если объект наследуется от любого стандартного элемента (подобного
Item_num_func
), то, возможно, потребуется определить только одну из
перечисленных выше функций и возложить на родительский объект заботу об
остальных функциях. Например, класс Item_str_func
определяет функцию
val()
, выполняющую atof()
над значением, возвращенным ::str()
.
void Item_func_newname::fix_length_and_dec()Эта функция должна как минимум вычислять
max_length
на основе переданных
аргументов. max_length
является максимальным количеством символов, которое
может возвращать функция. Эта функция также должна устанавливать
maybe_null = 0
, если невозможно, чтобы главная функция возвратила значение
NULL
. Узнать, может ли какой-либо аргумент функции возвращать NULL
,
функция может путем проверки поля/переменной maybe_null
аргумента. В
качестве типичного примера того, как это делается, можно рассмотреть
Item_func_mod::fix_length_and_dec
.
Все функции должны поддерживать многопоточность (другими словами, непозволительно использовать какие-либо глобальные или статические переменные в функции без их защиты примитивами взаимного исключения).
Если желательно возвращать NULL
, из ::val()
, ::val_int()
или ::str()
, то
необходимо устанавливать null_value
в 1
и возвращать 0
.
Для функции объекта ::str()
существуют следующие дополнительные аспекты:
String *str
обеспечивает строковый буфер, который может быть
использован для размещения результата (дополнительную информацию о типе
String
можно найти в файле `sql_string.h').
::str()
должна возвращать строку, содержащую результат, или
(char*) 0
, если результат NULL
.
9.2.2.5 Компиляция и установка определяемых пользователем функций | Оглавление | 9.3 Добавление новой процедуры в MySQL |