CREATE LANGUAGE#

CREATE LANGUAGE

CREATE LANGUAGE

CREATE LANGUAGE — определить новый процедурный язык

Синтаксис

CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name
    HANDLER call_handler [ INLINE inline_handler ] [ VALIDATOR valfunction ]
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name

Описание

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.