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