summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorHeikki Linnakangas2011-06-21 11:32:11 +0000
committerHeikki Linnakangas2011-06-21 11:49:50 +0000
commit1eea8e8a06bc718836c34b8f7da9420b38fc4851 (patch)
tree90d68b04494e2aec0330ca731062cdd15cbfe4a4 /src/test
parent7cb2ff9621a6129cc251f9d06bf23d3f9d426173 (diff)
Fix bug in PreCommit_CheckForSerializationFailure. A transaction that has
already been marked as PREPARED cannot be killed. Kill the current transaction instead. One of the prepared_xacts regression tests actually hits this bug. I removed the anomaly from the duplicate-gids test so that it fails in the intended way, and added a new test to check serialization failures with a prepared transaction. Dan Ports
Diffstat (limited to 'src/test')
-rw-r--r--src/test/regress/expected/prepared_xacts.out47
-rw-r--r--src/test/regress/sql/prepared_xacts.sql22
2 files changed, 62 insertions, 7 deletions
diff --git a/src/test/regress/expected/prepared_xacts.out b/src/test/regress/expected/prepared_xacts.out
index 1a6b4ce1d94..328cd7426ec 100644
--- a/src/test/regress/expected/prepared_xacts.out
+++ b/src/test/regress/expected/prepared_xacts.out
@@ -88,17 +88,17 @@ SELECT gid FROM pg_prepared_xacts;
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
INSERT INTO pxtest1 VALUES ('fff');
+-- This should fail, because the gid foo3 is already in use
+PREPARE TRANSACTION 'foo3';
+ERROR: transaction identifier "foo3" is already in use
SELECT * FROM pxtest1;
foobar
--------
aaa
ddd
- fff
-(3 rows)
+(2 rows)
--- This should fail, because the gid foo3 is already in use
-PREPARE TRANSACTION 'foo3';
-ERROR: transaction identifier "foo3" is already in use
+ROLLBACK PREPARED 'foo3';
SELECT * FROM pxtest1;
foobar
--------
@@ -106,7 +106,24 @@ SELECT * FROM pxtest1;
ddd
(2 rows)
-ROLLBACK PREPARED 'foo3';
+-- Test serialization failure (SSI)
+BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
+UPDATE pxtest1 SET foobar = 'eee' WHERE foobar = 'ddd';
+SELECT * FROM pxtest1;
+ foobar
+--------
+ aaa
+ eee
+(2 rows)
+
+PREPARE TRANSACTION 'foo4';
+SELECT gid FROM pg_prepared_xacts;
+ gid
+------
+ foo4
+(1 row)
+
+BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT * FROM pxtest1;
foobar
--------
@@ -114,6 +131,24 @@ SELECT * FROM pxtest1;
ddd
(2 rows)
+INSERT INTO pxtest1 VALUES ('fff');
+-- This should fail, because the two transactions have a write-skew anomaly
+PREPARE TRANSACTION 'foo5';
+ERROR: could not serialize access due to read/write dependencies among transactions
+DETAIL: Cancelled on commit attempt with conflict in from prepared pivot.
+HINT: The transaction might succeed if retried.
+SELECT gid FROM pg_prepared_xacts;
+ gid
+------
+ foo4
+(1 row)
+
+ROLLBACK PREPARED 'foo4';
+SELECT gid FROM pg_prepared_xacts;
+ gid
+-----
+(0 rows)
+
-- Clean up
DROP TABLE pxtest1;
-- Test subtransactions
diff --git a/src/test/regress/sql/prepared_xacts.sql b/src/test/regress/sql/prepared_xacts.sql
index 2bdbb0d1891..e06c9d47c13 100644
--- a/src/test/regress/sql/prepared_xacts.sql
+++ b/src/test/regress/sql/prepared_xacts.sql
@@ -54,7 +54,6 @@ SELECT gid FROM pg_prepared_xacts;
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
INSERT INTO pxtest1 VALUES ('fff');
-SELECT * FROM pxtest1;
-- This should fail, because the gid foo3 is already in use
PREPARE TRANSACTION 'foo3';
@@ -65,6 +64,27 @@ ROLLBACK PREPARED 'foo3';
SELECT * FROM pxtest1;
+-- Test serialization failure (SSI)
+BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
+UPDATE pxtest1 SET foobar = 'eee' WHERE foobar = 'ddd';
+SELECT * FROM pxtest1;
+PREPARE TRANSACTION 'foo4';
+
+SELECT gid FROM pg_prepared_xacts;
+
+BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
+SELECT * FROM pxtest1;
+INSERT INTO pxtest1 VALUES ('fff');
+
+-- This should fail, because the two transactions have a write-skew anomaly
+PREPARE TRANSACTION 'foo5';
+
+SELECT gid FROM pg_prepared_xacts;
+
+ROLLBACK PREPARED 'foo4';
+
+SELECT gid FROM pg_prepared_xacts;
+
-- Clean up
DROP TABLE pxtest1;