-- -- Test that recursing between plperl and plperlu doesn't allow plperl to perform unsafe ops -- -- recurse between a plperl and plperlu function that are identical except that -- each calls the other. Each also checks if an unsafe opcode can be executed. CREATE OR REPLACE FUNCTION recurse_plperl(i int) RETURNS SETOF TEXT LANGUAGE plperl AS $$ my $i = shift; return unless $i > 0; return_next "plperl $i entry: ".((eval "stat;1") ? "ok" : $@); return_next $_ for map { $_->{recurse_plperlu} } @{spi_exec_query("select * from recurse_plperlu($i-1)")->{rows}}; return; $$; CREATE OR REPLACE FUNCTION recurse_plperlu(i int) RETURNS SETOF TEXT LANGUAGE plperlu AS $$ my $i = shift; return unless $i > 0; return_next "plperlu $i entry: ".((eval "stat;1") ? "ok" : $@); return_next $_ for map { $_->{recurse_plperl} } @{spi_exec_query("select * from recurse_plperl($i-1)")->{rows}}; return; $$; SELECT * FROM recurse_plperl(5); SELECT * FROM recurse_plperlu(5); -- -- Make sure we can't use/require things in plperl -- CREATE OR REPLACE FUNCTION use_plperlu() RETURNS void LANGUAGE plperlu AS $$ use Errno; $$; CREATE OR REPLACE FUNCTION use_plperl() RETURNS void LANGUAGE plperl AS $$ use Errno; $$; -- make sure our overloaded require op gets restored/set correctly select use_plperlu(); CREATE OR REPLACE FUNCTION use_plperl() RETURNS void LANGUAGE plperl AS $$ use Errno; $$;