box.schema.func.create()
Создает функцию. Созданная функция может использоваться в различных сценариях, например, в ограничениях полей и кортежей или функциональных индексах.
С помощью параметра body функцию можно сделать постоянной. В этом случае функция является "постоянной", так как ее определение хранится в снимке (системном спейсе box.space._func) и может быть восстановлено при перезапуске сервера.
Параметры:
func_name(string) — имя функции, которое должно соответствовать правилам именования объектовfunction_options(table) — см. function_options
Возвращает
nil
Пример 1: непостоянная Lua-функция
В примере ниже показано, как создать непостоянную Lua-функцию:
box.schema.func.create('calculate')box.schema.func.create('calculate', {if_not_exists = false})box.schema.func.create('calculate', {setuid = false})box.schema.func.create('calculate', {language = 'LUA'})
Пример 2: постоянная Lua-функция
В примере ниже показано, как создать постоянную Lua-функцию, просмотреть
ее определение с помощью box.func.{func-name} и вызвать эту функцию с
помощью box.func.{func-name}:call([parameters]):
tarantool> lua_code = [[function(a, b) return a + b end]]tarantool> box.schema.func.create('sum', {body = lua_code})tarantool> box.func.sum---- is_sandboxed: falseis_deterministic: falseid: 2setuid: falsebody: function(a, b) return a + b endname: sumlanguage: LUA...tarantool> box.func.sum:call({1, 2})---- 3...
Для вызова функций через net.box используйте
net_box:call().
{#box_schema-func_example-sql} Пример 3: постоянное SQL-выражение, используемое в ограничении кортежа
В приведенном ниже фрагменте кода определяется функция, которая проверяет данные кортежа с помощью SQL-выражения:
box.schema.func.create('check_person', {language = 'SQL_EXPR',is_deterministic = true,body = [["age" > 21 AND "name" != 'Admin']]})
Затем эта функция используется для создания ограничения кортежа:
local customers = box.schema.space.create('customers', { constraint = 'check_person' })customers:format({{ name = 'id', type = 'number' },{ name = 'name', type = 'string' },{ name = 'age', type = 'number' },})customers:create_index('primary', { parts = { 1 } })
При попытке вставить кортеж, не соответствующий требуемым критериям, возникает ошибка:
customers:insert { 2, "Bob", 18 }-- error: Check constraint 'check_person' failed for a tuple
: function_options Таблица, содержащая параметры, передаваемые функции box.schema.func.create(func-name [, function_options]).
Определяет, следует ли избегать ошибки, если функция уже существует.
Тип: boolean
По умолчанию: false
При включении этого параметра вызывающий функцию рассматривается как ее
создатель с полными привилегиями. Обратите внимание, что setuid
работает только через бинарные порты. setuid не
работает при вызове функции через
административную консоль или внутри Lua-скрипта.
Тип: boolean
По умолчанию: false
Определяет язык функции. Возможные значения:
-
LUA: определить Lua-функцию в атрибуте body. -
SQL_EXPR: определить SQL-выражение в атрибуте body. SQL-выражение может использоваться только как ограничение поля или кортежа. -
C: импортировать C-функцию по ее имени из файла.so. О том, как вызывать C-код из Lua, см. в руководстве по C.
Тип: string
По умолчанию: LUA
Определяет, должна ли функция выполняться в изолированной среде. Это означает, что любые операции, обращающиеся к внешнему относительно песочницы миру, запрещены или не имеют эффекта. Следовательно, функция в песочнице может использовать только модули и функции, не влияющие на изоляцию:
assert, assert, error, ipairs, math.*, next, pairs, pcall, print, select, string.*, table.*, tonumber, tostring, type, unpack, xpcall, utf8.*.
Кроме того, функция в песочнице не может обращаться к глобальным переменным — они рассматриваются как локальные переменные, так как песочница создается с помощью setfenv. Таким образом, функция в песочнице не имеет состояния и является детерминированной.
Тип: boolean
По умолчанию: false
Определяет, должна ли функция быть детерминированной.
Тип: boolean
По умолчанию: false
Если в определении функции для функционального индекса установлено
значение true, функция возвращает несколько ключей. Подробности см. в
примере.
Тип: boolean
По умолчанию: false
Определяет тело функции. Язык функции можно задать с помощью атрибута language.
В приведенном ниже фрагменте кода определяется функция-ограничение, которая проверяет данные кортежа с помощью Lua-функции:
box.schema.func.create('check_person', {language = 'LUA',is_deterministic = true,body = 'function(t, c) return (t.age >= 0 and #(t.name) > 3) end'})
В следующем примере для проверки данных кортежа используется SQL-выражение:
box.schema.func.create('check_person', {language = 'SQL_EXPR',is_deterministic = true,body = [["age" > 21 AND "name" != 'Admin']]})
Пример: Постоянное SQL-выражение, используемое в ограничении кортежа
Тип: string
По умолчанию: nil
Начиная с: 2.10.0
Если установлено значение true для Lua-функции и функция вызывается
через net.box (conn:call()) или через
box.func.<func-name>:call(), аргументы функции передаются в виде
объекта MsgPack:
local msgpack = require('msgpack')box.schema.func.create('my_func', {takes_raw_args = true})local my_func = function(mp)assert(msgpack.is_object(mp))local args = mp:decode() -- array of argumentsend
Если функция перенаправляет большую часть своих аргументов на другой экземпляр Tarantool или записывает их в базу данных, использование этого параметра может повысить производительность, так как пропускается декодирование данных MsgPack в Lua.
Тип: boolean
По умолчанию: false
Определяет языки, с которых можно вызывать функцию.
Пример: exports = {'LUA', 'SQL'}
См. также: Вызов Lua-процедур из SQL
Тип: table
По умолчанию: {'LUA'}
Определяет имена типов Lua для каждого параметра функции.
Пример: param_list = {'number', 'number'}
См. также: Вызов Lua-процедур из SQL
Тип: table
Определяет имя типа Lua для возвращаемого функцией значения.
Пример: returns = 'number'
См. также: Вызов Lua-процедур из SQL
Тип: string