From a7ed44b2ebecffac297cbbe181c1980d8edb58a9 Mon Sep 17 00:00:00 2001 From: Richard Guo Date: Thu, 29 Jul 2021 12:00:44 +0800 Subject: [PATCH v1] Gather partial paths for subproblem's topmost scan/join rel --- src/backend/optimizer/path/allpaths.c | 2 +- src/test/regress/expected/select_parallel.out | 22 +++++++++++++++++++ src/test/regress/sql/select_parallel.sql | 5 +++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 671117314a..640e3b4049 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -3041,7 +3041,7 @@ standard_join_search(PlannerInfo *root, int levels_needed, List *initial_rels) * partial paths. We'll do the same for the topmost scan/join rel * once we know the final targetlist (see grouping_planner). */ - if (lev < levels_needed) + if (!bms_equal(rel->relids, root->all_baserels)) generate_useful_gather_paths(root, rel, false); /* Find and save the cheapest paths for this rel */ diff --git a/src/test/regress/expected/select_parallel.out b/src/test/regress/expected/select_parallel.out index 4ea1aa7dfd..c9cc8cdc18 100644 --- a/src/test/regress/expected/select_parallel.out +++ b/src/test/regress/expected/select_parallel.out @@ -1194,4 +1194,26 @@ SELECT 1 FROM tenk1_vw_sec Filter: (f1 < tenk1_vw_sec.unique1) (9 rows) +-- test gather for subproblem's topmost scan/join rel +EXPLAIN (COSTS OFF) +SELECT count(*) FROM tenk1 a JOIN tenk1 b ON a.two = b.two + FULL JOIN tenk1 c ON b.two = c.two; + QUERY PLAN +------------------------------------------------------------ + Aggregate + -> Hash Full Join + Hash Cond: (b.two = c.two) + -> Gather + Workers Planned: 4 + -> Parallel Hash Join + Hash Cond: (a.two = b.two) + -> Parallel Seq Scan on tenk1 a + -> Parallel Hash + -> Parallel Seq Scan on tenk1 b + -> Hash + -> Gather + Workers Planned: 4 + -> Parallel Seq Scan on tenk1 c +(14 rows) + rollback; diff --git a/src/test/regress/sql/select_parallel.sql b/src/test/regress/sql/select_parallel.sql index f924731248..3fcf82cd9d 100644 --- a/src/test/regress/sql/select_parallel.sql +++ b/src/test/regress/sql/select_parallel.sql @@ -455,4 +455,9 @@ EXPLAIN (COSTS OFF) SELECT 1 FROM tenk1_vw_sec WHERE (SELECT sum(f1) FROM int4_tbl WHERE f1 < unique1) < 100; +-- test gather for subproblem's topmost scan/join rel +EXPLAIN (COSTS OFF) +SELECT count(*) FROM tenk1 a JOIN tenk1 b ON a.two = b.two + FULL JOIN tenk1 c ON b.two = c.two; + rollback; -- 2.31.0