Thread

  1. [PATCH] Add isolation test for session variables.

    Julien Rouhaud <julien.rouhaud@free.fr> — 2022-08-29T08:38:52Z

    ---
     .../isolation/expected/session-variable.out   | 87 +++++++++++++++++++
     src/test/isolation/isolation_schedule         |  1 +
     .../isolation/specs/session-variable.spec     | 34 ++++++++
     3 files changed, 122 insertions(+)
     create mode 100644 src/test/isolation/expected/session-variable.out
     create mode 100644 src/test/isolation/specs/session-variable.spec
    
    diff --git a/src/test/isolation/expected/session-variable.out b/src/test/isolation/expected/session-variable.out
    new file mode 100644
    index 0000000000..d8c817f05a
    --- /dev/null
    +++ b/src/test/isolation/expected/session-variable.out
    @@ -0,0 +1,87 @@
    +Parsed test spec with 2 sessions
    +
    +starting permutation: let val drop val
    +step let: LET myvar = 'test';
    +step val: SELECT myvar;
    +myvar
    +-----
    +test 
    +(1 row)
    +
    +step drop: DROP VARIABLE myvar;
    +step val: SELECT myvar;
    +ERROR:  column or variable "myvar" does not exist
    +
    +starting permutation: let val s1 drop val sr1
    +step let: LET myvar = 'test';
    +step val: SELECT myvar;
    +myvar
    +-----
    +test 
    +(1 row)
    +
    +step s1: BEGIN;
    +step drop: DROP VARIABLE myvar;
    +step val: SELECT myvar;
    +ERROR:  column or variable "myvar" does not exist
    +step sr1: ROLLBACK;
    +
    +starting permutation: let val dbg drop create dbg val
    +step let: LET myvar = 'test';
    +step val: SELECT myvar;
    +myvar
    +-----
    +test 
    +(1 row)
    +
    +step dbg: SELECT schema, name, removed FROM pg_debug_show_used_session_variables();
    +schema|name |removed
    +------+-----+-------
    +public|myvar|f      
    +(1 row)
    +
    +step drop: DROP VARIABLE myvar;
    +step create: CREATE VARIABLE myvar AS text
    +step dbg: SELECT schema, name, removed FROM pg_debug_show_used_session_variables();
    +schema|name |removed
    +------+-----+-------
    +public|myvar|t      
    +(1 row)
    +
    +step val: SELECT myvar;
    +myvar
    +-----
    +     
    +(1 row)
    +
    +
    +starting permutation: let val s1 dbg drop create dbg val sr1
    +step let: LET myvar = 'test';
    +step val: SELECT myvar;
    +myvar
    +-----
    +test 
    +(1 row)
    +
    +step s1: BEGIN;
    +step dbg: SELECT schema, name, removed FROM pg_debug_show_used_session_variables();
    +schema|name |removed
    +------+-----+-------
    +public|myvar|f      
    +(1 row)
    +
    +step drop: DROP VARIABLE myvar;
    +step create: CREATE VARIABLE myvar AS text
    +step dbg: SELECT schema, name, removed FROM pg_debug_show_used_session_variables();
    +schema|name |removed
    +------+-----+-------
    +public|myvar|t      
    +(1 row)
    +
    +step val: SELECT myvar;
    +myvar
    +-----
    +     
    +(1 row)
    +
    +step sr1: ROLLBACK;
    diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule
    index 529a4cbd4d..96ecf93e32 100644
    --- a/src/test/isolation/isolation_schedule
    +++ b/src/test/isolation/isolation_schedule
    @@ -107,3 +107,4 @@ test: cluster-conflict-partition
     test: truncate-conflict
     test: serializable-parallel
     test: serializable-parallel-2
    +test: session-variable
    diff --git a/src/test/isolation/specs/session-variable.spec b/src/test/isolation/specs/session-variable.spec
    new file mode 100644
    index 0000000000..a138f0449e
    --- /dev/null
    +++ b/src/test/isolation/specs/session-variable.spec
    @@ -0,0 +1,34 @@
    +#
    +
    +setup
    +{
    +    CREATE VARIABLE myvar AS text;
    +}
    +
    +teardown
    +{
    +    DROP VARIABLE IF EXISTS myvar;
    +}
    +
    +session s1
    +step s1		{ BEGIN; }
    +step let	{ LET myvar = 'test'; }
    +step val	{ SELECT myvar; }
    +step dbg	{ SELECT schema, name, removed FROM pg_debug_show_used_session_variables(); }
    +step sr1	{ ROLLBACK; }
    +
    +
    +session s2
    +step drop		{ DROP VARIABLE myvar; }
    +step create		{ CREATE VARIABLE myvar AS text }
    +
    +# Concurrent drop of a known variable should lead to an error
    +permutation let val drop val
    +# Same, but with an explicit transaction
    +permutation let val s1 drop val sr1
    +# Concurrent drop/create of a known variable should lead to empty variable
    +permutation let val dbg drop create dbg val
    +# Concurrent drop/create of a known variable should lead to empty variable
    +# We need a transaction to make sure that we won't accept invalidation when
    +# calling the dbg step after the concurrent drop
    +permutation let val s1 dbg drop create dbg val sr1
    -- 
    2.37.0
    
    
    --wa5flpjzlpkolrar--