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)