CREATE LANGUAGE

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


Синтаксис

CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE имя
    HANDLER обработчик_вызова [ INLINE обработчик_внедренного_кода ] [ VALIDATOR функция_валидатор ]
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE имя

Описание

Команда CREATE LANGUAGE регистрирует в базе данных QHB новый процедурный язык. Впоследствии на этом новом языке могут быть определены функции и процедуры.

В сущности, CREATE LANGUAGE связывает имя языка с функциями-обработчиками, которые отвечают за выполнение функций, написанных на этом языке. Дополнительную информацию о языковых обработчиках см. в главе Написание обработчика процедурного языка.

Команда CREATE OR REPLACE LANGUAGE либо создаст новый язык, либо заменит существующее определение. Если язык уже существует, его параметры изменятся в соответствии со значениями, указанными в команде, но при этом владелец языка и права доступа не меняются, а все существующие функции, написанные на этом языке, по-прежнему считаются действительными.

Чтобы зарегистрировать новый язык или изменить параметры существующего языка, нужно иметь права суперпользователя QHB. Однако после создания языка его владельцем можно назначить и обычного пользователя, который затем может его удалить или переименовать, изменить права доступа к нему или назначить нового владельца. (Однако назначайте обычного пользователя владельцем нижележащих функций на С, поскольку это откроет перед ним возможность повысить свои права.)

Форма CREATE LANGUAGE, которая не задает никакую функцию-обработчика, является устаревшей. Для обратной совместимости со старыми файлами дампа она интерпретируется как CREATE EXTENTION. Это сработает, если язык был упакован в расширение с тем же именем — как обычно и устанавливаются процедурные языки.


Параметры

TRUSTED

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

PROCEDURAL

Неучитываемое слово.

имя

Имя нового процедурного языка. Оно должно быть уникальным среди всех языков в этой базе данных.

HANDLER обработчик_вызова

обработчик_вызова — это имя ранее зарегистрированной функции, которая будет вызываться для выполнения функций на этом процедурном языке. Обработчик вызова для процедурного языка должен быть написан на компилируемом языке, например, C с соглашениями о вызовах версии 1, и зарегистрирован в QHB как функция, не принимающая аргументы и возвращающая фиктивный тип language_handler, который просто используется для идентификации функции в качестве обработчика вызова.

INLINE обработчик_внедренного_кода

обработчик_внедренного_кода — это имя ранее зарегистрированной функции, которая будет вызываться для выполнения анонимного блока кода (команды DO) на этом языке. Если функция обработчик_внедренного_кода не указана, язык не поддерживает анонимные блоки кода. Функция-обработчик должна принимать один аргумент типа internal, который будет внутренним представлением команды DO, и обычно возвращает тип void. Возвращаемое значение обработчика игнорируется.

VALIDATOR функция_валидатор

функция_валидатор — это имя ранее зарегистрированной функции, которая будет вызываться при создании новой функции на языке, чтобы ее проверить. Если функция- валидатор не указана, то новая функция при создании проверяться не будет. Функция- валидатор должна принимать один аргумент типа oid, который станет идентификатором создаваемой функции, и обычно возвращает void.
Функция-валидатор обычно проверяет синтаксическую корректность тела функции, но также может анализировать и другие свойства функции, например, может ли этот язык обрабатывать определенные типы аргументов. Чтобы сигнализировать об ошибке, функция-валидатор должна использовать функцию ereport(). Возвращаемое значение этой функции игнорируется.


Примечания

Для удаления процедурных языков воспользуйтесь командой DROP LANGUAGE.

Информация о текущих установленных языках содержится в системном каталоге pg_language. Кроме того, команда 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 является расширением QHB.


См. также

ALTER LANGUAGE, CREATE FUNCTION, DROP LANGUAGE, GRANT, REVOKE