42.8. Под капотом PL/Perl#
42.8. Под капотом PL/Perl #
42.8.1. Конфигурация #
Этот раздел перечисляет конфигурационные параметры, которые влияют на PL/Perl.
-
plperl.on_init
(string
) # Указывает Perl-код, который будет выполнен при первоначальной инициализации Perl-интерпретатора, до его специализации для использования
plperl
илиplperlu
. Функции SPI недоступны при выполнении этого кода. Если код завершается с ошибкой, он прерывает инициализацию интерпретатора и передает управление вызывающему запросу, что приводит к прерыванию текущей транзакции или подтранзакции.Perl-код ограничен одной строкой. Более длинный код может быть помещен в модуль и загружен с помощью строки
on_init
. Примеры:plperl.on_init = 'require "plperlinit.pl"' plperl.on_init = 'use lib "/my/app"; use MyApp::PgInit;'
Любые модули, загруженные с помощью
plperl.on_init
, будут доступны для использованияplperl
. Это может создать угрозу безопасности. Чтобы узнать, какие модули были загружены, вы можете использовать:DO 'elog(WARNING, join ", ", sort keys %INC)' LANGUAGE plperl;
Инициализация произойдет в постмастере, если библиотека
plperl
включена в shared_preload_libraries, в этом случае следует учесть возможность дестабилизации постмастера. Основная причина использования этой функции заключается в том, что модули Perl, загруженные черезplperl.on_init
, должны быть загружены только при запуске постмастера, и будут мгновенно доступны без издержек при работе с отдельными сессиями базы данных. Однако следует помнить, что издержки избегаются только для первого интерпретатора Perl, используемого в сессии базы данных - либо PL/PerlU, либо PL/Perl для первой SQL-роли, вызывающей функцию PL/Perl. Любые дополнительные интерпретаторы Perl, созданные в сессии базы данных, должны будут выполнитьplperl.on_init
заново. Кроме того, в Windows не будет никаких сбережений от предварительной загрузки, поскольку интерпретатор Perl, созданный в процессе постмастер, не передается дочерним процессам.Этот параметр может быть установлен только в файле
postgresql.conf
или в командной строке сервера.-
plperl.on_plperl_init
(string
)
plperl.on_plperlu_init
(string
) # Эти параметры определяют Perl-код, который будет выполнен, когда интерпретатор Perl специализируется для
plperl
илиplperlu
соответственно. Это происходит, когда функция PL/Perl или PL/PerlU впервые выполняется в сессии базы данных или когда требуется создать дополнительный интерпретатор, потому что вызывается другой язык или вызывается функция PL/Perl новой роли SQL. Это происходит после любой инициализации, выполненнойplperl.on_init
. Функции SPI недоступны при выполнении этого кода. Perl-код вplperl.on_plperl_init
выполняется после “защиты” интерпретатора, поэтому он может выполнять только доверенные операции.Если код завершается с ошибкой, он прерывает инициализацию и передает управление обратно вызывающему запросу, что приводит к прерыванию текущей транзакции или подтранзакции. Любые действия, уже выполненные в Perl, не будут отменены; однако этот интерпретатор больше не будет использоваться. Если язык снова используется, инициализация будет попытана снова в новом Perl-интерпретаторе.
Только суперпользователи могут изменять эти настройки. Хотя эти настройки могут быть изменены в рамках сессии, такие изменения не повлияют на интерпретаторы Perl, которые уже были использованы для выполнения функций.
-
plperl.use_strict
(boolean
) # Когда установлено значение true, последующие компиляции функций PL/Perl будут выполняться с включенным прагмой
strict
. Этот параметр не влияет на функции, уже скомпилированные в текущей сессии.
42.8.2. Ограничения и отсутствующие функции #
Следующие функции в настоящее время отсутствуют в PL/Perl, но они были бы приветствованы вкладами.
Функции PL/Perl не могут вызывать друг друга напрямую.
SPI еще не полностью реализован.
Если вы извлекаете очень большие наборы данных с помощью
spi_exec_query
, вы должны знать, что все они будут загружены в память. Вы можете избежать этого, используяspi_query
/spi_fetchrow
, как показано ранее.Возникает аналогичная проблема, если функция, возвращающая набор строк, передает большой набор строк обратно в PostgreSQL через
return
. Вы можете избежать этой проблемы, используяreturn_next
для каждой возвращаемой строки, как показано ранее.Когда сессия завершается нормально, а не из-закритической ошибки, выполняются все определенные блоки
END
. В настоящее время никакие другие действия не выполняются. В частности, дескрипторы файлов не автоматически сбрасываются, а объекты не автоматически уничтожаются.