From 4f10509df2f57760f85794334ee944156d1d79de Mon Sep 17 00:00:00 2001 From: pgsql-guo Date: Mon, 18 Jul 2022 07:02:19 +0000 Subject: [PATCH v2] Gather partial paths for subproblem's topmost scan/join --- src/backend/optimizer/path/allpaths.c | 2 +- src/test/regress/expected/select_parallel.out | 20 +++++++++++++++++++ src/test/regress/sql/select_parallel.sql | 9 +++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index e9342097e5..d9810c5c56 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -3402,7 +3402,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..9afbc3d7df 100644 --- a/src/test/regress/expected/select_parallel.out +++ b/src/test/regress/expected/select_parallel.out @@ -1194,4 +1194,24 @@ SELECT 1 FROM tenk1_vw_sec Filter: (f1 < tenk1_vw_sec.unique1) (9 rows) +-- test gather for subproblem's topmost scan/join rel +set join_collapse_limit to 2; +alter table d_star set (parallel_workers = 0); +EXPLAIN (COSTS OFF) +SELECT * FROM tenk1 a JOIN tenk1 b ON a.two = b.two JOIN d_star c ON b.two > c.aa; + QUERY PLAN +------------------------------------------------------ + Nested Loop + Join Filter: (b.two > c.aa) + -> Seq Scan on d_star c + -> 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 +(10 rows) + +alter table d_star reset (parallel_workers); rollback; diff --git a/src/test/regress/sql/select_parallel.sql b/src/test/regress/sql/select_parallel.sql index f924731248..4fb8b0e0e7 100644 --- a/src/test/regress/sql/select_parallel.sql +++ b/src/test/regress/sql/select_parallel.sql @@ -455,4 +455,13 @@ 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 +set join_collapse_limit to 2; +alter table d_star set (parallel_workers = 0); + +EXPLAIN (COSTS OFF) +SELECT * FROM tenk1 a JOIN tenk1 b ON a.two = b.two JOIN d_star c ON b.two > c.aa; + +alter table d_star reset (parallel_workers); + rollback; -- 2.25.1