summaryrefslogtreecommitdiff
path: root/contrib/postgres_fdw/specs/eval_plan_qual.spec
blob: 30a83e040589690880985baf5d86eb6c4811bbb7 (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
# Tests for the EvalPlanQual mechanism involving foreign tables

setup
{
    DO $d$
        BEGIN
            EXECUTE $$CREATE SERVER loopback FOREIGN DATA WRAPPER postgres_fdw
                OPTIONS (dbname '$$||current_database()||$$',
                         port '$$||current_setting('port')||$$'
                )$$;
        END;
    $d$;
    CREATE USER MAPPING FOR PUBLIC SERVER loopback;

    CREATE TABLE a (i int);
    CREATE TABLE b (i int);
    CREATE TABLE c (i int);
    CREATE FOREIGN TABLE fb (i int) SERVER loopback OPTIONS (table_name 'b');
    CREATE FOREIGN TABLE fc (i int) SERVER loopback OPTIONS (table_name 'c');

    INSERT INTO a VALUES (1);
    INSERT INTO b VALUES (1);
    INSERT INTO c VALUES (1);
}

teardown
{
    DROP TABLE a;
    DROP TABLE b;
    DROP TABLE c;
    DROP SERVER loopback CASCADE;
}

session s0
step s0_begin { BEGIN ISOLATION LEVEL READ COMMITTED; }
step s0_update { UPDATE a SET i = i + 1; }
step s0_commit { COMMIT; }

session s1
step s1_begin { BEGIN ISOLATION LEVEL READ COMMITTED; }
step s1_tuplock {
    -- Verify if the sub-select has a foreign-join plan
    EXPLAIN (VERBOSE, COSTS OFF)
    SELECT a.i,
        (SELECT 1 FROM fb, fc WHERE a.i = fb.i AND fb.i = fc.i)
    FROM a FOR UPDATE;
    SELECT a.i,
        (SELECT 1 FROM fb, fc WHERE a.i = fb.i AND fb.i = fc.i)
    FROM a FOR UPDATE;
}
step s1_commit { COMMIT; }

# This test exercises EvalPlanQual with a SubLink sub-select (which should
# be unaffected by any EPQ recheck behavior in the outer query).
permutation s0_begin s0_update s1_begin s1_tuplock s0_commit s1_commit