Skip to content

Commit d8be066

Browse files
committed
resolve a small conflict
2 parents 526f237 + 07bf75f commit d8be066

19 files changed

+1297
-180
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ OBJS = src/init.o src/relation_info.o src/utils.o src/partition_filter.o \
55
src/runtimeappend.o src/runtime_merge_append.o src/pg_pathman.o src/rangeset.o \
66
src/pl_funcs.o src/pl_range_funcs.o src/pl_hash_funcs.o src/pathman_workers.o \
77
src/hooks.o src/nodes_common.o src/xact_handling.o src/copy_stmt_hooking.o \
8-
src/pg_compat.o $(WIN32RES)
8+
src/debug_print.o src/pg_compat.o $(WIN32RES)
99

1010
EXTENSION = pg_pathman
1111
EXTVERSION = 1.1

src/debug_print.c

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
/* ------------------------------------------------------------------------
2+
*
3+
* debug_print.c
4+
* Print sophisticated structs as CSTRING
5+
*
6+
* Copyright (c) 2016, Postgres Professional
7+
*
8+
* ------------------------------------------------------------------------
9+
*/
10+
11+
#include "rangeset.h"
12+
13+
#include "postgres.h"
14+
#include "nodes/bitmapset.h"
15+
#include "nodes/pg_list.h"
16+
#include "lib/stringinfo.h"
17+
18+
19+
/*
20+
* Print Bitmapset as cstring.
21+
*/
22+
#ifdef __GNUC__
23+
__attribute__((unused))
24+
#endif
25+
static char *
26+
bms_print(Bitmapset *bms)
27+
{
28+
StringInfoData str;
29+
int x;
30+
31+
initStringInfo(&str);
32+
x = -1;
33+
while ((x = bms_next_member(bms, x)) >= 0)
34+
appendStringInfo(&str, " %d", x);
35+
36+
return str.data;
37+
}
38+
39+
/*
40+
* Print list of IndexRanges as cstring.
41+
*/
42+
#ifdef __GNUC__
43+
__attribute__((unused))
44+
#endif
45+
static char *
46+
rangeset_print(List *rangeset)
47+
{
48+
StringInfoData str;
49+
ListCell *lc;
50+
bool first_irange = true;
51+
char lossy = 'L', /* Lossy IndexRange */
52+
complete = 'C'; /* Complete IndexRange */
53+
54+
initStringInfo(&str);
55+
56+
foreach (lc, rangeset)
57+
{
58+
IndexRange irange = lfirst_irange(lc);
59+
60+
/* Append comma if needed */
61+
if (!first_irange)
62+
appendStringInfo(&str, ", ");
63+
64+
if (!is_irange_valid(irange))
65+
appendStringInfo(&str, "X");
66+
else if (irange_lower(irange) == irange_upper(irange))
67+
appendStringInfo(&str, "%u%c",
68+
irange_lower(irange),
69+
(is_irange_lossy(irange) ? lossy : complete));
70+
else
71+
appendStringInfo(&str, "[%u-%u]%c",
72+
irange_lower(irange), irange_upper(irange),
73+
(is_irange_lossy(irange) ? lossy : complete));
74+
75+
first_irange = false;
76+
}
77+
78+
return str.data;
79+
}
80+
81+
/*
82+
* Print IndexRange struct as cstring.
83+
*/
84+
#ifdef __GNUC__
85+
__attribute__((unused))
86+
#endif
87+
static char *
88+
irange_print(IndexRange irange)
89+
{
90+
StringInfoData str;
91+
92+
initStringInfo(&str);
93+
94+
appendStringInfo(&str, "{ valid: %s, lossy: %s, lower: %u, upper: %u }",
95+
(is_irange_valid(irange) ? "true" : "false"),
96+
(is_irange_lossy(irange) ? "true" : "false"),
97+
irange_lower(irange),
98+
irange_upper(irange));
99+
100+
return str.data;
101+
}

src/hooks.c

Lines changed: 3 additions & 3 deletions
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);
@@ -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
/* Get number of selected partitions */
@@ -319,7 +319,7 @@ pathman_rel_pathlist_hook(PlannerInfo *root,
319319
{
320320
IndexRange irange = lfirst_irange(lc);
321321

322-
for (i = irange.ir_lower; i <= irange.ir_upper; i++)
322+
for (i = irange_lower(irange); i <= irange_upper(irange); i++)
323323
append_child_relation(root, parent_rel, rti, i, children[i], wrappers);
324324
}
325325

src/nodes_common.c

Lines changed: 4 additions & 4 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
{
@@ -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)
@@ -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: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ handle_modification_query(Query *parse)
327327
return;
328328

329329
/* Parse syntax tree and extract partition ranges */
330-
ranges = list_make1_irange(make_irange(0, PrelLastChild(prel), false));
330+
ranges = list_make1_irange(make_irange(0, PrelLastChild(prel), IR_COMPLETE));
331331
expr = (Expr *) eval_const_expressions(NULL, parse->jointree->quals);
332332
if (!expr)
333333
return;
@@ -336,16 +336,16 @@ handle_modification_query(Query *parse)
336336
InitWalkerContext(&context, prel, NULL, false);
337337
wrap = walk_expr_tree(expr, &context);
338338

339-
ranges = irange_list_intersect(ranges, wrap->rangeset);
339+
ranges = irange_list_intersection(ranges, wrap->rangeset);
340340

341341
/* If only one partition is affected then substitute parent table with partition */
342342
if (irange_list_length(ranges) == 1)
343343
{
344344
IndexRange irange = linitial_irange(ranges);
345-
if (irange.ir_lower == irange.ir_upper)
345+
if (irange_lower(irange) == irange_upper(irange))
346346
{
347347
Oid *children = PrelGetChildrenArray(prel);
348-
rte->relid = children[irange.ir_lower];
348+
rte->relid = children[irange_lower(irange)];
349349
rte->inh = false;
350350
}
351351
}
@@ -688,7 +688,7 @@ walk_expr_tree(Expr *expr, WalkerContext *context)
688688
result->paramsel = 1.0;
689689

690690
result->rangeset = list_make1_irange(
691-
make_irange(0, PrelLastChild(context->prel), true));
691+
make_irange(0, PrelLastChild(context->prel), IR_LOSSY));
692692

693693
return result;
694694
}
@@ -1077,14 +1077,18 @@ select_range_partitions(const Datum value,
10771077
if ((cmp_min < 0 && strategy == BTGreaterStrategyNumber) ||
10781078
(cmp_min <= 0 && strategy == BTGreaterEqualStrategyNumber))
10791079
{
1080-
result->rangeset = list_make1_irange(make_irange(startidx, endidx, false));
1080+
result->rangeset = list_make1_irange(make_irange(startidx,
1081+
endidx,
1082+
IR_COMPLETE));
10811083
return;
10821084
}
10831085

10841086
if (cmp_max >= 0 && (strategy == BTLessEqualStrategyNumber ||
10851087
strategy == BTLessStrategyNumber))
10861088
{
1087-
result->rangeset = list_make1_irange(make_irange(startidx, endidx, false));
1089+
result->rangeset = list_make1_irange(make_irange(startidx,
1090+
endidx,
1091+
IR_COMPLETE));
10881092
return;
10891093
}
10901094
}
@@ -1145,39 +1149,39 @@ select_range_partitions(const Datum value,
11451149
case BTLessEqualStrategyNumber:
11461150
if (lossy)
11471151
{
1148-
result->rangeset = list_make1_irange(make_irange(i, i, true));
1152+
result->rangeset = list_make1_irange(make_irange(i, i, IR_LOSSY));
11491153
if (i > 0)
1150-
result->rangeset = lcons_irange(make_irange(0, i - 1, false),
1154+
result->rangeset = lcons_irange(make_irange(0, i - 1, IR_COMPLETE),
11511155
result->rangeset);
11521156
}
11531157
else
11541158
{
1155-
result->rangeset = list_make1_irange(make_irange(0, i, false));
1159+
result->rangeset = list_make1_irange(make_irange(0, i, IR_COMPLETE));
11561160
}
11571161
break;
11581162

11591163
case BTEqualStrategyNumber:
1160-
result->rangeset = list_make1_irange(make_irange(i, i, true));
1164+
result->rangeset = list_make1_irange(make_irange(i, i, IR_LOSSY));
11611165
break;
11621166

11631167
case BTGreaterEqualStrategyNumber:
11641168
case BTGreaterStrategyNumber:
11651169
if (lossy)
11661170
{
1167-
result->rangeset = list_make1_irange(make_irange(i, i, true));
1171+
result->rangeset = list_make1_irange(make_irange(i, i, IR_LOSSY));
11681172
if (i < nranges - 1)
11691173
result->rangeset =
11701174
lappend_irange(result->rangeset,
11711175
make_irange(i + 1,
11721176
nranges - 1,
1173-
false));
1177+
IR_COMPLETE));
11741178
}
11751179
else
11761180
{
11771181
result->rangeset =
11781182
list_make1_irange(make_irange(i,
11791183
nranges - 1,
1180-
false));
1184+
IR_COMPLETE));
11811185
}
11821186
break;
11831187

@@ -1237,7 +1241,7 @@ handle_binary_opexpr(WalkerContext *context, WrapperNode *result,
12371241
PrelChildrenCount(prel));
12381242

12391243
result->paramsel = estimate_paramsel_using_prel(prel, strategy);
1240-
result->rangeset = list_make1_irange(make_irange(idx, idx, true));
1244+
result->rangeset = list_make1_irange(make_irange(idx, idx, IR_LOSSY));
12411245

12421246
return; /* exit on equal */
12431247
}
@@ -1263,7 +1267,7 @@ handle_binary_opexpr(WalkerContext *context, WrapperNode *result,
12631267
}
12641268

12651269
binary_opexpr_return:
1266-
result->rangeset = list_make1_irange(make_irange(0, PrelLastChild(prel), true));
1270+
result->rangeset = list_make1_irange(make_irange(0, PrelLastChild(prel), IR_LOSSY));
12671271
result->paramsel = 1.0;
12681272
}
12691273

@@ -1289,7 +1293,7 @@ handle_binary_opexpr_param(const PartRelationInfo *prel,
12891293
tce = lookup_type_cache(vartype, TYPECACHE_BTREE_OPFAMILY);
12901294
strategy = get_op_opfamily_strategy(expr->opno, tce->btree_opf);
12911295

1292-
result->rangeset = list_make1_irange(make_irange(0, PrelLastChild(prel), true));
1296+
result->rangeset = list_make1_irange(make_irange(0, PrelLastChild(prel), IR_LOSSY));
12931297
result->paramsel = estimate_paramsel_using_prel(prel, strategy);
12941298
}
12951299

@@ -1353,13 +1357,13 @@ search_range_partition_eq(const Datum value,
13531357
IndexRange irange = linitial_irange(result.rangeset);
13541358

13551359
Assert(list_length(result.rangeset) == 1);
1356-
Assert(irange.ir_lower == irange.ir_upper);
1357-
Assert(irange.ir_valid);
1360+
Assert(irange_lower(irange) == irange_upper(irange));
1361+
Assert(is_irange_valid(irange));
13581362

13591363
/* Write result to the 'out_rentry' if necessary */
13601364
if (out_re)
13611365
memcpy((void *) out_re,
1362-
(const void *) &ranges[irange.ir_lower],
1366+
(const void *) &ranges[irange_lower(irange)],
13631367
sizeof(RangeEntry));
13641368

13651369
return SEARCH_RANGEREL_FOUND;
@@ -1408,7 +1412,7 @@ handle_const(const Const *c, WalkerContext *context)
14081412
PrelChildrenCount(prel));
14091413

14101414
result->paramsel = estimate_paramsel_using_prel(prel, strategy);
1411-
result->rangeset = list_make1_irange(make_irange(idx, idx, true));
1415+
result->rangeset = list_make1_irange(make_irange(idx, idx, IR_LOSSY));
14121416
}
14131417
break;
14141418

@@ -1469,7 +1473,7 @@ handle_opexpr(const OpExpr *expr, WalkerContext *context)
14691473
}
14701474
}
14711475

1472-
result->rangeset = list_make1_irange(make_irange(0, PrelLastChild(prel), true));
1476+
result->rangeset = list_make1_irange(make_irange(0, PrelLastChild(prel), IR_LOSSY));
14731477
result->paramsel = 1.0;
14741478
return result;
14751479
}
@@ -1542,7 +1546,7 @@ handle_boolexpr(const BoolExpr *expr, WalkerContext *context)
15421546
if (expr->boolop == AND_EXPR)
15431547
result->rangeset = list_make1_irange(make_irange(0,
15441548
PrelLastChild(prel),
1545-
false));
1549+
IR_COMPLETE));
15461550
else
15471551
result->rangeset = NIL;
15481552

@@ -1561,15 +1565,15 @@ handle_boolexpr(const BoolExpr *expr, WalkerContext *context)
15611565
break;
15621566

15631567
case AND_EXPR:
1564-
result->rangeset = irange_list_intersect(result->rangeset,
1565-
arg->rangeset);
1568+
result->rangeset = irange_list_intersection(result->rangeset,
1569+
arg->rangeset);
15661570
result->paramsel *= arg->paramsel;
15671571
break;
15681572

15691573
default:
15701574
result->rangeset = list_make1_irange(make_irange(0,
15711575
PrelLastChild(prel),
1572-
false));
1576+
IR_COMPLETE));
15731577
break;
15741578
}
15751579
}
@@ -1580,8 +1584,8 @@ handle_boolexpr(const BoolExpr *expr, WalkerContext *context)
15801584

15811585
foreach (lc, result->args)
15821586
{
1583-
WrapperNode *arg = (WrapperNode *) lfirst(lc);
1584-
int len = irange_list_length(arg->rangeset);
1587+
WrapperNode *arg = (WrapperNode *) lfirst(lc);
1588+
int len = irange_list_length(arg->rangeset);
15851589

15861590
result->paramsel *= (1.0 - arg->paramsel * (double)len / (double)totallen);
15871591
}
@@ -1671,7 +1675,7 @@ handle_arrexpr(const ScalarArrayOpExpr *expr, WalkerContext *context)
16711675
idx = hash_to_part_index(DatumGetUInt32(value),
16721676
PrelChildrenCount(prel));
16731677

1674-
irange = list_make1_irange(make_irange(idx, idx, true));
1678+
irange = list_make1_irange(make_irange(idx, idx, IR_LOSSY));
16751679
}
16761680
/* No children if Const is NULL */
16771681
else irange = NIL;
@@ -1740,7 +1744,7 @@ handle_arrexpr(const ScalarArrayOpExpr *expr, WalkerContext *context)
17401744
result->paramsel = DEFAULT_INEQ_SEL;
17411745

17421746
handle_arrexpr_return:
1743-
result->rangeset = list_make1_irange(make_irange(0, PrelLastChild(prel), true));
1747+
result->rangeset = list_make1_irange(make_irange(0, PrelLastChild(prel), IR_LOSSY));
17441748
result->paramsel = 1.0;
17451749
return result;
17461750
}

0 commit comments

Comments
 (0)