Skip to content

Commit f552d2b

Browse files
committed
add macros IR_LOSSY & IR_COMPLETE, add more tests for rangeset.c
1 parent 6d0da5f commit f552d2b

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
return result;
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
case BTLessEqualStrategyNumber:
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
case BTEqualStrategyNumber:
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
case BTGreaterEqualStrategyNumber:
11281132
case BTGreaterStrategyNumber:
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
return result;
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
else irange = 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
return result;
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+
#define IR_LOSSY true
34+
#define IR_COMPLETE false
35+
3236
#define IRANGE_SPECIAL_BIT ( (uint32) ( ((uint32) 1) << 31) )
3337
#define IRANGE_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-
static void test_irange_list_union(void **state);
18+
static void test_irange_list_union_merge(void **state);
19+
static void test_irange_list_union_lossy_cov(void **state);
20+
static void test_irange_list_union_complete_cov(void **state);
1921

2022

2123
/* Entrypoint */
@@ -25,7 +27,9 @@ main(void)
2527
/* Array of test functions */
2628
const struct CMUnitTest tests[] =
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
static void
42-
test_irange_list_union(void **state)
47+
test_irange_list_union_merge(void **state)
4348
{
44-
IndexRange a, b;
45-
List *union_result;
49+
IndexRange a;
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+
static void
73+
test_irange_list_union_lossy_cov(void **state)
74+
{
75+
IndexRange a, 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+
static void
145+
test_irange_list_union_complete_cov(void **state)
146+
{
147+
IndexRange a, 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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy