File: subxact_without_top.spec

package info (click to toggle)
postgresql-18 18~beta3-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 155,816 kB
  • sloc: ansic: 993,154; sql: 127,411; perl: 58,874; xml: 30,905; yacc: 21,023; lex: 9,000; makefile: 6,880; sh: 5,353; cpp: 984; python: 710; asm: 40; sed: 3
file content (63 lines) | stat: -rw-r--r-- 2,456 bytes parent folder | download | duplicates (6)
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
# Test decoding of subtransactions whose top-transaction is before restart
# point.  Such transactions won't be streamed as we stream only complete
# transactions, but it is good to test that they don't cause any problem.

setup
{
    SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding'); -- must be first write in xact
    CREATE TABLE harvest(apples integer);
    CREATE OR REPLACE FUNCTION subxacts() returns void as $$
    BEGIN
      FOR i in 1 .. 128 LOOP
        BEGIN
          INSERT INTO harvest VALUES (42);
        EXCEPTION
        WHEN OTHERS THEN
	  RAISE;
        END;
    END LOOP;
    END; $$LANGUAGE 'plpgsql';
}

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

session "s0"
setup { SET synchronous_commit=on; }
step "s0_begin" { BEGIN; }
step "s0_first_subxact" {
    DO LANGUAGE plpgsql $$
      BEGIN
        BEGIN
          INSERT INTO harvest VALUES (41);
	EXCEPTION WHEN OTHERS THEN RAISE;
	END;
      END $$;
}
step "s0_many_subxacts" { select subxacts(); }
step "s0_commit" { COMMIT; }

session "s1"
setup { SET synchronous_commit=on; }
step "s1_begin" { BEGIN; }
step "s1_dml" { INSERT INTO harvest VALUES (43); }
step "s1_commit" { COMMIT; }

session "s2"
setup { SET synchronous_commit=on; }
step "s2_checkpoint" { CHECKPOINT; }
step "s2_get_changes" { SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); }
step "s2_get_changes_suppress_output" { SELECT null n FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1') GROUP BY n; }

# The first checkpoint establishes the potential restart point (aka
# restart_lsn) for the slot after the initial subxact.  The second checkpoint
# followed by get_changes will ensure that the potential restart point will
# become the actual restart point.  We do get_changes twice because if one
# more xl_running_xacts record had slipped before our s0_commit, then the
# potential restart point won't become actual restart point.  The s1's open
# transaction till get_changes holds the potential restart point to our first
# checkpoint location.
permutation "s0_begin" "s0_first_subxact" "s2_checkpoint" "s1_begin" "s1_dml" "s0_many_subxacts" "s0_commit" "s2_checkpoint" "s2_get_changes_suppress_output" "s2_get_changes_suppress_output" "s1_commit" "s2_get_changes"