Skip to content

Commit ed2a778

Browse files
committed
[WIP] rework rangeset.c, fix several bugs with OR operator handling and IndexRange union
1 parent 0457402 commit ed2a778

File tree

6 files changed

+389
-137
lines changed

6 files changed

+389
-137
lines changed

src/hooks.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ pathman_rel_pathlist_hook(PlannerInfo *root,
270270

271271
paramsel *= wrap->paramsel;
272272
wrappers = lappend(wrappers, wrap);
273-
ranges = irange_list_intersect(ranges, wrap->rangeset);
273+
ranges = irange_list_intersection(ranges, wrap->rangeset);
274274
}
275275

276276
/*
@@ -318,7 +318,7 @@ pathman_rel_pathlist_hook(PlannerInfo *root,
318318
{
319319
IndexRange irange = lfirst_irange(lc);
320320

321-
for (i = irange.ir_lower; i <= irange.ir_upper; i++)
321+
for (i = irange_lower(irange); i <= irange_upper(irange); i++)
322322
append_child_relation(root, rel, rti, rte, i, children[i], wrappers);
323323
}
324324

src/nodes_common.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -303,8 +303,8 @@ get_partition_oids(List *ranges, int *n, const PartRelationInfo *prel,
303303
foreach (range_cell, ranges)
304304
{
305305
uint32 i;
306-
uint32 a = lfirst_irange(range_cell).ir_lower,
307-
b = lfirst_irange(range_cell).ir_upper;
306+
uint32 a = irange_lower(lfirst_irange(range_cell)),
307+
b = irange_upper(lfirst_irange(range_cell));
308308

309309
for (i = a; i <= b; i++)
310310
{
@@ -565,7 +565,7 @@ rescan_append_common(CustomScanState *node)
565565

566566
/* ... then we cut off irrelevant ones using the provided clauses */
567567
wn = walk_expr_tree((Expr *) lfirst(lc), &wcxt);
568-
ranges = irange_list_intersect(ranges, wn->rangeset);
568+
ranges = irange_list_intersection(ranges, wn->rangeset);
569569
}
570570

571571
/* Get Oids of the required partitions */

src/pg_pathman.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -333,16 +333,16 @@ handle_modification_query(Query *parse)
333333
InitWalkerContext(&context, prel, NULL, false);
334334
wrap = walk_expr_tree(expr, &context);
335335

336-
ranges = irange_list_intersect(ranges, wrap->rangeset);
336+
ranges = irange_list_intersection(ranges, wrap->rangeset);
337337

338338
/* If only one partition is affected then substitute parent table with partition */
339339
if (irange_list_length(ranges) == 1)
340340
{
341341
IndexRange irange = linitial_irange(ranges);
342-
if (irange.ir_lower == irange.ir_upper)
342+
if (irange_lower(irange) == irange_upper(irange))
343343
{
344344
Oid *children = PrelGetChildrenArray(prel);
345-
rte->relid = children[irange.ir_lower];
345+
rte->relid = children[irange_lower(irange)];
346346
rte->inh = false;
347347
}
348348
}
@@ -1317,13 +1317,13 @@ search_range_partition_eq(const Datum value,
13171317
IndexRange irange = linitial_irange(result.rangeset);
13181318

13191319
Assert(list_length(result.rangeset) == 1);
1320-
Assert(irange.ir_lower == irange.ir_upper);
1321-
Assert(irange.ir_valid);
1320+
Assert(irange_lower(irange) == irange_upper(irange));
1321+
Assert(is_irange_valid(irange));
13221322

13231323
/* Write result to the 'out_rentry' if necessary */
13241324
if (out_re)
13251325
memcpy((void *) out_re,
1326-
(const void *) &ranges[irange.ir_lower],
1326+
(const void *) &ranges[irange_lower(irange)],
13271327
sizeof(RangeEntry));
13281328

13291329
return SEARCH_RANGEREL_FOUND;
@@ -1525,8 +1525,8 @@ handle_boolexpr(const BoolExpr *expr, WalkerContext *context)
15251525
break;
15261526

15271527
case AND_EXPR:
1528-
result->rangeset = irange_list_intersect(result->rangeset,
1529-
arg->rangeset);
1528+
result->rangeset = irange_list_intersection(result->rangeset,
1529+
arg->rangeset);
15301530
result->paramsel *= arg->paramsel;
15311531
break;
15321532

@@ -1544,8 +1544,8 @@ handle_boolexpr(const BoolExpr *expr, WalkerContext *context)
15441544

15451545
foreach (lc, result->args)
15461546
{
1547-
WrapperNode *arg = (WrapperNode *) lfirst(lc);
1548-
int len = irange_list_length(arg->rangeset);
1547+
WrapperNode *arg = (WrapperNode *) lfirst(lc);
1548+
int len = irange_list_length(arg->rangeset);
15491549

15501550
result->paramsel *= (1.0 - arg->paramsel * (double)len / (double)totallen);
15511551
}

0 commit comments

Comments
 (0)