]> granicus.if.org Git - postgresql/blob - src/test/regress/sql/privileges.sql
Privileges on functions and procedural languages
[postgresql] / src / test / regress / sql / privileges.sql
1 --
2 -- Test access privileges
3 --
4
5 CREATE USER regressuser1;
6 CREATE USER regressuser2;
7 CREATE USER regressuser3;
8 CREATE USER regressuser4;
9 CREATE USER regressuser4;       -- duplicate
10
11 CREATE GROUP regressgroup1;
12 CREATE GROUP regressgroup2 WITH USER regressuser1, regressuser2;
13
14 ALTER GROUP regressgroup1 ADD USER regressuser4;
15
16 ALTER GROUP regressgroup2 ADD USER regressuser2;        -- duplicate
17 ALTER GROUP regressgroup2 DROP USER regressuser2;
18 ALTER GROUP regressgroup2 ADD USER regressuser4;
19
20
21 -- test owner privileges
22
23 SET SESSION AUTHORIZATION regressuser1;
24 SELECT session_user, current_user;
25
26 CREATE TABLE atest1 ( a int, b text );
27 SELECT * FROM atest1;
28 INSERT INTO atest1 VALUES (1, 'one');
29 DELETE FROM atest1;
30 UPDATE atest1 SET a = 1 WHERE b = 'blech';
31 LOCK atest1 IN ACCESS EXCLUSIVE MODE;
32
33 REVOKE ALL ON atest1 FROM PUBLIC;
34 SELECT * FROM atest1;
35
36 GRANT ALL ON atest1 TO regressuser2;
37 GRANT SELECT ON atest1 TO regressuser3, regressuser4;
38 SELECT * FROM atest1;
39
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;
44
45
46 SET SESSION AUTHORIZATION regressuser2;
47 SELECT session_user, current_user;
48
49 -- try various combinations of queries on atest1 and atest2
50
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
64
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 ) );
68
69
70 SET SESSION AUTHORIZATION regressuser3;
71 SELECT session_user, current_user;
72
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
87
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 ) );
91
92 SET SESSION AUTHORIZATION regressuser4;
93 COPY atest2 FROM stdin; -- ok
94 bar     true
95 \.
96 SELECT * FROM atest1; -- ok
97
98
99 -- groups
100
101 SET SESSION AUTHORIZATION regressuser3;
102 CREATE TABLE atest3 (one int, two int, three int);
103 GRANT DELETE ON atest3 TO GROUP regressgroup2;
104
105 SET SESSION AUTHORIZATION regressuser1;
106
107 SELECT * FROM atest3; -- fail
108 DELETE FROM atest3; -- ok
109
110
111 -- views
112
113 SET SESSION AUTHORIZATION regressuser3;
114
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
119
120 SELECT * FROM atestv1; -- ok
121 GRANT SELECT ON atestv1, atestv3 TO regressuser4;
122
123 SET SESSION AUTHORIZATION regressuser4;
124
125 SELECT * FROM atestv1; -- ok
126 SELECT * FROM atestv3; -- ok
127
128
129 -- privileges on functions, languages
130
131 -- switch to superuser
132 \c -
133 REVOKE ALL PRIVILEGES ON LANGUAGE sql FROM PUBLIC;
134 GRANT USAGE ON LANGUAGE sql TO regressuser1; -- ok
135 GRANT USAGE ON LANGUAGE c TO PUBLIC; -- fail
136
137 SET SESSION AUTHORIZATION regressuser1;
138 GRANT USAGE ON LANGUAGE sql TO regressuser2; -- fail
139 CREATE FUNCTION testfunc1(int) RETURNS int AS 'select 2 * $1;' LANGUAGE sql;
140 CREATE FUNCTION testfunc2(int) RETURNS int AS 'select 3 * $1;' LANGUAGE sql;
141
142 GRANT EXECUTE ON FUNCTION testfunc1(int), testfunc2(int) TO regressuser2;
143 GRANT USAGE ON FUNCTION testfunc1(int) TO regressuser3; -- semantic error
144 GRANT ALL PRIVILEGES ON FUNCTION testfunc1(int) TO regressuser4;
145 GRANT ALL PRIVILEGES ON FUNCTION testfunc_nosuch(int) TO regressuser4;
146
147 SET SESSION AUTHORIZATION regressuser2;
148 SELECT testfunc1(5), testfunc2(5); -- ok
149 CREATE FUNCTION testfunc3(int) RETURNS int AS 'select 2 * $1;' LANGUAGE sql; -- fail
150
151 SET SESSION AUTHORIZATION regressuser3;
152 SELECT testfunc1(5); -- fail
153
154 SET SESSION AUTHORIZATION regressuser4;
155 SELECT testfunc1(5); -- ok
156
157 DROP FUNCTION testfunc1(int); -- fail
158
159 \c -
160 DROP FUNCTION testfunc1(int); -- ok
161 -- restore to sanity
162 GRANT ALL PRIVILEGES ON LANGUAGE sql TO PUBLIC;
163
164
165 -- has_table_privilege function
166
167 -- bad-input checks
168 select has_table_privilege(NULL,'pg_shadow','select');
169 select has_table_privilege('pg_shad','select');
170 select has_table_privilege('nosuchuser','pg_shadow','select');
171 select has_table_privilege('pg_shadow','sel');
172 select has_table_privilege(-999999,'pg_shadow','update');
173 select has_table_privilege(1,'rule');
174
175 -- superuser
176 \c -
177 select has_table_privilege(current_user,'pg_shadow','select');
178 select has_table_privilege(current_user,'pg_shadow','insert');
179
180 select has_table_privilege(t2.usesysid,'pg_shadow','update')
181 from (select usesysid from pg_user where usename = current_user) as t2;
182 select has_table_privilege(t2.usesysid,'pg_shadow','delete')
183 from (select usesysid from pg_user where usename = current_user) as t2;
184
185 select has_table_privilege(current_user,t1.oid,'rule')
186 from (select oid from pg_class where relname = 'pg_shadow') as t1;
187 select has_table_privilege(current_user,t1.oid,'references')
188 from (select oid from pg_class where relname = 'pg_shadow') as t1;
189
190 select has_table_privilege(t2.usesysid,t1.oid,'select')
191 from (select oid from pg_class where relname = 'pg_shadow') as t1,
192   (select usesysid from pg_user where usename = current_user) as t2;
193 select has_table_privilege(t2.usesysid,t1.oid,'insert')
194 from (select oid from pg_class where relname = 'pg_shadow') as t1,
195   (select usesysid from pg_user where usename = current_user) as t2;
196
197 select has_table_privilege('pg_shadow','update');
198 select has_table_privilege('pg_shadow','delete');
199
200 select has_table_privilege(t1.oid,'select')
201 from (select oid from pg_class where relname = 'pg_shadow') as t1;
202 select has_table_privilege(t1.oid,'trigger')
203 from (select oid from pg_class where relname = 'pg_shadow') as t1;
204
205 -- non-superuser
206 SET SESSION AUTHORIZATION regressuser3;
207
208 select has_table_privilege(current_user,'pg_class','select');
209 select has_table_privilege(current_user,'pg_class','insert');
210
211 select has_table_privilege(t2.usesysid,'pg_class','update')
212 from (select usesysid from pg_user where usename = current_user) as t2;
213 select has_table_privilege(t2.usesysid,'pg_class','delete')
214 from (select usesysid from pg_user where usename = current_user) as t2;
215
216 select has_table_privilege(current_user,t1.oid,'rule')
217 from (select oid from pg_class where relname = 'pg_class') as t1;
218 select has_table_privilege(current_user,t1.oid,'references')
219 from (select oid from pg_class where relname = 'pg_class') as t1;
220
221 select has_table_privilege(t2.usesysid,t1.oid,'select')
222 from (select oid from pg_class where relname = 'pg_class') as t1,
223   (select usesysid from pg_user where usename = current_user) as t2;
224 select has_table_privilege(t2.usesysid,t1.oid,'insert')
225 from (select oid from pg_class where relname = 'pg_class') as t1,
226   (select usesysid from pg_user where usename = current_user) as t2;
227
228 select has_table_privilege('pg_class','update');
229 select has_table_privilege('pg_class','delete');
230
231 select has_table_privilege(t1.oid,'select')
232 from (select oid from pg_class where relname = 'pg_class') as t1;
233 select has_table_privilege(t1.oid,'trigger')
234 from (select oid from pg_class where relname = 'pg_class') as t1;
235
236 select has_table_privilege(current_user,'atest1','select');
237 select has_table_privilege(current_user,'atest1','insert');
238
239 select has_table_privilege(t2.usesysid,'atest1','update')
240 from (select usesysid from pg_user where usename = current_user) as t2;
241 select has_table_privilege(t2.usesysid,'atest1','delete')
242 from (select usesysid from pg_user where usename = current_user) as t2;
243
244 select has_table_privilege(current_user,t1.oid,'rule')
245 from (select oid from pg_class where relname = 'atest1') as t1;
246 select has_table_privilege(current_user,t1.oid,'references')
247 from (select oid from pg_class where relname = 'atest1') as t1;
248
249 select has_table_privilege(t2.usesysid,t1.oid,'select')
250 from (select oid from pg_class where relname = 'atest1') as t1,
251   (select usesysid from pg_user where usename = current_user) as t2;
252 select has_table_privilege(t2.usesysid,t1.oid,'insert')
253 from (select oid from pg_class where relname = 'atest1') as t1,
254   (select usesysid from pg_user where usename = current_user) as t2;
255
256 select has_table_privilege('atest1','update');
257 select has_table_privilege('atest1','delete');
258
259 select has_table_privilege(t1.oid,'select')
260 from (select oid from pg_class where relname = 'atest1') as t1;
261 select has_table_privilege(t1.oid,'trigger')
262 from (select oid from pg_class where relname = 'atest1') as t1;
263
264
265 -- clean up
266
267 \c regression
268 DROP TABLE atest1;
269 DROP TABLE atest2;
270 DROP TABLE atest3;
271
272 DROP VIEW atestv1;
273 DROP VIEW atestv2;
274 DROP VIEW atestv3;
275
276 DROP GROUP regressgroup1;
277 DROP GROUP regressgroup2;
278
279 DROP USER regressuser1;
280 DROP USER regressuser2;
281 DROP USER regressuser3;
282 DROP USER regressuser4;