Skip to content

Commit 48afabd

Browse files
committed
resolve merge conflicts
2 parents 82507b6 + 0c5323d commit 48afabd

File tree

8 files changed

+227
-52
lines changed

8 files changed

+227
-52
lines changed

META.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "pg_pathman",
33
"abstract": "Partitioning tool",
44
"description": "The `pg_pathman` module provides optimized partitioning mechanism and functions to manage partitions.",
5-
"version": "1.3.1",
5+
"version": "1.3.2",
66
"maintainer": [
77
"Ildar Musin <i.musin@postgrespro.ru>",
88
"Dmitry Ivanov <d.ivanov@postgrespro.ru>",
@@ -24,7 +24,7 @@
2424
"pg_pathman": {
2525
"file": "pg_pathman--1.3.sql",
2626
"docfile": "README.md",
27-
"version": "1.3.1",
27+
"version": "1.3.2",
2828
"abstract": "Partitioning tool"
2929
}
3030
},

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ REGRESS = pathman_basic \
3737
pathman_interval \
3838
pathman_join_clause \
3939
pathman_lateral \
40+
pathman_mergejoin \
4041
pathman_only \
4142
pathman_permissions \
4243
pathman_rowmarks \
@@ -45,7 +46,6 @@ REGRESS = pathman_basic \
4546
pathman_updates \
4647
pathman_utility_stmt
4748

48-
4949
EXTRA_REGRESS_OPTS=--temp-config=$(top_srcdir)/$(subdir)/conf.add
5050

5151
EXTRA_CLEAN = pg_pathman--$(EXTVERSION).sql ./isolation_output

expected/pathman_basic.out

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,40 +1022,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM test.range_rel_1 UNION ALL SELECT * FROM test.
10221022
/*
10231023
* Join
10241024
*/
1025-
SET enable_hashjoin = OFF;
10261025
set enable_nestloop = OFF;
1027-
SET enable_mergejoin = ON;
1028-
EXPLAIN (COSTS OFF)
1029-
SELECT * FROM test.range_rel j1
1030-
JOIN test.range_rel j2 on j2.id = j1.id
1031-
JOIN test.num_range_rel j3 on j3.id = j1.id
1032-
WHERE j1.dt < '2015-03-01' AND j2.dt >= '2015-02-01' ORDER BY j2.dt;
1033-
QUERY PLAN
1034-
-------------------------------------------------------------------------------------------
1035-
Sort
1036-
Sort Key: j2.dt
1037-
-> Merge Join
1038-
Merge Cond: (j3.id = j2.id)
1039-
-> Append
1040-
-> Index Scan using num_range_rel_1_pkey on num_range_rel_1 j3
1041-
-> Index Scan using num_range_rel_2_pkey on num_range_rel_2 j3_1
1042-
-> Index Scan using num_range_rel_3_pkey on num_range_rel_3 j3_2
1043-
-> Index Scan using num_range_rel_4_pkey on num_range_rel_4 j3_3
1044-
-> Materialize
1045-
-> Merge Join
1046-
Merge Cond: (j2.id = j1.id)
1047-
-> Merge Append
1048-
Sort Key: j2.id
1049-
-> Index Scan using range_rel_2_pkey on range_rel_2 j2
1050-
-> Index Scan using range_rel_3_pkey on range_rel_3 j2_1
1051-
-> Index Scan using range_rel_4_pkey on range_rel_4 j2_2
1052-
-> Materialize
1053-
-> Merge Append
1054-
Sort Key: j1.id
1055-
-> Index Scan using range_rel_1_pkey on range_rel_1 j1
1056-
-> Index Scan using range_rel_2_pkey on range_rel_2 j1_1
1057-
(22 rows)
1058-
10591026
SET enable_hashjoin = ON;
10601027
SET enable_mergejoin = OFF;
10611028
EXPLAIN (COSTS OFF)

expected/pathman_mergejoin.out

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
\set VERBOSITY terse
2+
SET search_path = 'public';
3+
CREATE SCHEMA pathman;
4+
CREATE EXTENSION pg_pathman SCHEMA pathman;
5+
CREATE SCHEMA test;
6+
CREATE TABLE test.range_rel (
7+
id SERIAL PRIMARY KEY,
8+
dt TIMESTAMP NOT NULL,
9+
txt TEXT);
10+
CREATE INDEX ON test.range_rel (dt);
11+
INSERT INTO test.range_rel (dt, txt)
12+
SELECT g, md5(g::TEXT) FROM generate_series('2015-01-01', '2015-04-30', '1 day'::interval) as g;
13+
SELECT pathman.create_range_partitions('test.range_rel', 'DT', '2015-01-01'::DATE, '1 month'::INTERVAL);
14+
create_range_partitions
15+
-------------------------
16+
4
17+
(1 row)
18+
19+
CREATE TABLE test.num_range_rel (
20+
id SERIAL PRIMARY KEY,
21+
txt TEXT);
22+
INSERT INTO test.num_range_rel SELECT g, md5(g::TEXT) FROM generate_series(1, 3000) as g;
23+
SELECT pathman.create_range_partitions('test.num_range_rel', 'id', 0, 1000, 4);
24+
create_range_partitions
25+
-------------------------
26+
4
27+
(1 row)
28+
29+
/*
30+
* Merge join between 3 partitioned tables
31+
*
32+
* test case for the fix of sorting, merge append and index scan issues
33+
* details in commit 54dd0486fc55b2d25cf7d095f83dee6ff4adee06
34+
*/
35+
SET enable_hashjoin = OFF;
36+
SET enable_nestloop = OFF;
37+
SET enable_mergejoin = ON;
38+
EXPLAIN (COSTS OFF)
39+
SELECT * FROM test.range_rel j1
40+
JOIN test.range_rel j2 on j2.id = j1.id
41+
JOIN test.num_range_rel j3 on j3.id = j1.id
42+
WHERE j1.dt < '2015-03-01' AND j2.dt >= '2015-02-01' ORDER BY j2.dt;
43+
QUERY PLAN
44+
-------------------------------------------------------------------------------------------
45+
Sort
46+
Sort Key: j2.dt
47+
-> Merge Join
48+
Merge Cond: (j3.id = j2.id)
49+
-> Append
50+
-> Index Scan using num_range_rel_1_pkey on num_range_rel_1 j3
51+
-> Index Scan using num_range_rel_2_pkey on num_range_rel_2 j3_1
52+
-> Index Scan using num_range_rel_3_pkey on num_range_rel_3 j3_2
53+
-> Index Scan using num_range_rel_4_pkey on num_range_rel_4 j3_3
54+
-> Materialize
55+
-> Merge Join
56+
Merge Cond: (j2.id = j1.id)
57+
-> Merge Append
58+
Sort Key: j2.id
59+
-> Index Scan using range_rel_2_pkey on range_rel_2 j2
60+
-> Index Scan using range_rel_3_pkey on range_rel_3 j2_1
61+
-> Index Scan using range_rel_4_pkey on range_rel_4 j2_2
62+
-> Materialize
63+
-> Merge Append
64+
Sort Key: j1.id
65+
-> Index Scan using range_rel_1_pkey on range_rel_1 j1
66+
-> Index Scan using range_rel_2_pkey on range_rel_2 j1_1
67+
(22 rows)
68+
69+
SET enable_hashjoin = ON;
70+
SET enable_nestloop = ON;
71+
DROP SCHEMA test CASCADE;
72+
NOTICE: drop cascades to 12 other objects
73+
DROP EXTENSION pg_pathman;
74+
DROP SCHEMA pathman CASCADE;

expected/pathman_mergejoin_0.out

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
\set VERBOSITY terse
2+
SET search_path = 'public';
3+
CREATE SCHEMA pathman;
4+
CREATE EXTENSION pg_pathman SCHEMA pathman;
5+
CREATE SCHEMA test;
6+
CREATE TABLE test.range_rel (
7+
id SERIAL PRIMARY KEY,
8+
dt TIMESTAMP NOT NULL,
9+
txt TEXT);
10+
CREATE INDEX ON test.range_rel (dt);
11+
INSERT INTO test.range_rel (dt, txt)
12+
SELECT g, md5(g::TEXT) FROM generate_series('2015-01-01', '2015-04-30', '1 day'::interval) as g;
13+
SELECT pathman.create_range_partitions('test.range_rel', 'DT', '2015-01-01'::DATE, '1 month'::INTERVAL);
14+
create_range_partitions
15+
-------------------------
16+
4
17+
(1 row)
18+
19+
CREATE TABLE test.num_range_rel (
20+
id SERIAL PRIMARY KEY,
21+
txt TEXT);
22+
INSERT INTO test.num_range_rel SELECT g, md5(g::TEXT) FROM generate_series(1, 3000) as g;
23+
SELECT pathman.create_range_partitions('test.num_range_rel', 'id', 0, 1000, 4);
24+
create_range_partitions
25+
-------------------------
26+
4
27+
(1 row)
28+
29+
/*
30+
* Merge join between 3 partitioned tables
31+
*
32+
* test case for the fix of sorting, merge append and index scan issues
33+
* details in commit 54dd0486fc55b2d25cf7d095f83dee6ff4adee06
34+
*/
35+
SET enable_hashjoin = OFF;
36+
SET enable_nestloop = OFF;
37+
SET enable_mergejoin = ON;
38+
EXPLAIN (COSTS OFF)
39+
SELECT * FROM test.range_rel j1
40+
JOIN test.range_rel j2 on j2.id = j1.id
41+
JOIN test.num_range_rel j3 on j3.id = j1.id
42+
WHERE j1.dt < '2015-03-01' AND j2.dt >= '2015-02-01' ORDER BY j2.dt;
43+
QUERY PLAN
44+
---------------------------------------------------------------------------------
45+
Sort
46+
Sort Key: j2.dt
47+
-> Merge Join
48+
Merge Cond: (j2.id = j3.id)
49+
-> Merge Join
50+
Merge Cond: (j1.id = j2.id)
51+
-> Merge Append
52+
Sort Key: j1.id
53+
-> Index Scan using range_rel_1_pkey on range_rel_1 j1
54+
-> Index Scan using range_rel_2_pkey on range_rel_2 j1_1
55+
-> Merge Append
56+
Sort Key: j2.id
57+
-> Index Scan using range_rel_2_pkey on range_rel_2 j2
58+
-> Index Scan using range_rel_3_pkey on range_rel_3 j2_1
59+
-> Index Scan using range_rel_4_pkey on range_rel_4 j2_2
60+
-> Append
61+
-> Index Scan using num_range_rel_1_pkey on num_range_rel_1 j3
62+
-> Index Scan using num_range_rel_2_pkey on num_range_rel_2 j3_1
63+
-> Index Scan using num_range_rel_3_pkey on num_range_rel_3 j3_2
64+
-> Index Scan using num_range_rel_4_pkey on num_range_rel_4 j3_3
65+
(20 rows)
66+
67+
SET enable_hashjoin = ON;
68+
SET enable_nestloop = ON;
69+
DROP SCHEMA test CASCADE;
70+
NOTICE: drop cascades to 12 other objects
71+
DROP EXTENSION pg_pathman;
72+
DROP SCHEMA pathman CASCADE;

sql/pathman_basic.sql

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -251,15 +251,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM test.range_rel_1 UNION ALL SELECT * FROM test.
251251
/*
252252
* Join
253253
*/
254-
SET enable_hashjoin = OFF;
255254
set enable_nestloop = OFF;
256-
SET enable_mergejoin = ON;
257-
258-
EXPLAIN (COSTS OFF)
259-
SELECT * FROM test.range_rel j1
260-
JOIN test.range_rel j2 on j2.id = j1.id
261-
JOIN test.num_range_rel j3 on j3.id = j1.id
262-
WHERE j1.dt < '2015-03-01' AND j2.dt >= '2015-02-01' ORDER BY j2.dt;
263255
SET enable_hashjoin = ON;
264256
SET enable_mergejoin = OFF;
265257
EXPLAIN (COSTS OFF)

sql/pathman_mergejoin.sql

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
\set VERBOSITY terse
2+
3+
SET search_path = 'public';
4+
CREATE SCHEMA pathman;
5+
CREATE EXTENSION pg_pathman SCHEMA pathman;
6+
CREATE SCHEMA test;
7+
8+
9+
CREATE TABLE test.range_rel (
10+
id SERIAL PRIMARY KEY,
11+
dt TIMESTAMP NOT NULL,
12+
txt TEXT);
13+
CREATE INDEX ON test.range_rel (dt);
14+
15+
INSERT INTO test.range_rel (dt, txt)
16+
SELECT g, md5(g::TEXT) FROM generate_series('2015-01-01', '2015-04-30', '1 day'::interval) as g;
17+
18+
SELECT pathman.create_range_partitions('test.range_rel', 'DT', '2015-01-01'::DATE, '1 month'::INTERVAL);
19+
20+
CREATE TABLE test.num_range_rel (
21+
id SERIAL PRIMARY KEY,
22+
txt TEXT);
23+
24+
INSERT INTO test.num_range_rel SELECT g, md5(g::TEXT) FROM generate_series(1, 3000) as g;
25+
26+
SELECT pathman.create_range_partitions('test.num_range_rel', 'id', 0, 1000, 4);
27+
28+
/*
29+
* Merge join between 3 partitioned tables
30+
*
31+
* test case for the fix of sorting, merge append and index scan issues
32+
* details in commit 54dd0486fc55b2d25cf7d095f83dee6ff4adee06
33+
*/
34+
SET enable_hashjoin = OFF;
35+
SET enable_nestloop = OFF;
36+
SET enable_mergejoin = ON;
37+
38+
EXPLAIN (COSTS OFF)
39+
SELECT * FROM test.range_rel j1
40+
JOIN test.range_rel j2 on j2.id = j1.id
41+
JOIN test.num_range_rel j3 on j3.id = j1.id
42+
WHERE j1.dt < '2015-03-01' AND j2.dt >= '2015-02-01' ORDER BY j2.dt;
43+
44+
SET enable_hashjoin = ON;
45+
SET enable_nestloop = ON;
46+
47+
48+
DROP SCHEMA test CASCADE;
49+
DROP EXTENSION pg_pathman;
50+
DROP SCHEMA pathman CASCADE;

src/hooks.c

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@ pathman_join_pathlist_hook(PlannerInfo *root,
152152
Relids required_nestloop,
153153
required_inner;
154154
List *filtered_joinclauses = NIL,
155-
*saved_ppi_list;
155+
*saved_ppi_list,
156+
*pathkeys;
156157
ListCell *rinfo_lc;
157158

158159
if (!IsA(cur_inner_path, AppendPath))
@@ -217,17 +218,18 @@ pathman_join_pathlist_hook(PlannerInfo *root,
217218
return;
218219

219220

221+
/* TODO: create macro initial_cost_nestloop_compat() */
222+
#if defined(PGPRO_VERSION) && PG_VERSION_NUM >= 90603
223+
initial_cost_nestloop(root, &workspace, jointype,
224+
outer, inner, /* built paths */
225+
extra);
226+
#else
220227
initial_cost_nestloop(root, &workspace, jointype,
221228
outer, inner, /* built paths */
222229
extra->sjinfo, &extra->semifactors);
230+
#endif
223231

224-
nest_path = create_nestloop_path(root, joinrel, jointype, &workspace,
225-
extra->sjinfo, &extra->semifactors,
226-
outer, inner, extra->restrictlist,
227-
build_join_pathkeys(root, joinrel,
228-
jointype,
229-
outer->pathkeys),
230-
required_nestloop);
232+
pathkeys = build_join_pathkeys(root, joinrel, jointype, outer->pathkeys);
231233

232234
/* Discard all clauses that are to be evaluated by 'inner' */
233235
foreach (rinfo_lc, extra->restrictlist)
@@ -239,6 +241,24 @@ pathman_join_pathlist_hook(PlannerInfo *root,
239241
filtered_joinclauses = lappend(filtered_joinclauses, rinfo);
240242
}
241243

244+
/* TODO: create macro create_nestloop_path_compat() */
245+
#if defined(PGPRO_VERSION) && PG_VERSION_NUM >= 90603
246+
nest_path = create_nestloop_path(root, joinrel, jointype, &workspace,
247+
extra,
248+
outer, inner,
249+
filtered_joinclauses,
250+
pathkeys,
251+
calc_nestloop_required_outer(outer, inner));
252+
#else
253+
nest_path = create_nestloop_path(root, joinrel, jointype, &workspace,
254+
extra->sjinfo,
255+
&extra->semifactors,
256+
outer, inner,
257+
filtered_joinclauses,
258+
pathkeys,
259+
calc_nestloop_required_outer(outer, inner));
260+
#endif
261+
242262
/*
243263
* NOTE: Override 'rows' value produced by standard estimator.
244264
* Currently we use get_parameterized_joinrel_size() since

0 commit comments

Comments
 (0)