@@ -47,7 +47,8 @@ static void my_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry
47
47
static PlannedStmt * my_planner_hook (Query * parse ,int cursorOptions ,ParamListInfo boundParams );
48
48
49
49
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 );
51
52
static void set_pathkeys (PlannerInfo * root ,RelOptInfo * childrel ,Path * path );
52
53
static void disable_inheritance (Query * parse );
53
54
@@ -206,7 +207,6 @@ my_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
206
207
List * ranges ,
207
208
* wrappers ;
208
209
ListCell * lc ;
209
- int childOID = -1 ;
210
210
int i ;
211
211
Oid * dsm_arr ;
212
212
@@ -265,13 +265,12 @@ my_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
265
265
foreach (lc ,ranges )
266
266
{
267
267
IndexRange irange = lfirst_irange (lc );
268
- int i ;
269
268
Oid childOid ;
270
269
271
270
for (i = irange_lower (irange );i <=irange_upper (irange );i ++ )
272
271
{
273
272
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 );
275
274
}
276
275
}
277
276
@@ -289,7 +288,7 @@ my_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
289
288
290
289
static void
291
290
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 )
293
292
{
294
293
RangeTblEntry * childrte ;
295
294
RelOptInfo * childrel ;
@@ -305,7 +304,7 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
305
304
306
305
/* Create RangeTblEntry for child relation */
307
306
childrte = copyObject (rte );
308
- childrte -> relid = childOID ;
307
+ childrte -> relid = childOid ;
309
308
childrte -> inh = false;
310
309
childrte -> requiredPerms = 0 ;
311
310
root -> parse -> rtable = lappend (root -> parse -> rtable ,childrte );
@@ -329,15 +328,17 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
329
328
330
329
/* copy restrictions */
331
330
childrel -> baserestrictinfo = NIL ;
332
- foreach (lc ,rel -> baserestrictinfo )
331
+ foreach (lc ,wrappers )
333
332
{
334
- Node * new_rinfo ;
333
+ bool alwaysTrue ;
334
+ WrapperNode * wrap = (WrapperNode * )lfirst (lc );
335
+ Node * new_rinfo = wrapper_make_expression (wrap ,index ,& alwaysTrue );
335
336
336
- node = (Node * )lfirst (lc );
337
- new_rinfo = copyObject (node );
337
+ if (alwaysTrue )
338
+ continue ;
339
+ Assert (new_rinfo );
338
340
339
341
/* replace old relids with new ones */
340
- // change_varnos_in_restrinct_info(new_rinfo, rel->relid, childrel->relid);
341
342
change_varnos (new_rinfo ,rel -> relid ,childrel -> relid );
342
343
343
344
childrel -> baserestrictinfo = lappend (childrel -> baserestrictinfo ,
@@ -353,7 +354,65 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
353
354
root -> total_table_pages += (double )childrel -> pages ;
354
355
355
356
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
+ }
357
416
}
358
417
359
418
@@ -686,6 +745,7 @@ handle_boolexpr(const BoolExpr *expr, const PartRelationInfo *prel)
686
745
result -> rangeset = irange_list_intersect (result -> rangeset ,arg -> rangeset );
687
746
break ;
688
747
default :
748
+ result -> rangeset = list_make1_irange (make_irange (0 ,prel -> children_count - 1 , false));
689
749
break ;
690
750
}
691
751
}