Consistently use "superuser" instead of "super user"
[pgsql.git] / src / test / regress / expected / prepared_xacts.out
blobba8e3ccc6c9bf35d192dff5b8f49dd9be8055ea1
1 --
2 -- PREPARED TRANSACTIONS (two-phase commit)
3 --
4 -- We can't readily test persistence of prepared xacts within the
5 -- regression script framework, unfortunately.  Note that a crash
6 -- isn't really needed ... stopping and starting the postmaster would
7 -- be enough, but we can't even do that here.
8 -- create a simple table that we'll use in the tests
9 CREATE TABLE pxtest1 (foobar VARCHAR(10));
10 INSERT INTO pxtest1 VALUES ('aaa');
11 -- Test PREPARE TRANSACTION
12 BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
13 UPDATE pxtest1 SET foobar = 'bbb' WHERE foobar = 'aaa';
14 SELECT * FROM pxtest1;
15  foobar 
16 --------
17  bbb
18 (1 row)
20 PREPARE TRANSACTION 'foo1';
21 SELECT * FROM pxtest1;
22  foobar 
23 --------
24  aaa
25 (1 row)
27 -- Test pg_prepared_xacts system view
28 SELECT gid FROM pg_prepared_xacts;
29  gid  
30 ------
31  foo1
32 (1 row)
34 -- Test ROLLBACK PREPARED
35 ROLLBACK PREPARED 'foo1';
36 SELECT * FROM pxtest1;
37  foobar 
38 --------
39  aaa
40 (1 row)
42 SELECT gid FROM pg_prepared_xacts;
43  gid 
44 -----
45 (0 rows)
47 -- Test COMMIT PREPARED
48 BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
49 INSERT INTO pxtest1 VALUES ('ddd');
50 SELECT * FROM pxtest1;
51  foobar 
52 --------
53  aaa
54  ddd
55 (2 rows)
57 PREPARE TRANSACTION 'foo2';
58 SELECT * FROM pxtest1;
59  foobar 
60 --------
61  aaa
62 (1 row)
64 COMMIT PREPARED 'foo2';
65 SELECT * FROM pxtest1;
66  foobar 
67 --------
68  aaa
69  ddd
70 (2 rows)
72 -- Test duplicate gids
73 BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
74 UPDATE pxtest1 SET foobar = 'eee' WHERE foobar = 'ddd';
75 SELECT * FROM pxtest1;
76  foobar 
77 --------
78  aaa
79  eee
80 (2 rows)
82 PREPARE TRANSACTION 'foo3';
83 SELECT gid FROM pg_prepared_xacts;
84  gid  
85 ------
86  foo3
87 (1 row)
89 BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
90 INSERT INTO pxtest1 VALUES ('fff');
91 -- This should fail, because the gid foo3 is already in use
92 PREPARE TRANSACTION 'foo3';
93 ERROR:  transaction identifier "foo3" is already in use
94 SELECT * FROM pxtest1;
95  foobar 
96 --------
97  aaa
98  ddd
99 (2 rows)
101 ROLLBACK PREPARED 'foo3';
102 SELECT * FROM pxtest1;
103  foobar 
104 --------
105  aaa
106  ddd
107 (2 rows)
109 -- Test serialization failure (SSI)
110 BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
111 UPDATE pxtest1 SET foobar = 'eee' WHERE foobar = 'ddd';
112 SELECT * FROM pxtest1;
113  foobar 
114 --------
115  aaa
116  eee
117 (2 rows)
119 PREPARE TRANSACTION 'foo4';
120 SELECT gid FROM pg_prepared_xacts;
121  gid  
122 ------
123  foo4
124 (1 row)
126 BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
127 SELECT * FROM pxtest1;
128  foobar 
129 --------
130  aaa
131  ddd
132 (2 rows)
134 -- This should fail, because the two transactions have a write-skew anomaly
135 INSERT INTO pxtest1 VALUES ('fff');
136 ERROR:  could not serialize access due to read/write dependencies among transactions
137 DETAIL:  Reason code: Canceled on identification as a pivot, during write.
138 HINT:  The transaction might succeed if retried.
139 PREPARE TRANSACTION 'foo5';
140 SELECT gid FROM pg_prepared_xacts;
141  gid  
142 ------
143  foo4
144 (1 row)
146 ROLLBACK PREPARED 'foo4';
147 SELECT gid FROM pg_prepared_xacts;
148  gid 
149 -----
150 (0 rows)
152 -- Clean up
153 DROP TABLE pxtest1;
154 -- Test detection of session-level and xact-level locks on same object
155 BEGIN;
156 SELECT pg_advisory_lock(1);
157  pg_advisory_lock 
158 ------------------
160 (1 row)
162 SELECT pg_advisory_xact_lock_shared(1);
163  pg_advisory_xact_lock_shared 
164 ------------------------------
166 (1 row)
168 PREPARE TRANSACTION 'foo6';  -- fails
169 ERROR:  cannot PREPARE while holding both session-level and transaction-level locks on the same object
170 -- Test subtransactions
171 BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
172   CREATE TABLE pxtest2 (a int);
173   INSERT INTO pxtest2 VALUES (1);
174   SAVEPOINT a;
175     INSERT INTO pxtest2 VALUES (2);
176   ROLLBACK TO a;
177   SAVEPOINT b;
178   INSERT INTO pxtest2 VALUES (3);
179 PREPARE TRANSACTION 'regress-one';
180 CREATE TABLE pxtest3(fff int);
181 -- Test shared invalidation
182 BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
183   DROP TABLE pxtest3;
184   CREATE TABLE pxtest4 (a int);
185   INSERT INTO pxtest4 VALUES (1);
186   INSERT INTO pxtest4 VALUES (2);
187   DECLARE foo CURSOR FOR SELECT * FROM pxtest4;
188   -- Fetch 1 tuple, keeping the cursor open
189   FETCH 1 FROM foo;
190  a 
193 (1 row)
195 PREPARE TRANSACTION 'regress-two';
196 -- No such cursor
197 FETCH 1 FROM foo;
198 ERROR:  cursor "foo" does not exist
199 -- Table doesn't exist, the creation hasn't been committed yet
200 SELECT * FROM pxtest2;
201 ERROR:  relation "pxtest2" does not exist
202 LINE 1: SELECT * FROM pxtest2;
203                       ^
204 -- There should be two prepared transactions
205 SELECT gid FROM pg_prepared_xacts;
206      gid     
207 -------------
208  regress-one
209  regress-two
210 (2 rows)
212 -- pxtest3 should be locked because of the pending DROP
213 begin;
214 lock table pxtest3 in access share mode nowait;
215 ERROR:  could not obtain lock on relation "pxtest3"
216 rollback;
217 -- Disconnect, we will continue testing in a different backend
218 \c -
219 -- There should still be two prepared transactions
220 SELECT gid FROM pg_prepared_xacts;
221      gid     
222 -------------
223  regress-one
224  regress-two
225 (2 rows)
227 -- pxtest3 should still be locked because of the pending DROP
228 begin;
229 lock table pxtest3 in access share mode nowait;
230 ERROR:  could not obtain lock on relation "pxtest3"
231 rollback;
232 -- Commit table creation
233 COMMIT PREPARED 'regress-one';
234 \d pxtest2
235               Table "public.pxtest2"
236  Column |  Type   | Collation | Nullable | Default 
237 --------+---------+-----------+----------+---------
238  a      | integer |           |          | 
240 SELECT * FROM pxtest2;
241  a 
245 (2 rows)
247 -- There should be one prepared transaction
248 SELECT gid FROM pg_prepared_xacts;
249      gid     
250 -------------
251  regress-two
252 (1 row)
254 -- Commit table drop
255 COMMIT PREPARED 'regress-two';
256 SELECT * FROM pxtest3;
257 ERROR:  relation "pxtest3" does not exist
258 LINE 1: SELECT * FROM pxtest3;
259                       ^
260 -- There should be no prepared transactions
261 SELECT gid FROM pg_prepared_xacts;
262  gid 
263 -----
264 (0 rows)
266 -- Clean up
267 DROP TABLE pxtest2;
268 DROP TABLE pxtest3;  -- will still be there if prepared xacts are disabled
269 ERROR:  table "pxtest3" does not exist
270 DROP TABLE pxtest4;