4 create function sp_parallel_restricted(int) returns int as
5 $$begin return $1; end$$ language plpgsql parallel restricted;
7 -- encourage use of parallel plans
8 set parallel_setup_cost=0;
9 set parallel_tuple_cost=0;
10 set min_parallel_table_scan_size=0;
11 set max_parallel_workers_per_gather=4;
12 -- Parallel Append with partial-subplans
14 select round(avg(aa)), sum(aa) from a_star;
16 --------------------------------------------------------------
22 -> Parallel Seq Scan on d_star a_star_4
23 -> Parallel Seq Scan on f_star a_star_6
24 -> Parallel Seq Scan on e_star a_star_5
25 -> Parallel Seq Scan on b_star a_star_2
26 -> Parallel Seq Scan on c_star a_star_3
27 -> Parallel Seq Scan on a_star a_star_1
30 select round(avg(aa)), sum(aa) from a_star a1;
36 -- Parallel Append with both partial and non-partial subplans
37 alter table c_star set (parallel_workers = 0);
38 alter table d_star set (parallel_workers = 0);
40 select round(avg(aa)), sum(aa) from a_star;
42 --------------------------------------------------------------
48 -> Seq Scan on d_star a_star_4
49 -> Seq Scan on c_star a_star_3
50 -> Parallel Seq Scan on f_star a_star_6
51 -> Parallel Seq Scan on e_star a_star_5
52 -> Parallel Seq Scan on b_star a_star_2
53 -> Parallel Seq Scan on a_star a_star_1
56 select round(avg(aa)), sum(aa) from a_star a2;
62 -- Parallel Append with only non-partial subplans
63 alter table a_star set (parallel_workers = 0);
64 alter table b_star set (parallel_workers = 0);
65 alter table e_star set (parallel_workers = 0);
66 alter table f_star set (parallel_workers = 0);
68 select round(avg(aa)), sum(aa) from a_star;
70 -----------------------------------------------------
76 -> Seq Scan on d_star a_star_4
77 -> Seq Scan on f_star a_star_6
78 -> Seq Scan on e_star a_star_5
79 -> Seq Scan on b_star a_star_2
80 -> Seq Scan on c_star a_star_3
81 -> Seq Scan on a_star a_star_1
84 select round(avg(aa)), sum(aa) from a_star a3;
90 -- Disable Parallel Append
91 alter table a_star reset (parallel_workers);
92 alter table b_star reset (parallel_workers);
93 alter table c_star reset (parallel_workers);
94 alter table d_star reset (parallel_workers);
95 alter table e_star reset (parallel_workers);
96 alter table f_star reset (parallel_workers);
97 set enable_parallel_append to off;
99 select round(avg(aa)), sum(aa) from a_star;
101 --------------------------------------------------------------
107 -> Parallel Seq Scan on a_star a_star_1
108 -> Parallel Seq Scan on b_star a_star_2
109 -> Parallel Seq Scan on c_star a_star_3
110 -> Parallel Seq Scan on d_star a_star_4
111 -> Parallel Seq Scan on e_star a_star_5
112 -> Parallel Seq Scan on f_star a_star_6
115 select round(avg(aa)), sum(aa) from a_star a4;
121 reset enable_parallel_append;
122 -- Parallel Append that runs serially
123 create function sp_test_func() returns setof text as
124 $$ select 'foo'::varchar union all select 'bar'::varchar $$
126 select sp_test_func() order by 1;
133 -- Parallel Append is not to be used when the subpath depends on the outer param
134 create table part_pa_test(a int, b int) partition by range(a);
135 create table part_pa_test_p1 partition of part_pa_test for values from (minvalue) to (0);
136 create table part_pa_test_p2 partition of part_pa_test for values from (0) to (maxvalue);
138 select (select max((select pa1.b from part_pa_test pa1 where pa1.a = pa2.a)))
139 from part_pa_test pa2;
141 --------------------------------------------------------------
146 -> Parallel Seq Scan on part_pa_test_p1 pa2_1
147 -> Parallel Seq Scan on part_pa_test_p2 pa2_2
152 -> Seq Scan on part_pa_test_p1 pa1_1
154 -> Seq Scan on part_pa_test_p2 pa1_2
158 drop table part_pa_test;
159 -- test with leader participation disabled
160 set parallel_leader_participation = off;
162 select count(*) from tenk1 where stringu1 = 'GRAAAA';
164 ---------------------------------------------------------
169 -> Parallel Seq Scan on tenk1
170 Filter: (stringu1 = 'GRAAAA'::name)
173 select count(*) from tenk1 where stringu1 = 'GRAAAA';
179 -- test with leader participation disabled, but no workers available (so
180 -- the leader will have to run the plan despite the setting)
181 set max_parallel_workers = 0;
183 select count(*) from tenk1 where stringu1 = 'GRAAAA';
185 ---------------------------------------------------------
190 -> Parallel Seq Scan on tenk1
191 Filter: (stringu1 = 'GRAAAA'::name)
194 select count(*) from tenk1 where stringu1 = 'GRAAAA';
200 reset max_parallel_workers;
201 reset parallel_leader_participation;
202 -- test that parallel_restricted function doesn't run in worker
203 alter table tenk1 set (parallel_workers = 4);
204 explain (verbose, costs off)
205 select sp_parallel_restricted(unique1) from tenk1
206 where stringu1 = 'GRAAAA' order by 1;
208 ---------------------------------------------------------
210 Output: (sp_parallel_restricted(unique1))
211 Sort Key: (sp_parallel_restricted(tenk1.unique1))
213 Output: sp_parallel_restricted(unique1)
215 -> Parallel Seq Scan on public.tenk1
217 Filter: (tenk1.stringu1 = 'GRAAAA'::name)
220 -- test parallel plan when group by expression is in target list.
222 select length(stringu1) from tenk1 group by length(stringu1);
224 ---------------------------------------------------
225 Finalize HashAggregate
226 Group Key: (length((stringu1)::text))
229 -> Partial HashAggregate
230 Group Key: length((stringu1)::text)
231 -> Parallel Seq Scan on tenk1
234 select length(stringu1) from tenk1 group by length(stringu1);
241 select stringu1, count(*) from tenk1 group by stringu1 order by stringu1;
243 ----------------------------------------------------
246 -> Finalize HashAggregate
250 -> Partial HashAggregate
252 -> Parallel Seq Scan on tenk1
255 -- test that parallel plan for aggregates is not selected when
256 -- target list contains parallel restricted clause.
258 select sum(sp_parallel_restricted(unique1)) from tenk1
259 group by(sp_parallel_restricted(unique1));
261 -------------------------------------------------------------------
263 Group Key: sp_parallel_restricted(unique1)
266 -> Parallel Index Only Scan using tenk1_unique1 on tenk1
269 -- test prepared statement
270 prepare tenk1_count(integer) As select count((unique1)) from tenk1 where hundred > $1;
271 explain (costs off) execute tenk1_count(1);
273 ----------------------------------------------
278 -> Parallel Seq Scan on tenk1
279 Filter: (hundred > 1)
282 execute tenk1_count(1);
288 deallocate tenk1_count;
289 -- test parallel plans for queries containing un-correlated subplans.
290 alter table tenk2 set (parallel_workers = 0);
292 select count(*) from tenk1 where (two, four) not in
293 (select hundred, thousand from tenk2 where thousand > 100);
295 ------------------------------------------------------
300 -> Parallel Seq Scan on tenk1
301 Filter: (NOT (hashed SubPlan 1))
304 Filter: (thousand > 100)
307 select count(*) from tenk1 where (two, four) not in
308 (select hundred, thousand from tenk2 where thousand > 100);
314 -- this is not parallel-safe due to use of random() within SubLink's testexpr:
316 select * from tenk1 where (unique1 + random())::integer not in
317 (select ten from tenk2);
319 ------------------------------------
321 Filter: (NOT (hashed SubPlan 1))
326 alter table tenk2 reset (parallel_workers);
327 -- test parallel plan for a query containing initplan.
328 set enable_indexscan = off;
329 set enable_indexonlyscan = off;
330 set enable_bitmapscan = off;
331 alter table tenk2 set (parallel_workers = 2);
333 select count(*) from tenk1
334 where tenk1.unique1 = (Select max(tenk2.unique1) from tenk2);
336 ------------------------------------------------------
338 InitPlan 1 (returns $2)
339 -> Finalize Aggregate
343 -> Parallel Seq Scan on tenk2
347 -> Parallel Seq Scan on tenk1
348 Filter: (unique1 = $2)
351 select count(*) from tenk1
352 where tenk1.unique1 = (Select max(tenk2.unique1) from tenk2);
358 reset enable_indexscan;
359 reset enable_indexonlyscan;
360 reset enable_bitmapscan;
361 alter table tenk2 reset (parallel_workers);
362 -- test parallel index scans.
363 set enable_seqscan to off;
364 set enable_bitmapscan to off;
366 select count((unique1)) from tenk1 where hundred > 1;
368 --------------------------------------------------------------------
373 -> Parallel Index Scan using tenk1_hundred on tenk1
374 Index Cond: (hundred > 1)
377 select count((unique1)) from tenk1 where hundred > 1;
383 -- test parallel index-only scans.
385 select count(*) from tenk1 where thousand > 95;
387 --------------------------------------------------------------------------------
392 -> Parallel Index Only Scan using tenk1_thous_tenthous on tenk1
393 Index Cond: (thousand > 95)
396 select count(*) from tenk1 where thousand > 95;
402 -- test rescan cases too
403 set enable_material = false;
406 (select count(unique1) from tenk1 where hundred > 10) ss
407 right join (values (1),(2),(3)) v(x) on true;
409 --------------------------------------------------------------------------
410 Nested Loop Left Join
411 -> Values Scan on "*VALUES*"
412 -> Finalize Aggregate
416 -> Parallel Index Scan using tenk1_hundred on tenk1
417 Index Cond: (hundred > 10)
421 (select count(unique1) from tenk1 where hundred > 10) ss
422 right join (values (1),(2),(3)) v(x) on true;
432 (select count(*) from tenk1 where thousand > 99) ss
433 right join (values (1),(2),(3)) v(x) on true;
435 --------------------------------------------------------------------------------------
436 Nested Loop Left Join
437 -> Values Scan on "*VALUES*"
438 -> Finalize Aggregate
442 -> Parallel Index Only Scan using tenk1_thous_tenthous on tenk1
443 Index Cond: (thousand > 99)
447 (select count(*) from tenk1 where thousand > 99) ss
448 right join (values (1),(2),(3)) v(x) on true;
456 -- test rescans for a Limit node with a parallel node beneath it.
457 reset enable_seqscan;
458 set enable_indexonlyscan to off;
459 set enable_indexscan to off;
460 alter table tenk1 set (parallel_workers = 0);
461 alter table tenk2 set (parallel_workers = 1);
463 select count(*) from tenk1
464 left join (select tenk2.unique1 from tenk2 order by 1 limit 1000) ss
465 on tenk1.unique1 < ss.unique1 + 1
466 where tenk1.unique1 < 2;
468 ------------------------------------------------------------
470 -> Nested Loop Left Join
471 Join Filter: (tenk1.unique1 < (tenk2.unique1 + 1))
473 Filter: (unique1 < 2)
478 Sort Key: tenk2.unique1
479 -> Parallel Seq Scan on tenk2
482 select count(*) from tenk1
483 left join (select tenk2.unique1 from tenk2 order by 1 limit 1000) ss
484 on tenk1.unique1 < ss.unique1 + 1
485 where tenk1.unique1 < 2;
491 --reset the value of workers for each table as it was before this test.
492 alter table tenk1 set (parallel_workers = 4);
493 alter table tenk2 reset (parallel_workers);
494 reset enable_material;
495 reset enable_bitmapscan;
496 reset enable_indexonlyscan;
497 reset enable_indexscan;
498 -- test parallel bitmap heap scan.
499 set enable_seqscan to off;
500 set enable_indexscan to off;
501 set enable_hashjoin to off;
502 set enable_mergejoin to off;
503 set enable_material to off;
504 -- test prefetching, if the platform allows it
507 SET effective_io_concurrency = 50;
508 EXCEPTION WHEN invalid_parameter_value THEN
510 set work_mem='64kB'; --set small work mem to force lossy pages
512 select count(*) from tenk1, tenk2 where tenk1.hundred > 1 and tenk2.thousand=0;
514 ------------------------------------------------------------
518 Filter: (thousand = 0)
521 -> Parallel Bitmap Heap Scan on tenk1
522 Recheck Cond: (hundred > 1)
523 -> Bitmap Index Scan on tenk1_hundred
524 Index Cond: (hundred > 1)
527 select count(*) from tenk1, tenk2 where tenk1.hundred > 1 and tenk2.thousand=0;
533 create table bmscantest (a int, t text);
534 insert into bmscantest select r, 'fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo' FROM generate_series(1,100000) r;
535 create index i_bmtest ON bmscantest(a);
536 select count(*) from bmscantest where a>1;
542 -- test accumulation of stats for parallel nodes
543 reset enable_seqscan;
544 alter table tenk2 set (parallel_workers = 0);
545 explain (analyze, timing off, summary off, costs off)
546 select count(*) from tenk1, tenk2 where tenk1.hundred > 1
547 and tenk2.thousand=0;
549 --------------------------------------------------------------------------
550 Aggregate (actual rows=1 loops=1)
551 -> Nested Loop (actual rows=98000 loops=1)
552 -> Seq Scan on tenk2 (actual rows=10 loops=1)
553 Filter: (thousand = 0)
554 Rows Removed by Filter: 9990
555 -> Gather (actual rows=9800 loops=10)
558 -> Parallel Seq Scan on tenk1 (actual rows=1960 loops=50)
559 Filter: (hundred > 1)
560 Rows Removed by Filter: 40
563 alter table tenk2 reset (parallel_workers);
565 create function explain_parallel_sort_stats() returns setof text
571 explain (analyze, timing off, summary off, costs off)
573 (select ten from tenk1 where ten < 100 order by ten) ss
574 right join (values (1),(2),(3)) v(x) on true
576 ln := regexp_replace(ln, 'Memory: \S*', 'Memory: xxx');
581 select * from explain_parallel_sort_stats();
582 explain_parallel_sort_stats
583 --------------------------------------------------------------------------
584 Nested Loop Left Join (actual rows=30000 loops=1)
585 -> Values Scan on "*VALUES*" (actual rows=3 loops=1)
586 -> Gather Merge (actual rows=10000 loops=3)
589 -> Sort (actual rows=2000 loops=15)
591 Sort Method: quicksort Memory: xxx
592 Worker 0: Sort Method: quicksort Memory: xxx
593 Worker 1: Sort Method: quicksort Memory: xxx
594 Worker 2: Sort Method: quicksort Memory: xxx
595 Worker 3: Sort Method: quicksort Memory: xxx
596 -> Parallel Seq Scan on tenk1 (actual rows=2000 loops=15)
600 reset enable_indexscan;
601 reset enable_hashjoin;
602 reset enable_mergejoin;
603 reset enable_material;
604 reset effective_io_concurrency;
605 drop table bmscantest;
606 drop function explain_parallel_sort_stats();
607 -- test parallel merge join path.
608 set enable_hashjoin to off;
609 set enable_nestloop to off;
611 select count(*) from tenk1, tenk2 where tenk1.unique1 = tenk2.unique1;
613 -------------------------------------------------------------------------------
619 Merge Cond: (tenk1.unique1 = tenk2.unique1)
620 -> Parallel Index Only Scan using tenk1_unique1 on tenk1
621 -> Index Only Scan using tenk2_unique1 on tenk2
624 select count(*) from tenk1, tenk2 where tenk1.unique1 = tenk2.unique1;
630 reset enable_hashjoin;
631 reset enable_nestloop;
633 set enable_hashagg = false;
635 select count(*) from tenk1 group by twenty;
637 ----------------------------------------------------
638 Finalize GroupAggregate
642 -> Partial GroupAggregate
646 -> Parallel Seq Scan on tenk1
649 select count(*) from tenk1 group by twenty;
674 --test expressions in targetlist are pushed down for gather merge
675 create function sp_simple_func(var1 integer) returns integer
680 $$ language plpgsql PARALLEL SAFE;
681 explain (costs off, verbose)
682 select ten, sp_simple_func(ten) from tenk1 where ten < 100 order by ten;
684 -----------------------------------------------------
686 Output: ten, (sp_simple_func(ten))
689 Output: ten, sp_simple_func(ten)
693 -> Parallel Seq Scan on public.tenk1
695 Filter: (tenk1.ten < 100)
698 drop function sp_simple_func(integer);
699 -- test handling of SRFs in targetlist (bug in 10.0)
701 select count(*), generate_series(1,2) from tenk1 group by twenty;
703 ----------------------------------------------------------
705 -> Finalize GroupAggregate
709 -> Partial GroupAggregate
713 -> Parallel Seq Scan on tenk1
716 select count(*), generate_series(1,2) from tenk1 group by twenty;
717 count | generate_series
718 -------+-----------------
761 -- test gather merge with parallel leader participation disabled
762 set parallel_leader_participation = off;
764 select count(*) from tenk1 group by twenty;
766 ----------------------------------------------------
767 Finalize GroupAggregate
771 -> Partial GroupAggregate
775 -> Parallel Seq Scan on tenk1
778 select count(*) from tenk1 group by twenty;
803 reset parallel_leader_participation;
804 --test rescan behavior of gather merge
805 set enable_material = false;
808 (select string4, count(unique2)
809 from tenk1 group by string4 order by string4) ss
810 right join (values (1),(2),(3)) v(x) on true;
812 ----------------------------------------------------------
813 Nested Loop Left Join
814 -> Values Scan on "*VALUES*"
815 -> Finalize GroupAggregate
816 Group Key: tenk1.string4
819 -> Partial GroupAggregate
820 Group Key: tenk1.string4
822 Sort Key: tenk1.string4
823 -> Parallel Seq Scan on tenk1
827 (select string4, count(unique2)
828 from tenk1 group by string4 order by string4) ss
829 right join (values (1),(2),(3)) v(x) on true;
831 ---------+-------+---
846 reset enable_material;
847 reset enable_hashagg;
848 -- check parallelized int8 aggregate (bug #14897)
850 select avg(unique1::int8) from tenk1;
852 -------------------------------------------------------------------------
857 -> Parallel Index Only Scan using tenk1_unique1 on tenk1
860 select avg(unique1::int8) from tenk1;
862 -----------------------
863 4999.5000000000000000
866 -- gather merge test with a LIMIT
868 select fivethous from tenk1 order by fivethous limit 4;
870 ----------------------------------------------
876 -> Parallel Seq Scan on tenk1
879 select fivethous from tenk1 order by fivethous limit 4;
888 -- gather merge test with 0 worker
889 set max_parallel_workers = 0;
891 select string4 from tenk1 order by string4 limit 5;
893 ----------------------------------------------
899 -> Parallel Seq Scan on tenk1
902 select string4 from tenk1 order by string4 limit 5;
912 -- gather merge test with 0 workers, with parallel leader
913 -- participation disabled (the leader will have to run the plan
914 -- despite the setting)
915 set parallel_leader_participation = off;
917 select string4 from tenk1 order by string4 limit 5;
919 ----------------------------------------------
925 -> Parallel Seq Scan on tenk1
928 select string4 from tenk1 order by string4 limit 5;
938 reset parallel_leader_participation;
939 reset max_parallel_workers;
941 SET LOCAL force_parallel_mode = 1;
943 select stringu1::int2 from tenk1 where unique1 = 1;
945 -----------------------------------------------
949 -> Index Scan using tenk1_unique1 on tenk1
950 Index Cond: (unique1 = 1)
953 ROLLBACK TO SAVEPOINT settings;
954 -- exercise record typmod remapping between backends
955 CREATE FUNCTION make_record(n int)
956 RETURNS RECORD LANGUAGE plpgsql PARALLEL SAFE AS
961 WHEN 2 THEN ROW(1, 2)
962 WHEN 3 THEN ROW(1, 2, 3)
963 WHEN 4 THEN ROW(1, 2, 3, 4)
964 ELSE ROW(1, 2, 3, 4, 5)
969 SET LOCAL force_parallel_mode = 1;
970 SELECT make_record(x) FROM (SELECT generate_series(1, 5) x) ss ORDER BY x;
980 ROLLBACK TO SAVEPOINT settings;
981 DROP function make_record(n int);
982 -- test the sanity of parallel query after the active role is dropped.
983 drop role if exists regress_parallel_worker;
984 NOTICE: role "regress_parallel_worker" does not exist, skipping
985 create role regress_parallel_worker;
986 set role regress_parallel_worker;
987 reset session authorization;
988 drop role regress_parallel_worker;
989 set force_parallel_mode = 1;
990 select count(*) from tenk1;
996 reset force_parallel_mode;
998 -- Window function calculation can't be pushed to workers.
999 explain (costs off, verbose)
1000 select count(*) from tenk1 a where (unique1, two) in
1001 (select unique1, row_number() over() from tenk1 b);
1003 ----------------------------------------------------------------------------------------------
1007 Hash Cond: ((a.unique1 = b.unique1) AND (a.two = (row_number() OVER (?))))
1009 Output: a.unique1, a.two
1011 -> Parallel Seq Scan on public.tenk1 a
1012 Output: a.unique1, a.two
1014 Output: b.unique1, (row_number() OVER (?))
1016 Output: b.unique1, row_number() OVER (?)
1020 -> Parallel Index Only Scan using tenk1_unique1 on public.tenk1 b
1024 -- LIMIT/OFFSET within sub-selects can't be pushed to workers.
1026 select * from tenk1 a where two in
1027 (select two from tenk1 b where stringu1 like '%AAAA' limit 3);
1029 ---------------------------------------------------------------
1031 Hash Cond: (a.two = b.two)
1034 -> Parallel Seq Scan on tenk1 a
1039 -> Parallel Seq Scan on tenk1 b
1040 Filter: (stringu1 ~~ '%AAAA'::text)
1043 -- to increase the parallel query test coverage
1045 SET LOCAL force_parallel_mode = 1;
1046 EXPLAIN (analyze, timing off, summary off, costs off) SELECT * FROM tenk1;
1048 -------------------------------------------------------------
1049 Gather (actual rows=10000 loops=1)
1052 -> Parallel Seq Scan on tenk1 (actual rows=2000 loops=5)
1055 ROLLBACK TO SAVEPOINT settings;
1056 -- provoke error in worker
1057 -- (make the error message long enough to require multiple bufferloads)
1059 SET LOCAL force_parallel_mode = 1;
1060 select (stringu1 || repeat('abcd', 5000))::int2 from tenk1 where unique1 = 1;
1061 ERROR: invalid input syntax for type smallint: "BAAAAAabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"
1062 CONTEXT: parallel worker
1063 ROLLBACK TO SAVEPOINT settings;
1064 -- test interaction with set-returning functions
1066 -- multiple subqueries under a single Gather node
1067 -- must set parallel_setup_cost > 0 to discourage multiple Gather nodes
1068 SET LOCAL parallel_setup_cost = 10;
1070 SELECT unique1 FROM tenk1 WHERE fivethous = tenthous + 1
1072 SELECT unique1 FROM tenk1 WHERE fivethous = tenthous + 1;
1074 ----------------------------------------------------
1078 -> Parallel Seq Scan on tenk1
1079 Filter: (fivethous = (tenthous + 1))
1080 -> Parallel Seq Scan on tenk1 tenk1_1
1081 Filter: (fivethous = (tenthous + 1))
1084 ROLLBACK TO SAVEPOINT settings;
1085 -- can't use multiple subqueries under a single Gather node due to initPlans
1087 SELECT unique1 FROM tenk1 WHERE fivethous =
1088 (SELECT unique1 FROM tenk1 WHERE fivethous = 1 LIMIT 1)
1090 SELECT unique1 FROM tenk1 WHERE fivethous =
1091 (SELECT unique2 FROM tenk1 WHERE fivethous = 1 LIMIT 1)
1094 --------------------------------------------------------------------
1096 Sort Key: tenk1.unique1
1100 Params Evaluated: $1
1101 InitPlan 1 (returns $1)
1105 -> Parallel Seq Scan on tenk1 tenk1_2
1106 Filter: (fivethous = 1)
1107 -> Parallel Seq Scan on tenk1
1108 Filter: (fivethous = $1)
1111 Params Evaluated: $3
1112 InitPlan 2 (returns $3)
1116 -> Parallel Seq Scan on tenk1 tenk1_3
1117 Filter: (fivethous = 1)
1118 -> Parallel Seq Scan on tenk1 tenk1_1
1119 Filter: (fivethous = $3)
1122 -- test interaction with SRFs
1123 SELECT * FROM information_schema.foreign_data_wrapper_options
1125 foreign_data_wrapper_catalog | foreign_data_wrapper_name | option_name | option_value
1126 ------------------------------+---------------------------+-------------+--------------
1129 EXPLAIN (VERBOSE, COSTS OFF)
1130 SELECT generate_series(1, two), array(select generate_series(1, two))
1131 FROM tenk1 ORDER BY tenthous;
1133 ----------------------------------------------------------------------
1135 Output: generate_series(1, tenk1.two), (SubPlan 1), tenk1.tenthous
1137 Output: tenk1.two, tenk1.tenthous
1140 Output: tenk1.two, tenk1.tenthous
1142 Output: tenk1.tenthous, tenk1.two
1143 Sort Key: tenk1.tenthous
1144 -> Parallel Seq Scan on public.tenk1
1145 Output: tenk1.tenthous, tenk1.two
1148 Output: generate_series(1, tenk1.two)
1152 -- test passing expanded-value representations to workers
1153 CREATE FUNCTION make_some_array(int,int) returns int[] as
1159 end$$ language plpgsql parallel safe;
1160 CREATE TABLE fooarr(f1 text, f2 int[], f3 text);
1161 INSERT INTO fooarr VALUES('1', ARRAY[1,2], 'one');
1162 PREPARE pstmt(text, int[]) AS SELECT * FROM fooarr WHERE f1 = $1 AND f2 = $2;
1163 EXPLAIN (COSTS OFF) EXECUTE pstmt('1', make_some_array(1,2));
1165 ------------------------------------------------------------------
1168 -> Parallel Seq Scan on fooarr
1169 Filter: ((f1 = '1'::text) AND (f2 = '{1,2}'::integer[]))
1172 EXECUTE pstmt('1', make_some_array(1,2));
1179 -- test interaction between subquery and partial_paths
1180 CREATE VIEW tenk1_vw_sec WITH (security_barrier) AS SELECT * FROM tenk1;
1182 SELECT 1 FROM tenk1_vw_sec
1183 WHERE (SELECT sum(f1) FROM int4_tbl WHERE f1 < unique1) < 100;
1185 -------------------------------------------------------------------
1186 Subquery Scan on tenk1_vw_sec
1187 Filter: ((SubPlan 1) < 100)
1190 -> Parallel Index Only Scan using tenk1_unique1 on tenk1
1193 -> Seq Scan on int4_tbl
1194 Filter: (f1 < tenk1_vw_sec.unique1)