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)