From 7a46d51d8338c686d61f4cc5c700a23c83cae07a Mon Sep 17 00:00:00 2001 From: Robins Tharakan Date: Sat, 16 Mar 2013 04:20:46 +0530 Subject: [PATCH] Add regression tests for SCHEMA --- src/test/regress/expected/schema.out | 144 ++++++++++++++++++++++++++++++++++ src/test/regress/parallel_schedule | 2 +- src/test/regress/sql/schema.sql | 142 +++++++++++++++++++++++++++++++++ 3 files changed, 287 insertions(+), 1 deletion(-) create mode 100644 src/test/regress/expected/schema.out create mode 100644 src/test/regress/sql/schema.sql diff --git a/src/test/regress/expected/schema.out b/src/test/regress/expected/schema.out new file mode 100644 index 0000000..d506011 --- /dev/null +++ b/src/test/regress/expected/schema.out @@ -0,0 +1,144 @@ +-- +-- SCHEMA Commands +-- +CREATE SCHEMA t1; +DROP SCHEMA t1; +-- Should fail. Disallow CREATE SCHEMA by ROLE with insufficient permission +CREATE ROLE r1; +SET ROLE r1; +CREATE SCHEMA t2; +ERROR: permission denied for database regression +RESET ROLE; +DROP ROLE r1; +-- Should fail. Disallow CREATE SCHEMA if using a reserved name +CREATE SCHEMA pg_asdf; +ERROR: unacceptable schema name "pg_asdf" +DETAIL: The prefix "pg_" is reserved for system schemas. +-- Should fail. Disallow CREATE SCHEMA if already exists +CREATE SCHEMA public; +ERROR: schema "public" already exists +-- Ensure CREATE SCHEMA uses current_user (and not necessarily session_user) +CREATE ROLE r1; +GRANT CREATE ON DATABASE regression to r1; +SET ROLE r1; +CREATE SCHEMA t2; +SELECT schema_owner +FROM information_schema.schemata +WHERE schema_name <> 'information_schema' + AND schema_name !~ E'^pg_'; + schema_owner +-------------- + r1 +(1 row) + +DROP SCHEMA t2; +RESET ROLE; +REVOKE CREATE ON DATABASE regression FROM r1; +DROP ROLE r1; +-- RENAME SCHEMA +CREATE SCHEMA s1; +ALTER SCHEMA s1 RENAME TO ss1; +DROP SCHEMA ss1; +-- ALTER SCHEMA ok for user created IN ROLE of one with CREATE DATABASE rights +CREATE ROLE r3; +GRANT CREATE ON DATABASE regression to r3; +CREATE ROLE r4 IN ROLE r3; +SET ROLE r3; +CREATE SCHEMA s2; +SET ROLE r4; +ALTER SCHEMA s2 RENAME TO s2a; +ALTER SCHEMA s2a OWNER TO r4; +DROP SCHEMA s2a; +RESET ROLE; +REVOKE CREATE ON DATABASE regression FROM r3; +SET ROLE r3; +RESET ROLE; +DROP ROLE r4; +DROP ROLE r3; +-- Should work, REASSIGN OWNED objects to another OWNER +CREATE ROLE r3; +GRANT CREATE ON DATABASE regression to r3; +CREATE ROLE r4; +SET ROLE r3; +CREATE SCHEMA s2; +RESET ROLE; +REVOKE CREATE ON DATABASE regression FROM r3; +REASSIGN OWNED BY r3 TO r4; +SET ROLE r4; +DROP SCHEMA s2; +RESET ROLE; +DROP ROLE r4; +DROP ROLE r3; +-- Should fail. Shouldn't RENAME SCHEMA if invalid / already existing / etc. +CREATE SCHEMA s1; +CREATE SCHEMA s2; +ALTER SCHEMA s2 RENAME TO s1; +ERROR: schema "s1" already exists +ALTER SCHEMA s2 RENAME TO public; +ERROR: schema "public" already exists +ALTER SCHEMA s2 RENAME TO pg_asdf; +ERROR: unacceptable schema name "pg_asdf" +DETAIL: The prefix "pg_" is reserved for system schemas. +DROP SCHEMA s1; +DROP SCHEMA s2; +-- Should fail. Shouldn't ALTER SCHEMA if not OWNER +CREATE SCHEMA s1; +CREATE ROLE r1; +SET ROLE r1; +ALTER SCHEMA s1 RENAME TO ss1; +ERROR: must be owner of schema s1 +ALTER SCHEMA s1 OWNER TO r1; +ERROR: must be owner of schema s1 +RESET ROLE; +DROP SCHEMA s1; +DROP ROLE r1; +-- Should work. Non-Owner with CREATE ON DATABASE priviledge can RENAME SCHEMA +CREATE ROLE r1; +GRANT CREATE ON DATABASE regression to r1; +SET ROLE r1; +CREATE SCHEMA s1; +RESET ROLE; +ALTER SCHEMA s1 RENAME TO ss1; +DROP SCHEMA ss1; +REVOKE CREATE ON DATABASE regression FROM r1; +DROP ROLE r1; +-- Should fail. OWNER without CREATE ON DATABASE can't ALTER OWNER SCHEMA +CREATE ROLE r1; +CREATE SCHEMA s1 AUTHORIZATION r1; +CREATE ROLE r2; +GRANT r2 TO r1; +SET ROLE r1; +ALTER SCHEMA s1 RENAME TO ss1; +ERROR: permission denied for database regression +ALTER SCHEMA s1 OWNER TO r2; +ERROR: permission denied for database regression +RESET ROLE; +DROP SCHEMA s1; +REVOKE r2 FROM r1; +DROP ROLE r2; +DROP ROLE r1; +-- Should work. Try to have multiple OWNERships for a ROLE +CREATE ROLE r1; +CREATE ROLE r2; +CREATE SCHEMA s1; +GRANT CREATE ON SCHEMA s1 TO r1; +GRANT ALL ON SCHEMA s1 TO r2; +ALTER SCHEMA s1 OWNER TO r1; +REVOKE CREATE ON SCHEMA s1 FROM r1; +REVOKE ALL ON SCHEMA s1 FROM r2; +DROP SCHEMA s1; +DROP ROLE r2; +DROP ROLE r1; +-- Change OWNER of SCHEMA +CREATE SCHEMA s1; +CREATE ROLE r1; +ALTER SCHEMA s1 OWNER TO r1; +DROP SCHEMA s1; +DROP ROLE r1; +-- Should fail. Can't change OWNER of SCHEMA if doesn't exist/invalid name/etc. +ALTER SCHEMA s1 RENAME TO ss1; +ERROR: schema "s1" does not exist +CREATE ROLE r1; +ALTER SCHEMA s1 OWNER TO r1; +ERROR: schema "s1" does not exist +DROP ROLE r1; diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index 2af28b1..7d23aaa 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -78,7 +78,7 @@ ignore: random # ---------- # Another group of parallel tests # ---------- -test: select_into select_distinct select_distinct_on select_implicit select_having subselect union case join aggregates transactions random portals arrays btree_index hash_index update namespace prepared_xacts delete +test: select_into select_distinct select_distinct_on select_implicit select_having subselect union case join aggregates transactions random portals arrays btree_index hash_index update namespace prepared_xacts delete schema # ---------- # Another group of parallel tests diff --git a/src/test/regress/sql/schema.sql b/src/test/regress/sql/schema.sql new file mode 100644 index 0000000..b7150ff --- /dev/null +++ b/src/test/regress/sql/schema.sql @@ -0,0 +1,142 @@ +-- +-- SCHEMA Commands +-- + +CREATE SCHEMA t1; +DROP SCHEMA t1; + +-- Should fail. Disallow CREATE SCHEMA by ROLE with insufficient permission +CREATE ROLE r1; +SET ROLE r1; +CREATE SCHEMA t2; +RESET ROLE; +DROP ROLE r1; + +-- Should fail. Disallow CREATE SCHEMA if using a reserved name +CREATE SCHEMA pg_asdf; + +-- Should fail. Disallow CREATE SCHEMA if already exists +CREATE SCHEMA public; + +-- Ensure CREATE SCHEMA uses current_user (and not necessarily session_user) +CREATE ROLE r1; +GRANT CREATE ON DATABASE regression to r1; +SET ROLE r1; +CREATE SCHEMA t2; +SELECT schema_owner +FROM information_schema.schemata +WHERE schema_name <> 'information_schema' + AND schema_name !~ E'^pg_'; +DROP SCHEMA t2; +RESET ROLE; +REVOKE CREATE ON DATABASE regression FROM r1; +DROP ROLE r1; + +-- RENAME SCHEMA +CREATE SCHEMA s1; +ALTER SCHEMA s1 RENAME TO ss1; +DROP SCHEMA ss1; + +-- ALTER SCHEMA ok for user created IN ROLE of one with CREATE DATABASE rights +CREATE ROLE r3; +GRANT CREATE ON DATABASE regression to r3; +CREATE ROLE r4 IN ROLE r3; +SET ROLE r3; +CREATE SCHEMA s2; +SET ROLE r4; +ALTER SCHEMA s2 RENAME TO s2a; +ALTER SCHEMA s2a OWNER TO r4; +DROP SCHEMA s2a; +RESET ROLE; +REVOKE CREATE ON DATABASE regression FROM r3; +SET ROLE r3; +RESET ROLE; +DROP ROLE r4; +DROP ROLE r3; + +-- Should work, REASSIGN OWNED objects to another OWNER +CREATE ROLE r3; +GRANT CREATE ON DATABASE regression to r3; +CREATE ROLE r4; +SET ROLE r3; +CREATE SCHEMA s2; +RESET ROLE; +REVOKE CREATE ON DATABASE regression FROM r3; +REASSIGN OWNED BY r3 TO r4; +SET ROLE r4; +DROP SCHEMA s2; +RESET ROLE; +DROP ROLE r4; +DROP ROLE r3; + +-- Should fail. Shouldn't RENAME SCHEMA if invalid / already existing / etc. +CREATE SCHEMA s1; +CREATE SCHEMA s2; +ALTER SCHEMA s2 RENAME TO s1; +ALTER SCHEMA s2 RENAME TO public; +ALTER SCHEMA s2 RENAME TO pg_asdf; +DROP SCHEMA s1; +DROP SCHEMA s2; + +-- Should fail. Shouldn't ALTER SCHEMA if not OWNER +CREATE SCHEMA s1; +CREATE ROLE r1; +SET ROLE r1; +ALTER SCHEMA s1 RENAME TO ss1; +ALTER SCHEMA s1 OWNER TO r1; +RESET ROLE; +DROP SCHEMA s1; +DROP ROLE r1; + +-- Should work. Non-Owner with CREATE ON DATABASE priviledge can RENAME SCHEMA +CREATE ROLE r1; +GRANT CREATE ON DATABASE regression to r1; +SET ROLE r1; +CREATE SCHEMA s1; +RESET ROLE; +ALTER SCHEMA s1 RENAME TO ss1; +DROP SCHEMA ss1; +REVOKE CREATE ON DATABASE regression FROM r1; +DROP ROLE r1; + +-- Should fail. OWNER without CREATE ON DATABASE can't ALTER OWNER SCHEMA +CREATE ROLE r1; +CREATE SCHEMA s1 AUTHORIZATION r1; +CREATE ROLE r2; +GRANT r2 TO r1; +SET ROLE r1; +ALTER SCHEMA s1 RENAME TO ss1; +ALTER SCHEMA s1 OWNER TO r2; +RESET ROLE; +DROP SCHEMA s1; +REVOKE r2 FROM r1; +DROP ROLE r2; +DROP ROLE r1; + +-- Should work. Try to have multiple OWNERships for a ROLE +CREATE ROLE r1; +CREATE ROLE r2; +CREATE SCHEMA s1; +GRANT CREATE ON SCHEMA s1 TO r1; +GRANT ALL ON SCHEMA s1 TO r2; +ALTER SCHEMA s1 OWNER TO r1; +REVOKE CREATE ON SCHEMA s1 FROM r1; +REVOKE ALL ON SCHEMA s1 FROM r2; +DROP SCHEMA s1; +DROP ROLE r2; +DROP ROLE r1; + +-- Change OWNER of SCHEMA +CREATE SCHEMA s1; +CREATE ROLE r1; +ALTER SCHEMA s1 OWNER TO r1; +DROP SCHEMA s1; +DROP ROLE r1; + +-- Should fail. Can't change OWNER of SCHEMA if doesn't exist/invalid name/etc. +ALTER SCHEMA s1 RENAME TO ss1; +CREATE ROLE r1; +ALTER SCHEMA s1 OWNER TO r1; +DROP ROLE r1; + + -- 1.7.10.4