Skip to content

Commit 43a78cd

Browse files
akorotkovzilder
authored andcommitted
Fix RestrictInfo problem.
1 parent 71365f6 commit 43a78cd

File tree

3 files changed

+133
-45
lines changed

3 files changed

+133
-45
lines changed

contrib/pathman/expected/pathman.out

Lines changed: 97 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
CREATE EXTENSION pathman;
2-
SET enable_indexscan = OFF;
3-
SET enable_bitmapscan = OFF;
42
CREATE TABLE hash_rel (
53
id SERIAL PRIMARY KEY,
64
value INTEGER);
@@ -14,12 +12,26 @@ NOTICE: function hash_rel_hash_update_trigger_func() does not exist, skipping
1412

1513
(1 row)
1614

15+
CREATE TABLE num_range_rel (
16+
id SERIAL PRIMARY KEY,
17+
txt TEXT);
18+
SELECT create_range_partitions('num_range_rel', 'id', 'num', 0, 1000, 3);
19+
create_range_partitions
20+
-------------------------
21+
22+
(1 row)
23+
1724
INSERT INTO hash_rel VALUES (1, 1);
1825
INSERT INTO hash_rel VALUES (2, 2);
1926
INSERT INTO hash_rel VALUES (3, 3);
2027
INSERT INTO hash_rel VALUES (4, 4);
2128
INSERT INTO hash_rel VALUES (5, 5);
2229
INSERT INTO hash_rel VALUES (6, 6);
30+
INSERT INTO num_range_rel SELECT g, md5(g::TEXT) FROM generate_series(1, 3000) as g;
31+
VACUUM;
32+
SET enable_indexscan = OFF;
33+
SET enable_bitmapscan = OFF;
34+
SET enable_seqscan = ON;
2335
EXPLAIN (COSTS OFF) SELECT * FROM hash_rel;
2436
QUERY PLAN
2537
------------------------------
@@ -47,30 +59,6 @@ EXPLAIN (COSTS OFF) SELECT * FROM hash_rel WHERE value = 2 OR value = 1;
4759
Filter: (value = 2)
4860
(5 rows)
4961

50-
SELECT drop_hash_partitions('hash_rel');
51-
NOTICE: trigger "hash_rel_update_trigger" for relation "hash_rel" does not exist, skipping
52-
NOTICE: function hash_rel_hash_update_trigger_func() does not exist, skipping
53-
drop_hash_partitions
54-
----------------------
55-
56-
(1 row)
57-
58-
DROP TABLE hash_rel CASCADE;
59-
NOTICE: drop cascades to 3 other objects
60-
DETAIL: drop cascades to table hash_rel_0
61-
drop cascades to table hash_rel_1
62-
drop cascades to table hash_rel_2
63-
CREATE TABLE num_range_rel (
64-
id SERIAL PRIMARY KEY,
65-
txt TEXT);
66-
SELECT create_range_partitions('num_range_rel', 'id', 'num', '0', '1000', 3);
67-
create_range_partitions
68-
-------------------------
69-
70-
(1 row)
71-
72-
INSERT INTO num_range_rel SELECT g, md5(g::TEXT) FROM generate_series(1, 3000) as g;
73-
VACUUM;
7462
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE id > 2500;
7563
QUERY PLAN
7664
--------------------------------------
@@ -111,6 +99,89 @@ EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE (id >= 500 AND id < 1500)
11199
-> Seq Scan on num_range_rel_3000
112100
(8 rows)
113101

102+
SET enable_indexscan = ON;
103+
SET enable_bitmapscan = OFF;
104+
SET enable_seqscan = OFF;
105+
EXPLAIN (COSTS OFF) SELECT * FROM hash_rel;
106+
QUERY PLAN
107+
------------------------------
108+
Append
109+
-> Seq Scan on hash_rel_0
110+
-> Seq Scan on hash_rel_1
111+
-> Seq Scan on hash_rel_2
112+
(4 rows)
113+
114+
EXPLAIN (COSTS OFF) SELECT * FROM hash_rel WHERE value = 2;
115+
QUERY PLAN
116+
------------------------------
117+
Append
118+
-> Seq Scan on hash_rel_2
119+
Filter: (value = 2)
120+
(3 rows)
121+
122+
EXPLAIN (COSTS OFF) SELECT * FROM hash_rel WHERE value = 2 OR value = 1;
123+
QUERY PLAN
124+
------------------------------
125+
Append
126+
-> Seq Scan on hash_rel_1
127+
Filter: (value = 1)
128+
-> Seq Scan on hash_rel_2
129+
Filter: (value = 2)
130+
(5 rows)
131+
132+
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE id > 2500;
133+
QUERY PLAN
134+
----------------------------------------------------------------------
135+
Append
136+
-> Index Scan using num_range_rel_2000_pkey on num_range_rel_2000
137+
Index Cond: (id > 2500)
138+
-> Seq Scan on num_range_rel_3000
139+
(4 rows)
140+
141+
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE id >= 1000 AND id < 3000;
142+
QUERY PLAN
143+
--------------------------------------
144+
Append
145+
-> Seq Scan on num_range_rel_1000
146+
-> Seq Scan on num_range_rel_2000
147+
(3 rows)
148+
149+
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE id >= 1500 AND id < 2500;
150+
QUERY PLAN
151+
----------------------------------------------------------------------
152+
Append
153+
-> Index Scan using num_range_rel_1000_pkey on num_range_rel_1000
154+
Index Cond: (id >= 1500)
155+
-> Index Scan using num_range_rel_2000_pkey on num_range_rel_2000
156+
Index Cond: (id < 2500)
157+
(5 rows)
158+
159+
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE (id >= 500 AND id < 1500) OR (id > 2500);
160+
QUERY PLAN
161+
----------------------------------------------------------------------
162+
Append
163+
-> Index Scan using num_range_rel_0_pkey on num_range_rel_0
164+
Index Cond: (id >= 500)
165+
-> Index Scan using num_range_rel_1000_pkey on num_range_rel_1000
166+
Index Cond: (id < 1500)
167+
-> Index Scan using num_range_rel_2000_pkey on num_range_rel_2000
168+
Index Cond: (id > 2500)
169+
-> Seq Scan on num_range_rel_3000
170+
(8 rows)
171+
172+
SELECT drop_hash_partitions('hash_rel');
173+
NOTICE: trigger "hash_rel_update_trigger" for relation "hash_rel" does not exist, skipping
174+
NOTICE: function hash_rel_hash_update_trigger_func() does not exist, skipping
175+
drop_hash_partitions
176+
----------------------
177+
178+
(1 row)
179+
180+
DROP TABLE hash_rel CASCADE;
181+
NOTICE: drop cascades to 3 other objects
182+
DETAIL: drop cascades to table hash_rel_0
183+
drop cascades to table hash_rel_1
184+
drop cascades to table hash_rel_2
114185
SELECT drop_range_partitions('num_range_rel');
115186
drop_range_partitions
116187
-----------------------

contrib/pathman/pathman.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "optimizer/paths.h"
99
#include "optimizer/pathnode.h"
1010
#include "optimizer/planner.h"
11+
#include "optimizer/restrictinfo.h"
1112
#include "utils/hsearch.h"
1213
#include "utils/tqual.h"
1314
#include "utils/rel.h"
@@ -337,22 +338,26 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
337338
bool alwaysTrue;
338339
WrapperNode *wrap = (WrapperNode *) lfirst(lc);
339340
Node *new_clause = wrapper_make_expression(wrap, index, &alwaysTrue);
340-
RestrictInfo *new_rinfo;
341+
RestrictInfo *old_rinfo = (RestrictInfo *) lfirst(lc2),
342+
*new_rinfo;
341343

342344
if (alwaysTrue)
343345
continue;
344346
Assert(new_clause);
345347

346-
/* TODO: evade double copy of clause */
347-
348-
new_rinfo = copyObject((Node *) lfirst(lc2));
349-
new_rinfo->clause = (Expr *)new_clause;
348+
new_rinfo = make_restrictinfo((Expr *) new_clause,
349+
old_rinfo->is_pushed_down,
350+
old_rinfo->outerjoin_delayed,
351+
old_rinfo->pseudoconstant,
352+
old_rinfo->required_relids,
353+
old_rinfo->outer_relids,
354+
old_rinfo->nullable_relids);
350355

351356
/* replace old relids with new ones */
352357
change_varnos((Node *)new_rinfo, rel->relid, childrel->relid);
353358

354359
childrel->baserestrictinfo = lappend(childrel->baserestrictinfo,
355-
new_rinfo);
360+
(void *) new_rinfo);
356361
}
357362

358363
/* Build an AppendRelInfo for this parent and child */

contrib/pathman/sql/pathman.sql

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,52 @@
11
CREATE EXTENSION pathman;
22

3-
SET enable_indexscan = OFF;
4-
SET enable_bitmapscan = OFF;
5-
63
CREATE TABLE hash_rel (
74
id SERIAL PRIMARY KEY,
85
value INTEGER);
9-
106
SELECT create_hash_partitions('hash_rel', 'value', 3);
117

8+
CREATE TABLE num_range_rel (
9+
id SERIAL PRIMARY KEY,
10+
txt TEXT);
11+
SELECT create_range_partitions('num_range_rel', 'id', 'num', 0, 1000, 3);
12+
1213
INSERT INTO hash_rel VALUES (1, 1);
1314
INSERT INTO hash_rel VALUES (2, 2);
1415
INSERT INTO hash_rel VALUES (3, 3);
1516
INSERT INTO hash_rel VALUES (4, 4);
1617
INSERT INTO hash_rel VALUES (5, 5);
1718
INSERT INTO hash_rel VALUES (6, 6);
1819

20+
INSERT INTO num_range_rel SELECT g, md5(g::TEXT) FROM generate_series(1, 3000) as g;
21+
VACUUM;
22+
23+
SET enable_indexscan = OFF;
24+
SET enable_bitmapscan = OFF;
25+
SET enable_seqscan = ON;
26+
1927
EXPLAIN (COSTS OFF) SELECT * FROM hash_rel;
2028
EXPLAIN (COSTS OFF) SELECT * FROM hash_rel WHERE value = 2;
2129
EXPLAIN (COSTS OFF) SELECT * FROM hash_rel WHERE value = 2 OR value = 1;
30+
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE id > 2500;
31+
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE id >= 1000 AND id < 3000;
32+
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE id >= 1500 AND id < 2500;
33+
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE (id >= 500 AND id < 1500) OR (id > 2500);
2234

23-
SELECT drop_hash_partitions('hash_rel');
24-
DROP TABLE hash_rel CASCADE;
25-
26-
CREATE TABLE num_range_rel (
27-
id SERIAL PRIMARY KEY,
28-
txt TEXT);
29-
SELECT create_range_partitions('num_range_rel', 'id', 'num', '0', '1000', 3);
30-
INSERT INTO num_range_rel SELECT g, md5(g::TEXT) FROM generate_series(1, 3000) as g;
31-
VACUUM;
35+
SET enable_indexscan = ON;
36+
SET enable_bitmapscan = OFF;
37+
SET enable_seqscan = OFF;
3238

39+
EXPLAIN (COSTS OFF) SELECT * FROM hash_rel;
40+
EXPLAIN (COSTS OFF) SELECT * FROM hash_rel WHERE value = 2;
41+
EXPLAIN (COSTS OFF) SELECT * FROM hash_rel WHERE value = 2 OR value = 1;
3342
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE id > 2500;
3443
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE id >= 1000 AND id < 3000;
3544
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE id >= 1500 AND id < 2500;
3645
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE (id >= 500 AND id < 1500) OR (id > 2500);
3746

47+
SELECT drop_hash_partitions('hash_rel');
48+
DROP TABLE hash_rel CASCADE;
49+
3850
SELECT drop_range_partitions('num_range_rel');
3951
DROP TABLE num_range_rel CASCADE;
4052

0 commit comments

Comments
 (0)