summaryrefslogtreecommitdiffstats
path: root/src/test/isolation/specs/update-conflict-out.spec
blob: 8aad6aa6619705256bab8aedcea24acbc95c426a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# Test for interactions between SSI's "conflict out" handling for heapam and
# concurrently updated tuple
#
# See bug report:
# https://postgr.es/m/db7b729d-0226-d162-a126-8a8ab2dc4443%40jepsen.io

setup
{
  CREATE TABLE txn0(id int4 PRIMARY KEY, val TEXT);
  CREATE TABLE txn1(id int4 PRIMARY KEY, val TEXT);
}

teardown
{
  DROP TABLE txn0;
  DROP TABLE txn1;
}

session foo
setup                  { BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; }
step foo_select        { SELECT * FROM txn0 WHERE id = 42; }
step foo_insert        { INSERT INTO txn1 SELECT 7, 'foo_insert'; }
step foo_commit        { COMMIT; }

session bar
setup                  { BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; }
step bar_select        { SELECT * FROM txn1 WHERE id = 7; }
step bar_insert        { INSERT INTO txn0 SELECT 42, 'bar_insert'; }
step bar_commit        { COMMIT; }

# This session creates the conditions that confused bar's "conflict out"
# handling in old releases affected by bug:
session trouble
setup                  { BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; }
step trouble_update    { UPDATE txn1 SET val = 'add physical version for "bar_select"' WHERE id = 7; }
step trouble_delete    { DELETE FROM txn1 WHERE id = 7; }
step trouble_abort     { ABORT; }

permutation foo_select
    bar_insert
    foo_insert foo_commit
    trouble_update   # Updates tuple...
    bar_select       # Should observe one distinct XID per version
    bar_commit       # "bar" should fail here at the latest
    trouble_abort

# Same as above, but "trouble" session DELETEs this time around
permutation foo_select
    bar_insert
    foo_insert foo_commit
    trouble_delete   # Deletes tuple...
    bar_select       # Should observe foo's XID
    bar_commit       # "bar" should fail here at the latest
    trouble_abort