Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

box.schema.func.create()

box.schema.func.create(func_name [, function_options])

Создает функцию. Созданная функция может использоваться в различных сценариях, например, в ограничениях полей и кортежей или функциональных индексах.

С помощью параметра body функцию можно сделать постоянной. В этом случае функция является "постоянной", так как ее определение хранится в снимке (системном спейсе box.space._func) и может быть восстановлено при перезапуске сервера.

Параметры:

Возвращает

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: false  is_deterministic: false  id: 2  setuid: false  body: function(a, b) return a + b end  name: sum  language: 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

: function_options Таблица, содержащая параметры, передаваемые функции box.schema.func.create(func-name [, function_options]).

if_not_exists

Определяет, следует ли избегать ошибки, если функция уже существует.

Тип: boolean

По умолчанию: false

setuid

При включении этого параметра вызывающий функцию рассматривается как ее создатель с полными привилегиями. Обратите внимание, что setuid работает только через бинарные порты. setuid не работает при вызове функции через административную консоль или внутри Lua-скрипта.

Тип: boolean

По умолчанию: false

language

Определяет язык функции. Возможные значения:

  • LUA: определить Lua-функцию в атрибуте body.

  • SQL_EXPR: определить SQL-выражение в атрибуте body. SQL-выражение может использоваться только как ограничение поля или кортежа.

  • C: импортировать C-функцию по ее имени из файла .so. О том, как вызывать C-код из Lua, см. в руководстве по C.

Тип: string

По умолчанию: LUA

is_sandboxed

Определяет, должна ли функция выполняться в изолированной среде. Это означает, что любые операции, обращающиеся к внешнему относительно песочницы миру, запрещены или не имеют эффекта. Следовательно, функция в песочнице может использовать только модули и функции, не влияющие на изоляцию:

assert, assert, error, ipairs, math.*, next, pairs, pcall, print, select, string.*, table.*, tonumber, tostring, type, unpack, xpcall, utf8.*.

Кроме того, функция в песочнице не может обращаться к глобальным переменным — они рассматриваются как локальные переменные, так как песочница создается с помощью setfenv. Таким образом, функция в песочнице не имеет состояния и является детерминированной.

Тип: boolean

По умолчанию: false

is_deterministic

Определяет, должна ли функция быть детерминированной.

Тип: boolean

По умолчанию: false

is_multikey

Если в определении функции для функционального индекса установлено значение true, функция возвращает несколько ключей. Подробности см. в примере.

Тип: boolean

По умолчанию: false

body

Определяет тело функции. Язык функции можно задать с помощью атрибута 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

takes_raw_args

Начиная с: 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

Определяет языки, с которых можно вызывать функцию.

Пример: exports = {'LUA', 'SQL'}

См. также: Вызов Lua-процедур из SQL

Тип: table

По умолчанию: {'LUA'}

param_list

Определяет имена типов Lua для каждого параметра функции.

Пример: param_list = {'number', 'number'}

См. также: Вызов Lua-процедур из SQL

Тип: table

returns

Определяет имя типа Lua для возвращаемого функцией значения.

Пример: returns = 'number'

См. также: Вызов Lua-процедур из SQL

Тип: string