diff options
Diffstat (limited to 'contrib/pg_logicalinspect/specs')
-rw-r--r-- | contrib/pg_logicalinspect/specs/logical_inspect.spec | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/contrib/pg_logicalinspect/specs/logical_inspect.spec b/contrib/pg_logicalinspect/specs/logical_inspect.spec index 9851a6c18e4..26b2db10f3e 100644 --- a/contrib/pg_logicalinspect/specs/logical_inspect.spec +++ b/contrib/pg_logicalinspect/specs/logical_inspect.spec @@ -1,9 +1,10 @@ # Test the pg_logicalinspect functions: that needs some permutation to -# ensure that we are creating multiple logical snapshots and that one of them -# contains ongoing catalogs changes. +# ensure that we are creating at least one snapshot that contains ongoing and +# committed catalogs changes. setup { DROP TABLE IF EXISTS tbl1; + DROP TABLE IF EXISTS tbl2; CREATE TABLE tbl1 (val1 integer, val2 integer); CREATE EXTENSION pg_logicalinspect; } @@ -11,6 +12,7 @@ setup teardown { DROP TABLE tbl1; + DROP TABLE tbl2; SELECT 'stop' FROM pg_drop_replication_slot('isolation_slot'); DROP EXTENSION pg_logicalinspect; } @@ -21,14 +23,24 @@ step "s0_init" { SELECT 'init' FROM pg_create_logical_replication_slot('isolatio step "s0_begin" { BEGIN; } step "s0_savepoint" { SAVEPOINT sp1; } step "s0_truncate" { TRUNCATE tbl1; } -step "s0_insert" { INSERT INTO tbl1 VALUES (1); } step "s0_commit" { COMMIT; } session "s1" setup { SET synchronous_commit=on; } step "s1_checkpoint" { CHECKPOINT; } +step "s1_create_table" { CREATE TABLE tbl2 (val1 integer, val2 integer); } step "s1_get_changes" { SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0'); } -step "s1_get_logical_snapshot_meta" { SELECT COUNT(meta.*) from pg_ls_logicalsnapdir(), pg_get_logical_snapshot_meta(name) as meta;} -step "s1_get_logical_snapshot_info" { SELECT info.state, info.catchange_count, array_length(info.catchange_xip,1) AS catchange_array_length, info.committed_count, array_length(info.committed_xip,1) AS committed_array_length FROM pg_ls_logicalsnapdir(), pg_get_logical_snapshot_info(name) AS info ORDER BY 2; } +step "s1_check_snapshot_meta" { SELECT count(meta.*) > 0 AS has_meta from pg_ls_logicalsnapdir(), pg_get_logical_snapshot_meta(name) as meta; } +step "s1_check_snapshot_info" { SELECT count(*) > 0 as has_info FROM pg_ls_logicalsnapdir(), pg_get_logical_snapshot_info(name) AS info where info.catchange_count >= 2 and array_length(info.catchange_xip,1) >= 2 and info.committed_count >= 1 and array_length(info.committed_xip,1) >= 1; } -permutation "s0_init" "s0_begin" "s0_savepoint" "s0_truncate" "s1_checkpoint" "s1_get_changes" "s0_commit" "s0_begin" "s0_insert" "s1_checkpoint" "s1_get_changes" "s0_commit" "s1_get_changes" "s1_get_logical_snapshot_info" "s1_get_logical_snapshot_meta" + +# Both s0 and s1 execute catalog-change transactions. When "s1_get_changes" is +# executed, s0's transaction is still in progress, while s1's transaction has +# already completed. Consequently, the logical decoding produces a snapshot at +# the point where a RUNNING_XACTS record is generated by "s1_checkpoint". +# This snapshot contains both two ongoing catalog-change transactions (from s0's +# top-level and sub transactions) and one completed transaction (from s1). +# "s1_check_snapshot_info" verifies whether the logical snapshot contains at +# least the expected number of transactions, accounting for potential +# additional catalog changes that may occur due to concurrent autoanalyze. +permutation "s0_init" "s0_begin" "s0_savepoint" "s0_truncate" "s1_create_table" "s1_checkpoint" "s1_get_changes" "s1_check_snapshot_info" "s1_check_snapshot_meta" "s0_commit" |