Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit43a78cd

Browse files
akorotkovzilder
authored andcommitted
Fix RestrictInfo problem.
1 parent71365f6 commit43a78cd

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
boolalwaysTrue;
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
CREATETABLEhash_rel (
74
idSERIALPRIMARY KEY,
85
valueINTEGER);
9-
106
SELECT create_hash_partitions('hash_rel','value',3);
117

8+
CREATETABLEnum_range_rel (
9+
idSERIALPRIMARY KEY,
10+
txtTEXT);
11+
SELECT create_range_partitions('num_range_rel','id','num',0,1000,3);
12+
1213
INSERT INTO hash_relVALUES (1,1);
1314
INSERT INTO hash_relVALUES (2,2);
1415
INSERT INTO hash_relVALUES (3,3);
1516
INSERT INTO hash_relVALUES (4,4);
1617
INSERT INTO hash_relVALUES (5,5);
1718
INSERT INTO hash_relVALUES (6,6);
1819

20+
INSERT INTO num_range_relSELECT 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_relWHERE value=2;
2129
EXPLAIN (COSTS OFF)SELECT*FROM hash_relWHERE value=2OR value=1;
30+
EXPLAIN (COSTS OFF)SELECT*FROM num_range_relWHERE id>2500;
31+
EXPLAIN (COSTS OFF)SELECT*FROM num_range_relWHERE id>=1000AND id<3000;
32+
EXPLAIN (COSTS OFF)SELECT*FROM num_range_relWHERE id>=1500AND id<2500;
33+
EXPLAIN (COSTS OFF)SELECT*FROM num_range_relWHERE (id>=500AND id<1500)OR (id>2500);
2234

23-
SELECT drop_hash_partitions('hash_rel');
24-
DROPTABLE hash_rel CASCADE;
25-
26-
CREATETABLEnum_range_rel (
27-
idSERIALPRIMARY KEY,
28-
txtTEXT);
29-
SELECT create_range_partitions('num_range_rel','id','num','0','1000',3);
30-
INSERT INTO num_range_relSELECT 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_relWHERE value=2;
41+
EXPLAIN (COSTS OFF)SELECT*FROM hash_relWHERE value=2OR value=1;
3342
EXPLAIN (COSTS OFF)SELECT*FROM num_range_relWHERE id>2500;
3443
EXPLAIN (COSTS OFF)SELECT*FROM num_range_relWHERE id>=1000AND id<3000;
3544
EXPLAIN (COSTS OFF)SELECT*FROM num_range_relWHERE id>=1500AND id<2500;
3645
EXPLAIN (COSTS OFF)SELECT*FROM num_range_relWHERE (id>=500AND id<1500)OR (id>2500);
3746

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

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp