CREATE LANGUAGE

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

Синтаксис

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

Описание

Команда 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. Кроме того, команда qsql \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