11--
22-- PARALLEL
33--
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;
412-- Serializable isolation would disable parallel query, so explicitly use an
513-- arbitrary other level.
614begin isolation level repeatable read;
715-- setup parallel test
816set parallel_setup_cost=0;
917set parallel_tuple_cost=0;
18+ set max_parallel_workers_per_gather=4;
1019explain (costs off)
1120 select count(*) from a_star;
1221 QUERY PLAN
@@ -30,6 +39,45 @@ select count(*) from a_star;
3039 50
3140(1 row)
3241
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+
3381set force_parallel_mode=1;
3482explain (costs off)
3583 select stringu1::int2 from tenk1 where unique1 = 1;
0 commit comments