|
|
|
@ -3,7 +3,9 @@ |
|
|
|
|
-- |
|
|
|
|
-- sanity check of pg_proc catalog to the given parameters |
|
|
|
|
-- |
|
|
|
|
CREATE USER regtest_unpriv_user; |
|
|
|
|
CREATE SCHEMA temp_func_test; |
|
|
|
|
GRANT ALL ON SCHEMA temp_func_test TO public; |
|
|
|
|
SET search_path TO temp_func_test, public; |
|
|
|
|
-- |
|
|
|
|
-- ARGUMENT and RETURN TYPES |
|
|
|
@ -125,6 +127,28 @@ SELECT proname, proleakproof FROM pg_proc |
|
|
|
|
functext_e_2 | t |
|
|
|
|
(2 rows) |
|
|
|
|
|
|
|
|
|
ALTER FUNCTION functext_E_2(int) NOT LEAKPROOF; -- remove leakproog attribute |
|
|
|
|
SELECT proname, proleakproof FROM pg_proc |
|
|
|
|
WHERE oid in ('functext_E_1'::regproc, |
|
|
|
|
'functext_E_2'::regproc) ORDER BY proname; |
|
|
|
|
proname | proleakproof |
|
|
|
|
--------------+-------------- |
|
|
|
|
functext_e_1 | t |
|
|
|
|
functext_e_2 | f |
|
|
|
|
(2 rows) |
|
|
|
|
|
|
|
|
|
-- it takes superuser privilege to turn on leakproof, but not for turn off |
|
|
|
|
ALTER FUNCTION functext_E_1(int) OWNER TO regtest_unpriv_user; |
|
|
|
|
ALTER FUNCTION functext_E_2(int) OWNER TO regtest_unpriv_user; |
|
|
|
|
SET SESSION AUTHORIZATION regtest_unpriv_user; |
|
|
|
|
SET search_path TO temp_func_test, public; |
|
|
|
|
ALTER FUNCTION functext_E_1(int) NOT LEAKPROOF; |
|
|
|
|
ALTER FUNCTION functext_E_2(int) LEAKPROOF; |
|
|
|
|
ERROR: only superuser can define a leakproof function |
|
|
|
|
CREATE FUNCTION functext_E_3(int) RETURNS bool LANGUAGE 'sql' |
|
|
|
|
LEAKPROOF AS 'SELECT $1 < 200'; -- failed |
|
|
|
|
ERROR: only superuser can define a leakproof function |
|
|
|
|
RESET SESSION AUTHORIZATION; |
|
|
|
|
-- list of built-in leakproof functions |
|
|
|
|
SELECT proname, prorettype::regtype, proargtypes::regtype[] |
|
|
|
|
FROM pg_proc JOIN pg_namespace ON pronamespace = pg_namespace.oid |
|
|
|
@ -420,4 +444,5 @@ drop cascades to function functext_f_1(integer) |
|
|
|
|
drop cascades to function functext_f_2(integer) |
|
|
|
|
drop cascades to function functext_f_3(integer) |
|
|
|
|
drop cascades to function functext_f_4(integer) |
|
|
|
|
DROP USER regtest_unpriv_user; |
|
|
|
|
RESET search_path; |
|
|
|
|