Executando o PostgreSQL 9.1.8 no Xubuntu 12.04, instalado a partir dos repositórios.
No shell, executei:
createlang plperl db_name;
createlang plperlu db_name;
Como superusuário executando psql
, executei:
GRANT ALL ON LANGUAGE plperl TO account_name;
GRANT ALL ON LANGUAGE plperlu TO account_name;
A pg_language
tabela revela:
select lanname,lanpltrusted from pg_language where lanname like 'plperl%';
"plperl";t
"plperlu";t
Quando crio a seguinte função:
CREATE OR REPLACE FUNCTION get_hostname()
RETURNS text AS
$BODY$
use Sys::Hostname;
return hostname;
$BODY$
LANGUAGE plperlu IMMUTABLE
COST 1;
ALTER FUNCTION get_hostname()
OWNER TO account_name;
Eu recebo o seguinte erro:
ERROR: Unable to load Sys/Hostname.pm into plperl at line 2.
BEGIN failed--compilation aborted at line 2.
CONTEXT: compilation of PL/Perl function "get_hostname"
Ainda as seguintes obras:
CREATE OR REPLACE FUNCTION get_hostname()
RETURNS text AS
$BODY$
return '127.0.0.1';
$BODY$
LANGUAGE plperlu IMMUTABLE
COST 1;
ALTER FUNCTION get_hostname()
OWNER TO account_name;
O script Perl a seguir funciona conforme o esperado do shell:
use Sys::Hostname;
print hostname;
Tentei executar a função como um bloco anônimo:
DO $$
use Sys::Hostname;
print hostname;
$$ LANGUAGE plperlu;
Isso retornou o mesmo erro de antes, com esta informação adicional:
ERROR: Unable to load Sys/Hostname.pm into plperl at line 3.
BEGIN failed--compilation aborted at line 3.
SQL state: 42601
Context: PL/Perl anonymous code block
Na documentação , o erro 42601 é um erro de sintaxe.
Não vejo nenhum erro de sintaxe.
Além disso, a função carregou bem com a conta de superusuário quando importei o banco de dados:
psql -d db_name -U account_name -W -f db-dump.sql > import.log 2> error.log
Tentei simplificar o código sem sucesso:
CREATE OR REPLACE FUNCTION get_hostname() RETURNS text AS
$$
use Sys::Hostname;
return hostname;
$$
LANGUAGE plperlu;
Mesmo erro de antes.
O que não entendo é por que, de acordo com a mensagem de erro, o PostgreSQL está tentando carregar o código em plperl
vez de plperlu
.
Alguma ideia?
Atualização nº 1
Observe que o usuário postgres é um superusuário:
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication | {}
Por
plperlu
não ser confiável, a conta requer autorização de superusuário:Não sei se é permitido
plperl
eplperlu
seja instalado ao mesmo tempo, então larguei o primeiro. A função agora pode ser criada.