Spec-Zone .ru
спецификации, руководства, описания, API
|
Чтобы добавить новую собственную функцию MySQL, используйте процедуру, описанную здесь, который требует, чтобы Вы использовали исходное распределение. Невозможно добавить собственные функции к двоичному распределению, потому что необходимо изменить исходный код MySQL и MySQL компиляции из измененного источника. Если Вы переходите на другую версию MySQL (например, когда новая версия выпускается), следует повторить процедуру с новой версией.
Если новая собственная функция будет упомянута в операторах, которые будут тиражированы в ведомые серверы, следует гарантировать, что каждый ведомый сервер также имеет функцию в наличии. Иначе, репликация перестанет работать на ведомых устройствах, когда они попытаются вызвать функцию.
Чтобы добавить новую собственную функцию, следуйте за этими шагами, чтобы изменить исходные файлы в sql
каталог:
Создайте подкласс для функции в item_create.cc
:
Если функция берет постоянное число параметров, создайте подкласс Create_func_arg0
, Create_func_arg1
,
Create_func_arg2
, или Create_func_arg3
, соответственно, в зависимости от того,
берет ли функция нуль, один, два, или три параметра. Для примеров см. Create_func_uuid
,
Create_func_abs
, Create_func_pow
,
и Create_func_lpad
классы.
Если функция берет переменное число параметров, создайте подкласс Create_native_func
. Для примера см. Create_func_concat
.
Чтобы обеспечить имя, которым функция может быть упомянута в SQL-операторах,
зарегистрируйте имя в item_create.cc
добавляя строку к этому массиву:
static Native_func_registry func_array[]
Можно зарегистрировать несколько имен для той же самой функции. Например, см. строки для "LCASE"
и "LOWER"
,
которые являются псевдонимами для Create_func_lcase
.
В item_func.h
, объявите class, наследовавшийся от
Item_num_func
или Item_str_func
В зависимости
от того, возвращает ли Ваша функция число или строку.
В item_func.cc
, добавьте одно из следующих
объявлений, в зависимости от того, определяете ли Вы числовую или строковую функцию:
double Item_func_newname::val()longlong Item_func_newname::val_int()String *Item_func_newname::Str(String *str)
Если Вы наследовали свой объект от какого-либо из стандартных элементов (как Item_num_func
),
вероятно, только необходимо определить одну из этих функций и позволить родительскому объекту
заботиться о других функциях. Например, Item_str_func
class определяет
a val()
функция, которая выполняется atof()
на значении, возвращенном ::str()
.
Если функция недетерминирована, включайте следующий оператор в конструктора элемента, чтобы указать, что функциональные результаты не должны кэшироваться:
current_thd->lex->safe_to_cache_query=0;
Функция недетерминирована, если, учитывая фиксированные значения для ее параметров, она может возвратить различные результаты для различных вызовов.
Следует, вероятно, также определить следующую объектную функцию:
void Item_func_newname::fix_length_and_dec()
Эта функция должна, по крайней мере, вычислить max_length
основанный на
данных параметрах. max_length
максимальное количество символов, которые
может возвратить функция. Эта функция должна также установить maybe_null =
0
если основная функция не может возвратить a 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
.
Все текущие строковые функции пытаются избежать не выделять память если абсолютно необходимый!