Adjust some comments about structure properties in pg_stat.h
[pgsql.git] / src / pl / plperl / sql / plperl_transaction.sql
blobd10c8bee8978be00457fdac125ddc4b7162da4c5
1 CREATE TABLE test1 (a int, b text);
4 CREATE PROCEDURE transaction_test1()
5 LANGUAGE plperl
6 AS $$
7 foreach my $i (0..9) {
8     spi_exec_query("INSERT INTO test1 (a) VALUES ($i)");
9     if ($i % 2 == 0) {
10         spi_commit();
11     } else {
12         spi_rollback();
13     }
15 $$;
17 CALL transaction_test1();
19 SELECT * FROM test1;
22 TRUNCATE test1;
25 LANGUAGE plperl
27 foreach my $i (0..9) {
28     spi_exec_query("INSERT INTO test1 (a) VALUES ($i)");
29     if ($i % 2 == 0) {
30         spi_commit();
31     } else {
32         spi_rollback();
33     }
35 $$;
37 SELECT * FROM test1;
40 TRUNCATE test1;
42 -- not allowed in a function
43 CREATE FUNCTION transaction_test2() RETURNS int
44 LANGUAGE plperl
45 AS $$
46 foreach my $i (0..9) {
47     spi_exec_query("INSERT INTO test1 (a) VALUES ($i)");
48     if ($i % 2 == 0) {
49         spi_commit();
50     } else {
51         spi_rollback();
52     }
54 return 1;
55 $$;
57 SELECT transaction_test2();
59 SELECT * FROM test1;
62 -- also not allowed if procedure is called from a function
63 CREATE FUNCTION transaction_test3() RETURNS int
64 LANGUAGE plperl
65 AS $$
66 spi_exec_query("CALL transaction_test1()");
67 return 1;
68 $$;
70 SELECT transaction_test3();
72 SELECT * FROM test1;
75 -- DO block inside function
76 CREATE FUNCTION transaction_test4() RETURNS int
77 LANGUAGE plperl
78 AS $$
79 spi_exec_query('DO LANGUAGE plperl $x$ spi_commit(); $x$');
80 return 1;
81 $$;
83 SELECT transaction_test4();
86 -- commit inside cursor loop
87 CREATE TABLE test2 (x int);
88 INSERT INTO test2 VALUES (0), (1), (2), (3), (4);
90 TRUNCATE test1;
92 DO LANGUAGE plperl $$
93 my $sth = spi_query("SELECT * FROM test2 ORDER BY x");
94 my $row;
95 while (defined($row = spi_fetchrow($sth))) {
96     spi_exec_query("INSERT INTO test1 (a) VALUES (" . $row->{x} . ")");
97     spi_commit();
99 $$;
101 SELECT * FROM test1;
103 -- check that this doesn't leak a holdable portal
104 SELECT * FROM pg_cursors;
107 -- error in cursor loop with commit
108 TRUNCATE test1;
110 DO LANGUAGE plperl $$
111 my $sth = spi_query("SELECT * FROM test2 ORDER BY x");
112 my $row;
113 while (defined($row = spi_fetchrow($sth))) {
114     spi_exec_query("INSERT INTO test1 (a) VALUES (12/(" . $row->{x} . "-2))");
115     spi_commit();
119 SELECT * FROM test1;
121 SELECT * FROM pg_cursors;
124 -- rollback inside cursor loop
125 TRUNCATE test1;
127 DO LANGUAGE plperl $$
128 my $sth = spi_query("SELECT * FROM test2 ORDER BY x");
129 my $row;
130 while (defined($row = spi_fetchrow($sth))) {
131     spi_exec_query("INSERT INTO test1 (a) VALUES (" . $row->{x} . ")");
132     spi_rollback();
136 SELECT * FROM test1;
138 SELECT * FROM pg_cursors;
141 -- first commit then rollback inside cursor loop
142 TRUNCATE test1;
144 DO LANGUAGE plperl $$
145 my $sth = spi_query("SELECT * FROM test2 ORDER BY x");
146 my $row;
147 while (defined($row = spi_fetchrow($sth))) {
148     spi_exec_query("INSERT INTO test1 (a) VALUES (" . $row->{x} . ")");
149     if ($row->{x} % 2 == 0) {
150         spi_commit();
151     } else {
152         spi_rollback();
153     }
157 SELECT * FROM test1;
159 SELECT * FROM pg_cursors;
162 -- check handling of an error during COMMIT
163 CREATE TABLE testpk (id int PRIMARY KEY);
164 CREATE TABLE testfk(f1 int REFERENCES testpk DEFERRABLE INITIALLY DEFERRED);
166 DO LANGUAGE plperl $$
167 # this insert will fail during commit:
168 spi_exec_query("INSERT INTO testfk VALUES (0)");
169 spi_commit();
170 elog(WARNING, 'should not get here');
173 SELECT * FROM testpk;
174 SELECT * FROM testfk;
176 DO LANGUAGE plperl $$
177 # this insert will fail during commit:
178 spi_exec_query("INSERT INTO testfk VALUES (0)");
179 eval {
180     spi_commit();
182 if ($@) {
183     elog(INFO, $@);
185 # these inserts should work:
186 spi_exec_query("INSERT INTO testpk VALUES (1)");
187 spi_exec_query("INSERT INTO testfk VALUES (1)");
190 SELECT * FROM testpk;
191 SELECT * FROM testfk;
194 DROP TABLE test1;
195 DROP TABLE test2;