2 -- Test access privileges
5 CREATE USER regressuser1;
6 CREATE USER regressuser2;
7 CREATE USER regressuser3;
8 CREATE USER regressuser4;
9 CREATE USER regressuser4; -- duplicate
11 CREATE GROUP regressgroup1;
12 CREATE GROUP regressgroup2 WITH USER regressuser1, regressuser2;
14 ALTER GROUP regressgroup1 ADD USER regressuser4;
16 ALTER GROUP regressgroup2 ADD USER regressuser2; -- duplicate
17 ALTER GROUP regressgroup2 DROP USER regressuser2;
18 ALTER GROUP regressgroup2 ADD USER regressuser4;
21 -- test owner privileges
23 SET SESSION AUTHORIZATION regressuser1;
24 SELECT session_user, current_user;
26 CREATE TABLE atest1 ( a int, b text );
28 INSERT INTO atest1 VALUES (1, 'one');
30 UPDATE atest1 SET a = 1 WHERE b = 'blech';
31 LOCK atest1 IN ACCESS EXCLUSIVE MODE;
33 REVOKE ALL ON atest1 FROM PUBLIC;
36 GRANT ALL ON atest1 TO regressuser2;
37 GRANT SELECT ON atest1 TO regressuser3, regressuser4;
40 CREATE TABLE atest2 (col1 varchar(10), col2 boolean);
41 GRANT SELECT ON atest2 TO regressuser2;
42 GRANT UPDATE ON atest2 TO regressuser3;
43 GRANT INSERT ON atest2 TO regressuser4;
46 SET SESSION AUTHORIZATION regressuser2;
47 SELECT session_user, current_user;
49 -- try various combinations of queries on atest1 and atest2
51 SELECT * FROM atest1; -- ok
52 SELECT * FROM atest2; -- ok
53 INSERT INTO atest1 VALUES (2, 'two'); -- ok
54 INSERT INTO atest2 VALUES ('foo', true); -- fail
55 INSERT INTO atest1 SELECT 1, b FROM atest1; -- ok
56 UPDATE atest1 SET a = 1 WHERE a = 2; -- ok
57 UPDATE atest2 SET col2 = NOT col2; -- fail
58 SELECT * FROM atest1 FOR UPDATE; -- ok
59 SELECT * FROM atest2 FOR UPDATE; -- fail
60 DELETE FROM atest2; -- fail
61 LOCK atest2 IN ACCESS EXCLUSIVE MODE; -- fail
62 COPY atest2 FROM stdin; -- fail
63 GRANT ALL ON atest1 TO PUBLIC; -- fail
65 -- checks in subquery, both ok
66 SELECT * FROM atest1 WHERE ( b IN ( SELECT col1 FROM atest2 ) );
67 SELECT * FROM atest2 WHERE ( col1 IN ( SELECT b FROM atest1 ) );
70 SET SESSION AUTHORIZATION regressuser3;
71 SELECT session_user, current_user;
73 SELECT * FROM atest1; -- ok
74 SELECT * FROM atest2; -- fail
75 INSERT INTO atest1 VALUES (2, 'two'); -- fail
76 INSERT INTO atest2 VALUES ('foo', true); -- fail
77 INSERT INTO atest1 SELECT 1, b FROM atest1; -- fail
78 UPDATE atest1 SET a = 1 WHERE a = 2; -- fail
79 UPDATE atest2 SET col2 = NULL; -- ok
80 UPDATE atest2 SET col2 = NOT col2; -- fails; requires SELECT on atest2
81 UPDATE atest2 SET col2 = true WHERE atest1.a = 5; -- ok
82 SELECT * FROM atest1 FOR UPDATE; -- fail
83 SELECT * FROM atest2 FOR UPDATE; -- fail
84 DELETE FROM atest2; -- fail
85 LOCK atest2 IN ACCESS EXCLUSIVE MODE; -- ok
86 COPY atest2 FROM stdin; -- fail
88 -- checks in subquery, both fail
89 SELECT * FROM atest1 WHERE ( b IN ( SELECT col1 FROM atest2 ) );
90 SELECT * FROM atest2 WHERE ( col1 IN ( SELECT b FROM atest1 ) );
92 SET SESSION AUTHORIZATION regressuser4;
93 COPY atest2 FROM stdin; -- ok
96 SELECT * FROM atest1; -- ok
101 SET SESSION AUTHORIZATION regressuser3;
102 CREATE TABLE atest3 (one int, two int, three int);
103 GRANT DELETE ON atest3 TO GROUP regressgroup2;
105 SET SESSION AUTHORIZATION regressuser1;
107 SELECT * FROM atest3; -- fail
108 DELETE FROM atest3; -- ok
113 SET SESSION AUTHORIZATION regressuser3;
115 CREATE VIEW atestv1 AS SELECT * FROM atest1; -- ok
116 /* The next *should* fail, but it's not implemented that way yet. */
117 CREATE VIEW atestv2 AS SELECT * FROM atest2;
118 CREATE VIEW atestv3 AS SELECT * FROM atest3; -- ok
120 SELECT * FROM atestv1; -- ok
121 GRANT SELECT ON atestv1, atestv3 TO regressuser4;
123 SET SESSION AUTHORIZATION regressuser4;
125 SELECT * FROM atestv1; -- ok
126 SELECT * FROM atestv3; -- ok
129 -- has_table_privilege function
132 select has_table_privilege(NULL,'pg_shadow','select');
133 select has_table_privilege('pg_shad','select');
134 select has_table_privilege('nosuchuser','pg_shadow','select');
135 select has_table_privilege('pg_shadow','sel');
136 select has_table_privilege(-999999,'pg_shadow','update');
137 select has_table_privilege(1,'rule');
141 select has_table_privilege(current_user,'pg_shadow','select');
142 select has_table_privilege(current_user,'pg_shadow','insert');
144 select has_table_privilege(t2.usesysid,'pg_shadow','update')
145 from (select usesysid from pg_user where usename = current_user) as t2;
146 select has_table_privilege(t2.usesysid,'pg_shadow','delete')
147 from (select usesysid from pg_user where usename = current_user) as t2;
149 select has_table_privilege(current_user,t1.oid,'rule')
150 from (select oid from pg_class where relname = 'pg_shadow') as t1;
151 select has_table_privilege(current_user,t1.oid,'references')
152 from (select oid from pg_class where relname = 'pg_shadow') as t1;
154 select has_table_privilege(t2.usesysid,t1.oid,'select')
155 from (select oid from pg_class where relname = 'pg_shadow') as t1,
156 (select usesysid from pg_user where usename = current_user) as t2;
157 select has_table_privilege(t2.usesysid,t1.oid,'insert')
158 from (select oid from pg_class where relname = 'pg_shadow') as t1,
159 (select usesysid from pg_user where usename = current_user) as t2;
161 select has_table_privilege('pg_shadow','update');
162 select has_table_privilege('pg_shadow','delete');
164 select has_table_privilege(t1.oid,'select')
165 from (select oid from pg_class where relname = 'pg_shadow') as t1;
166 select has_table_privilege(t1.oid,'trigger')
167 from (select oid from pg_class where relname = 'pg_shadow') as t1;
170 SET SESSION AUTHORIZATION regressuser3;
172 select has_table_privilege(current_user,'pg_class','select');
173 select has_table_privilege(current_user,'pg_class','insert');
175 select has_table_privilege(t2.usesysid,'pg_class','update')
176 from (select usesysid from pg_user where usename = current_user) as t2;
177 select has_table_privilege(t2.usesysid,'pg_class','delete')
178 from (select usesysid from pg_user where usename = current_user) as t2;
180 select has_table_privilege(current_user,t1.oid,'rule')
181 from (select oid from pg_class where relname = 'pg_class') as t1;
182 select has_table_privilege(current_user,t1.oid,'references')
183 from (select oid from pg_class where relname = 'pg_class') as t1;
185 select has_table_privilege(t2.usesysid,t1.oid,'select')
186 from (select oid from pg_class where relname = 'pg_class') as t1,
187 (select usesysid from pg_user where usename = current_user) as t2;
188 select has_table_privilege(t2.usesysid,t1.oid,'insert')
189 from (select oid from pg_class where relname = 'pg_class') as t1,
190 (select usesysid from pg_user where usename = current_user) as t2;
192 select has_table_privilege('pg_class','update');
193 select has_table_privilege('pg_class','delete');
195 select has_table_privilege(t1.oid,'select')
196 from (select oid from pg_class where relname = 'pg_class') as t1;
197 select has_table_privilege(t1.oid,'trigger')
198 from (select oid from pg_class where relname = 'pg_class') as t1;
200 select has_table_privilege(current_user,'atest1','select');
201 select has_table_privilege(current_user,'atest1','insert');
203 select has_table_privilege(t2.usesysid,'atest1','update')
204 from (select usesysid from pg_user where usename = current_user) as t2;
205 select has_table_privilege(t2.usesysid,'atest1','delete')
206 from (select usesysid from pg_user where usename = current_user) as t2;
208 select has_table_privilege(current_user,t1.oid,'rule')
209 from (select oid from pg_class where relname = 'atest1') as t1;
210 select has_table_privilege(current_user,t1.oid,'references')
211 from (select oid from pg_class where relname = 'atest1') as t1;
213 select has_table_privilege(t2.usesysid,t1.oid,'select')
214 from (select oid from pg_class where relname = 'atest1') as t1,
215 (select usesysid from pg_user where usename = current_user) as t2;
216 select has_table_privilege(t2.usesysid,t1.oid,'insert')
217 from (select oid from pg_class where relname = 'atest1') as t1,
218 (select usesysid from pg_user where usename = current_user) as t2;
220 select has_table_privilege('atest1','update');
221 select has_table_privilege('atest1','delete');
223 select has_table_privilege(t1.oid,'select')
224 from (select oid from pg_class where relname = 'atest1') as t1;
225 select has_table_privilege(t1.oid,'trigger')
226 from (select oid from pg_class where relname = 'atest1') as t1;
240 DROP GROUP regressgroup1;
241 DROP GROUP regressgroup2;
243 DROP USER regressuser1;
244 DROP USER regressuser2;
245 DROP USER regressuser3;
246 DROP USER regressuser4;