Skip to content

Commit 7dc0118

Browse files
committed
change IndexRange's implementation
1 parent 073cf4c commit 7dc0118

File tree

6 files changed

+80
-80
lines changed

6 files changed

+80
-80
lines changed

src/hooks.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ pathman_rel_pathlist_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTb
220220

221221
rte->inh = true;
222222
dsm_arr = (Oid *) dsm_array_get_pointer(&prel->children);
223-
ranges = list_make1_int(make_irange(0, prel->children_count - 1, false));
223+
ranges = list_make1_irange(make_irange(0, prel->children_count - 1, false));
224224

225225
/* Make wrappers over restrictions and collect final rangeset */
226226
context.prel = prel;
@@ -282,7 +282,7 @@ pathman_rel_pathlist_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTb
282282
{
283283
IndexRange irange = lfirst_irange(lc);
284284

285-
for (i = irange_lower(irange); i <= irange_upper(irange); i++)
285+
for (i = irange.ir_lower; i <= irange.ir_upper; i++)
286286
append_child_relation(root, rel, rti, rte, i, dsm_arr[i], wrappers);
287287
}
288288

src/nodes_common.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,8 @@ get_partition_oids(List *ranges, int *n, PartRelationInfo *prel)
217217
foreach (range_cell, ranges)
218218
{
219219
int i;
220-
int a = irange_lower(lfirst_irange(range_cell));
221-
int b = irange_upper(lfirst_irange(range_cell));
220+
int a = lfirst_irange(range_cell).ir_lower;
221+
int b = lfirst_irange(range_cell).ir_upper;
222222

223223
for (i = a; i <= b; i++)
224224
{
@@ -498,7 +498,7 @@ rescan_append_common(CustomScanState *node)
498498
int nparts;
499499
WalkerContext wcxt;
500500

501-
ranges = list_make1_int(make_irange(0, prel->children_count - 1, false));
501+
ranges = list_make1_irange(make_irange(0, prel->children_count - 1, false));
502502

503503
wcxt.prel = prel;
504504
wcxt.econtext = econtext;

src/partition_filter.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ partition_filter_exec(CustomScanState *node)
173173
else if (nparts == 0)
174174
selected_partid = add_missing_partition(state->partitioned_table,
175175
&state->temp_const);
176+
176177
else
177178
selected_partid = parts[0];
178179

src/pathman.h

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -139,27 +139,46 @@ extern PathmanState *pmstate;
139139

140140
#define PATHMAN_GET_DATUM(value, by_val) ( (by_val) ? (value) : PointerGetDatum(&value) )
141141

142-
typedef uint32 IndexRange;
143-
#define RANGE_INFINITY 0x7FFF
144-
#define RANGE_LOSSY 0x80000000
142+
typedef struct {
143+
bool ir_valid : 1;
144+
bool ir_lossy : 1;
145+
uint32 ir_lower : 31;
146+
uint32 ir_upper : 31;
147+
} IndexRange;
145148

146-
#define make_irange(lower, upper, lossy) \
147-
(((lower) & RANGE_INFINITY) << 15 | ((upper) & RANGE_INFINITY) | ((lossy) ? RANGE_LOSSY : 0))
149+
#define RANGE_MASK 0xEFFFFFFF
148150

149-
#define irange_lower(irange) \
150-
(((irange) >> 15) & RANGE_INFINITY)
151+
#define InvalidIndexRange { false, false, 0, 0 }
151152

152-
#define irange_upper(irange) \
153-
((irange) & RANGE_INFINITY)
153+
inline static IndexRange
154+
make_irange(uint32 lower, uint32 upper, bool lossy)
155+
{
156+
IndexRange result;
157+
158+
result.ir_valid = true;
159+
result.ir_lossy = lossy;
160+
result.ir_lower = (lower & RANGE_MASK);
161+
result.ir_upper = (upper & RANGE_MASK);
162+
163+
return result;
164+
}
165+
166+
inline static IndexRange *
167+
alloc_irange(IndexRange irange)
168+
{
169+
IndexRange *result = (IndexRange *) palloc(sizeof(IndexRange));
170+
171+
memcpy((void *) result, (void *) &irange, sizeof(IndexRange));
154172

155-
#define irange_is_lossy(irange) \
156-
((irange) & RANGE_LOSSY)
173+
return result;
174+
}
157175

158-
#define lfirst_irange(lc) ((IndexRange)(lc)->data.int_value)
159-
#define lappend_irange(list, irange) (lappend_int((list), (int)(irange)))
160-
#define lcons_irange(irange, list) lcons_int((int)(irange), (list))
161-
#define list_make1_irange(irange) lcons_int((int)(irange), NIL)
162-
#define llast_irange(l) (IndexRange)lfirst_int(list_tail(l))
176+
#define lfirst_irange(lc) ( *(IndexRange *) lfirst(lc) )
177+
#define lappend_irange(list, irange) ( lappend((list), alloc_irange(irange)) )
178+
#define lcons_irange(irange, list) ( lcons(alloc_irange(irange), (list)) )
179+
#define list_make1_irange(irange) ( lcons(alloc_irange(irange), NIL) )
180+
#define llast_irange(list) ( lfirst_irange(list_tail(list)) )
181+
#define linitial_irange(list) ( lfirst_irange(list_head(list)) )
163182

164183
/* rangeset.c */
165184
bool irange_intersects(IndexRange a, IndexRange b);

src/pg_pathman.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ handle_modification_query(Query *parse)
304304
return;
305305

306306
/* Parse syntax tree and extract partition ranges */
307-
ranges = list_make1_int(make_irange(0, prel->children_count - 1, false));
307+
ranges = list_make1_irange(make_irange(0, prel->children_count - 1, false));
308308
expr = (Expr *) eval_const_expressions(NULL, parse->jointree->quals);
309309
if (!expr)
310310
return;
@@ -322,11 +322,11 @@ handle_modification_query(Query *parse)
322322
/* If only one partition is affected then substitute parent table with partition */
323323
if (irange_list_length(ranges) == 1)
324324
{
325-
IndexRange irange = (IndexRange) linitial_oid(ranges);
326-
if (irange_lower(irange) == irange_upper(irange))
325+
IndexRange irange = linitial_irange(ranges);
326+
if (irange.ir_lower == irange.ir_upper)
327327
{
328328
Oid *children = (Oid *) dsm_array_get_pointer(&prel->children);
329-
rte->relid = children[irange_lower(irange)];
329+
rte->relid = children[irange.ir_lower];
330330
rte->inh = false;
331331
}
332332
}
@@ -1143,12 +1143,13 @@ search_range_partition_eq(const Datum value,
11431143
}
11441144
else
11451145
{
1146-
IndexRange irange = lfirst_irange(list_head(result.rangeset));
1146+
IndexRange irange = linitial_irange(result.rangeset);
11471147

11481148
Assert(list_length(result.rangeset) == 1);
1149-
Assert(irange_lower(irange) == irange_upper(irange));
1149+
Assert(irange.ir_lower == irange.ir_upper);
1150+
Assert(irange.ir_valid);
11501151

1151-
*part_idx = irange_lower(irange);
1152+
*part_idx = irange.ir_lower;
11521153
return SEARCH_RANGEREL_FOUND;
11531154
}
11541155
}

src/rangeset.c

Lines changed: 31 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -13,58 +13,37 @@
1313
bool
1414
irange_intersects(IndexRange a, IndexRange b)
1515
{
16-
return (irange_lower(a) <= irange_upper(b)) &&
17-
(irange_lower(b) <= irange_upper(a));
16+
return (a.ir_lower <= b.ir_upper) &&
17+
(b.ir_lower <= a.ir_upper);
1818
}
1919

2020
/* Check if two ranges are conjuncted */
2121
bool
2222
irange_conjuncted(IndexRange a, IndexRange b)
2323
{
24-
return (irange_lower(a) - 1 <= irange_upper(b)) &&
25-
(irange_lower(b) - 1 <= irange_upper(a));
24+
return (a.ir_lower - 1 <= b.ir_upper) &&
25+
(b.ir_lower - 1 <= a.ir_upper);
2626
}
2727

2828
/* Make union of two ranges. They should have the same lossiness. */
2929
IndexRange
3030
irange_union(IndexRange a, IndexRange b)
3131
{
32-
Assert(irange_is_lossy(a) == irange_is_lossy(b));
33-
return make_irange(Min(irange_lower(a), irange_lower(b)),
34-
Max(irange_upper(a), irange_upper(b)),
35-
irange_is_lossy(a));
32+
Assert(a.ir_lossy == b.ir_lossy);
33+
return make_irange(Min(a.ir_lower, b.ir_lower),
34+
Max(a.ir_upper, b.ir_upper),
35+
a.ir_lossy);
3636
}
3737

3838
/* Get intersection of two ranges */
3939
IndexRange
4040
irange_intersect(IndexRange a, IndexRange b)
4141
{
42-
return make_irange(Max(irange_lower(a), irange_lower(b)),
43-
Min(irange_upper(a), irange_upper(b)),
44-
irange_is_lossy(a) || irange_is_lossy(b));
42+
return make_irange(Max(a.ir_lower, b.ir_lower),
43+
Min(a.ir_upper, b.ir_upper),
44+
a.ir_lossy || b.ir_lossy);
4545
}
4646

47-
#ifdef NOT_USED
48-
/* Print range list in debug purposes */
49-
static char *
50-
print_irange(List *l)
51-
{
52-
ListCell *c;
53-
StringInfoData str;
54-
55-
initStringInfo(&str);
56-
57-
foreach (c, l)
58-
{
59-
IndexRange ir = lfirst_irange(c);
60-
61-
appendStringInfo(&str, "[%d,%d]%c ", irange_lower(ir), irange_upper(ir),
62-
irange_is_lossy(ir) ? 'l' : 'e');
63-
}
64-
return str.data;
65-
}
66-
#endif
67-
6847
/*
6948
* Make union of two index rage lists.
7049
*/
@@ -74,20 +53,20 @@ irange_list_union(List *a, List *b)
7453
ListCell *ca,
7554
*cb;
7655
List *result = NIL;
77-
IndexRange cur = 0;
56+
IndexRange cur = InvalidIndexRange;
7857
bool have_cur = false;
7958

8059
ca = list_head(a);
8160
cb = list_head(b);
8261

8362
while (ca || cb)
8463
{
85-
IndexRange next = 0;
64+
IndexRange next = InvalidIndexRange;
8665

8766
/* Fetch next range with lesser lower bound */
8867
if (ca && cb)
8968
{
90-
if (irange_lower(lfirst_irange(ca)) <= irange_lower(lfirst_irange(cb)))
69+
if (lfirst_irange(ca).ir_lower <= lfirst_irange(cb).ir_lower)
9170
{
9271
next = lfirst_irange(ca);
9372
ca = lnext(ca);
@@ -122,25 +101,25 @@ irange_list_union(List *a, List *b)
122101
/*
123102
* Ranges are conjuncted, try to unify them.
124103
*/
125-
if (irange_is_lossy(next) == irange_is_lossy(cur))
104+
if (next.ir_lossy == cur.ir_lossy)
126105
{
127106
cur = irange_union(next, cur);
128107
}
129108
else
130109
{
131-
if (!irange_is_lossy(cur))
110+
if (!cur.ir_lossy)
132111
{
133112
result = lappend_irange(result, cur);
134-
cur = make_irange(irange_upper(cur) + 1,
135-
irange_upper(next),
136-
irange_is_lossy(next));
113+
cur = make_irange(cur.ir_upper + 1,
114+
next.ir_upper,
115+
next.ir_lossy);
137116
}
138117
else
139118
{
140-
result = lappend_irange(result,
141-
make_irange(irange_lower(cur),
142-
irange_lower(next) - 1,
143-
irange_is_lossy(cur)));
119+
result = lappend_irange(result,
120+
make_irange(cur.ir_lower,
121+
next.ir_lower - 1,
122+
cur.ir_lossy));
144123
cur = next;
145124
}
146125
}
@@ -196,10 +175,10 @@ irange_list_intersect(List *a, List *b)
196175
if (result != NIL)
197176
{
198177
last = llast_irange(result);
199-
if (irange_conjuncted(last, intersect) &&
200-
irange_is_lossy(last) == irange_is_lossy(intersect))
178+
if (irange_conjuncted(last, intersect) &&
179+
last.ir_lossy == intersect.ir_lossy)
201180
{
202-
llast_int(result) = irange_union(last, intersect);
181+
llast(result) = alloc_irange(irange_union(last, intersect));
203182
}
204183
else
205184
{
@@ -217,9 +196,9 @@ irange_list_intersect(List *a, List *b)
217196
* which lists to fetch, since lower bound of next range is greater (or
218197
* equal) to upper bound of current.
219198
*/
220-
if (irange_upper(ra) <= irange_upper(rb))
199+
if (ra.ir_upper <= rb.ir_upper)
221200
ca = lnext(ca);
222-
if (irange_upper(ra) >= irange_upper(rb))
201+
if (ra.ir_upper >= rb.ir_upper)
223202
cb = lnext(cb);
224203
}
225204
return result;
@@ -235,7 +214,7 @@ irange_list_length(List *rangeset)
235214
foreach (lc, rangeset)
236215
{
237216
IndexRange irange = lfirst_irange(lc);
238-
result += irange_upper(irange) - irange_lower(irange) + 1;
217+
result += irange.ir_upper - irange.ir_lower + 1;
239218
}
240219
return result;
241220
}
@@ -249,10 +228,10 @@ irange_list_find(List *rangeset, int index, bool *lossy)
249228
foreach (lc, rangeset)
250229
{
251230
IndexRange irange = lfirst_irange(lc);
252-
if (index >= irange_lower(irange) && index <= irange_upper(irange))
231+
if (index >= irange.ir_lower && index <= irange.ir_upper)
253232
{
254233
if (lossy)
255-
*lossy = irange_is_lossy(irange) ? true : false;
234+
*lossy = irange.ir_lossy;
256235
return true;
257236
}
258237
}

0 commit comments

Comments
 (0)