Fix pg_dump bug in the database-level collation patch. "datcollate" and
[PostgreSQL.git] / src / test / regress / sql / prepared_xacts.sql
blob337567271de1da450372dc3776b1390967ed971f
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.
10 -- create a simple table that we'll use in the tests
11 CREATE TABLE pxtest1 (foobar VARCHAR(10));
13 INSERT INTO pxtest1 VALUES ('aaa');
16 -- Test PREPARE TRANSACTION
17 BEGIN;
18 UPDATE pxtest1 SET foobar = 'bbb' WHERE foobar = 'aaa';
19 SELECT * FROM pxtest1;
20 PREPARE TRANSACTION 'foo1';
22 SELECT * FROM pxtest1;
24 -- Test pg_prepared_xacts system view
25 SELECT gid FROM pg_prepared_xacts;
27 -- Test ROLLBACK PREPARED
28 ROLLBACK PREPARED 'foo1';
30 SELECT * FROM pxtest1;
32 SELECT gid FROM pg_prepared_xacts;
35 -- Test COMMIT PREPARED
36 BEGIN;
37 INSERT INTO pxtest1 VALUES ('ddd');
38 SELECT * FROM pxtest1;
39 PREPARE TRANSACTION 'foo2';
41 SELECT * FROM pxtest1;
43 COMMIT PREPARED 'foo2';
45 SELECT * FROM pxtest1;
47 -- Test duplicate gids
48 BEGIN;
49 UPDATE pxtest1 SET foobar = 'eee' WHERE foobar = 'ddd';
50 SELECT * FROM pxtest1;
51 PREPARE TRANSACTION 'foo3';
53 SELECT gid FROM pg_prepared_xacts;
55 BEGIN;
56 INSERT INTO pxtest1 VALUES ('fff');
57 SELECT * FROM pxtest1;
59 -- This should fail, because the gid foo3 is already in use
60 PREPARE TRANSACTION 'foo3';
62 SELECT * FROM pxtest1;
64 ROLLBACK PREPARED 'foo3';
66 SELECT * FROM pxtest1;
68 -- Clean up
69 DROP TABLE pxtest1;
71 -- Test subtransactions
72 BEGIN;
73   CREATE TABLE pxtest2 (a int);
74   INSERT INTO pxtest2 VALUES (1);
75   SAVEPOINT a;
76     INSERT INTO pxtest2 VALUES (2);
77   ROLLBACK TO a;
78   SAVEPOINT b;
79   INSERT INTO pxtest2 VALUES (3);
80 PREPARE TRANSACTION 'regress-one';
82 CREATE TABLE pxtest3(fff int);
84 -- Test shared invalidation
85 BEGIN;
86   DROP TABLE pxtest3;
87   CREATE TABLE pxtest4 (a int);
88   INSERT INTO pxtest4 VALUES (1);
89   INSERT INTO pxtest4 VALUES (2);
90   DECLARE foo CURSOR FOR SELECT * FROM pxtest4;
91   -- Fetch 1 tuple, keeping the cursor open
92   FETCH 1 FROM foo;
93 PREPARE TRANSACTION 'regress-two';
95 -- No such cursor
96 FETCH 1 FROM foo;
98 -- Table doesn't exist, the creation hasn't been committed yet
99 SELECT * FROM pxtest2;
101 -- There should be two prepared transactions
102 SELECT gid FROM pg_prepared_xacts;
104 -- pxtest3 should be locked because of the pending DROP
105 set statement_timeout to 2000;
106 SELECT * FROM pxtest3;
107 reset statement_timeout;
109 -- Disconnect, we will continue testing in a different backend
110 \c -
112 -- There should still be two prepared transactions
113 SELECT gid FROM pg_prepared_xacts;
115 -- pxtest3 should still be locked because of the pending DROP
116 set statement_timeout to 2000;
117 SELECT * FROM pxtest3;
118 reset statement_timeout;
120 -- Commit table creation
121 COMMIT PREPARED 'regress-one';
122 \d pxtest2
123 SELECT * FROM pxtest2;
125 -- There should be one prepared transaction
126 SELECT gid FROM pg_prepared_xacts;
128 -- Commit table drop
129 COMMIT PREPARED 'regress-two';
130 SELECT * FROM pxtest3;
132 -- There should be no prepared transactions
133 SELECT gid FROM pg_prepared_xacts;
135 -- Clean up
136 DROP TABLE pxtest2;
137 DROP TABLE pxtest4;