Процедурные языки

QHB позволяет писать пользовательские функции на других языках, кроме SQL и C/RUST. Эти другие языки обычно называются процедурными языкам (PL). Для функции, написанной на процедурном языке, сервер базы данных не имеет встроенных методов, для интерпретации исходного текста функции. Вместо этого задача передается специальному обработчику, который обрабатывает детали языка. Обработчик может либо выполнять всю работу по синтаксическому анализу, синтаксическому анализу, выполнению и т. д., Либо он может служить «связующим звеном» между QHB и существующей реализацией языка программирования. Сам обработчик является функцией языка C/RUST, скомпилированной в общий объект и загружается по требованию, как и любая другая функция C/RUST.

В настоящее время в стандартном выпуске QHB доступен язык: PL/pgSQL (глава PL/pgSQL), другие языки могут быть созданы пользователями самостоятельно.

Установка процедурных языков

Процедурный язык должен быть «установлен» в каждой базе данных, где он будет использоваться. Процедурные языки, установленные в базе данных template1, автоматически доступны во всех впоследствии созданных базах данных, так как их записи в template1 будут скопированы командой CREATE DATABASE. Таким образом, администратор базы данных может решить, какие языки доступны в каких базах данных, и при желании может сделать некоторые языки доступными по умолчанию.

Для языков, поставляемых со стандартным дистрибутивом, необходимо только выполнить CREATE EXTENSION language_name чтобы установить язык в текущей базе данных. Описанная ниже ручная процедура рекомендуется только для установки языков, которые не были упакованы как расширения.

Ручная процедура установки процедурных языков

Процедурный язык устанавливается в базе данных в пять этапов, которые должны выполняться суперпользователем базы данных. В большинстве случаев требуемые команды SQL должны быть упакованы как установочный скрипт «расширения», чтобы их можно было использовать для CREATE EXTENSION.

  1. Общий объект для языкового обработчика (динамически подключаемая библиотека) должен быть скомпилирован и установлен в соответствующий каталог библиотеки, так же, как сборка и установка модулей с обычными пользовательскими функциями C\RUST - см. раздел Компиляция и связывание динамически загружаемых функций. Часто обработчик языка зависит от внешней библиотеки, которая обеспечивает реальный движок языка программирования - в этом случае он также должен быть установлен.

  2. Обработчик должен быть создан командой

CREATE FUNCTION handler_function_name()
    RETURNS language_handler
    AS 'path-to-shared-object'
    LANGUAGE C;

Специальный возвращаемый тип language_handler сообщает системе баз данных, что эта функция не возвращает ни один из определенных типов данных SQL и не может напрямую использоваться в инструкциях SQL .

  1. При желании обработчик языка может предоставлять встроенную функцию обработчика, предназначенную для выполнения блоков анонимного кода (команды DO), написанных на этом языке. Если встроенная функция обработчика предоставляется языком, необходимо объявить ее командой
CREATE FUNCTION inline_function_name(internal)
    RETURNS void
    AS 'path-to-shared-object'
    LANGUAGE C;
  1. При желании обработчик языка может предоставить функцию «валидатора», которая проверяет правильность определения функции, фактически не выполняя ее. Функция валидатора,если она существует, вызывается командой CREATE FUNCTION. Если язык предоставляет функцию валидатора, необходимо объявить ее командой
CREATE FUNCTION validator_function_name(oid)
    RETURNS void
    AS 'path-to-shared-object'
    LANGUAGE C STRICT;
  1. Наконец, сам процедурный язык, должен быть объявлен с командой
CREATE [TRUSTED] LANGUAGE language_name
    HANDLER handler_function_name
    [INLINE inline_function_name]
    [VALIDATOR validator_function_name] ;

Необязательное ключевое слово TRUSTED указывает, что язык не предоставляет доступ к данным,к которым в противном случае, у пользователя нет доступа. Доверенные языки предназначены для обычных пользователей баз данных (без привилегий суперпользователя) и позволяют им безопасно создавать функции и процедуры. Поскольку функции процедурного языка выполняются внутри сервера базы данных, флаг TRUSTED следует указывать только для языков, которые не разрешают доступ к внутренним компонентам сервера базы данных или файловой системе. Язык PL/pgSQL считается доверенным.

При установке QHB по умолчанию обработчик для языка PL/pgSQL создается и устанавливается в каталог «library». Более того, сам язык PL/pgSQL установлен во всех базах данных.