*** a/src/test/isolation/expected/fk-deadlock.out
--- b/src/test/isolation/expected/fk-deadlock.out
***************
*** 23,29 **** step s2i: INSERT INTO child VALUES (2, 1);
  step s1u: UPDATE parent SET aux = 'bar'; <waiting ...>
  step s2u: UPDATE parent SET aux = 'baz';
  step s1u: <... completed>
! ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
--- 23,29 ----
  step s1u: UPDATE parent SET aux = 'bar'; <waiting ...>
  step s2u: UPDATE parent SET aux = 'baz';
  step s1u: <... completed>
! error in steps s2u s1u: ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
***************
*** 32,39 **** step s1i: INSERT INTO child VALUES (1, 1);
  step s2i: INSERT INTO child VALUES (2, 1);
  step s2u: UPDATE parent SET aux = 'baz'; <waiting ...>
  step s1u: UPDATE parent SET aux = 'bar';
- ERROR:  deadlock detected
  step s2u: <... completed>
  step s2c: COMMIT;
  step s1c: COMMIT;
  
--- 32,39 ----
  step s2i: INSERT INTO child VALUES (2, 1);
  step s2u: UPDATE parent SET aux = 'baz'; <waiting ...>
  step s1u: UPDATE parent SET aux = 'bar';
  step s2u: <... completed>
+ error in steps s1u s2u: ERROR:  deadlock detected
  step s2c: COMMIT;
  step s1c: COMMIT;
  
***************
*** 43,49 **** step s1i: INSERT INTO child VALUES (1, 1);
  step s1u: UPDATE parent SET aux = 'bar'; <waiting ...>
  step s2u: UPDATE parent SET aux = 'baz';
  step s1u: <... completed>
! ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
--- 43,49 ----
  step s1u: UPDATE parent SET aux = 'bar'; <waiting ...>
  step s2u: UPDATE parent SET aux = 'baz';
  step s1u: <... completed>
! error in steps s2u s1u: ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
***************
*** 52,59 **** step s2i: INSERT INTO child VALUES (2, 1);
  step s1i: INSERT INTO child VALUES (1, 1);
  step s2u: UPDATE parent SET aux = 'baz'; <waiting ...>
  step s1u: UPDATE parent SET aux = 'bar';
- ERROR:  deadlock detected
  step s2u: <... completed>
  step s2c: COMMIT;
  step s1c: COMMIT;
  
--- 52,59 ----
  step s1i: INSERT INTO child VALUES (1, 1);
  step s2u: UPDATE parent SET aux = 'baz'; <waiting ...>
  step s1u: UPDATE parent SET aux = 'bar';
  step s2u: <... completed>
+ error in steps s1u s2u: ERROR:  deadlock detected
  step s2c: COMMIT;
  step s1c: COMMIT;
  
*** a/src/test/isolation/expected/fk-deadlock2.out
--- b/src/test/isolation/expected/fk-deadlock2.out
***************
*** 23,29 **** step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
! ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
--- 23,29 ----
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
! error in steps s2u2 s1u2: ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
***************
*** 33,39 **** step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
! ERROR:  deadlock detected
  step s2c: COMMIT;
  step s1c: COMMIT;
  
--- 33,39 ----
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
! error in steps s2u2 s1u2: ERROR:  deadlock detected
  step s2c: COMMIT;
  step s1c: COMMIT;
  
***************
*** 42,49 **** step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
  step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- ERROR:  deadlock detected
  step s2u2: <... completed>
  step s1c: COMMIT;
  step s2c: COMMIT;
  
--- 42,49 ----
  step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u2: <... completed>
+ error in steps s1u2 s2u2: ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
***************
*** 52,59 **** step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
  step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- ERROR:  deadlock detected
  step s2u2: <... completed>
  step s2c: COMMIT;
  step s1c: COMMIT;
  
--- 52,59 ----
  step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u2: <... completed>
+ error in steps s1u2 s2u2: ERROR:  deadlock detected
  step s2c: COMMIT;
  step s1c: COMMIT;
  
***************
*** 63,69 **** step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
! ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
--- 63,69 ----
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
! error in steps s2u2 s1u2: ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
***************
*** 73,79 **** step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
! ERROR:  deadlock detected
  step s2c: COMMIT;
  step s1c: COMMIT;
  
--- 73,79 ----
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
! error in steps s2u2 s1u2: ERROR:  deadlock detected
  step s2c: COMMIT;
  step s1c: COMMIT;
  
***************
*** 82,89 **** step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- ERROR:  deadlock detected
  step s2u2: <... completed>
  step s1c: COMMIT;
  step s2c: COMMIT;
  
--- 82,89 ----
  step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u2: <... completed>
+ error in steps s1u2 s2u2: ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
***************
*** 92,99 **** step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- ERROR:  deadlock detected
  step s2u2: <... completed>
  step s2c: COMMIT;
  step s1c: COMMIT;
  
--- 92,99 ----
  step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u2: <... completed>
+ error in steps s1u2 s2u2: ERROR:  deadlock detected
  step s2c: COMMIT;
  step s1c: COMMIT;
  
*** a/src/test/isolation/expected/fk-deadlock2_1.out
--- b/src/test/isolation/expected/fk-deadlock2_1.out
***************
*** 14,20 **** step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1c: COMMIT;
  step s2u1: <... completed>
! ERROR:  could not serialize access due to concurrent update
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  ERROR:  current transaction is aborted, commands ignored until end of transaction block
  step s2c: COMMIT;
--- 14,20 ----
  step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1c: COMMIT;
  step s2u1: <... completed>
! error in steps s1c s2u1: ERROR:  could not serialize access due to concurrent update
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  ERROR:  current transaction is aborted, commands ignored until end of transaction block
  step s2c: COMMIT;
***************
*** 25,31 **** step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
! ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
--- 25,31 ----
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
! error in steps s2u2 s1u2: ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
***************
*** 35,41 **** step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
! ERROR:  deadlock detected
  step s2c: COMMIT;
  step s1c: COMMIT;
  
--- 35,41 ----
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
! error in steps s2u2 s1u2: ERROR:  deadlock detected
  step s2c: COMMIT;
  step s1c: COMMIT;
  
***************
*** 44,51 **** step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
  step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- ERROR:  deadlock detected
  step s2u2: <... completed>
  step s1c: COMMIT;
  step s2c: COMMIT;
  
--- 44,51 ----
  step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u2: <... completed>
+ error in steps s1u2 s2u2: ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
***************
*** 54,61 **** step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
  step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- ERROR:  deadlock detected
  step s2u2: <... completed>
  step s2c: COMMIT;
  step s1c: COMMIT;
  
--- 54,61 ----
  step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u2: <... completed>
+ error in steps s1u2 s2u2: ERROR:  deadlock detected
  step s2c: COMMIT;
  step s1c: COMMIT;
  
***************
*** 65,71 **** step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
! ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
--- 65,71 ----
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
! error in steps s2u2 s1u2: ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
***************
*** 75,81 **** step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
! ERROR:  deadlock detected
  step s2c: COMMIT;
  step s1c: COMMIT;
  
--- 75,81 ----
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u2: <... completed>
! error in steps s2u2 s1u2: ERROR:  deadlock detected
  step s2c: COMMIT;
  step s1c: COMMIT;
  
***************
*** 84,91 **** step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- ERROR:  deadlock detected
  step s2u2: <... completed>
  step s1c: COMMIT;
  step s2c: COMMIT;
  
--- 84,91 ----
  step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u2: <... completed>
+ error in steps s1u2 s2u2: ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
***************
*** 94,101 **** step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- ERROR:  deadlock detected
  step s2u2: <... completed>
  step s2c: COMMIT;
  step s1c: COMMIT;
  
--- 94,101 ----
  step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
  step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
  step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
  step s2u2: <... completed>
+ error in steps s1u2 s2u2: ERROR:  deadlock detected
  step s2c: COMMIT;
  step s1c: COMMIT;
  
*** a/src/test/isolation/expected/fk-deadlock2_2.out
--- /dev/null
***************
*** 1,110 ****
- Parsed test spec with 2 sessions
- 
- starting permutation: s1u1 s1u2 s1c s2u1 s2u2 s2c
- step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
- step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s1c: COMMIT;
- step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s2c: COMMIT;
- 
- starting permutation: s1u1 s1u2 s2u1 s1c s2u2 s2c
- step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
- step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
- step s1c: COMMIT;
- step s2u1: <... completed>
- ERROR:  could not serialize access due to concurrent update
- step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- ERROR:  current transaction is aborted, commands ignored until end of transaction block
- step s2c: COMMIT;
- 
- starting permutation: s1u1 s2u1 s1u2 s2u2 s1c s2c
- step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
- step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
- step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s1u2: <... completed>
- ERROR:  deadlock detected
- step s1c: COMMIT;
- step s2c: COMMIT;
- 
- starting permutation: s1u1 s2u1 s1u2 s2u2 s2c s1c
- step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
- step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
- step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s1u2: <... completed>
- ERROR:  deadlock detected
- step s2c: COMMIT;
- step s1c: COMMIT;
- 
- starting permutation: s1u1 s2u1 s2u2 s1u2 s1c s2c
- step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
- step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
- step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- ERROR:  deadlock detected
- step s2u2: <... completed>
- step s1c: COMMIT;
- step s2c: COMMIT;
- 
- starting permutation: s1u1 s2u1 s2u2 s1u2 s2c s1c
- step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
- step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
- step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- ERROR:  deadlock detected
- step s2u2: <... completed>
- step s2c: COMMIT;
- step s1c: COMMIT;
- 
- starting permutation: s2u1 s1u1 s1u2 s2u2 s1c s2c
- step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
- step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
- step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s1u2: <... completed>
- ERROR:  deadlock detected
- step s1c: COMMIT;
- step s2c: COMMIT;
- 
- starting permutation: s2u1 s1u1 s1u2 s2u2 s2c s1c
- step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
- step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
- step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s1u2: <... completed>
- ERROR:  deadlock detected
- step s2c: COMMIT;
- step s1c: COMMIT;
- 
- starting permutation: s2u1 s1u1 s2u2 s1u2 s1c s2c
- step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
- step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
- step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- ERROR:  deadlock detected
- step s2u2: <... completed>
- step s1c: COMMIT;
- step s2c: COMMIT;
- 
- starting permutation: s2u1 s1u1 s2u2 s1u2 s2c s1c
- step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1;
- step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2; <waiting ...>
- step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- ERROR:  deadlock detected
- step s2u2: <... completed>
- step s2c: COMMIT;
- step s1c: COMMIT;
- 
- starting permutation: s2u1 s2u2 s1u1 s2c s1u2 s1c
- step s2u1: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s2u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- step s1u1: UPDATE A SET Col1 = 1 WHERE AID = 1; <waiting ...>
- step s2c: COMMIT;
- step s1u1: <... completed>
- step s1u2: UPDATE B SET Col2 = 1 WHERE BID = 2;
- ERROR:  could not serialize access due to concurrent update
- step s1c: COMMIT;
--- 0 ----
*** a/src/test/isolation/expected/fk-deadlock_1.out
--- b/src/test/isolation/expected/fk-deadlock_1.out
***************
*** 14,20 **** step s1u: UPDATE parent SET aux = 'bar';
  step s2i: INSERT INTO child VALUES (2, 1); <waiting ...>
  step s1c: COMMIT;
  step s2i: <... completed>
! ERROR:  could not serialize access due to concurrent update
  step s2u: UPDATE parent SET aux = 'baz';
  ERROR:  current transaction is aborted, commands ignored until end of transaction block
  step s2c: COMMIT;
--- 14,20 ----
  step s2i: INSERT INTO child VALUES (2, 1); <waiting ...>
  step s1c: COMMIT;
  step s2i: <... completed>
! error in steps s1c s2i: ERROR:  could not serialize access due to concurrent update
  step s2u: UPDATE parent SET aux = 'baz';
  ERROR:  current transaction is aborted, commands ignored until end of transaction block
  step s2c: COMMIT;
***************
*** 25,31 **** step s2i: INSERT INTO child VALUES (2, 1);
  step s1u: UPDATE parent SET aux = 'bar'; <waiting ...>
  step s2u: UPDATE parent SET aux = 'baz';
  step s1u: <... completed>
! ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
--- 25,31 ----
  step s1u: UPDATE parent SET aux = 'bar'; <waiting ...>
  step s2u: UPDATE parent SET aux = 'baz';
  step s1u: <... completed>
! error in steps s2u s1u: ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
***************
*** 34,41 **** step s1i: INSERT INTO child VALUES (1, 1);
  step s2i: INSERT INTO child VALUES (2, 1);
  step s2u: UPDATE parent SET aux = 'baz'; <waiting ...>
  step s1u: UPDATE parent SET aux = 'bar';
- ERROR:  deadlock detected
  step s2u: <... completed>
  step s2c: COMMIT;
  step s1c: COMMIT;
  
--- 34,41 ----
  step s2i: INSERT INTO child VALUES (2, 1);
  step s2u: UPDATE parent SET aux = 'baz'; <waiting ...>
  step s1u: UPDATE parent SET aux = 'bar';
  step s2u: <... completed>
+ error in steps s1u s2u: ERROR:  deadlock detected
  step s2c: COMMIT;
  step s1c: COMMIT;
  
***************
*** 45,51 **** step s1i: INSERT INTO child VALUES (1, 1);
  step s1u: UPDATE parent SET aux = 'bar'; <waiting ...>
  step s2u: UPDATE parent SET aux = 'baz';
  step s1u: <... completed>
! ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
--- 45,51 ----
  step s1u: UPDATE parent SET aux = 'bar'; <waiting ...>
  step s2u: UPDATE parent SET aux = 'baz';
  step s1u: <... completed>
! error in steps s2u s1u: ERROR:  deadlock detected
  step s1c: COMMIT;
  step s2c: COMMIT;
  
***************
*** 54,61 **** step s2i: INSERT INTO child VALUES (2, 1);
  step s1i: INSERT INTO child VALUES (1, 1);
  step s2u: UPDATE parent SET aux = 'baz'; <waiting ...>
  step s1u: UPDATE parent SET aux = 'bar';
- ERROR:  deadlock detected
  step s2u: <... completed>
  step s2c: COMMIT;
  step s1c: COMMIT;
  
--- 54,61 ----
  step s1i: INSERT INTO child VALUES (1, 1);
  step s2u: UPDATE parent SET aux = 'baz'; <waiting ...>
  step s1u: UPDATE parent SET aux = 'bar';
  step s2u: <... completed>
+ error in steps s1u s2u: ERROR:  deadlock detected
  step s2c: COMMIT;
  step s1c: COMMIT;
  
***************
*** 65,71 **** step s2u: UPDATE parent SET aux = 'baz';
  step s1i: INSERT INTO child VALUES (1, 1); <waiting ...>
  step s2c: COMMIT;
  step s1i: <... completed>
! ERROR:  could not serialize access due to concurrent update
  step s1u: UPDATE parent SET aux = 'bar';
  ERROR:  current transaction is aborted, commands ignored until end of transaction block
  step s1c: COMMIT;
--- 65,71 ----
  step s1i: INSERT INTO child VALUES (1, 1); <waiting ...>
  step s2c: COMMIT;
  step s1i: <... completed>
! error in steps s2c s1i: ERROR:  could not serialize access due to concurrent update
  step s1u: UPDATE parent SET aux = 'bar';
  ERROR:  current transaction is aborted, commands ignored until end of transaction block
  step s1c: COMMIT;
*** a/src/test/isolation/isolationtester.c
--- b/src/test/isolation/isolationtester.c
***************
*** 384,389 **** step_bsearch_cmp(const void *a, const void *b)
--- 384,433 ----
  }
  
  /*
+  * If a step caused an error to be reported, print it out and clear it.
+  */
+ static void
+ report_error_message(Step *step)
+ {
+ 	if (step->errormsg)
+ 	{
+ 		fprintf(stdout, "%s\n", step->errormsg);
+ 		free(step->errormsg);
+ 		step->errormsg = NULL;
+ 	}
+ }
+ 
+ /*
+  * As above, but reports messages possibly emitted by two steps.  This is
+  * useful when we have a blocked command awakened by another one; we want to
+  * report both messages identically, for the case where we don't care which
+  * one fails due to a timeout such as deadlock timeout.
+  */
+ static void
+ report_two_error_messages(Step *step1, Step *step2)
+ {
+ 	char *prefix;
+ 
+ 	prefix = malloc(strlen(step1->name) + strlen(step2->name) + 2);
+ 	sprintf(prefix, "%s %s", step1->name, step2->name);
+ 
+ 	if (step1->errormsg)
+ 	{
+ 		fprintf(stdout, "error in steps %s: %s\n", prefix,
+ 				step1->errormsg);
+ 		free(step1->errormsg);
+ 		step1->errormsg = NULL;
+ 	}
+ 	if (step2->errormsg)
+ 	{
+ 		fprintf(stdout, "error in steps %s: %s\n", prefix,
+ 				step2->errormsg);
+ 		free(step2->errormsg);
+ 		step2->errormsg = NULL;
+ 	}
+ }
+ 
+ /*
   * Run one permutation
   */
  static void
***************
*** 448,464 **** run_permutation(TestSpec * testspec, int nsteps, Step ** steps)
  			/* Some other step is already waiting: just block. */
  			try_complete_step(step, 0);
  
! 			/* See if this step unblocked the waiting step. */
  			if (!try_complete_step(waiting, STEP_NONBLOCK | STEP_RETRY))
  				waiting = NULL;
  		}
- 		else if (try_complete_step(step, STEP_NONBLOCK))
- 			waiting = step;
  	}
  
  	/* Finish any waiting query. */
  	if (waiting != NULL)
  		try_complete_step(waiting, STEP_RETRY);
  
  	/* Perform per-session teardown */
  	for (i = 0; i < testspec->nsessions; i++)
--- 492,523 ----
  			/* Some other step is already waiting: just block. */
  			try_complete_step(step, 0);
  
! 			/*
! 			 * See if this step unblocked the waiting step; report both error
! 			 * messages together if so.
! 			 */
  			if (!try_complete_step(waiting, STEP_NONBLOCK | STEP_RETRY))
+ 			{
+ 				report_two_error_messages(step, waiting);
  				waiting = NULL;
+ 			}
+ 			else
+ 				report_error_message(step);
+ 		}
+ 		else
+ 		{
+ 			if (try_complete_step(step, STEP_NONBLOCK))
+ 				waiting = step;
+ 			report_error_message(step);
  		}
  	}
  
  	/* Finish any waiting query. */
  	if (waiting != NULL)
+ 	{
  		try_complete_step(waiting, STEP_RETRY);
+ 		report_error_message(waiting);
+ 	}
  
  	/* Perform per-session teardown */
  	for (i = 0; i < testspec->nsessions; i++)
***************
*** 505,510 **** run_permutation(TestSpec * testspec, int nsteps, Step ** steps)
--- 564,573 ----
   * When calling this function on behalf of a given step for a second or later
   * time, pass the STEP_RETRY flag.  This only affects the messages printed.
   *
+  * If the connection returns an error, the message is saved in step->errormsg.
+  * Caller should call report_error_message shortly after this, to have it
+  * printed and cleared.
+  *
   * If the STEP_NONBLOCK flag was specified and the query is waiting to acquire
   * a lock, returns true.  Otherwise, returns false.
   */
***************
*** 579,587 **** try_complete_step(Step *step, int flags)
  				printResultSet(res);
  				break;
  			case PGRES_FATAL_ERROR:
  				/* Detail may contain xid values, so just show primary. */
! 				printf("%s:  %s\n", PQresultErrorField(res, PG_DIAG_SEVERITY),
! 					   PQresultErrorField(res, PG_DIAG_MESSAGE_PRIMARY));
  				break;
  			default:
  				printf("unexpected result status: %s\n",
--- 642,660 ----
  				printResultSet(res);
  				break;
  			case PGRES_FATAL_ERROR:
+ 				if (step->errormsg != NULL)
+ 				{
+ 					printf("WARNING: this step had a leftover error message\n");
+ 					printf("%s\n", step->errormsg);
+ 				}
  				/* Detail may contain xid values, so just show primary. */
! 				step->errormsg = malloc(5 +
! 										strlen(PQresultErrorField(res, PG_DIAG_SEVERITY)) + 
! 										strlen(PQresultErrorField(res,
! 																  PG_DIAG_MESSAGE_PRIMARY)));
! 				sprintf(step->errormsg, "%s:  %s",
! 						PQresultErrorField(res, PG_DIAG_SEVERITY),
! 						PQresultErrorField(res, PG_DIAG_MESSAGE_PRIMARY));
  				break;
  			default:
  				printf("unexpected result status: %s\n",
*** a/src/test/isolation/isolationtester.h
--- b/src/test/isolation/isolationtester.h
***************
*** 31,36 **** struct Step
--- 31,37 ----
  	int			session;
  	char	   *name;
  	char	   *sql;
+ 	char	   *errormsg;
  };
  
  typedef struct
*** a/src/test/isolation/specparse.y
--- b/src/test/isolation/specparse.y
***************
*** 123,128 **** step:
--- 123,129 ----
  				$$ = malloc(sizeof(Step));
  				$$->name = $2;
  				$$->sql = $3;
+ 				$$->errormsg = NULL;
  			}
  		;
  
