43.8. Под капотом PL/Perl#

43.8. Под капотом PL/Perl

43.8. Под капотом PL/Perl

43.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. Этот параметр не влияет на функции, уже скомпилированные в текущей сессии.

43.8.2. Ограничения и отсутствующие функции

Следующие функции в настоящее время отсутствуют в PL/Perl, но они были бы приветствованы вкладами.

  • Функции PL/Perl не могут вызывать друг друга напрямую.

  • SPI еще не полностью реализован.

  • Если вы извлекаете очень большие наборы данных с помощью spi_exec_query, вы должны знать, что все они будут загружены в память. Вы можете избежать этого, используя spi_query/spi_fetchrow, как показано ранее.

    Возникает аналогичная проблема, если функция, возвращающая набор строк, передает большой набор строк обратно в PostgreSQL через return. Вы можете избежать этой проблемы, используя return_next для каждой возвращаемой строки, как показано ранее.

  • Когда сессия завершается нормально, а не из-закритической ошибки, выполняются все определенные блоки END. В настоящее время никакие другие действия не выполняются. В частности, дескрипторы файлов не автоматически сбрасываются, а объекты не автоматически уничтожаются.