Skip to content

Commit 2fcdddd

Browse files
akorotkovzilder
authored andcommitted
Make restrictions from wrappers.
1 parent d5f50e3 commit 2fcdddd

File tree

3 files changed

+92
-13
lines changed

3 files changed

+92
-13
lines changed

contrib/pathman/pathman.c

Lines changed: 72 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ static void my_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry
4747
static PlannedStmt * my_planner_hook(Query *parse, int cursorOptions, ParamListInfo boundParams);
4848

4949
static void append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
50-
RangeTblEntry *rte, int index, int childOID, List *wrappers);
50+
RangeTblEntry *rte, int index, Oid childOID, List *wrappers);
51+
static Node *wrapper_make_expression(WrapperNode *wrap, int index, bool *alwaysTrue);
5152
static void set_pathkeys(PlannerInfo *root, RelOptInfo *childrel, Path *path);
5253
static void disable_inheritance(Query *parse);
5354

@@ -206,7 +207,6 @@ my_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
206207
List *ranges,
207208
*wrappers;
208209
ListCell *lc;
209-
int childOID = -1;
210210
int i;
211211
Oid *dsm_arr;
212212

@@ -265,13 +265,12 @@ my_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
265265
foreach(lc, ranges)
266266
{
267267
IndexRange irange = lfirst_irange(lc);
268-
int i;
269268
Oid childOid;
270269

271270
for (i = irange_lower(irange); i <= irange_upper(irange); i++)
272271
{
273272
childOid = dsm_arr[i];
274-
append_child_relation(root, rel, rti, rte, i, childOID, wrappers);
273+
append_child_relation(root, rel, rti, rte, i, childOid, wrappers);
275274
}
276275
}
277276

@@ -289,7 +288,7 @@ my_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
289288

290289
static void
291290
append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
292-
RangeTblEntry *rte, int index, int childOID, List *wrappers)
291+
RangeTblEntry *rte, int index, Oid childOid, List *wrappers)
293292
{
294293
RangeTblEntry *childrte;
295294
RelOptInfo *childrel;
@@ -305,7 +304,7 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
305304

306305
/* Create RangeTblEntry for child relation */
307306
childrte = copyObject(rte);
308-
childrte->relid = childOID;
307+
childrte->relid = childOid;
309308
childrte->inh = false;
310309
childrte->requiredPerms = 0;
311310
root->parse->rtable = lappend(root->parse->rtable, childrte);
@@ -329,15 +328,17 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
329328

330329
/* copy restrictions */
331330
childrel->baserestrictinfo = NIL;
332-
foreach(lc, rel->baserestrictinfo)
331+
foreach(lc, wrappers)
333332
{
334-
Node *new_rinfo;
333+
bool alwaysTrue;
334+
WrapperNode *wrap = (WrapperNode *) lfirst(lc);
335+
Node *new_rinfo = wrapper_make_expression(wrap, index, &alwaysTrue);
335336

336-
node = (Node *) lfirst(lc);
337-
new_rinfo = copyObject(node);
337+
if (alwaysTrue)
338+
continue;
339+
Assert(new_rinfo);
338340

339341
/* replace old relids with new ones */
340-
// change_varnos_in_restrinct_info(new_rinfo, rel->relid, childrel->relid);
341342
change_varnos(new_rinfo, rel->relid, childrel->relid);
342343

343344
childrel->baserestrictinfo = lappend(childrel->baserestrictinfo,
@@ -353,7 +354,65 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
353354
root->total_table_pages += (double) childrel->pages;
354355

355356
ereport(LOG,
356-
(errmsg("Relation %u appended", childOID)));
357+
(errmsg("Relation %u appended", childOid)));
358+
}
359+
360+
static Node *
361+
wrapper_make_expression(WrapperNode *wrap, int index, bool *alwaysTrue)
362+
{
363+
bool lossy, found;
364+
365+
*alwaysTrue = false;
366+
found = irange_list_find(wrap->rangeset, index, &lossy);
367+
if (!found)
368+
return NULL;
369+
if (!lossy)
370+
{
371+
*alwaysTrue = true;
372+
return NULL;
373+
}
374+
375+
if (IsA(wrap->orig, BoolExpr))
376+
{
377+
const BoolExpr *expr = (const BoolExpr *) wrap->orig;
378+
BoolExpr *result;
379+
380+
if (expr->boolop == OR_EXPR || expr->boolop == AND_EXPR)
381+
{
382+
ListCell *lc;
383+
List *args;
384+
385+
foreach (lc, wrap->args)
386+
{
387+
Node *arg;
388+
389+
arg = wrapper_make_expression((WrapperNode *)lfirst(lc), index, alwaysTrue);
390+
Assert(!(*alwaysTrue));
391+
Assert(arg || *alwaysTrue);
392+
if (arg)
393+
args = lappend(args, arg);
394+
}
395+
396+
Assert(list_length(args) > 1);
397+
if (list_length(args) == 1)
398+
return (Node *) linitial(args);
399+
400+
result = (BoolExpr *) palloc(sizeof(BoolExpr));
401+
result->xpr.type = T_BoolExpr;
402+
result->args = args;
403+
result->boolop = expr->boolop;
404+
result->location = expr->location;
405+
return (Node *)result;
406+
}
407+
else
408+
{
409+
return copyObject(wrap->orig);
410+
}
411+
}
412+
else
413+
{
414+
return copyObject(wrap->orig);
415+
}
357416
}
358417

359418

@@ -686,6 +745,7 @@ handle_boolexpr(const BoolExpr *expr, const PartRelationInfo *prel)
686745
result->rangeset = irange_list_intersect(result->rangeset, arg->rangeset);
687746
break;
688747
default:
748+
result->rangeset = list_make1_irange(make_irange(0, prel->children_count - 1, false));
689749
break;
690750
}
691751
}

contrib/pathman/pathman.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ IndexRange irange_intersect(IndexRange a, IndexRange b);
164164
List *irange_list_union(List *a, List *b);
165165
List *irange_list_intersect(List *a, List *b);
166166
int irange_list_length(List *rangeset);
167+
bool irange_list_find(List *rangeset, int index, bool *lossy);
167168

168169

169170
LWLock *load_config_lock;
@@ -175,7 +176,7 @@ LWLock *dsm_init_lock;
175176
// void free_dsm_array(DsmArray *array);
176177
// void *get_dsm_array(const ArrayPtr* ptr);
177178

178-
void alloc_dsm_table();
179+
void alloc_dsm_table(void);
179180
void create_dsm_segment(size_t block_size);
180181
void init_dsm_table(Table *tbl, dsm_handle h, size_t block_size);
181182
void alloc_dsm_array(DsmArray *arr, size_t entry_size, size_t length);

contrib/pathman/rangeset.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,3 +169,21 @@ irange_list_length(List *rangeset)
169169
}
170170
return result;
171171
}
172+
173+
bool
174+
irange_list_find(List *rangeset, int index, bool *lossy)
175+
{
176+
ListCell *lc;
177+
178+
foreach (lc, rangeset)
179+
{
180+
IndexRange irange = lfirst_irange(lc);
181+
if (index >= irange_lower(irange) && index <= irange_upper(irange))
182+
{
183+
if (lossy)
184+
*lossy = irange_is_lossy(irange);
185+
return true;
186+
}
187+
}
188+
return false;
189+
}

0 commit comments

Comments
 (0)