CREATE LANGUAGE#
CREATE LANGUAGE
CREATE LANGUAGE — определить новый процедурный язык
Синтаксис
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEname
HANDLERcall_handler
[ INLINEinline_handler
] [ VALIDATORvalfunction
] CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEname
Описание
CREATE LANGUAGE
регистрирует новый процедурный язык в базе данных Tantor BE. В дальнейшем, в этом новом языке можно определить функции и процедуры.
CREATE LANGUAGE
эффективно связывает
имя языка с функцией(ями) обработчика, которые отвечают за выполнение
функций, написанных на этом языке. См. Глава 55
для получения дополнительной информации о обработчиках языка.
CREATE OR REPLACE LANGUAGE
создаст новый язык или заменит существующее определение. Если язык уже существует, его параметры будут обновлены в соответствии с командой, но владение и настройки разрешений языка не изменятся, и существующие функции, написанные на этом языке, считаются действительными.
Для регистрации нового языка или изменения параметров существующего языка необходимо обладать привилегией суперпользователя Tantor BE. Однако, после создания языка, его владение можно передать не-суперпользователю, который может удалить его, изменить его разрешения, переименовать его или передать его новому владельцу. (Однако, не следует передавать владение базовыми C-функциями не-суперпользователю, так как это создаст путь для повышения привилегий для данного пользователя).
Способ CREATE LANGUAGE
, который не предоставляет
никакой обработчик функции, является устаревшим. Для обратной совместимости
со старыми файлами дампа он интерпретируется как CREATE EXTENSION
.
Это будет работать, если язык был упакован в расширение с
тем же именем, что является обычным способом настройки
процедурных языков.
Параметры
TRUSTED
TRUSTED
указывает, что язык не предоставляет доступ к данным, к которым пользователь не имел бы доступа. Если это ключевое слово не указано при регистрации языка, только пользователи с привилегией суперпользователя Tantor BE могут использовать этот язык для создания новых функций.PROCEDURAL
Это шумовое слово.
name
Имя нового процедурного языка. Имя должно быть уникальным среди языков в базе данных.
HANDLER
call_handler
call_handler
- это имя ранее зарегистрированной функции, которая будет вызываться для выполнения функций процедурного языка. Обработчик вызова для процедурного языка должен быть написан на компилируемом языке, таком как C с конвенцией вызова версии 1, и зарегистрирован в Tantor BE как функция, не принимающая аргументов и возвращающая типlanguage_handler
, плейсхолдерный тип, который просто используется для идентификации функции как обработчика вызова.INLINE
inline_handler
inline_handler
- это имя ранее зарегистрированной функции, которая будет вызываться для выполнения анонимного блока кода (командаDO
) на этом языке. Если не указана функцияinline_handler
, то язык не поддерживает анонимные блоки кода. Функция-обработчик должна принимать один аргумент типаinternal
, который будет внутренним представлением командыDO
, и обычно возвращаетvoid
. Возвращаемое значение обработчика игнорируется.VALIDATOR
valfunction
valfunction
- это имя ранее зарегистрированной функции, которая будет вызываться при создании новой функции на языке для проверки новой функции. Если не указана функция-валидатор, то новая функция не будет проверяться при ее создании. Функция-валидатор должна принимать один аргумент типаoid
, который будет являться OID создаваемой функции, и обычно возвращаетvoid
.Функция-валидатор обычно проверяет тело функции на синтаксическую корректность, но также может анализировать другие свойства функции, например, если язык не может обрабатывать определенные типы аргументов. Чтобы сигнализировать об ошибке, функция-валидатор должна использовать функцию
ereport()
. Возвращаемое значение функции игнорируется.
Примечания
Используйте DROP LANGUAGE
для удаления процедурных языков.
Системный каталог pg_language
(см. Раздел 50.29) содержит информацию о
установленных в настоящее время языках. Кроме того, команда psql
\dL
выводит список установленных языков.
Для создания функций на процедурном языке пользователь должен иметь привилегию USAGE
для этого языка. По умолчанию привилегия USAGE
предоставляется PUBLIC
(т.е. всем) для доверенных языков. При необходимости это можно отозвать.
Все процедурные языки являются локальными для отдельных баз данных.
Однако язык может быть установлен в базу данных template1
,
что позволит автоматически использовать его во всех последующих созданных базах данных.
Примеры
Минимальная последовательность для создания нового процедурного языка:
CREATE FUNCTION plsample_call_handler() RETURNS language_handler AS '$libdir/plsample' LANGUAGE C; CREATE LANGUAGE plsample HANDLER plsample_call_handler;
Обычно это будет записано в скрипте создания расширения, и пользователи будут делать это для установки расширения:
CREATE EXTENSION plsample;
Совместимость
CREATE LANGUAGE
- это расширение Tantor BE.