Consistently use "superuser" instead of "super user"
[pgsql.git] / src / pl / plpython / expected / plpython_transaction.out
blob14152993c7516ba4628ffda1da2eb06447e3dcbf
1 CREATE TABLE test1 (a int, b text);
2 CREATE PROCEDURE transaction_test1()
3 LANGUAGE plpythonu
4 AS $$
5 for i in range(0, 10):
6     plpy.execute("INSERT INTO test1 (a) VALUES (%d)" % i)
7     if i % 2 == 0:
8         plpy.commit()
9     else:
10         plpy.rollback()
11 $$;
12 CALL transaction_test1();
13 SELECT * FROM test1;
14  a | b 
15 ---+---
16  0 | 
17  2 | 
18  4 | 
19  6 | 
20  8 | 
21 (5 rows)
23 TRUNCATE test1;
25 LANGUAGE plpythonu
27 for i in range(0, 10):
28     plpy.execute("INSERT INTO test1 (a) VALUES (%d)" % i)
29     if i % 2 == 0:
30         plpy.commit()
31     else:
32         plpy.rollback()
33 $$;
34 SELECT * FROM test1;
35  a | b 
36 ---+---
37  0 | 
38  2 | 
39  4 | 
40  6 | 
41  8 | 
42 (5 rows)
44 TRUNCATE test1;
45 -- not allowed in a function
46 CREATE FUNCTION transaction_test2() RETURNS int
47 LANGUAGE plpythonu
48 AS $$
49 for i in range(0, 10):
50     plpy.execute("INSERT INTO test1 (a) VALUES (%d)" % i)
51     if i % 2 == 0:
52         plpy.commit()
53     else:
54         plpy.rollback()
55 return 1
56 $$;
57 SELECT transaction_test2();
58 ERROR:  invalid transaction termination
59 CONTEXT:  PL/Python function "transaction_test2"
60 SELECT * FROM test1;
61  a | b 
62 ---+---
63 (0 rows)
65 -- also not allowed if procedure is called from a function
66 CREATE FUNCTION transaction_test3() RETURNS int
67 LANGUAGE plpythonu
68 AS $$
69 plpy.execute("CALL transaction_test1()")
70 return 1
71 $$;
72 SELECT transaction_test3();
73 ERROR:  spiexceptions.InvalidTransactionTermination: invalid transaction termination
74 CONTEXT:  Traceback (most recent call last):
75   PL/Python function "transaction_test3", line 2, in <module>
76     plpy.execute("CALL transaction_test1()")
77 PL/Python function "transaction_test3"
78 SELECT * FROM test1;
79  a | b 
80 ---+---
81 (0 rows)
83 -- DO block inside function
84 CREATE FUNCTION transaction_test4() RETURNS int
85 LANGUAGE plpythonu
86 AS $$
87 plpy.execute("DO LANGUAGE plpythonu $x$ plpy.commit() $x$")
88 return 1
89 $$;
90 SELECT transaction_test4();
91 ERROR:  spiexceptions.InvalidTransactionTermination: invalid transaction termination
92 CONTEXT:  Traceback (most recent call last):
93   PL/Python function "transaction_test4", line 2, in <module>
94     plpy.execute("DO LANGUAGE plpythonu $x$ plpy.commit() $x$")
95 PL/Python function "transaction_test4"
96 -- commit inside subtransaction (prohibited)
97 DO LANGUAGE plpythonu $$
98 s = plpy.subtransaction()
99 s.enter()
100 plpy.commit()
102 WARNING:  forcibly aborting a subtransaction that has not been exited
103 ERROR:  cannot commit while a subtransaction is active
104 CONTEXT:  PL/Python anonymous code block
105 -- commit inside cursor loop
106 CREATE TABLE test2 (x int);
107 INSERT INTO test2 VALUES (0), (1), (2), (3), (4);
108 TRUNCATE test1;
109 DO LANGUAGE plpythonu $$
110 for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"):
111     plpy.execute("INSERT INTO test1 (a) VALUES (%s)" % row['x'])
112     plpy.commit()
114 SELECT * FROM test1;
115  a | b 
116 ---+---
117  0 | 
118  1 | 
119  2 | 
120  3 | 
121  4 | 
122 (5 rows)
124 -- check that this doesn't leak a holdable portal
125 SELECT * FROM pg_cursors;
126  name | statement | is_holdable | is_binary | is_scrollable | creation_time 
127 ------+-----------+-------------+-----------+---------------+---------------
128 (0 rows)
130 -- error in cursor loop with commit
131 TRUNCATE test1;
132 DO LANGUAGE plpythonu $$
133 for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"):
134     plpy.execute("INSERT INTO test1 (a) VALUES (12/(%s-2))" % row['x'])
135     plpy.commit()
137 ERROR:  spiexceptions.DivisionByZero: division by zero
138 CONTEXT:  Traceback (most recent call last):
139   PL/Python anonymous code block, line 3, in <module>
140     plpy.execute("INSERT INTO test1 (a) VALUES (12/(%s-2))" % row['x'])
141 PL/Python anonymous code block
142 SELECT * FROM test1;
143   a  | b 
144 -----+---
145   -6 | 
146  -12 | 
147 (2 rows)
149 SELECT * FROM pg_cursors;
150  name | statement | is_holdable | is_binary | is_scrollable | creation_time 
151 ------+-----------+-------------+-----------+---------------+---------------
152 (0 rows)
154 -- rollback inside cursor loop
155 TRUNCATE test1;
156 DO LANGUAGE plpythonu $$
157 for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"):
158     plpy.execute("INSERT INTO test1 (a) VALUES (%s)" % row['x'])
159     plpy.rollback()
161 SELECT * FROM test1;
162  a | b 
163 ---+---
164 (0 rows)
166 SELECT * FROM pg_cursors;
167  name | statement | is_holdable | is_binary | is_scrollable | creation_time 
168 ------+-----------+-------------+-----------+---------------+---------------
169 (0 rows)
171 -- first commit then rollback inside cursor loop
172 TRUNCATE test1;
173 DO LANGUAGE plpythonu $$
174 for row in plpy.cursor("SELECT * FROM test2 ORDER BY x"):
175     plpy.execute("INSERT INTO test1 (a) VALUES (%s)" % row['x'])
176     if row['x'] % 2 == 0:
177         plpy.commit()
178     else:
179         plpy.rollback()
181 SELECT * FROM test1;
182  a | b 
183 ---+---
184  0 | 
185  2 | 
186  4 | 
187 (3 rows)
189 SELECT * FROM pg_cursors;
190  name | statement | is_holdable | is_binary | is_scrollable | creation_time 
191 ------+-----------+-------------+-----------+---------------+---------------
192 (0 rows)
194 DROP TABLE test1;
195 DROP TABLE test2;