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

Commit4ef4d33

Browse files
akorotkovzilder
authored andcommitted
Some comments and regression tests.
1 parent6e2ba1c commit4ef4d33

File tree

3 files changed

+94
-27
lines changed

3 files changed

+94
-27
lines changed

‎contrib/pathman/expected/pathman.out

Lines changed: 61 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
CREATE EXTENSION pathman;
2+
SET enable_indexscan = OFF;
3+
SET enable_bitmapscan = OFF;
24
CREATE TABLE hash_rel (
35
id SERIAL PRIMARY KEY,
46
value INTEGER);
@@ -18,23 +20,33 @@ INSERT INTO hash_rel VALUES (3, 3);
1820
INSERT INTO hash_rel VALUES (4, 4);
1921
INSERT INTO hash_rel VALUES (5, 5);
2022
INSERT INTO hash_rel VALUES (6, 6);
21-
EXPLAIN SELECT * FROM hash_rel;
22-
QUERY PLAN
23-
-----------------------------------------------------------------
24-
Append (cost=0.00..97.80 rows=0 width=0)
25-
-> Seq Scan on hash_rel_0 (cost=0.00..32.60 rows=0 width=0)
26-
-> Seq Scan on hash_rel_1 (cost=0.00..32.60 rows=0 width=0)
27-
-> Seq Scan on hash_rel_2 (cost=0.00..32.60 rows=0 width=0)
23+
EXPLAIN(COSTS OFF)SELECT * FROM hash_rel;
24+
QUERY PLAN
25+
------------------------------
26+
Append
27+
-> Seq Scan on hash_rel_0
28+
-> Seq Scan on hash_rel_1
29+
-> Seq Scan on hash_rel_2
2830
(4 rows)
2931

30-
EXPLAIN SELECT * FROM hash_rel WHERE value = 2;
31-
QUERY PLAN
32-
-----------------------------------------------------------------
33-
Append (cost=0.00..32.60 rows=0 width=0)
34-
-> Seq Scan on hash_rel_2 (cost=0.00..32.60 rows=0 width=0)
32+
EXPLAIN(COSTS OFF)SELECT * FROM hash_rel WHERE value = 2;
33+
QUERY PLAN
34+
------------------------------
35+
Append
36+
-> Seq Scan on hash_rel_2
3537
Filter: (value = 2)
3638
(3 rows)
3739

40+
EXPLAIN (COSTS OFF) SELECT * FROM hash_rel WHERE value = 2 OR value = 1;
41+
QUERY PLAN
42+
------------------------------
43+
Append
44+
-> Seq Scan on hash_rel_1
45+
Filter: (value = 1)
46+
-> Seq Scan on hash_rel_2
47+
Filter: (value = 2)
48+
(5 rows)
49+
3850
SELECT drop_hash_partitions('hash_rel');
3951
NOTICE: trigger "hash_rel_update_trigger" for relation "hash_rel" does not exist, skipping
4052
NOTICE: function hash_rel_hash_update_trigger_func() does not exist, skipping
@@ -59,16 +71,46 @@ SELECT create_range_partitions('num_range_rel', 'id', 'num', '0', '1000', 3);
5971

6072
INSERT INTO num_range_rel SELECT g, md5(g::TEXT) FROM generate_series(1, 3000) as g;
6173
VACUUM;
62-
EXPLAIN SELECT * FROM num_range_rel WHERE id > 2500;
63-
QUERY PLAN
64-
-------------------------------------------------------------------------
65-
Append (cost=0.00..20.01 rows=0 width=0)
66-
-> Seq Scan on num_range_rel_2000 (cost=0.00..19.00 rows=0 width=0)
67-
Filter: (id > 2500)
68-
-> Seq Scan on num_range_rel_3000 (cost=0.00..1.01 rows=0 width=0)
74+
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE id > 2500;
75+
QUERY PLAN
76+
--------------------------------------
77+
Append
78+
-> Seq Scan on num_range_rel_2000
6979
Filter: (id > 2500)
80+
-> Seq Scan on num_range_rel_3000
81+
(4 rows)
82+
83+
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE id >= 1000 AND id < 3000;
84+
QUERY PLAN
85+
--------------------------------------
86+
Append
87+
-> Seq Scan on num_range_rel_1000
88+
-> Seq Scan on num_range_rel_2000
89+
(3 rows)
90+
91+
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE id >= 1500 AND id < 2500;
92+
QUERY PLAN
93+
--------------------------------------
94+
Append
95+
-> Seq Scan on num_range_rel_1000
96+
Filter: (id >= 1500)
97+
-> Seq Scan on num_range_rel_2000
98+
Filter: (id < 2500)
7099
(5 rows)
71100

101+
EXPLAIN (COSTS OFF) SELECT * FROM num_range_rel WHERE (id >= 500 AND id < 1500) OR (id > 2500);
102+
QUERY PLAN
103+
--------------------------------------
104+
Append
105+
-> Seq Scan on num_range_rel_0
106+
Filter: (id >= 500)
107+
-> Seq Scan on num_range_rel_1000
108+
Filter: (id < 1500)
109+
-> Seq Scan on num_range_rel_2000
110+
Filter: (id > 2500)
111+
-> Seq Scan on num_range_rel_3000
112+
(8 rows)
113+
72114
SELECT drop_range_partitions('num_range_rel');
73115
drop_range_partitions
74116
-----------------------

‎contrib/pathman/pathman.c

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ my_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
219219

220220
ranges=list_make1_int(make_irange(0,prel->children_count-1, false));
221221

222-
/*Runover restrictions and collectchildren partitions */
222+
/*Make wrappersover restrictions and collectfinal rangeset */
223223
wrappers=NIL;
224224
foreach(lc,rel->baserestrictinfo)
225225
{
@@ -262,6 +262,10 @@ my_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
262262
/* TODO: free old arrays */
263263
}
264264

265+
/*
266+
* Iterate all indexes in rangeset and append corresponding child
267+
* relations.
268+
*/
265269
foreach(lc,ranges)
266270
{
267271
IndexRangeirange=lfirst_irange(lc);
@@ -363,13 +367,19 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
363367
(errmsg("Relation %u appended",childOid)));
364368
}
365369

370+
/* Conver wrapper into expression for given index */
366371
staticNode*
367372
wrapper_make_expression(WrapperNode*wrap,intindex,bool*alwaysTrue)
368373
{
369374
boollossy,found;
370375

371376
*alwaysTrue= false;
377+
/*
378+
* TODO: use faster algorithm using knowledge than we enumerate indexes
379+
* sequntially.
380+
*/
372381
found=irange_list_find(wrap->rangeset,index,&lossy);
382+
/* Return NULL for always true and always false. */
373383
if (!found)
374384
returnNULL;
375385
if (!lossy)
@@ -390,20 +400,27 @@ wrapper_make_expression(WrapperNode *wrap, int index, bool *alwaysTrue)
390400

391401
foreach (lc,wrap->args)
392402
{
393-
Node*arg;
403+
Node*arg;
404+
boolchildAlwaysTrue;
394405

395-
arg=wrapper_make_expression((WrapperNode*)lfirst(lc),index,alwaysTrue);
406+
arg=wrapper_make_expression((WrapperNode*)lfirst(lc),index,&childAlwaysTrue);
396407
#ifdefUSE_ASSERT_CHECKING
408+
/*
409+
* We shouldn't get there for always true clause under OR and
410+
* always false clause under AND.
411+
*/
397412
if (expr->boolop==OR_EXPR)
398-
Assert(!(*alwaysTrue));
413+
Assert(!childAlwaysTrue);
399414
if (expr->boolop==AND_EXPR)
400-
Assert(arg||*alwaysTrue);
415+
Assert(arg||childAlwaysTrue);
401416
#endif
402417
if (arg)
403418
args=lappend(args,arg);
404419
}
405420

406421
Assert(list_length(args) >=1);
422+
423+
/* Remove redundant OR/AND when child is single. */
407424
if (list_length(args)==1)
408425
return (Node*)linitial(args);
409426

‎contrib/pathman/sql/pathman.sql

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
CREATE EXTENSION pathman;
22

3+
SET enable_indexscan= OFF;
4+
SET enable_bitmapscan= OFF;
5+
36
CREATETABLEhash_rel (
47
idSERIALPRIMARY KEY,
58
valueINTEGER);
@@ -13,8 +16,9 @@ INSERT INTO hash_rel VALUES (4, 4);
1316
INSERT INTO hash_relVALUES (5,5);
1417
INSERT INTO hash_relVALUES (6,6);
1518

16-
EXPLAINSELECT*FROM hash_rel;
17-
EXPLAINSELECT*FROM hash_relWHERE value=2;
19+
EXPLAIN (COSTS OFF)SELECT*FROM hash_rel;
20+
EXPLAIN (COSTS OFF)SELECT*FROM hash_relWHERE value=2;
21+
EXPLAIN (COSTS OFF)SELECT*FROM hash_relWHERE value=2OR value=1;
1822

1923
SELECT drop_hash_partitions('hash_rel');
2024
DROPTABLE hash_rel CASCADE;
@@ -25,7 +29,11 @@ CREATE TABLE num_range_rel (
2529
SELECT create_range_partitions('num_range_rel','id','num','0','1000',3);
2630
INSERT INTO num_range_relSELECT g, md5(g::TEXT)FROM generate_series(1,3000)as g;
2731
VACUUM;
28-
EXPLAINSELECT*FROM num_range_relWHERE id>2500;
32+
33+
EXPLAIN (COSTS OFF)SELECT*FROM num_range_relWHERE id>2500;
34+
EXPLAIN (COSTS OFF)SELECT*FROM num_range_relWHERE id>=1000AND id<3000;
35+
EXPLAIN (COSTS OFF)SELECT*FROM num_range_relWHERE id>=1500AND id<2500;
36+
EXPLAIN (COSTS OFF)SELECT*FROM num_range_relWHERE (id>=500AND id<1500)OR (id>2500);
2937

3038
SELECT drop_range_partitions('num_range_rel');
3139
DROPTABLE num_range_rel CASCADE;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp