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_asserts

on

Выполнение проверок, указанных в ASSERT-инструкциях

compatibility_warnings

off

Вывод предупреждения о совместимости

enable_tracer

off

Включение функциональности трассировщика

fatal_errors

on

Остановка работы plpgsql при возникновении ошибки

mode

by_function

Выбор режима расширенной проверки (disabled (для отключения), by_function (для ручного запуска функций проверки), fresh_start (для первого запуска проверяемой функции), every_start (для каждого запуска проверяемой функции)

profiler

off

Фоновое профилирование функции

profiler_max_shared_chunks

15000

Максимальное количество выражений в общей памяти

regress_test_mode

off

Изменение формата вывода для регрессионного тестирования

show_nonperformance_extra_warnings

off

Вывод дополнительных предупреждений (кроме предупреждений о производительности)

show_nonperformance_warnings

off

Вывод всех предупреждений (кроме предупреждений о производительности)

show_performance_warnings

off

Вывод предупреждений о производительности

trace_assert

off

Отслеживание ASSERT-оператора

trace_assert_verbosity

default

Детализация ASSERT-инструкции (terse/default/verbose)

tracer

off

Включение функции трассировки

tracer_errlevel

notice

Установка уровня сообщения трассировщика (log/notice/info/debug/debug1/debug2/debug3/debug4/debug5)

tracer_test_mode

off

Вывод трассировщика в формате для регрессионного тестирования

tracer_variable_max_length

1024

Максимальная выходная длина содержимого переменных трассировщика в байтах

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.