aboutsummaryrefslogtreecommitdiff
path: root/contrib/test_decoding/specs/oldest_xmin.spec
blob: 4f8af70aa264b5a64fa089cc2d08ee98568909b6 (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
# Test advancement of the slot's oldest xmin

setup
{
    SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding'); -- must be first write in xact
    DROP TYPE IF EXISTS basket;
    CREATE TYPE basket AS (apples integer, pears integer, mangos integer);
    DROP TABLE IF EXISTS harvest;
    CREATE TABLE harvest(fruits basket);
}

teardown
{
    DROP TABLE IF EXISTS harvest;
    DROP TYPE IF EXISTS basket;
    SELECT 'stop' FROM pg_drop_replication_slot('isolation_slot');
}

session "s0"
step "s0_begin" { BEGIN; }
step "s0_getxid" { SELECT txid_current() IS NULL; }
step "s0_alter" { ALTER TYPE basket DROP ATTRIBUTE mangos; }
step "s0_commit" { COMMIT; }
step "s0_checkpoint" { CHECKPOINT; }
step "s0_vacuum" { VACUUM FULL; }
step "s0_get_changes" { SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); }

session "s1"
step "s1_begin" { BEGIN; }
step "s1_insert" { INSERT INTO harvest VALUES ((1, 2, 3)); }
step "s1_commit" { COMMIT; }

# Checkpoint with following get_changes forces to advance xmin. ALTER of a
# composite type is a rare form of DDL which allows T1 to see the tuple which
# will be removed (xmax set) before T1 commits. That is, interlocking doesn't
# forbid modifying catalog after someone read it (and didn't commit yet).
permutation "s0_begin" "s0_getxid" "s1_begin" "s1_insert" "s0_alter" "s0_commit" "s0_checkpoint" "s0_get_changes" "s1_commit" "s0_vacuum" "s0_get_changes"