From 7a46d51d8338c686d61f4cc5c700a23c83cae07a Mon Sep 17 00:00:00 2001
From: Robins Tharakan <robins@pobox.com>
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

