Перейти к основному содержимому

plpgsql_check. Средство контроля plpgsql

Версия: 2.5.

В исходном дистрибутиве установлено по умолчанию: нет.

Связанные компоненты: plpgsql.

Схема размещения: ext.

Расширение plpgsql_check - это полноценный статический анализатор кода plpgsql для PostgreSQL, предоставляющий набор функций для анализа и профилирования функций и процедур, написанных на языке PL/pgSQL.

Функциональные возможности расширения:

  • анализ SQL внутри процедур и поиска ошибок, которые обычно не обнаруживаются при выполнении команды CREATE PROCEDURE/FUNCTION;
  • контроль уровней многих предупреждений и подсказок;
  • добавление маркеров PRAGMA для изменения уровеня отображения сообщений, о которых уже известно, или напоминания вернуться к ним для более глубокого анализа позже.

Помимо статического анализа расширение предоставляет возможность динамического анализа кода с отслеживанием выполнения функций (в том числе триггерных) и процедур на языке pl/pgsql.

Доработка

Не производилась.

Ограничения

Для корректной работы plpgsql_check необходимо наличие расширения plpgsql.

Внимание!

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

Установка

Установка расширения:

cd {путь к дистрибутиву pangolin}/3rdparty/plpgsql_check
tar -C "/" -xzf plpgsql_check.tar.gz

Для использования расширения на развернутой СУБД необходимо установить его в целевую БД:

CREATE EXTENSION plpgsql_check SCHEMA ext;

Расширение может быть добавлено в shared_preload_libraries:

shared_preload_libraries = 'plpgsql_check'

В случае, если расширение используется совместно с расширением pldebugger, библиотека расширения должна быть указана после pldebugger при перечислении в shared_preload_libraries:

shared_preload_libraries = 'plugin_debugger,plpgsql_check'

Настройка

Расширение может работать в нескольких режимах:

  • активный (статический анализ кода) - расширение никак не настраивается и не работает в фоне. Вся информация о функциях получается путем ручного вызова функций;
  • пассивный - функции расширения запускаются не вручную, а автоматически перед запуском отлаживаемой функции;
  • профилирования нагрузки - расширение собирает статистику о запусках и работе функций, а также выражений в теле функций. Статистика хранится в памяти сеанса, при добавлении библиотеки расширения в shared_preload_libraries используется общая разделяемая память и статистика хранится в общей памяти СУБД;
  • трассировки - каждый вызов любой plpgsql-функции сопровождается подробной информацией о выполняемой в текущий момент строке кода функции.

Конфигурационные параметры расширения

Конфигурационные параметры:

ПараметрЗначение по умолчаниюОписание
check_assertsonВыполнение проверок, указанных в ASSERT-инструкциях
compatibility_warningsoffВывод предупреждения о совместимости
enable_traceroffВключение функциональности трассировщика
fatal_errorsonОстановка работы plpgsql при возникновении ошибки
modeby_functionВыбор режима расширенной проверки (disabled (для отключения), by_function (для ручного запуска функций проверки), fresh_start (для первого запуска проверяемой функции), every_start (для каждого запуска проверяемой функции)
profileroffФоновое профилирование функции
profiler_max_shared_chunks15000Максимальное количество выражений в общей памяти
regress_test_modeoffИзменение формата вывода для регрессионного тестирования
show_nonperformance_extra_warningsoffВывод дополнительных предупреждений (кроме предупреждений о производительности)
show_nonperformance_warningsoffВывод всех предупреждений (кроме предупреждений о производительности)
show_performance_warningsoffВывод предупреждений о производительности
trace_assertoffОтслеживание ASSERT-оператора
trace_assert_verbositydefaultДетализация ASSERT-инструкции (terse/default/verbose)
traceroffВключение функции трассировки
tracer_errlevelnoticeУстановка уровня сообщения трассировщика (log/notice/info/debug/debug1/debug2/debug3/debug4/debug5)
tracer_test_modeoffВывод трассировщика в формате для регрессионного тестирования
tracer_variable_max_length1024Максимальная выходная длина содержимого переменных трассировщика в байтах
tracer_verbosityвуафгдеДетализация вывода трассировщика (terse/default/verbose)

Использование модуля

Функции расширения (с аргументами и возвращаемыми значениями можно ознакомиться по ссылке https://github.com/okbob/plpgsql_check:

ИмяОписание
__plpgsql_show_dependency_tb()Обнаружение зависимостей для функции
plpgsql_check_function()Расширенная проверка (статический анализ кода) функции с выводом в виде форматированного текста
plpgsql_check_pragma()Реализация функции pragma. Существует два разных варианта использования: для статического анализа с помощью plpgsql_check, где аргументы считываются из дерева синтаксического анализа; для управления трассировкой кода во время выполнения (аргументы обрабатываются аналогичным для variadic text образом)
plpgsql_check_profiler()Проверка/установка статуса профайлера
plpgsql_check_tracer()Проверка/установка статуса трассировщика
plpgsql_coverage_branches()Расчет показателя покрытия профилировщиком вариантов использования функции
plpgsql_coverage_statements()Расчет показателя покрытия профилировщиком строк с выражениями в функции
plpgsql_profiler_function_statements_tb()Отображение собранного профиля функции в виде таблицы
plpgsql_profiler_function_tb()Отображение собранного профиля функции в виде таблицы
plpgsql_profiler_functions_all()Отображение собранных профилей всех функций в виде таблицы
plpgsql_profiler_install_fake_queryid_hook()Отображение собранных профилей всех функций в виде таблицы
plpgsql_profiler_remove_fake_queryid_hook()Очистка сгенерированного функцией plpgsql_profiler_install_fake_queryid_hook() идентификатора запроса и возврат предыдущего значения
plpgsql_profiler_reset()Очистка статистики, собранной профайлером и относящейся к переданной в аргументе функции
plpgsql_profiler_reset_all()Очистка всей статистики, собранной профайлером
plpgsql_show_dependency_tb()Обнаружение зависимостей для функции

Ссылки на документацию разработчика

plpgsql_check: https://github.com/okbob/plpgsql_check.