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)
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