144 lines
3.2 KiB
Plaintext
144 lines
3.2 KiB
Plaintext
--
|
|
-- Test explicit subtransactions
|
|
--
|
|
CREATE TABLE subtransaction_tbl (
|
|
i integer
|
|
);
|
|
--
|
|
-- We use this wrapper to catch errors and return errormsg only,
|
|
-- because values of $::errorinfo variable contain procedure name which
|
|
-- includes OID, so it's not stable
|
|
--
|
|
CREATE FUNCTION pltcl_wrapper(statement text) RETURNS text
|
|
AS $$
|
|
if [catch {spi_exec $1} msg] {
|
|
return "ERROR: $msg"
|
|
} else {
|
|
return "SUCCESS: $msg"
|
|
}
|
|
$$ LANGUAGE pltcl;
|
|
-- Test subtransaction successfully committed
|
|
CREATE FUNCTION subtransaction_ctx_success() RETURNS void
|
|
AS $$
|
|
spi_exec "INSERT INTO subtransaction_tbl VALUES(1)"
|
|
subtransaction {
|
|
spi_exec "INSERT INTO subtransaction_tbl VALUES(2)"
|
|
}
|
|
$$ LANGUAGE pltcl;
|
|
BEGIN;
|
|
INSERT INTO subtransaction_tbl VALUES(0);
|
|
SELECT subtransaction_ctx_success();
|
|
subtransaction_ctx_success
|
|
----------------------------
|
|
|
|
(1 row)
|
|
|
|
COMMIT;
|
|
SELECT * FROM subtransaction_tbl;
|
|
i
|
|
---
|
|
0
|
|
1
|
|
2
|
|
(3 rows)
|
|
|
|
TRUNCATE subtransaction_tbl;
|
|
-- Test subtransaction rollback
|
|
CREATE FUNCTION subtransaction_ctx_test(what_error text = NULL) RETURNS void
|
|
AS $$
|
|
spi_exec "INSERT INTO subtransaction_tbl VALUES (1)"
|
|
subtransaction {
|
|
spi_exec "INSERT INTO subtransaction_tbl VALUES (2)"
|
|
if {$1 == "SPI"} {
|
|
spi_exec "INSERT INTO subtransaction_tbl VALUES ('oops')"
|
|
} elseif { $1 == "Tcl"} {
|
|
elog ERROR "Tcl error"
|
|
}
|
|
}
|
|
$$ LANGUAGE pltcl;
|
|
SELECT pltcl_wrapper('SELECT subtransaction_ctx_test()');
|
|
pltcl_wrapper
|
|
---------------
|
|
SUCCESS: 1
|
|
(1 row)
|
|
|
|
SELECT * FROM subtransaction_tbl;
|
|
i
|
|
---
|
|
1
|
|
2
|
|
(2 rows)
|
|
|
|
TRUNCATE subtransaction_tbl;
|
|
SELECT pltcl_wrapper('SELECT subtransaction_ctx_test(''SPI'')');
|
|
pltcl_wrapper
|
|
------------------------------------------------------
|
|
ERROR: invalid input syntax for type integer: "oops"
|
|
(1 row)
|
|
|
|
SELECT * FROM subtransaction_tbl;
|
|
i
|
|
---
|
|
(0 rows)
|
|
|
|
TRUNCATE subtransaction_tbl;
|
|
SELECT pltcl_wrapper('SELECT subtransaction_ctx_test(''Tcl'')');
|
|
pltcl_wrapper
|
|
------------------
|
|
ERROR: Tcl error
|
|
(1 row)
|
|
|
|
SELECT * FROM subtransaction_tbl;
|
|
i
|
|
---
|
|
(0 rows)
|
|
|
|
TRUNCATE subtransaction_tbl;
|
|
-- Nested subtransactions
|
|
CREATE FUNCTION subtransaction_nested_test(swallow boolean = 'f') RETURNS text
|
|
AS $$
|
|
spi_exec "INSERT INTO subtransaction_tbl VALUES (1)"
|
|
subtransaction {
|
|
spi_exec "INSERT INTO subtransaction_tbl VALUES (2)"
|
|
if [catch {
|
|
subtransaction {
|
|
spi_exec "INSERT INTO subtransaction_tbl VALUES (3)"
|
|
spi_exec "error"
|
|
}
|
|
} errormsg] {
|
|
if {$1 != "t"} {
|
|
error $errormsg $::errorInfo $::errorCode
|
|
}
|
|
elog NOTICE "Swallowed $errormsg"
|
|
}
|
|
}
|
|
return "ok"
|
|
$$ LANGUAGE pltcl;
|
|
SELECT pltcl_wrapper('SELECT subtransaction_nested_test()');
|
|
pltcl_wrapper
|
|
----------------------------------------
|
|
ERROR: syntax error at or near "error"
|
|
(1 row)
|
|
|
|
SELECT * FROM subtransaction_tbl;
|
|
i
|
|
---
|
|
(0 rows)
|
|
|
|
TRUNCATE subtransaction_tbl;
|
|
SELECT pltcl_wrapper('SELECT subtransaction_nested_test(''t'')');
|
|
NOTICE: Swallowed syntax error at or near "error"
|
|
pltcl_wrapper
|
|
---------------
|
|
SUCCESS: 1
|
|
(1 row)
|
|
|
|
SELECT * FROM subtransaction_tbl;
|
|
i
|
|
---
|
|
1
|
|
2
|
|
(2 rows)
|
|
|
|
TRUNCATE subtransaction_tbl;
|