CREATE LANGUAGE

Определяет новый процедурный язык.

Обзор

CREATE [ OR REPLACE ] [ PROCEDURAL ] LANGUAGE <name>

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

Описание

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

Примечание!
Процедурные языки для Database реализованы как «расширения» и поэтому должны устанавливаться с помощью команды CREATE EXTENSION, а не CREATE LANGUAGE. Прямое использование команды CREATE LANGUAGE следует ограничить скриптами установки расширений. Если в вашей базе данных присутствует «простой» (не расширение) язык, возможно, в результате обновления, вы можете преобразовать его в расширение с помощью CREATE EXTENSION <langname> FROM unpackaged.

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

Существует две формы команды CREATE LANGUAGE. В первой форме пользователь указывает только имя желаемого языка, а сервер Database обращается к системному каталогу pg_pltemplate, чтобы определить правильные параметры. Во второй форме пользователь указывает параметры языка вместе с его именем. Вторая форма может использоваться для создания языка, который не определён в pg_pltemplate, однако такой подход считается устаревшим.

Если сервер находит запись в каталоге pg_pltemplate для указанного имени языка, он будет использовать данные из этого каталога, даже если команда содержит параметры языка. Это поведение упрощает загрузку старых дампов, в которых, вероятно, содержится устаревшая информация о функциях поддержки языков.

Обычно пользователь должен обладать привилегией суперпользователя Database, чтобы зарегистрировать новый язык. Однако владелец базы данных может зарегистрировать новый язык в этой базе данных, если язык указан в каталоге pg_pltemplate и помечен как разрешённый для создания владельцами баз данных (атрибут tmpldbacreate имеет значение true). По умолчанию владельцы баз данных могут создавать доверенные языки, но это можно изменить суперпользователями путём редактирования содержимого pg_pltemplate. Создатель языка становится его владельцем и в дальнейшем может удалить его, переименовать или передать другому владельцу.

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

Параметры

  • TRUSTED
    • Ключевое слово TRUSTED указывает, что язык не предоставляет доступ к данным, к которым пользователь не имел бы доступа иным способом. Если это ключевое слово опущено при регистрации языка, только пользователи с привилегией суперпользователя Database смогут использовать этот язык для создания новых функций.
  • PROCEDURAL
    • Это служебное слово, не влияющее на поведение команды.
  • name
    • Имя нового процедурного языка. Имя должно быть уникальным среди всех языков в базе данных.
    • Для обратной совместимости имя можно заключать в одинарные кавычки.
  • HANDLER call_handler
    • Имя ранее зарегистрированной функции, которая будет вызываться для выполнения функций на данном процедурном языке. Функция-обработчик для процедурного языка должна быть написана на компилируемом языке, таком как C, с соглашением вызова версии 1, и зарегистрирована в Database как функция без аргументов, возвращающая тип language_handler — фиктивный тип, используемый исключительно для идентификации функции как обработчика вызовов.
  • INLINE inline_handler
    • Имя ранее зарегистрированной функции, которая вызывается для выполнения анонимного блока кода на этом языке, созданного с помощью команды DO. Если функция inline_handler не указана, язык не поддерживает анонимные блоки кода. Функция-обработчик должна принимать один аргумент типа internal — внутреннее представление команды DO. Обычно функция возвращает void. Возвращаемое значение обработчика игнорируется.
  • VALIDATOR valfunction
    • Имя ранее зарегистрированной функции, которая вызывается при создании новой функции на этом языке для её проверки. Если функция-валидатор не указана, Database не будет проверять новую функцию при её создании. Функция-валидатор должна принимать один аргумент типа oid — OID создаваемой функции — и обычно возвращать void.
    • Функция-валидатор обычно проверяет тело функции на синтаксическую корректность, но также может анализировать и другие свойства функции, например, возможность языка работать с определёнными типами аргументов. Чтобы сообщить об ошибке, функция-валидатор должна использовать функцию ereport(). Возвращаемое значение функции игнорируется.

      Примечание! Параметр TRUSTED и имена функций поддержки игнорируются, если сервер имеет запись для указанного имени языка в pg_pltemplate.

Замечания

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

Информация об установленных языках хранится в системном каталоге pg_language. Кроме того, команда psql \dL выводит список установленных языков.

Чтобы создавать функции на процедурном языке, пользователь должен иметь привилегию USAGE для этого языка. По умолчанию для доверенных языков USAGE предоставляется PUBLIC (всем). Эту привилегию можно отозвать при необходимости.

Процедурные языки являются локальными для отдельных баз данных. Однако язык можно установить в базу данных template1, что обеспечит его автоматическое наличие во всех последующих базах данных.

Функция-обработчик вызова, функция-обработчик встроенного кода (если есть) и функция-валидатор (если есть) должны уже существовать, если в pg_pltemplate нет записи для данного языка. Но если запись есть, функции не обязаны существовать заранее; они будут автоматически определены, если отсутствуют в базе данных. (Это может привести к сбою команды CREATE LANGUAGE, если разделяемая библиотека, реализующая язык, недоступна в установке.)

Примеры

Рекомендуемый способ создания любого стандартного процедурного языка — использовать CREATE EXTENSION вместо CREATE LANGUAGE. Например:

CREATE EXTENSION plperl;

Для языка, отсутствующего в каталоге pg_pltemplate, требуется следующая последовательность действий:

CREATE FUNCTION plsample_call_handler() RETURNS 
language_handler
    AS '$libdir/plsample'
    LANGUAGE C;
CREATE LANGUAGE plsample
    HANDLER plsample_call_handler;

Совместимость

CREATE LANGUAGE является расширением Database.

Смотрите также

ALTER LANGUAGE, CREATE EXTENSION, CREATE FUNCTION, DROP LANGUAGE, GRANT, DO