summaryrefslogtreecommitdiffstats
path: root/src/test/isolation/specs/inherit-temp.spec
blob: 644f919e8462ad9f6936eaec4c9679f4f4b5baed (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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# Tests for inheritance trees with temporary relations
#
# Inheritance trees are allowed to mix relations with different persistence
# as long as a persistent child relation does not try to inherit from a
# temporary parent.  This checks several scenarios with SELECT, INSERT, UPDATE,
# DELETE and TRUNCATE.  Any temporary relation inheriting from the same
# persistent parent should be isolated and handled only in its own session.

setup
{
  CREATE TABLE inh_parent (a int);
}

teardown
{
  DROP TABLE inh_parent;
}

# Session 1 executes actions which act directly on both the parent and
# its child.  Abbreviation "c" is used for queries working on the child
# and "p" on the parent.
session s1
setup
{
  CREATE TEMPORARY TABLE inh_temp_child_s1 () INHERITS (inh_parent);
}
step s1_begin { BEGIN; }
step s1_truncate_p { TRUNCATE inh_parent; }
step s1_select_p { SELECT a FROM inh_parent; }
step s1_select_c { SELECT a FROM inh_temp_child_s1; }
step s1_insert_p { INSERT INTO inh_parent VALUES (1), (2); }
step s1_insert_c { INSERT INTO inh_temp_child_s1 VALUES (3), (4); }
step s1_update_p { UPDATE inh_parent SET a = 11 WHERE a = 1; }
step s1_update_c { UPDATE inh_parent SET a = 13 WHERE a IN (3, 5); }
step s1_delete_p { DELETE FROM inh_parent WHERE a = 2; }
step s1_delete_c { DELETE FROM inh_parent WHERE a IN (4, 6); }
step s1_commit { COMMIT; }
teardown
{
  DROP TABLE inh_temp_child_s1;
}

# Session 2 executes actions on the parent which act only on the child.
session s2
setup
{
  CREATE TEMPORARY TABLE inh_temp_child_s2 () INHERITS (inh_parent);
}
step s2_truncate_p { TRUNCATE inh_parent; }
step s2_select_p { SELECT a FROM inh_parent; }
step s2_select_c { SELECT a FROM inh_temp_child_s2; }
step s2_insert_c { INSERT INTO inh_temp_child_s2 VALUES (5), (6); }
step s2_update_c { UPDATE inh_parent SET a = 15 WHERE a IN (3, 5); }
step s2_delete_c { DELETE FROM inh_parent WHERE a IN (4, 6); }
teardown
{
  DROP TABLE inh_temp_child_s2;
}

# Check INSERT behavior across sessions
permutation s1_insert_p s1_insert_c s2_insert_c s1_select_p s1_select_c s2_select_p s2_select_c

# Check UPDATE behavior across sessions
permutation s1_insert_p s1_insert_c s2_insert_c s1_update_p s1_update_c s1_select_p s1_select_c s2_select_p s2_select_c
permutation s1_insert_p s1_insert_c s2_insert_c s2_update_c s1_select_p s1_select_c s2_select_p s2_select_c

# Check DELETE behavior across sessions
permutation s1_insert_p s1_insert_c s2_insert_c s1_delete_p s1_delete_c s1_select_p s1_select_c s2_select_p s2_select_c
permutation s1_insert_p s1_insert_c s2_insert_c s2_delete_c s1_select_p s1_select_c s2_select_p s2_select_c

# Check TRUNCATE behavior across sessions
permutation s1_insert_p s1_insert_c s2_insert_c s1_truncate_p s1_select_p s1_select_c s2_select_p s2_select_c
permutation s1_insert_p s1_insert_c s2_insert_c s2_truncate_p s1_select_p s1_select_c s2_select_p s2_select_c

# TRUNCATE on a parent tree does not block access to temporary child relation
# of another session, and blocks when scanning the parent.
permutation s1_insert_p s1_insert_c s2_insert_c s1_begin s1_truncate_p s2_select_p s1_commit
permutation s1_insert_p s1_insert_c s2_insert_c s1_begin s1_truncate_p s2_select_c s1_commit