Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit2f36359

Browse files
committed
Additional PL/Python regression test expected file
plpython_subtransaction test needs a separate expected filespecifically for Python 2.5.
1 parent6eba5a7 commit2f36359

File tree

2 files changed

+373
-6
lines changed

2 files changed

+373
-6
lines changed

‎src/pl/plpython/expected/README

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
Guide to alternative expected files:
22

3-
plpython_error_0.outPython 2.4 and older
3+
plpython_error_0.outPython 2.4 and older
44

5-
plpython_unicode.outserver encoding != SQL_ASCII and client encoding == UTF8; else ...
6-
plpython_unicode_0.outserver encoding != SQL_ASCII and client encoding != UTF8; else ...
7-
plpython_unicode_3.outserver encoding == SQL_ASCII
5+
plpython_unicode.outserver encoding != SQL_ASCII and client encoding == UTF8; else ...
6+
plpython_unicode_0.outserver encoding != SQL_ASCII and client encoding != UTF8; else ...
7+
plpython_unicode_3.outserver encoding == SQL_ASCII
88

9-
plpython_subtransaction_0.outPython 2.5 and older (without with statement)
9+
plpython_subtransaction_0.outPython 2.4 and older (without with statement)
10+
plpython_subtransaction_5.outPython 2.5 (without with statement)
1011

11-
plpython_types_3.outPython 3.x
12+
plpython_types_3.outPython 3.x
1213

1314
Note: Building with Python 2.2 is supported, but there are no expected
1415
files for it (too much work to maintain).
Lines changed: 366 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,366 @@
1+
--
2+
-- Test explicit subtransactions
3+
--
4+
-- Test table to see if transactions get properly rolled back
5+
CREATE TABLE subtransaction_tbl (
6+
i integer
7+
);
8+
-- Explicit case for Python <2.6
9+
CREATE FUNCTION subtransaction_test(what_error text = NULL) RETURNS text
10+
AS $$
11+
import sys
12+
subxact = plpy.subtransaction()
13+
subxact.__enter__()
14+
exc = True
15+
try:
16+
try:
17+
plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)")
18+
plpy.execute("INSERT INTO subtransaction_tbl VALUES (2)")
19+
if what_error == "SPI":
20+
plpy.execute("INSERT INTO subtransaction_tbl VALUES ('oops')")
21+
elif what_error == "Python":
22+
plpy.attribute_error
23+
except:
24+
exc = False
25+
subxact.__exit__(*sys.exc_info())
26+
raise
27+
finally:
28+
if exc:
29+
subxact.__exit__(None, None, None)
30+
$$ LANGUAGE plpythonu;
31+
SELECT subtransaction_test();
32+
subtransaction_test
33+
---------------------
34+
35+
(1 row)
36+
37+
SELECT * FROM subtransaction_tbl;
38+
i
39+
---
40+
1
41+
2
42+
(2 rows)
43+
44+
TRUNCATE subtransaction_tbl;
45+
SELECT subtransaction_test('SPI');
46+
ERROR: spiexceptions.InvalidTextRepresentation: invalid input syntax for integer: "oops"
47+
LINE 1: INSERT INTO subtransaction_tbl VALUES ('oops')
48+
^
49+
QUERY: INSERT INTO subtransaction_tbl VALUES ('oops')
50+
CONTEXT: PL/Python function "subtransaction_test"
51+
SELECT * FROM subtransaction_tbl;
52+
i
53+
---
54+
(0 rows)
55+
56+
TRUNCATE subtransaction_tbl;
57+
SELECT subtransaction_test('Python');
58+
ERROR: AttributeError: 'module' object has no attribute 'attribute_error'
59+
CONTEXT: PL/Python function "subtransaction_test"
60+
SELECT * FROM subtransaction_tbl;
61+
i
62+
---
63+
(0 rows)
64+
65+
TRUNCATE subtransaction_tbl;
66+
-- Context manager case for Python >=2.6
67+
CREATE FUNCTION subtransaction_ctx_test(what_error text = NULL) RETURNS text
68+
AS $$
69+
with plpy.subtransaction():
70+
plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)")
71+
plpy.execute("INSERT INTO subtransaction_tbl VALUES (2)")
72+
if what_error == "SPI":
73+
plpy.execute("INSERT INTO subtransaction_tbl VALUES ('oops')")
74+
elif what_error == "Python":
75+
plpy.attribute_error
76+
$$ LANGUAGE plpythonu;
77+
ERROR: could not compile PL/Python function "subtransaction_ctx_test"
78+
DETAIL: SyntaxError: invalid syntax (<string>, line 3)
79+
SELECT subtransaction_ctx_test();
80+
ERROR: function subtransaction_ctx_test() does not exist
81+
LINE 1: SELECT subtransaction_ctx_test();
82+
^
83+
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
84+
SELECT * FROM subtransaction_tbl;
85+
i
86+
---
87+
(0 rows)
88+
89+
TRUNCATE subtransaction_tbl;
90+
SELECT subtransaction_ctx_test('SPI');
91+
ERROR: function subtransaction_ctx_test(unknown) does not exist
92+
LINE 1: SELECT subtransaction_ctx_test('SPI');
93+
^
94+
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
95+
SELECT * FROM subtransaction_tbl;
96+
i
97+
---
98+
(0 rows)
99+
100+
TRUNCATE subtransaction_tbl;
101+
SELECT subtransaction_ctx_test('Python');
102+
ERROR: function subtransaction_ctx_test(unknown) does not exist
103+
LINE 1: SELECT subtransaction_ctx_test('Python');
104+
^
105+
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
106+
SELECT * FROM subtransaction_tbl;
107+
i
108+
---
109+
(0 rows)
110+
111+
TRUNCATE subtransaction_tbl;
112+
-- Nested subtransactions
113+
CREATE FUNCTION subtransaction_nested_test(swallow boolean = 'f') RETURNS text
114+
AS $$
115+
plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)")
116+
with plpy.subtransaction():
117+
plpy.execute("INSERT INTO subtransaction_tbl VALUES (2)")
118+
try:
119+
with plpy.subtransaction():
120+
plpy.execute("INSERT INTO subtransaction_tbl VALUES (3)")
121+
plpy.execute("error")
122+
except plpy.SPIError, e:
123+
if not swallow:
124+
raise
125+
plpy.notice("Swallowed %r" % e)
126+
return "ok"
127+
$$ LANGUAGE plpythonu;
128+
ERROR: could not compile PL/Python function "subtransaction_nested_test"
129+
DETAIL: SyntaxError: invalid syntax (<string>, line 4)
130+
SELECT subtransaction_nested_test();
131+
ERROR: function subtransaction_nested_test() does not exist
132+
LINE 1: SELECT subtransaction_nested_test();
133+
^
134+
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
135+
SELECT * FROM subtransaction_tbl;
136+
i
137+
---
138+
(0 rows)
139+
140+
TRUNCATE subtransaction_tbl;
141+
SELECT subtransaction_nested_test('t');
142+
ERROR: function subtransaction_nested_test(unknown) does not exist
143+
LINE 1: SELECT subtransaction_nested_test('t');
144+
^
145+
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
146+
SELECT * FROM subtransaction_tbl;
147+
i
148+
---
149+
(0 rows)
150+
151+
TRUNCATE subtransaction_tbl;
152+
-- Nested subtransactions that recursively call code dealing with
153+
-- subtransactions
154+
CREATE FUNCTION subtransaction_deeply_nested_test() RETURNS text
155+
AS $$
156+
plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)")
157+
with plpy.subtransaction():
158+
plpy.execute("INSERT INTO subtransaction_tbl VALUES (2)")
159+
plpy.execute("SELECT subtransaction_nested_test('t')")
160+
return "ok"
161+
$$ LANGUAGE plpythonu;
162+
ERROR: could not compile PL/Python function "subtransaction_deeply_nested_test"
163+
DETAIL: SyntaxError: invalid syntax (<string>, line 4)
164+
SELECT subtransaction_deeply_nested_test();
165+
ERROR: function subtransaction_deeply_nested_test() does not exist
166+
LINE 1: SELECT subtransaction_deeply_nested_test();
167+
^
168+
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
169+
SELECT * FROM subtransaction_tbl;
170+
i
171+
---
172+
(0 rows)
173+
174+
TRUNCATE subtransaction_tbl;
175+
-- Error conditions from not opening/closing subtransactions
176+
CREATE FUNCTION subtransaction_exit_without_enter() RETURNS void
177+
AS $$
178+
plpy.subtransaction().__exit__(None, None, None)
179+
$$ LANGUAGE plpythonu;
180+
CREATE FUNCTION subtransaction_enter_without_exit() RETURNS void
181+
AS $$
182+
plpy.subtransaction().__enter__()
183+
$$ LANGUAGE plpythonu;
184+
CREATE FUNCTION subtransaction_exit_twice() RETURNS void
185+
AS $$
186+
plpy.subtransaction().__enter__()
187+
plpy.subtransaction().__exit__(None, None, None)
188+
plpy.subtransaction().__exit__(None, None, None)
189+
$$ LANGUAGE plpythonu;
190+
CREATE FUNCTION subtransaction_enter_twice() RETURNS void
191+
AS $$
192+
plpy.subtransaction().__enter__()
193+
plpy.subtransaction().__enter__()
194+
$$ LANGUAGE plpythonu;
195+
CREATE FUNCTION subtransaction_exit_same_subtransaction_twice() RETURNS void
196+
AS $$
197+
s = plpy.subtransaction()
198+
s.__enter__()
199+
s.__exit__(None, None, None)
200+
s.__exit__(None, None, None)
201+
$$ LANGUAGE plpythonu;
202+
CREATE FUNCTION subtransaction_enter_same_subtransaction_twice() RETURNS void
203+
AS $$
204+
s = plpy.subtransaction()
205+
s.__enter__()
206+
s.__enter__()
207+
s.__exit__(None, None, None)
208+
$$ LANGUAGE plpythonu;
209+
-- No warnings here, as the subtransaction gets indeed closed
210+
CREATE FUNCTION subtransaction_enter_subtransaction_in_with() RETURNS void
211+
AS $$
212+
with plpy.subtransaction() as s:
213+
s.__enter__()
214+
$$ LANGUAGE plpythonu;
215+
ERROR: could not compile PL/Python function "subtransaction_enter_subtransaction_in_with"
216+
DETAIL: SyntaxError: invalid syntax (<string>, line 3)
217+
CREATE FUNCTION subtransaction_exit_subtransaction_in_with() RETURNS void
218+
AS $$
219+
with plpy.subtransaction() as s:
220+
s.__exit__(None, None, None)
221+
$$ LANGUAGE plpythonu;
222+
ERROR: could not compile PL/Python function "subtransaction_exit_subtransaction_in_with"
223+
DETAIL: SyntaxError: invalid syntax (<string>, line 3)
224+
SELECT subtransaction_exit_without_enter();
225+
ERROR: ValueError: this subtransaction has not been entered
226+
CONTEXT: PL/Python function "subtransaction_exit_without_enter"
227+
SELECT subtransaction_enter_without_exit();
228+
WARNING: forcibly aborting a subtransaction that has not been exited
229+
CONTEXT: PL/Python function "subtransaction_enter_without_exit"
230+
subtransaction_enter_without_exit
231+
-----------------------------------
232+
233+
(1 row)
234+
235+
SELECT subtransaction_exit_twice();
236+
WARNING: forcibly aborting a subtransaction that has not been exited
237+
CONTEXT: PL/Python function "subtransaction_exit_twice"
238+
ERROR: ValueError: this subtransaction has not been entered
239+
CONTEXT: PL/Python function "subtransaction_exit_twice"
240+
SELECT subtransaction_enter_twice();
241+
WARNING: forcibly aborting a subtransaction that has not been exited
242+
CONTEXT: PL/Python function "subtransaction_enter_twice"
243+
WARNING: forcibly aborting a subtransaction that has not been exited
244+
CONTEXT: PL/Python function "subtransaction_enter_twice"
245+
subtransaction_enter_twice
246+
----------------------------
247+
248+
(1 row)
249+
250+
SELECT subtransaction_exit_same_subtransaction_twice();
251+
ERROR: ValueError: this subtransaction has already been exited
252+
CONTEXT: PL/Python function "subtransaction_exit_same_subtransaction_twice"
253+
SELECT subtransaction_enter_same_subtransaction_twice();
254+
WARNING: forcibly aborting a subtransaction that has not been exited
255+
CONTEXT: PL/Python function "subtransaction_enter_same_subtransaction_twice"
256+
ERROR: ValueError: this subtransaction has already been entered
257+
CONTEXT: PL/Python function "subtransaction_enter_same_subtransaction_twice"
258+
SELECT subtransaction_enter_subtransaction_in_with();
259+
ERROR: function subtransaction_enter_subtransaction_in_with() does not exist
260+
LINE 1: SELECT subtransaction_enter_subtransaction_in_with();
261+
^
262+
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
263+
SELECT subtransaction_exit_subtransaction_in_with();
264+
ERROR: function subtransaction_exit_subtransaction_in_with() does not exist
265+
LINE 1: SELECT subtransaction_exit_subtransaction_in_with();
266+
^
267+
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
268+
-- Make sure we don't get a "current transaction is aborted" error
269+
SELECT 1 as test;
270+
test
271+
------
272+
1
273+
(1 row)
274+
275+
-- Mix explicit subtransactions and normal SPI calls
276+
CREATE FUNCTION subtransaction_mix_explicit_and_implicit() RETURNS void
277+
AS $$
278+
p = plpy.prepare("INSERT INTO subtransaction_tbl VALUES ($1)", ["integer"])
279+
try:
280+
with plpy.subtransaction():
281+
plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)")
282+
plpy.execute(p, [2])
283+
plpy.execute(p, ["wrong"])
284+
except plpy.SPIError:
285+
plpy.warning("Caught a SPI error from an explicit subtransaction")
286+
287+
try:
288+
plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)")
289+
plpy.execute(p, [2])
290+
plpy.execute(p, ["wrong"])
291+
except plpy.SPIError:
292+
plpy.warning("Caught a SPI error")
293+
$$ LANGUAGE plpythonu;
294+
ERROR: could not compile PL/Python function "subtransaction_mix_explicit_and_implicit"
295+
DETAIL: SyntaxError: invalid syntax (<string>, line 5)
296+
SELECT subtransaction_mix_explicit_and_implicit();
297+
ERROR: function subtransaction_mix_explicit_and_implicit() does not exist
298+
LINE 1: SELECT subtransaction_mix_explicit_and_implicit();
299+
^
300+
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
301+
SELECT * FROM subtransaction_tbl;
302+
i
303+
---
304+
(0 rows)
305+
306+
TRUNCATE subtransaction_tbl;
307+
-- Alternative method names for Python <2.6
308+
CREATE FUNCTION subtransaction_alternative_names() RETURNS void
309+
AS $$
310+
s = plpy.subtransaction()
311+
s.enter()
312+
s.exit(None, None, None)
313+
$$ LANGUAGE plpythonu;
314+
SELECT subtransaction_alternative_names();
315+
subtransaction_alternative_names
316+
----------------------------------
317+
318+
(1 row)
319+
320+
-- try/catch inside a subtransaction block
321+
CREATE FUNCTION try_catch_inside_subtransaction() RETURNS void
322+
AS $$
323+
with plpy.subtransaction():
324+
plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)")
325+
try:
326+
plpy.execute("INSERT INTO subtransaction_tbl VALUES ('a')")
327+
except plpy.SPIError:
328+
plpy.notice("caught")
329+
$$ LANGUAGE plpythonu;
330+
ERROR: could not compile PL/Python function "try_catch_inside_subtransaction"
331+
DETAIL: SyntaxError: invalid syntax (<string>, line 3)
332+
SELECT try_catch_inside_subtransaction();
333+
ERROR: function try_catch_inside_subtransaction() does not exist
334+
LINE 1: SELECT try_catch_inside_subtransaction();
335+
^
336+
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
337+
SELECT * FROM subtransaction_tbl;
338+
i
339+
---
340+
(0 rows)
341+
342+
TRUNCATE subtransaction_tbl;
343+
ALTER TABLE subtransaction_tbl ADD PRIMARY KEY (i);
344+
NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "subtransaction_tbl_pkey" for table "subtransaction_tbl"
345+
CREATE FUNCTION pk_violation_inside_subtransaction() RETURNS void
346+
AS $$
347+
with plpy.subtransaction():
348+
plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)")
349+
try:
350+
plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)")
351+
except plpy.SPIError:
352+
plpy.notice("caught")
353+
$$ LANGUAGE plpythonu;
354+
ERROR: could not compile PL/Python function "pk_violation_inside_subtransaction"
355+
DETAIL: SyntaxError: invalid syntax (<string>, line 3)
356+
SELECT pk_violation_inside_subtransaction();
357+
ERROR: function pk_violation_inside_subtransaction() does not exist
358+
LINE 1: SELECT pk_violation_inside_subtransaction();
359+
^
360+
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
361+
SELECT * FROM subtransaction_tbl;
362+
i
363+
---
364+
(0 rows)
365+
366+
DROP TABLE subtransaction_tbl;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp