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

Commitf552d2b

Browse files
committed
add macros IR_LOSSY & IR_COMPLETE, add more tests for rangeset.c
1 parent6d0da5f commitf552d2b

File tree

7 files changed

+127
-43
lines changed

7 files changed

+127
-43
lines changed

‎src/hooks.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ pathman_rel_pathlist_hook(PlannerInfo *root,
256256
rte->inh= true;/* we must restore 'inh' flag! */
257257

258258
children=PrelGetChildrenArray(prel);
259-
ranges=list_make1_irange(make_irange(0,PrelLastChild(prel),false));
259+
ranges=list_make1_irange(make_irange(0,PrelLastChild(prel),IR_COMPLETE));
260260

261261
/* Make wrappers over restrictions and collect final rangeset */
262262
InitWalkerContext(&context,prel,NULL, false);

‎src/nodes_common.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,7 @@ rescan_append_common(CustomScanState *node)
556556
Assert(prel);
557557

558558
/* First we select all available partitions... */
559-
ranges=list_make1_irange(make_irange(0,PrelLastChild(prel),false));
559+
ranges=list_make1_irange(make_irange(0,PrelLastChild(prel),IR_COMPLETE));
560560

561561
InitWalkerContext(&wcxt,prel,econtext, false);
562562
foreach (lc,scan_state->custom_exprs)

‎src/pg_pathman.c

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ handle_modification_query(Query *parse)
324324
return;
325325

326326
/* Parse syntax tree and extract partition ranges */
327-
ranges=list_make1_irange(make_irange(0,PrelLastChild(prel),false));
327+
ranges=list_make1_irange(make_irange(0,PrelLastChild(prel),IR_COMPLETE));
328328
expr= (Expr*)eval_const_expressions(NULL,parse->jointree->quals);
329329
if (!expr)
330330
return;
@@ -652,7 +652,7 @@ walk_expr_tree(Expr *expr, WalkerContext *context)
652652
result->paramsel=1.0;
653653

654654
result->rangeset=list_make1_irange(
655-
make_irange(0,PrelLastChild(context->prel),true));
655+
make_irange(0,PrelLastChild(context->prel),IR_LOSSY));
656656

657657
returnresult;
658658
}
@@ -1041,14 +1041,18 @@ select_range_partitions(const Datum value,
10411041
if ((cmp_min<0&&strategy==BTGreaterStrategyNumber)||
10421042
(cmp_min <=0&&strategy==BTGreaterEqualStrategyNumber))
10431043
{
1044-
result->rangeset=list_make1_irange(make_irange(startidx,endidx, false));
1044+
result->rangeset=list_make1_irange(make_irange(startidx,
1045+
endidx,
1046+
IR_COMPLETE));
10451047
return;
10461048
}
10471049

10481050
if (cmp_max >=0&& (strategy==BTLessEqualStrategyNumber||
10491051
strategy==BTLessStrategyNumber))
10501052
{
1051-
result->rangeset=list_make1_irange(make_irange(startidx,endidx, false));
1053+
result->rangeset=list_make1_irange(make_irange(startidx,
1054+
endidx,
1055+
IR_COMPLETE));
10521056
return;
10531057
}
10541058
}
@@ -1109,39 +1113,39 @@ select_range_partitions(const Datum value,
11091113
caseBTLessEqualStrategyNumber:
11101114
if (lossy)
11111115
{
1112-
result->rangeset=list_make1_irange(make_irange(i,i,true));
1116+
result->rangeset=list_make1_irange(make_irange(i,i,IR_LOSSY));
11131117
if (i>0)
1114-
result->rangeset=lcons_irange(make_irange(0,i-1,false),
1118+
result->rangeset=lcons_irange(make_irange(0,i-1,IR_COMPLETE),
11151119
result->rangeset);
11161120
}
11171121
else
11181122
{
1119-
result->rangeset=list_make1_irange(make_irange(0,i,false));
1123+
result->rangeset=list_make1_irange(make_irange(0,i,IR_COMPLETE));
11201124
}
11211125
break;
11221126

11231127
caseBTEqualStrategyNumber:
1124-
result->rangeset=list_make1_irange(make_irange(i,i,true));
1128+
result->rangeset=list_make1_irange(make_irange(i,i,IR_LOSSY));
11251129
break;
11261130

11271131
caseBTGreaterEqualStrategyNumber:
11281132
caseBTGreaterStrategyNumber:
11291133
if (lossy)
11301134
{
1131-
result->rangeset=list_make1_irange(make_irange(i,i,true));
1135+
result->rangeset=list_make1_irange(make_irange(i,i,IR_LOSSY));
11321136
if (i<nranges-1)
11331137
result->rangeset=
11341138
lappend_irange(result->rangeset,
11351139
make_irange(i+1,
11361140
nranges-1,
1137-
false));
1141+
IR_COMPLETE));
11381142
}
11391143
else
11401144
{
11411145
result->rangeset=
11421146
list_make1_irange(make_irange(i,
11431147
nranges-1,
1144-
false));
1148+
IR_COMPLETE));
11451149
}
11461150
break;
11471151

@@ -1201,7 +1205,7 @@ handle_binary_opexpr(WalkerContext *context, WrapperNode *result,
12011205
PrelChildrenCount(prel));
12021206

12031207
result->paramsel=estimate_paramsel_using_prel(prel,strategy);
1204-
result->rangeset=list_make1_irange(make_irange(idx,idx,true));
1208+
result->rangeset=list_make1_irange(make_irange(idx,idx,IR_LOSSY));
12051209

12061210
return;/* exit on equal */
12071211
}
@@ -1227,7 +1231,7 @@ handle_binary_opexpr(WalkerContext *context, WrapperNode *result,
12271231
}
12281232

12291233
binary_opexpr_return:
1230-
result->rangeset=list_make1_irange(make_irange(0,PrelLastChild(prel),true));
1234+
result->rangeset=list_make1_irange(make_irange(0,PrelLastChild(prel),IR_LOSSY));
12311235
result->paramsel=1.0;
12321236
}
12331237

@@ -1253,7 +1257,7 @@ handle_binary_opexpr_param(const PartRelationInfo *prel,
12531257
tce=lookup_type_cache(vartype,TYPECACHE_BTREE_OPFAMILY);
12541258
strategy=get_op_opfamily_strategy(expr->opno,tce->btree_opf);
12551259

1256-
result->rangeset=list_make1_irange(make_irange(0,PrelLastChild(prel),true));
1260+
result->rangeset=list_make1_irange(make_irange(0,PrelLastChild(prel),IR_LOSSY));
12571261
result->paramsel=estimate_paramsel_using_prel(prel,strategy);
12581262
}
12591263

@@ -1372,7 +1376,7 @@ handle_const(const Const *c, WalkerContext *context)
13721376
PrelChildrenCount(prel));
13731377

13741378
result->paramsel=estimate_paramsel_using_prel(prel,strategy);
1375-
result->rangeset=list_make1_irange(make_irange(idx,idx,true));
1379+
result->rangeset=list_make1_irange(make_irange(idx,idx,IR_LOSSY));
13761380
}
13771381
break;
13781382

@@ -1433,7 +1437,7 @@ handle_opexpr(const OpExpr *expr, WalkerContext *context)
14331437
}
14341438
}
14351439

1436-
result->rangeset=list_make1_irange(make_irange(0,PrelLastChild(prel),true));
1440+
result->rangeset=list_make1_irange(make_irange(0,PrelLastChild(prel),IR_LOSSY));
14371441
result->paramsel=1.0;
14381442
returnresult;
14391443
}
@@ -1506,7 +1510,7 @@ handle_boolexpr(const BoolExpr *expr, WalkerContext *context)
15061510
if (expr->boolop==AND_EXPR)
15071511
result->rangeset=list_make1_irange(make_irange(0,
15081512
PrelLastChild(prel),
1509-
false));
1513+
IR_COMPLETE));
15101514
else
15111515
result->rangeset=NIL;
15121516

@@ -1533,7 +1537,7 @@ handle_boolexpr(const BoolExpr *expr, WalkerContext *context)
15331537
default:
15341538
result->rangeset=list_make1_irange(make_irange(0,
15351539
PrelLastChild(prel),
1536-
false));
1540+
IR_COMPLETE));
15371541
break;
15381542
}
15391543
}
@@ -1635,7 +1639,7 @@ handle_arrexpr(const ScalarArrayOpExpr *expr, WalkerContext *context)
16351639
idx=hash_to_part_index(DatumGetUInt32(value),
16361640
PrelChildrenCount(prel));
16371641

1638-
irange=list_make1_irange(make_irange(idx,idx,true));
1642+
irange=list_make1_irange(make_irange(idx,idx,IR_LOSSY));
16391643
}
16401644
/* No children if Const is NULL */
16411645
elseirange=NIL;
@@ -1704,7 +1708,7 @@ handle_arrexpr(const ScalarArrayOpExpr *expr, WalkerContext *context)
17041708
result->paramsel=DEFAULT_INEQ_SEL;
17051709

17061710
handle_arrexpr_return:
1707-
result->rangeset=list_make1_irange(make_irange(0,PrelLastChild(prel),true));
1711+
result->rangeset=list_make1_irange(make_irange(0,PrelLastChild(prel),IR_LOSSY));
17081712
result->paramsel=1.0;
17091713
returnresult;
17101714
}

‎src/rangeset.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ irange_handle_cover_internal(IndexRange ir_covering,
125125
/* Leftmost IndexRange is lossy */
126126
left_range=make_irange(left_range_lower,
127127
left_range_upper,
128-
true);
128+
IR_LOSSY);
129129

130130
/* Append leftmost IndexRange ('left_range') to 'new_iranges' */
131131
*new_iranges=lappend_irange(*new_iranges,left_range);
@@ -139,7 +139,7 @@ irange_handle_cover_internal(IndexRange ir_covering,
139139
/* Rightmost IndexRange is also lossy */
140140
right_range=make_irange(right_range_lower,
141141
right_range_upper,
142-
true);
142+
IR_LOSSY);
143143

144144
/* 'right_range' is indeed rightmost IndexRange */
145145
ret=right_range;

‎src/rangeset.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ typedef struct {
2929
}IndexRange;
3030

3131

32+
/* Convenience macros for make_irange(...) */
33+
#defineIR_LOSSYtrue
34+
#defineIR_COMPLETEfalse
35+
3236
#defineIRANGE_SPECIAL_BIT( (uint32) ( ((uint32) 1) << 31) )
3337
#defineIRANGE_BONDARY_MASK( (uint32) (~IRANGE_SPECIAL_BIT) )
3438

‎tests/cmocka/rangeset_tests

536 Bytes
Binary file not shown.

‎tests/cmocka/rangeset_tests.c

Lines changed: 95 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
* -----------------------
1616
*/
1717

18-
staticvoidtest_irange_list_union(void**state);
18+
staticvoidtest_irange_list_union_merge(void**state);
19+
staticvoidtest_irange_list_union_lossy_cov(void**state);
20+
staticvoidtest_irange_list_union_complete_cov(void**state);
1921

2022

2123
/* Entrypoint */
@@ -25,7 +27,9 @@ main(void)
2527
/* Array of test functions */
2628
conststructCMUnitTesttests[]=
2729
{
28-
cmocka_unit_test(test_irange_list_union),
30+
cmocka_unit_test(test_irange_list_union_merge),
31+
cmocka_unit_test(test_irange_list_union_lossy_cov),
32+
cmocka_unit_test(test_irange_list_union_complete_cov),
2933
};
3034

3135
/* Run series of tests */
@@ -38,73 +42,145 @@ main(void)
3842
* ----------------------
3943
*/
4044

45+
/* Test merges of adjoint lists */
4146
staticvoid
42-
test_irange_list_union(void**state)
47+
test_irange_list_union_merge(void**state)
4348
{
44-
IndexRangea,b;
45-
List*union_result;
49+
IndexRangea;
50+
List*unmerged,
51+
*union_result;
4652

4753

4854
/* Subtest #0 */
49-
a=make_irange(0,100, true);
50-
b=make_irange(0,100, true);
55+
a=make_irange(0,8,IR_COMPLETE);
56+
57+
unmerged=NIL;
58+
unmerged=lappend_irange(unmerged,make_irange(9,10,IR_COMPLETE));
59+
unmerged=lappend_irange(unmerged,make_irange(11,11,IR_LOSSY));
60+
unmerged=lappend_irange(unmerged,make_irange(12,12,IR_COMPLETE));
61+
unmerged=lappend_irange(unmerged,make_irange(13,13,IR_COMPLETE));
62+
unmerged=lappend_irange(unmerged,make_irange(14,24,IR_COMPLETE));
63+
unmerged=lappend_irange(unmerged,make_irange(15,20,IR_COMPLETE));
64+
65+
union_result=irange_list_union(list_make1_irange(a),unmerged);
66+
67+
assert_string_equal(rangeset_print(union_result),
68+
"[0-10]C, 11L, [12-24]C");
69+
}
70+
71+
/* Lossy IndexRange covers complete IndexRange */
72+
staticvoid
73+
test_irange_list_union_lossy_cov(void**state)
74+
{
75+
IndexRangea,b;
76+
List*union_result;
77+
78+
79+
/* Subtest #0 */
80+
a=make_irange(0,100,IR_LOSSY);
81+
b=make_irange(0,100,IR_LOSSY);
5182
union_result=irange_list_union(list_make1_irange(a),
5283
list_make1_irange(b));
5384

5485
assert_string_equal(rangeset_print(union_result),
5586
"[0-100]L");
5687

5788
/* Subtest #1 */
58-
a=make_irange(0,100,true);
59-
b=make_irange(0,100,false);
89+
a=make_irange(0,100,IR_LOSSY);
90+
b=make_irange(0,100,IR_COMPLETE);
6091
union_result=irange_list_union(list_make1_irange(a),
6192
list_make1_irange(b));
6293

6394
assert_string_equal(rangeset_print(union_result),
6495
"[0-100]C");
6596

6697
/* Subtest #2 */
67-
a=make_irange(0,100,true);
68-
b=make_irange(0,50,false);
98+
a=make_irange(0,100,IR_LOSSY);
99+
b=make_irange(0,50,IR_COMPLETE);
69100
union_result=irange_list_union(list_make1_irange(a),
70101
list_make1_irange(b));
71102

72103
assert_string_equal(rangeset_print(union_result),
73104
"[0-50]C, [51-100]L");
74105

75106
/* Subtest #3 */
76-
a=make_irange(0,100,true);
77-
b=make_irange(50,100,false);
107+
a=make_irange(0,100,IR_LOSSY);
108+
b=make_irange(50,100,IR_COMPLETE);
78109
union_result=irange_list_union(list_make1_irange(a),
79110
list_make1_irange(b));
80111

81112
assert_string_equal(rangeset_print(union_result),
82113
"[0-49]L, [50-100]C");
83114

84115
/* Subtest #4 */
85-
a=make_irange(0,100,true);
86-
b=make_irange(50,99,false);
116+
a=make_irange(0,100,IR_LOSSY);
117+
b=make_irange(50,99,IR_COMPLETE);
87118
union_result=irange_list_union(list_make1_irange(a),
88119
list_make1_irange(b));
89120

90121
assert_string_equal(rangeset_print(union_result),
91122
"[0-49]L, [50-99]C, 100L");
92123

93124
/* Subtest #5 */
94-
a=make_irange(0,100,true);
95-
b=make_irange(1,100,false);
125+
a=make_irange(0,100,IR_LOSSY);
126+
b=make_irange(1,100,IR_COMPLETE);
96127
union_result=irange_list_union(list_make1_irange(a),
97128
list_make1_irange(b));
98129

99130
assert_string_equal(rangeset_print(union_result),
100131
"0L, [1-100]C");
101132

102133
/* Subtest #6 */
103-
a=make_irange(0,100,true);
104-
b=make_irange(20,50,false);
134+
a=make_irange(0,100,IR_LOSSY);
135+
b=make_irange(20,50,IR_COMPLETE);
105136
union_result=irange_list_union(list_make1_irange(a),
106137
list_make1_irange(b));
107138

108139
assert_string_equal(rangeset_print(union_result),
109140
"[0-19]L, [20-50]C, [51-100]L");
110141
}
142+
143+
/* Complete IndexRange covers lossy IndexRange */
144+
staticvoid
145+
test_irange_list_union_complete_cov(void**state)
146+
{
147+
IndexRangea,b;
148+
List*union_result;
149+
150+
151+
/* Subtest #0 */
152+
a=make_irange(0,100,IR_COMPLETE);
153+
b=make_irange(0,100,IR_LOSSY);
154+
union_result=irange_list_union(list_make1_irange(a),
155+
list_make1_irange(b));
156+
157+
assert_string_equal(rangeset_print(union_result),
158+
"[0-100]C");
159+
160+
/* Subtest #1 */
161+
a=make_irange(0,100,IR_COMPLETE);
162+
b=make_irange(20,50,IR_LOSSY);
163+
union_result=irange_list_union(list_make1_irange(a),
164+
list_make1_irange(b));
165+
166+
assert_string_equal(rangeset_print(union_result),
167+
"[0-100]C");
168+
169+
/* Subtest #2 */
170+
a=make_irange(0,100,IR_COMPLETE);
171+
b=make_irange(0,50,IR_LOSSY);
172+
union_result=irange_list_union(list_make1_irange(a),
173+
list_make1_irange(b));
174+
175+
assert_string_equal(rangeset_print(union_result),
176+
"[0-100]C");
177+
178+
/* Subtest #3 */
179+
a=make_irange(0,100,IR_COMPLETE);
180+
b=make_irange(50,100,IR_LOSSY);
181+
union_result=irange_list_union(list_make1_irange(a),
182+
list_make1_irange(b));
183+
184+
assert_string_equal(rangeset_print(union_result),
185+
"[0-100]C");
186+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp