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 регистрирует новый процедурный язык в Greengage DB.
После этого на новом языке можно определять функции и триггерные процедуры.
В Greengage DB процедурные языки были преобразованы в "расширения", поэтому их следует устанавливать командой CREATE EXTENSION, а не CREATE LANGUAGE.
Непосредственное использование CREATE LANGUAGE следует ограничить скриптами установки расширений.
Если в вашей базе данных есть неупаковынный язык, полученный, например, после обновления, вы можете преобразовать его в расширение с помощью CREATE EXTENSION <langname> FROM unpackaged.
Суперпользователи могут регистрировать новый язык в базе данных Greengage DB.
Владелец базы данных также может регистрировать в этой базе любой из языков, перечисленных в системном каталоге pg_pltemplate, для которого поле tmpldbacreate имеет значение true.
Конфигурация по умолчанию позволяет владельцам базы данных регистрировать только доверенные (trusted) языки.
Создатель языка становится его владельцем и впоследствии может удалить его, переименовать или передать владение другому пользователю.
CREATE OR REPLACE LANGUAGE либо создает новый язык, либо заменяет существующее определение.
Если язык уже существует, его параметры обновляются согласно явно указанным значениям или значениям из pg_pltemplate, но параметры владения и прав доступа языка не меняются, и предполагается, что любые существующие функции на этом языке остаются корректными.
Помимо стандартных требований по привилегиям для создания языка, пользователь должен быть суперпользователем или владельцем существующего языка.
Вариант REPLACE в основном предназначен для того, чтобы гарантировать наличие языка.
Если для языка есть запись в pg_pltemplate, то REPLACE фактически ничего не изменит в уже существующем определении, за исключением редкого случая, когда запись pg_pltemplate была изменена после создания языка.
Команда CREATE LANGUAGE фактически связывает имя языка с функцией(ями)-обработчиком(ами), которые отвечают за выполнение функций, написанных на этом языке.
Для функции, написанной на процедурном языке (то есть языке, отличном от C или SQL), сервер базы данных не имеет встроенных знаний о том, как интерпретировать исходный код функции.
Эта задача передается специальному обработчику, который знает особенности языка.
Обработчик может либо выполнять всю работу по разбору, синтаксическому анализу, выполнению и т.п., либо служить мостом между Greengage DB и существующей реализацией языка программирования.
Сам обработчик является функцией на языке C, скомпилированной в разделяемый объект и загружаемой по требованию, как и любая другая C-функция.
В стандартную поставку Greengage DB входят пакеты процедурных языков PL/pgSQL, PL/Perl и PL/Python.
Также добавлены обработчики языков PL/Java и PL/R, но эти языки не предустановлены в Greengage DB.
Подробнее о разработке функций на процедурных языках см. раздел Procedural Languages в документации PostgreSQL.
Библиотеки PL/Perl, PL/Java и PL/R требуют, чтобы в системе были установлены соответствующие версии Perl, Java и R.
Команда CREATE LANGUAGE имеет две формы.
В первой форме пользователь указывает имя желаемого языка, а сервер Greengage DB использует системный каталог pg_pltemplate, чтобы определить корректные параметры.
Во второй форме пользователь указывает параметры языка вместе с именем языка.
Вторую форму можно использовать для создания языка, который не определен в pg_pltemplate.
Если сервер находит запись в каталоге pg_pltemplate для заданного имени языка, он будет использовать данные каталога, даже если команда содержит параметры языка.
Такое поведение упрощает загрузку старых dump-файлов, которые скорее всего содержат устаревшую информацию о поддерживающих функциях языка.
Параметры
| Параметр | Описание |
|---|---|
TRUSTED |
|
PROCEDURAL |
Не несет смысловой нагрузки |
name |
Имя нового процедурного языка.
Имя должно быть уникальным среди языков в базе данных.
Встроенная поддержка предусмотрена для языков |
HANDLER <call_handler> |
Игнорируется, если у сервера есть запись для указанного имени языка в |
INLINE <inline_handler> |
Имя ранее зарегистрированной функции, которая вызывается для выполнения анонимного блока кода на этом языке, создаваемого командой DO.
Если функция |
VALIDATOR <valfunction> |
Игнорируется, если у сервера есть запись для указанного имени языка в |
Примечания
Язык PL/pgSQL уже зарегистрирован во всех базах данных по умолчанию. Расширение языка PL/Python установлено, но не зарегистрировано.
Системный каталог pg_language содержит информацию о текущих установленных языках.
Чтобы создавать функции на процедурном языке, пользователь должен иметь привилегию USAGE для этого языка.
По умолчанию привилегия USAGE выдается роли PUBLIC (всем) для доверенных (trusted) языков.
При необходимости эту привилегию можно отозвать.
Процедурные языки являются локальными для отдельных баз данных. Языки создаются и удаляются отдельно для каждой базы данных.
Если у сервера нет записи о языке в pg_pltemplate, то функция обработчика вызова и функция валидатора (если она есть) должны уже существовать.
Но если запись есть, функции могут не существовать заранее.
Если таких функций нет в базе данных, они будут автоматически определены.
Любая разделяемая библиотека, реализующая язык, должна находиться по одному и тому же пути, указанному в переменной окружения LD_LIBRARY_PATH на всех сегментных хостах в кластере Greengage DB.
Примеры
Предпочтительный способ создания любого стандартного процедурного языка — использовать 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 является расширением Greengage DB.