Revert "Don't truncate database and user names in startup packets."
[pgsql.git] / src / test / regress / expected / lock.out
blobad137d3645d0c356b225ca7a7f5ee5d18d8c014d
1 --
2 -- Test the LOCK statement
3 --
4 -- directory paths and dlsuffix are passed to us in environment variables
5 \getenv libdir PG_LIBDIR
6 \getenv dlsuffix PG_DLSUFFIX
7 \set regresslib :libdir '/regress' :dlsuffix
8 -- Setup
9 CREATE SCHEMA lock_schema1;
10 SET search_path = lock_schema1;
11 CREATE TABLE lock_tbl1 (a BIGINT);
12 CREATE TABLE lock_tbl1a (a BIGINT);
13 CREATE VIEW lock_view1 AS SELECT * FROM lock_tbl1;
14 CREATE VIEW lock_view2(a,b) AS SELECT * FROM lock_tbl1, lock_tbl1a;
15 CREATE VIEW lock_view3 AS SELECT * from lock_view2;
16 CREATE VIEW lock_view4 AS SELECT (select a from lock_tbl1a limit 1) from lock_tbl1;
17 CREATE VIEW lock_view5 AS SELECT * from lock_tbl1 where a in (select * from lock_tbl1a);
18 CREATE VIEW lock_view6 AS SELECT * from (select * from lock_tbl1) sub;
19 CREATE ROLE regress_rol_lock1;
20 ALTER ROLE regress_rol_lock1 SET search_path = lock_schema1;
21 GRANT USAGE ON SCHEMA lock_schema1 TO regress_rol_lock1;
22 -- Try all valid lock options; also try omitting the optional TABLE keyword.
23 BEGIN TRANSACTION;
24 LOCK TABLE lock_tbl1 IN ACCESS SHARE MODE;
25 LOCK lock_tbl1 IN ROW SHARE MODE;
26 LOCK TABLE lock_tbl1 IN ROW EXCLUSIVE MODE;
27 LOCK TABLE lock_tbl1 IN SHARE UPDATE EXCLUSIVE MODE;
28 LOCK TABLE lock_tbl1 IN SHARE MODE;
29 LOCK lock_tbl1 IN SHARE ROW EXCLUSIVE MODE;
30 LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE;
31 LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE;
32 ROLLBACK;
33 -- Try using NOWAIT along with valid options.
34 BEGIN TRANSACTION;
35 LOCK TABLE lock_tbl1 IN ACCESS SHARE MODE NOWAIT;
36 LOCK TABLE lock_tbl1 IN ROW SHARE MODE NOWAIT;
37 LOCK TABLE lock_tbl1 IN ROW EXCLUSIVE MODE NOWAIT;
38 LOCK TABLE lock_tbl1 IN SHARE UPDATE EXCLUSIVE MODE NOWAIT;
39 LOCK TABLE lock_tbl1 IN SHARE MODE NOWAIT;
40 LOCK TABLE lock_tbl1 IN SHARE ROW EXCLUSIVE MODE NOWAIT;
41 LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE NOWAIT;
42 LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE NOWAIT;
43 ROLLBACK;
44 -- Verify that we can lock views.
45 BEGIN TRANSACTION;
46 LOCK TABLE lock_view1 IN EXCLUSIVE MODE;
47 -- lock_view1 and lock_tbl1 are locked.
48 select relname from pg_locks l, pg_class c
49  where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
50  order by relname;
51   relname   
52 ------------
53  lock_tbl1
54  lock_view1
55 (2 rows)
57 ROLLBACK;
58 BEGIN TRANSACTION;
59 LOCK TABLE lock_view2 IN EXCLUSIVE MODE;
60 -- lock_view1, lock_tbl1, and lock_tbl1a are locked.
61 select relname from pg_locks l, pg_class c
62  where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
63  order by relname;
64   relname   
65 ------------
66  lock_tbl1
67  lock_tbl1a
68  lock_view2
69 (3 rows)
71 ROLLBACK;
72 BEGIN TRANSACTION;
73 LOCK TABLE lock_view3 IN EXCLUSIVE MODE;
74 -- lock_view3, lock_view2, lock_tbl1, and lock_tbl1a are locked recursively.
75 select relname from pg_locks l, pg_class c
76  where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
77  order by relname;
78   relname   
79 ------------
80  lock_tbl1
81  lock_tbl1a
82  lock_view2
83  lock_view3
84 (4 rows)
86 ROLLBACK;
87 BEGIN TRANSACTION;
88 LOCK TABLE lock_view4 IN EXCLUSIVE MODE;
89 -- lock_view4, lock_tbl1, and lock_tbl1a are locked.
90 select relname from pg_locks l, pg_class c
91  where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
92  order by relname;
93   relname   
94 ------------
95  lock_tbl1
96  lock_tbl1a
97  lock_view4
98 (3 rows)
100 ROLLBACK;
101 BEGIN TRANSACTION;
102 LOCK TABLE lock_view5 IN EXCLUSIVE MODE;
103 -- lock_view5, lock_tbl1, and lock_tbl1a are locked.
104 select relname from pg_locks l, pg_class c
105  where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
106  order by relname;
107   relname   
108 ------------
109  lock_tbl1
110  lock_tbl1a
111  lock_view5
112 (3 rows)
114 ROLLBACK;
115 BEGIN TRANSACTION;
116 LOCK TABLE lock_view6 IN EXCLUSIVE MODE;
117 -- lock_view6 an lock_tbl1 are locked.
118 select relname from pg_locks l, pg_class c
119  where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
120  order by relname;
121   relname   
122 ------------
123  lock_tbl1
124  lock_view6
125 (2 rows)
127 ROLLBACK;
128 -- Verify that we cope with infinite recursion in view definitions.
129 CREATE OR REPLACE VIEW lock_view2 AS SELECT * from lock_view3;
130 BEGIN TRANSACTION;
131 LOCK TABLE lock_view2 IN EXCLUSIVE MODE;
132 ROLLBACK;
133 CREATE VIEW lock_view7 AS SELECT * from lock_view2;
134 BEGIN TRANSACTION;
135 LOCK TABLE lock_view7 IN EXCLUSIVE MODE;
136 ROLLBACK;
137 -- Verify that we can lock a table with inheritance children.
138 CREATE TABLE lock_tbl2 (b BIGINT) INHERITS (lock_tbl1);
139 CREATE TABLE lock_tbl3 () INHERITS (lock_tbl2);
140 BEGIN TRANSACTION;
141 LOCK TABLE lock_tbl1 * IN ACCESS EXCLUSIVE MODE;
142 ROLLBACK;
143 -- Child tables are locked without granting explicit permission to do so as
144 -- long as we have permission to lock the parent.
145 GRANT UPDATE ON TABLE lock_tbl1 TO regress_rol_lock1;
146 SET ROLE regress_rol_lock1;
147 -- fail when child locked directly
148 BEGIN;
149 LOCK TABLE lock_tbl2;
150 ERROR:  permission denied for table lock_tbl2
151 ROLLBACK;
152 BEGIN;
153 LOCK TABLE lock_tbl1 * IN ACCESS EXCLUSIVE MODE;
154 ROLLBACK;
155 BEGIN;
156 LOCK TABLE ONLY lock_tbl1;
157 ROLLBACK;
158 RESET ROLE;
159 REVOKE UPDATE ON TABLE lock_tbl1 FROM regress_rol_lock1;
160 -- Tables referred to by views are locked without explicit permission to do so
161 -- as long as we have permission to lock the view itself.
162 SET ROLE regress_rol_lock1;
163 -- fail without permissions on the view
164 BEGIN;
165 LOCK TABLE lock_view1;
166 ERROR:  permission denied for view lock_view1
167 ROLLBACK;
168 RESET ROLE;
169 GRANT UPDATE ON TABLE lock_view1 TO regress_rol_lock1;
170 SET ROLE regress_rol_lock1;
171 BEGIN;
172 LOCK TABLE lock_view1 IN ACCESS EXCLUSIVE MODE;
173 -- lock_view1 and lock_tbl1 (plus children lock_tbl2 and lock_tbl3) are locked.
174 select relname from pg_locks l, pg_class c
175  where l.relation = c.oid and relname like '%lock_%' and mode = 'AccessExclusiveLock'
176  order by relname;
177   relname   
178 ------------
179  lock_tbl1
180  lock_tbl2
181  lock_tbl3
182  lock_view1
183 (4 rows)
185 ROLLBACK;
186 RESET ROLE;
187 REVOKE UPDATE ON TABLE lock_view1 FROM regress_rol_lock1;
188 -- Tables referred to by security invoker views require explicit permission to
189 -- be locked.
190 CREATE VIEW lock_view8 WITH (security_invoker) AS SELECT * FROM lock_tbl1;
191 SET ROLE regress_rol_lock1;
192 -- fail without permissions on the view
193 BEGIN;
194 LOCK TABLE lock_view8;
195 ERROR:  permission denied for view lock_view8
196 ROLLBACK;
197 RESET ROLE;
198 GRANT UPDATE ON TABLE lock_view8 TO regress_rol_lock1;
199 SET ROLE regress_rol_lock1;
200 -- fail without permissions on the table referenced by the view
201 BEGIN;
202 LOCK TABLE lock_view8;
203 ERROR:  permission denied for table lock_tbl1
204 ROLLBACK;
205 RESET ROLE;
206 GRANT UPDATE ON TABLE lock_tbl1 TO regress_rol_lock1;
207 BEGIN;
208 LOCK TABLE lock_view8 IN ACCESS EXCLUSIVE MODE;
209 -- lock_view8 and lock_tbl1 (plus children lock_tbl2 and lock_tbl3) are locked.
210 select relname from pg_locks l, pg_class c
211  where l.relation = c.oid and relname like '%lock_%' and mode = 'AccessExclusiveLock'
212  order by relname;
213   relname   
214 ------------
215  lock_tbl1
216  lock_tbl2
217  lock_tbl3
218  lock_view8
219 (4 rows)
221 ROLLBACK;
222 RESET ROLE;
223 REVOKE UPDATE ON TABLE lock_view8 FROM regress_rol_lock1;
225 -- Clean up
227 DROP VIEW lock_view8;
228 DROP VIEW lock_view7;
229 DROP VIEW lock_view6;
230 DROP VIEW lock_view5;
231 DROP VIEW lock_view4;
232 DROP VIEW lock_view3 CASCADE;
233 NOTICE:  drop cascades to view lock_view2
234 DROP VIEW lock_view1;
235 DROP TABLE lock_tbl3;
236 DROP TABLE lock_tbl2;
237 DROP TABLE lock_tbl1;
238 DROP TABLE lock_tbl1a;
239 DROP SCHEMA lock_schema1 CASCADE;
240 DROP ROLE regress_rol_lock1;
241 -- atomic ops tests
242 RESET search_path;
243 CREATE FUNCTION test_atomic_ops()
244     RETURNS bool
245     AS :'regresslib'
246     LANGUAGE C;
247 SELECT test_atomic_ops();
248  test_atomic_ops 
249 -----------------
251 (1 row)