Lang:postgres
Навигация: Главная страница/Система ejudge/Использование/Поддерживаемые языки программирования/PostgresQL
ID языка | 79 |
Короткое имя | postgres |
Название языка | PostgreSQL |
Сайт | https://www.postgresql.org/ |
Способ установки | Менеджером пакетов ОС (dnf, apt-get) |
Этот язык программирования предназначен для тестирования SQL-запросов к базе данных Postgres. Поддерживается как запуск на пользовательских данных, так и запуск на наборе тестов.
Для доступа к серверу Postgres используется утилита командной
строки psql
, которая должна быть доступна
на тестирующих хостах. Сервер Postgres должен быть уже запущенным
и может находиться как на том же самом хосте, так и на другом хосте.
В частности, сервер Postgres может быть развернуть в docker.
Для тестирования SQL-запросов потребуется и административный доступ
к серверу БД, и неадминистративный доступ, под которым
исполняется тестируемый запрос.
При запуске на тестирование SQL-запроса на каждом тесте сначала
создается новая база данных со случайным именем
с помощью запроса CREATE DATABASE
, который выполняется
административным пользователем. На созданную базу выдаются права
для обычного пользователя.
Затем из-под обычного пользователя выполняются запросы из файла с тестовыми данными текущего теста. Файл с тестовыми данными таким образом играет роль файла с SQL-командами, заполняюего базу данных нужными значениями. Затем выполняются SQL-запросы пользователя, сданные на тестирование.
В конце выполняется команда уничтожения созданной базы данных. Таким образом, каждый раз SQL-запрос выполняется во временном изолированном окружении.
Для корректной работы postgres требуются особенные настройки языка программирования. Пример настроек приведен ниже:
[language] id = 79 short_name = "postgres" long_name = "PostgreSQL 15.4" arch = "linux-shared" src_sfx = ".sql" enable_ejudge_env preserve_line_numbers clean_up_cmd = "/opt/ejudge/libexec/ejudge/bin/ej-postgres-cleanup" run_env_file = "/home/judges/data/postgres.env" clean_up_env_file = "/home/judges/data/postgres.env"
Параметр enable_ejudge_env
включает передачу переменных окружения EJUDGE_SUPER_RUN_SERIAL
и EJUDGE_TEST_RANDOM_VALUE
при тестировании.
Параметр preserve_line_numbers
удаляет из пользовательских SQL-запросов специальный комментарий
#! /opt/ejudge/libexec/ejudge/bin/ej-postgres-exec
, добавленный
компонентом компиляции ej-compile.
Параметр clean_up_cmd
задаёт имя программы
очистки состояния базы данных после выполнения запроса.
Параметр run_env_file
задаёт файл с переменными
окружения с параметрами доступа к базе данных, которые используются
при выполнении запросов.
Параметр clean_up_env_file
задаёт файл с переменными окружения с параметрами доступа к базе данных,
которые используются при очистке базы данных после выполнения запроса.
Файл с переменными окружения /home/judges/data/postgres.env
должен иметь следующую структуру.
PGHOST=127.0.0.1 PGPORT=15432 PG_BASE_PREFIX=testdb PG_ROOT_USER=postgres PG_ROOT_PASSWORD=rootpassword PG_USER_PREFIX=ejexec PG_PASSWORDS=password0:password1:password2:password3
Переменная окружения PGHOST
задаёт имя хоста, на котором
работает сервер Postgres. Переменная окружения PGPORT
задаёт номер порта, на котором работает сервер Postgres. Это —
стандартные переменные окружения для Postgres-клиента psql
.
Переменная окружения PG_BASE_PREFIX
задаёт префикс имени
для базы данных для тестирования. При тестировании к нему будет добавлен
случайный суффикс.
Переменная окружения PG_ROOT_USER
задаёт имя административного
пользователя сервера Postgres. Переменная окружения PG_ROOT_PASSWORD
задаёт пароль административного пользователя сервера Postgres.
Переменная окружения PG_USER_PREFIX
задаёт имя пользователя
или префикс имен пользователей, под которым будут выполняться запросы.
Переменная окружения PG_PASSWORDS
задаёт один пароль или
несколько паролей для пользователей, под которыми выполняются запросы.
На примере файла выше, если тестирование выполняется в один поток,
то для выполнения запросов будет использоваться пользователь
ejexec
c паролем password0
.
Если тестирование выполняется в 2, 3, 4 потока, будут использоваться
пользователи ejexec
, ejexec1
, ejexec2
,
ejexec3
с паролями password0
, password1
,
password2
, password3
соответственно.
Обратите внимание, что под административными и обычными пользователями здесь понимаются пользователи Postgres, а не пользователи Linux хост-системы.
Дополнительно при выполнении запросов поддерживаются следующие
переменые окружения, которые можно устанавливать с помощью
параметров задачи
start_env
.
Переменная окружения EJUDGE_HTML_OUTPUT
включает опцию
--html
утилиты psql, то есть результат запроса будет
выведен в формате HTML.
Переменная окружения EJUDGE_TUPLES_ONLY
включает опцию
-t
утилиты psql, то есть в результате запроса
будет отсутствовать строка заголовка таблицы.
Поддерживается начиная с версии 3.12.0.