Skip to content

Commit 91ab602

Browse files
committed
Bugfix. inherent number of rows from parallel path , not from RelOptInfo.
1 parent 11be868 commit 91ab602

File tree

3 files changed

+104
-13
lines changed

3 files changed

+104
-13
lines changed

contrib/tempscan/expected/basic.out

Lines changed: 79 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,87 @@ SELECT count(*) FROM parallel_test;
3131
-- Should also utilise parallel workers like scanning of a plain table
3232
EXPLAIN (COSTS OFF)
3333
SELECT count(*) FROM parallel_test_tmp;
34-
QUERY PLAN
35-
----------------------------------------------------------
36-
Aggregate
34+
QUERY PLAN
35+
----------------------------------------------------------------
36+
Finalize Aggregate
3737
-> Gather
3838
Workers Planned: 1
39-
-> Custom Scan (nodeCustomTempScan)
40-
-> Parallel Seq Scan on parallel_test_tmp
41-
(5 rows)
39+
-> Partial Aggregate
40+
-> Custom Scan (nodeCustomTempScan)
41+
-> Parallel Seq Scan on parallel_test_tmp
42+
(6 rows)
43+
44+
-- Want to see here partial aggregate over parallel join
45+
EXPLAIN (COSTS OFF)
46+
SELECT count(*) FROM parallel_test t1 NATURAL JOIN parallel_test t2;
47+
QUERY PLAN
48+
---------------------------------------------------------------------
49+
Finalize Aggregate
50+
-> Gather
51+
Workers Planned: 1
52+
-> Partial Aggregate
53+
-> Parallel Hash Join
54+
Hash Cond: (t1.x = t2.x)
55+
-> Parallel Seq Scan on parallel_test t1
56+
-> Parallel Hash
57+
-> Parallel Seq Scan on parallel_test t2
58+
(9 rows)
59+
60+
EXPLAIN (COSTS OFF)
61+
SELECT count(*) FROM parallel_test_tmp t1 NATURAL JOIN parallel_test t2;
62+
QUERY PLAN
63+
-------------------------------------------------------------------------
64+
Finalize Aggregate
65+
-> Gather
66+
Workers Planned: 1
67+
-> Partial Aggregate
68+
-> Parallel Hash Join
69+
Hash Cond: (t1.x = t2.x)
70+
-> Custom Scan (nodeCustomTempScan)
71+
-> Parallel Seq Scan on parallel_test_tmp t1
72+
-> Parallel Hash
73+
-> Parallel Seq Scan on parallel_test t2
74+
(10 rows)
75+
76+
-- Just see how merge join manages custom parallel scan path
77+
SET enable_hashjoin = 'off';
78+
EXPLAIN (COSTS OFF)
79+
SELECT count(*) FROM parallel_test t1 NATURAL JOIN parallel_test t2;
80+
QUERY PLAN
81+
---------------------------------------------------------------------
82+
Finalize Aggregate
83+
-> Gather
84+
Workers Planned: 1
85+
-> Partial Aggregate
86+
-> Merge Join
87+
Merge Cond: (t1.x = t2.x)
88+
-> Sort
89+
Sort Key: t1.x
90+
-> Parallel Seq Scan on parallel_test t1
91+
-> Sort
92+
Sort Key: t2.x
93+
-> Seq Scan on parallel_test t2
94+
(12 rows)
95+
96+
EXPLAIN (COSTS OFF)
97+
SELECT count(*) FROM parallel_test_tmp t1 NATURAL JOIN parallel_test t2;
98+
QUERY PLAN
99+
-------------------------------------------------------------------------------
100+
Finalize Aggregate
101+
-> Gather
102+
Workers Planned: 1
103+
-> Partial Aggregate
104+
-> Merge Join
105+
Merge Cond: (t1.x = t2.x)
106+
-> Sort
107+
Sort Key: t1.x
108+
-> Custom Scan (nodeCustomTempScan)
109+
-> Parallel Seq Scan on parallel_test_tmp t1
110+
-> Sort
111+
Sort Key: t2.x
112+
-> Seq Scan on parallel_test t2
113+
(13 rows)
42114

115+
RESET enable_hashjoin;
43116
RESET tempscan.enable;
44117
DROP TABLE parallel_test, parallel_test_tmp;

contrib/tempscan/nodeCustomTempScan.c

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "postgres.h"
1515

1616
#include "nodes/extensible.h"
17+
#include "optimizer/clauses.h"
1718
#include "optimizer/cost.h"
1819
#include "optimizer/pathnode.h"
1920
#include "optimizer/paths.h"
@@ -70,6 +71,7 @@ static CustomExecMethods exec_methods =
7071
};
7172

7273
static set_rel_pathlist_hook_type set_rel_pathlist_hook_next = NULL;
74+
7375
static bool tempscan_enable = false;
7476

7577
void _PG_init(void);
@@ -90,7 +92,7 @@ create_partial_tempscan_path(PlannerInfo *root, RelOptInfo *rel,
9092
pathnode->pathtype = T_CustomScan;
9193
pathnode->parent = rel;
9294
pathnode->pathtarget = rel->reltarget;
93-
pathnode->rows = rel->rows;
95+
pathnode->rows = path->rows; /* Don't use rel->rows! Remember semantics of this field in the parallel case */
9496

9597
/* XXX: Just for now */
9698
pathnode->param_info = NULL;
@@ -100,8 +102,8 @@ create_partial_tempscan_path(PlannerInfo *root, RelOptInfo *rel,
100102
pathnode->parallel_workers = path->parallel_workers;
101103

102104
/* DEBUGGING purposes only */
103-
pathnode->startup_cost = path->startup_cost / disable_cost;
104-
pathnode->total_cost = path->total_cost / disable_cost;
105+
pathnode->startup_cost = path->startup_cost /*/ disable_cost*/;
106+
pathnode->total_cost = path->total_cost /*/ disable_cost*/;
105107

106108
cpath->custom_paths = list_make1(path);
107109
cpath->custom_private = NIL;
@@ -213,21 +215,25 @@ try_partial_tempscan(PlannerInfo *root, RelOptInfo *rel, Index rti,
213215
if (set_rel_pathlist_hook_next)
214216
(*set_rel_pathlist_hook_next)(root, rel, rti, rte);
215217

216-
if (rel->consider_parallel)
218+
if (!tempscan_enable || rel->consider_parallel)
217219
return;
218220

219221
if (rte->rtekind != RTE_RELATION ||
220222
get_rel_persistence(rte->relid) != RELPERSISTENCE_TEMP)
221223
return;
222224

225+
/* HACK */
226+
if (!is_parallel_safe(root, (Node *) rel->baserestrictinfo) ||
227+
!is_parallel_safe(root, (Node *) rel->reltarget->exprs))
228+
return;
229+
223230
parallel_workers = compute_parallel_worker(rel, rel->pages, -1,
224231
max_parallel_workers_per_gather);
225232

226233
/* If any limit was set to zero, the user doesn't want a parallel scan. */
227234
if (parallel_workers <= 0)
228235
return;
229236

230-
/* HACK */
231237
rel->consider_parallel = true;
232238

233239
path = create_seqscan_path(root, rel, NULL, parallel_workers);
@@ -238,8 +244,6 @@ try_partial_tempscan(PlannerInfo *root, RelOptInfo *rel, Index rti,
238244
create_partial_tempscan_path(root, rel, path));
239245
}
240246

241-
if (!bms_equal(rel->relids, root->all_query_rels))
242-
rel->consider_parallel = false;
243247
Assert(IsA(linitial(rel->partial_pathlist), CustomPath));
244248
}
245249

contrib/tempscan/sql/basic.sql

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,19 @@ SELECT count(*) FROM parallel_test;
2929
EXPLAIN (COSTS OFF)
3030
SELECT count(*) FROM parallel_test_tmp;
3131

32+
-- Want to see here partial aggregate over parallel join
33+
EXPLAIN (COSTS OFF)
34+
SELECT count(*) FROM parallel_test t1 NATURAL JOIN parallel_test t2;
35+
EXPLAIN (COSTS OFF)
36+
SELECT count(*) FROM parallel_test_tmp t1 NATURAL JOIN parallel_test t2;
37+
38+
-- Just see how merge join manages custom parallel scan path
39+
SET enable_hashjoin = 'off';
40+
EXPLAIN (COSTS OFF)
41+
SELECT count(*) FROM parallel_test t1 NATURAL JOIN parallel_test t2;
42+
EXPLAIN (COSTS OFF)
43+
SELECT count(*) FROM parallel_test_tmp t1 NATURAL JOIN parallel_test t2;
44+
45+
RESET enable_hashjoin;
3246
RESET tempscan.enable;
3347
DROP TABLE parallel_test, parallel_test_tmp;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy