From 952b28046f527dfb8250c13441722f3bf1e336e8 Mon Sep 17 00:00:00 2001 From: Zhang Mingli Date: Sat, 2 Aug 2025 07:54:12 +0800 Subject: [PATCH] Fix force_parallel_mode to work as intended. The force_parallel_mode GUC is meant to facilitate testing of parallel query plans, but it currently allows non-parallel plans to win even when force_parallel_mode is enabled. This behavior makes it difficult to debug parallel plans as intended. Correct the behavior for testing purposes. Authored-by: Zhang Mingli avamingli@gmail.com --- src/backend/optimizer/plan/planner.c | 2 ++ src/test/regress/expected/incremental_sort.out | 4 ++-- src/test/regress/expected/incremental_sort_optimizer.out | 4 ++-- src/test/regress/sql/incremental_sort.sql | 4 ++-- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 463b24ba903..be5814f888a 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -593,6 +593,8 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions, { Path *cheapest_partial_path; cheapest_partial_path = linitial(final_rel->partial_pathlist); + if (force_parallel_mode == FORCE_PARALLEL_ON) + final_rel->pathlist = NIL; add_path(final_rel, cheapest_partial_path, root); set_cheapest(final_rel); } diff --git a/src/test/regress/expected/incremental_sort.out b/src/test/regress/expected/incremental_sort.out index 9bdd3486d2b..c5f52e1e97f 100644 --- a/src/test/regress/expected/incremental_sort.out +++ b/src/test/regress/expected/incremental_sort.out @@ -589,7 +589,6 @@ select explain_analyze_without_memory('select * from (select * from t order by a Optimizer: Postgres query optimizer (13 rows) -reset max_parallel_workers_per_gather; select jsonb_pretty(explain_analyze_inc_sort_nodes_without_memory('select * from (select * from t order by a) s order by a, b limit 55')); jsonb_pretty ------------------------------------------------- @@ -626,6 +625,7 @@ select jsonb_pretty(explain_analyze_inc_sort_nodes_without_memory('select * from ] (1 row) +reset max_parallel_workers_per_gather; select explain_analyze_inc_sort_nodes_verify_invariants('select * from (select * from t order by a) s order by a, b limit 55'); explain_analyze_inc_sort_nodes_verify_invariants -------------------------------------------------- @@ -815,7 +815,6 @@ select explain_analyze_without_memory('select * from (select * from t order by a Optimizer: Postgres query optimizer (14 rows) -reset max_parallel_workers_per_gather; select jsonb_pretty(explain_analyze_inc_sort_nodes_without_memory('select * from (select * from t order by a) s order by a, b limit 70')); jsonb_pretty ------------------------------------------------- @@ -861,6 +860,7 @@ select jsonb_pretty(explain_analyze_inc_sort_nodes_without_memory('select * from ] (1 row) +reset max_parallel_workers_per_gather; select explain_analyze_inc_sort_nodes_verify_invariants('select * from (select * from t order by a) s order by a, b limit 70'); explain_analyze_inc_sort_nodes_verify_invariants -------------------------------------------------- diff --git a/src/test/regress/expected/incremental_sort_optimizer.out b/src/test/regress/expected/incremental_sort_optimizer.out index 97550c1beda..f5fd24f81ba 100644 --- a/src/test/regress/expected/incremental_sort_optimizer.out +++ b/src/test/regress/expected/incremental_sort_optimizer.out @@ -560,7 +560,6 @@ select explain_analyze_without_memory('select * from (select * from t order by a Optimizer: Pivotal Optimizer (GPORCA) (9 rows) -reset max_parallel_workers_per_gather; select jsonb_pretty(explain_analyze_inc_sort_nodes_without_memory('select * from (select * from t order by a) s order by a, b limit 55')); jsonb_pretty -------------- @@ -568,6 +567,7 @@ select jsonb_pretty(explain_analyze_inc_sort_nodes_without_memory('select * from ] (1 row) +reset max_parallel_workers_per_gather; select explain_analyze_inc_sort_nodes_verify_invariants('select * from (select * from t order by a) s order by a, b limit 55'); explain_analyze_inc_sort_nodes_verify_invariants -------------------------------------------------- @@ -743,7 +743,6 @@ select explain_analyze_without_memory('select * from (select * from t order by a Optimizer: Pivotal Optimizer (GPORCA) (10 rows) -reset max_parallel_workers_per_gather; select jsonb_pretty(explain_analyze_inc_sort_nodes_without_memory('select * from (select * from t order by a) s order by a, b limit 70')); jsonb_pretty -------------- @@ -751,6 +750,7 @@ select jsonb_pretty(explain_analyze_inc_sort_nodes_without_memory('select * from ] (1 row) +reset max_parallel_workers_per_gather; select explain_analyze_inc_sort_nodes_verify_invariants('select * from (select * from t order by a) s order by a, b limit 70'); explain_analyze_inc_sort_nodes_verify_invariants -------------------------------------------------- diff --git a/src/test/regress/sql/incremental_sort.sql b/src/test/regress/sql/incremental_sort.sql index eb7a1082f2b..afd1dab2045 100644 --- a/src/test/regress/sql/incremental_sort.sql +++ b/src/test/regress/sql/incremental_sort.sql @@ -147,8 +147,8 @@ select * from (select * from t order by a) s order by a, b limit 55; -- Test EXPLAIN ANALYZE with only a fullsort group. set max_parallel_workers_per_gather = 0; select explain_analyze_without_memory('select * from (select * from t order by a) s order by a, b limit 55'); -reset max_parallel_workers_per_gather; select jsonb_pretty(explain_analyze_inc_sort_nodes_without_memory('select * from (select * from t order by a) s order by a, b limit 55')); +reset max_parallel_workers_per_gather; select explain_analyze_inc_sort_nodes_verify_invariants('select * from (select * from t order by a) s order by a, b limit 55'); delete from t; @@ -181,8 +181,8 @@ rollback; -- Test EXPLAIN ANALYZE with both fullsort and presorted groups. set max_parallel_workers_per_gather = 0; select explain_analyze_without_memory('select * from (select * from t order by a) s order by a, b limit 70'); -reset max_parallel_workers_per_gather; select jsonb_pretty(explain_analyze_inc_sort_nodes_without_memory('select * from (select * from t order by a) s order by a, b limit 70')); +reset max_parallel_workers_per_gather; select explain_analyze_inc_sort_nodes_verify_invariants('select * from (select * from t order by a) s order by a, b limit 70'); delete from t;