Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

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

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

PROCEDURAL

Не несет смысловой нагрузки

name

Имя нового процедурного языка. Имя должно быть уникальным среди языков в базе данных. Встроенная поддержка предусмотрена для языков plpgsql, plperl и plpythonu. Языки plpgsql (PL/pgSQL) и plpythonu (PL/Python) установлены по умолчанию в Greengage DB

HANDLER <call_handler>

Игнорируется, если у сервера есть запись для указанного имени языка в pg_pltemplate. Имя ранее зарегистрированной функции, которая будет вызываться для выполнения функций на процедурном языке. Обработчик вызова (call handler) для процедурного языка должен быть написан на компилируемом языке, таком как C, с соглашением вызова версии 1 и зарегистрирован в Greengage DB как функция без аргументов, возвращающая тип language_handler, то есть служебный тип-заглушку, используемый для обозначения функции как обработчика вызова

INLINE <inline_handler>

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

VALIDATOR <valfunction>

Игнорируется, если у сервера есть запись для указанного имени языка в pg_pltemplate. Имя ранее зарегистрированной функции, которая будет вызываться при создании новой функции на этом языке для проверки этой новой функции. Если функция-валидатор не указана, то Greengage DB не будет проверять новую функцию при ее создании. Функция-валидатор должна принимать один аргумент типа oid, который будет содержать OID создаваемой функции, и, как правило, возвращать тип void

Примечания

Язык 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.

См. также