]> granicus.if.org Git - postgresql/commitdiff
More regression tests for LEAKPROOF/NOT LEAKPROOF stuff.
authorRobert Haas <rhaas@postgresql.org>
Wed, 15 Feb 2012 15:56:26 +0000 (10:56 -0500)
committerRobert Haas <rhaas@postgresql.org>
Wed, 15 Feb 2012 15:56:26 +0000 (10:56 -0500)
Along the way, move create_function_3 into a parallel schedule.

KaiGai Kohei

src/test/regress/expected/create_function_3.out
src/test/regress/parallel_schedule
src/test/regress/sql/create_function_3.sql

index 8dceb762e1bbb2af2f3945cd81b67038dd043b6b..eac3de57ccb42aea146f34b0f546117cfcd2f924 100644 (file)
@@ -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;
index 9749763ffd200762b3578566285df45ca94f034e..862f5b20077a66d80aa0009522d310f875e93487 100644 (file)
@@ -40,7 +40,6 @@ test: create_function_1
 test: create_type
 test: create_table
 test: create_function_2
-test: create_function_3
 
 # ----------
 # Load huge amounts of data
@@ -60,7 +59,7 @@ test: create_index create_view
 # ----------
 # Another group of parallel tests
 # ----------
-test: create_aggregate create_cast constraints triggers inherit create_table_like typed_table vacuum drop_if_exists
+test: create_aggregate create_function_3 create_cast constraints triggers inherit create_table_like typed_table vacuum drop_if_exists
 
 # ----------
 # sanity_check does a vacuum, affecting the sort order of SELECT *
index 56ed215a288a7823c1257ca6f4de45bcf3d16231..4693db63cdc815cce2ebfb30819a1e3762b9d091 100644 (file)
@@ -3,7 +3,10 @@
 --
 -- 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;
 
@@ -85,6 +88,25 @@ SELECT proname, proleakproof FROM pg_proc
        WHERE oid in ('functext_E_1'::regproc,
                      'functext_E_2'::regproc) ORDER BY proname;
 
+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;
+
+-- 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;
+
+CREATE FUNCTION functext_E_3(int) RETURNS bool LANGUAGE 'sql'
+       LEAKPROOF AS 'SELECT $1 < 200'; -- failed
+
+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
@@ -118,4 +140,5 @@ SELECT proname, proisstrict FROM pg_proc
 
 -- Cleanups
 DROP SCHEMA temp_func_test CASCADE;
+DROP USER regtest_unpriv_user;
 RESET search_path;