1
1
--
2
2
-- PARALLEL
3
3
--
4
+ create or replace function parallel_restricted(int) returns int as $$
5
+ begin
6
+ perform * from pg_stat_activity where client_port is null;
7
+ if (found) then
8
+ raise 'parallel restricted function run in worker';
9
+ end if;
10
+ return $1;
11
+ end$$ language plpgsql parallel restricted;
4
12
-- Serializable isolation would disable parallel query, so explicitly use an
5
13
-- arbitrary other level.
6
14
begin isolation level repeatable read;
7
15
-- setup parallel test
8
16
set parallel_setup_cost=0;
9
17
set parallel_tuple_cost=0;
18
+ set max_parallel_workers_per_gather=4;
10
19
explain (costs off)
11
20
select count(*) from a_star;
12
21
QUERY PLAN
@@ -30,6 +39,45 @@ select count(*) from a_star;
30
39
50
31
40
(1 row)
32
41
42
+ -- test that parallel_restricted function doesn't run in worker
43
+ alter table tenk1 set (parallel_workers = 4);
44
+ explain (verbose, costs off)
45
+ select parallel_restricted(unique1) from tenk1
46
+ where stringu1 = 'GRAAAA' order by 1;
47
+ QUERY PLAN
48
+ ---------------------------------------------------------
49
+ Sort
50
+ Output: (parallel_restricted(unique1))
51
+ Sort Key: (parallel_restricted(tenk1.unique1))
52
+ -> Gather
53
+ Output: parallel_restricted(unique1)
54
+ Workers Planned: 4
55
+ -> Parallel Seq Scan on public.tenk1
56
+ Output: unique1
57
+ Filter: (tenk1.stringu1 = 'GRAAAA'::name)
58
+ (9 rows)
59
+
60
+ select parallel_restricted(unique1) from tenk1
61
+ where stringu1 = 'GRAAAA' order by 1;
62
+ parallel_restricted
63
+ ---------------------
64
+ 448
65
+ 1124
66
+ 1800
67
+ 2476
68
+ 3152
69
+ 3828
70
+ 4504
71
+ 5180
72
+ 5856
73
+ 6532
74
+ 7208
75
+ 7884
76
+ 8560
77
+ 9236
78
+ 9912
79
+ (15 rows)
80
+
33
81
set force_parallel_mode=1;
34
82
explain (costs off)
35
83
select stringu1::int2 from tenk1 where unique1 = 1;
0 commit comments