From: Amit Kapila Date: Wed, 20 Jun 2018 02:21:42 +0000 (+0530) Subject: Don't consider parallel append for parallel unsafe paths. X-Git-Tag: REL_11_BETA2~29 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=403318b71f7058ecbfb65bcc7de1eec96cd35d3f;p=postgresql Don't consider parallel append for parallel unsafe paths. Commit ab72716778 allowed Parallel Append paths to be generated for a relation that is not parallel safe. Prevent that from happening. Initial analysis by Tom Lane. Reported-by: Rajkumar Raghuwanshi Author: Amit Kapila and Rajkumar Raghuwanshi Reviewed-by: Amit Khandekar and Robert Haas Discussion:https://postgr.es/m/CAKcux6=tPJ6nJ08r__nU_pmLQiC0xY15Fn0HvG1Cprsjdd9s_Q@mail.gmail.com --- diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 146298828d..3ada379f8b 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -1383,7 +1383,7 @@ add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel, List *pa_partial_subpaths = NIL; List *pa_nonpartial_subpaths = NIL; bool partial_subpaths_valid = true; - bool pa_subpaths_valid = enable_parallel_append; + bool pa_subpaths_valid; List *all_child_pathkeys = NIL; List *all_child_outers = NIL; ListCell *l; @@ -1391,6 +1391,9 @@ add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel, bool build_partitioned_rels = false; double partial_rows = -1; + /* If appropriate, consider parallel append */ + pa_subpaths_valid = enable_parallel_append && rel->consider_parallel; + /* * AppendPath generated for partitioned tables must record the RT indexes * of partitioned tables that are direct or indirect children of this diff --git a/src/test/regress/expected/select_parallel.out b/src/test/regress/expected/select_parallel.out index a07cd50fcb..e48e3941ec 100644 --- a/src/test/regress/expected/select_parallel.out +++ b/src/test/regress/expected/select_parallel.out @@ -132,6 +132,32 @@ select sp_test_func() order by 1; foo (2 rows) +-- Parallel Append is not to be used when the subpath depends on the outer param +create table part_pa_test(a int, b int) partition by range(a); +create table part_pa_test_p1 partition of part_pa_test for values from (minvalue) to (0); +create table part_pa_test_p2 partition of part_pa_test for values from (0) to (maxvalue); +explain (costs off) + select (select max((select pa1.b from part_pa_test pa1 where pa1.a = pa2.a))) + from part_pa_test pa2; + QUERY PLAN +-------------------------------------------------------------- + Aggregate + -> Gather + Workers Planned: 3 + -> Parallel Append + -> Parallel Seq Scan on part_pa_test_p1 pa2 + -> Parallel Seq Scan on part_pa_test_p2 pa2_1 + SubPlan 2 + -> Result + SubPlan 1 + -> Append + -> Seq Scan on part_pa_test_p1 pa1 + Filter: (a = pa2.a) + -> Seq Scan on part_pa_test_p2 pa1_1 + Filter: (a = pa2.a) +(14 rows) + +drop table part_pa_test; -- test with leader participation disabled set parallel_leader_participation = off; explain (costs off) diff --git a/src/test/regress/sql/select_parallel.sql b/src/test/regress/sql/select_parallel.sql index 7db75b0d22..31045d7f44 100644 --- a/src/test/regress/sql/select_parallel.sql +++ b/src/test/regress/sql/select_parallel.sql @@ -55,6 +55,15 @@ $$ select 'foo'::varchar union all select 'bar'::varchar $$ language sql stable; select sp_test_func() order by 1; +-- Parallel Append is not to be used when the subpath depends on the outer param +create table part_pa_test(a int, b int) partition by range(a); +create table part_pa_test_p1 partition of part_pa_test for values from (minvalue) to (0); +create table part_pa_test_p2 partition of part_pa_test for values from (0) to (maxvalue); +explain (costs off) + select (select max((select pa1.b from part_pa_test pa1 where pa1.a = pa2.a))) + from part_pa_test pa2; +drop table part_pa_test; + -- test with leader participation disabled set parallel_leader_participation = off; explain (costs off)