--
-- Install the plperl and plperlu extensions
--

-- Before going ahead with the to-be-tested installations, verify that
-- a non-superuser is allowed to install plperl (but not plperlu) when
-- suitable permissions have been granted.

CREATE USER regress_plperl_user1;
CREATE USER regress_plperl_user2;

SET ROLE regress_plperl_user1;

CREATE EXTENSION plperl;  -- fail
CREATE EXTENSION plperlu;  -- fail

RESET ROLE;

DO $$
begin
  execute format('grant create on database %I to regress_plperl_user1',
                 current_database());
end;
$$;

SET ROLE regress_plperl_user1;

CREATE EXTENSION plperl;
CREATE EXTENSION plperlu;  -- fail
CREATE SCHEMA plperl_setup_scratch;
SET search_path = plperl_setup_scratch;
GRANT ALL ON SCHEMA plperl_setup_scratch TO regress_plperl_user2;

CREATE FUNCTION foo1() returns int language plperl as '1;';
SELECT foo1();

-- Must reconnect to avoid failure with non-MULTIPLICITY Perl interpreters
\c -
SET search_path = plperl_setup_scratch;

SET ROLE regress_plperl_user1;

-- Should be able to change privileges on the language
revoke all on language plperl from public;

SET ROLE regress_plperl_user2;

CREATE FUNCTION foo2() returns int language plperl as '2;';  -- fail

SET ROLE regress_plperl_user1;

grant usage on language plperl to regress_plperl_user2;

SET ROLE regress_plperl_user2;

CREATE FUNCTION foo2() returns int language plperl as '2;';
SELECT foo2();

SET ROLE regress_plperl_user1;

-- Should be able to drop the extension, but not the language per se
DROP LANGUAGE plperl CASCADE;
DROP EXTENSION plperl CASCADE;

-- Clean up
RESET ROLE;
DROP OWNED BY regress_plperl_user1;
DROP USER regress_plperl_user1;
DROP USER regress_plperl_user2;

-- Now install the versions that will be used by subsequent test scripts.
CREATE EXTENSION plperl;
CREATE EXTENSION plperlu;
