Функции получения информации о сессии#

Данные функции не используют круглые скобки.

current_user#

Возвращает текущего пользователя.

current_groups()#

Возвращает список групп текущего пользователя.

current_catalog#

Возвращает текущий каталог.

current_schema#

Возвращает текущую схему.

Динамические параметры сессии#

Динамические параметры сессии позволяют передавать произвольные значения в запросы и представления (views) через механизм сессии. Один из сценариев использования — создание динамических представлений, поведение которых зависит от параметров, выставленных клиентом перед выполнением запроса.

Параметры не требуют предварительного объявления: они создаются в момент установки через SET SESSION и удаляются через RESET SESSION. Все активные динамические параметры отображаются в выводе команды SHOW SESSION.

Поддерживаются два типа динамических параметров:

  • Скалярные параметры — хранят одно строковое значение.

  • Списковые параметры — хранят массив строк для проверки принадлежности множеству.


Скалярные динамические параметры#

Скалярный параметр — именованный параметр, хранящий одно строковое значение типа varchar. Значение устанавливается через SET SESSION с использованием префикса dynamic_parameter$.

Установка параметра:

SET SESSION "dynamic_parameter$<имя_параметра>" = '<строковое_значение>';

Сброс параметра:

RESET SESSION "dynamic_parameter$<имя_параметра>";

Сброс уже удалённого параметра не вызывает ошибки (операция идемпотентна).

Просмотр активных параметров:

SHOW SESSION LIKE 'dynamic_parameter%';
dynamic_param(name) varchar#

Возвращает строковое значение скалярного динамического параметра с заданным именем.

  • name — имя параметра (тип varchar).

Если параметр не установлен, функция завершается с ошибкой: Dynamic session parameter is not set: <name>

Тип возвращаемого значения всегда varchar. При необходимости используйте явное приведение типа (CAST).

Пример: использование скалярного параметра в запросе

-- Установить параметр
SET SESSION "dynamic_parameter$department" = 'engineering';

-- Использовать в запросе
SELECT *
FROM employees
WHERE department = dynamic_param('department');

Пример: динамическое представление со скалярным параметром

Представление создаётся один раз и не содержит конкретных значений — они подставляются при каждом обращении из текущей сессии:

CREATE VIEW active_users AS
SELECT *
FROM users
WHERE status = dynamic_param('status_filter');
-- Первый запрос: показать активных пользователей
SET SESSION "dynamic_parameter$status_filter" = 'active';
SELECT * FROM active_users;

-- Второй запрос: показать заблокированных
SET SESSION "dynamic_parameter$status_filter" = 'blocked';
SELECT * FROM active_users;

Пример: приведение типа

Значение параметра всегда имеет тип varchar. Для использования в арифметических выражениях или сравнениях с числовыми столбцами необходимо явное приведение:

SET SESSION "dynamic_parameter$min_age" = '18';

SELECT name
FROM persons
WHERE age >= CAST(dynamic_param('min_age') AS bigint);

Списковые динамические параметры#

Списковый параметр — именованный параметр, хранящий массив строк (array(varchar)). Используется для фильтрации строк по принадлежности к динамически задаваемому множеству значений. Параметр устанавливается через SET SESSION с использованием префикса dynamic_parameters_list$.

Установка параметра:

SET SESSION "dynamic_parameters_list$<имя_параметра>" = ARRAY['значение1', 'значение2', ...];

Сброс параметра:

RESET SESSION "dynamic_parameters_list$<имя_параметра>";

Сброс уже удалённого параметра не вызывает ошибки (операция идемпотентна).

Просмотр активных параметров:

SHOW SESSION LIKE 'dynamic_parameters_list%';
in_dynamic_param_list(value, name) boolean#

Проверяет, содержится ли value в списковом динамическом параметре с именем name.

  • value — проверяемое значение (тип varchar). Если value равно NULL, функция возвращает NULL.

  • name — имя параметра (тип varchar).

Возвращает:

  • true — если значение найдено в списке.

  • false — если значение не найдено в списке.

  • NULL — если value равно NULL.

Если параметр не установлен, функция завершается с ошибкой: Dynamic session parameter list is not set: <name>

Оптимизация: при планировании запроса оптимизатор автоматически преобразует вызов in_dynamic_param_list(value, 'name') в выражение value IN ('val1', 'val2', ...) с конкретными значениями из списка. Это позволяет движку эффективно использовать индексы и выполнять предикат на уровне коннектора (predicate pushdown).

Пример: фильтрация по списку

SET SESSION "dynamic_parameters_list$allowed_regions" = ARRAY['EU', 'US', 'APAC'];

SELECT order_id, region, amount
FROM orders
WHERE in_dynamic_param_list(region, 'allowed_regions');

Пример: отрицательная фильтрация

SET SESSION "dynamic_parameters_list$excluded_categories" = ARRAY['spam', 'test', 'internal'];

SELECT *
FROM events
WHERE NOT in_dynamic_param_list(category, 'excluded_categories');

Пример: динамическое представление со списковым параметром

CREATE VIEW approved_products AS
SELECT product_id, name, price
FROM products
WHERE in_dynamic_param_list(category, 'visible_categories');
-- Показать только электронику и мебель
SET SESSION "dynamic_parameters_list$visible_categories" = ARRAY['electronics', 'furniture'];
SELECT * FROM approved_products;

-- Изменить набор видимых категорий без пересоздания представления
SET SESSION "dynamic_parameters_list$visible_categories" = ARRAY['clothing', 'shoes'];
SELECT * FROM approved_products;

Совместное использование скалярных и списковых параметров#

Оба типа параметров можно использовать в одном запросе или представлении:

CREATE VIEW filtered_report AS
SELECT user_id, region, amount
FROM transactions
WHERE status = dynamic_param('target_status')
  AND in_dynamic_param_list(region, 'allowed_regions');
SET SESSION "dynamic_parameter$target_status" = 'completed';
SET SESSION "dynamic_parameters_list$allowed_regions" = ARRAY['EU', 'US'];

SELECT * FROM filtered_report;