]> granicus.if.org Git - postgresql/commitdiff
Don't consider parallel append for parallel unsafe paths.
authorAmit Kapila <akapila@postgresql.org>
Wed, 20 Jun 2018 02:21:42 +0000 (07:51 +0530)
committerAmit Kapila <akapila@postgresql.org>
Wed, 20 Jun 2018 02:21:42 +0000 (07:51 +0530)
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

src/backend/optimizer/path/allpaths.c
src/test/regress/expected/select_parallel.out
src/test/regress/sql/select_parallel.sql

index 146298828d83dbdf2c55b346580240633cc43625..3ada379f8bccc29add1690290948754e96bed96a 100644 (file)
@@ -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
index a07cd50fcbfc84d5a58a4070972ab6fff3951019..e48e3941ec0cbe0049d82a9458f83669d67068f1 100644 (file)
@@ -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)
index 7db75b0d2207cdd36a8ff282c070db3106881a39..31045d7f44d473158bb68387f88e23629a96c586 100644 (file)
@@ -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)