@@ -47,7 +47,8 @@ static void my_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry
4747static PlannedStmt * my_planner_hook (Query * parse ,int cursorOptions ,ParamListInfo boundParams );
4848
4949static 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 );
5152static void set_pathkeys (PlannerInfo * root ,RelOptInfo * childrel ,Path * path );
5253static void disable_inheritance (Query * parse );
5354
@@ -206,7 +207,6 @@ my_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
206207List * ranges ,
207208* wrappers ;
208209ListCell * lc ;
209- int childOID = -1 ;
210210int i ;
211211Oid * dsm_arr ;
212212
@@ -265,13 +265,12 @@ my_hook(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
265265foreach (lc ,ranges )
266266{
267267IndexRange irange = lfirst_irange (lc );
268- int i ;
269268Oid childOid ;
270269
271270for (i = irange_lower (irange );i <=irange_upper (irange );i ++ )
272271{
273272childOid = 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
290289static void
291290append_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{
294293RangeTblEntry * childrte ;
295294RelOptInfo * childrel ;
@@ -305,7 +304,7 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
305304
306305/* Create RangeTblEntry for child relation */
307306childrte = copyObject (rte );
308- childrte -> relid = childOID ;
307+ childrte -> relid = childOid ;
309308childrte -> inh = false;
310309childrte -> requiredPerms = 0 ;
311310root -> parse -> rtable = lappend (root -> parse -> rtable ,childrte );
@@ -329,15 +328,17 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
329328
330329/* copy restrictions */
331330childrel -> 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);
341342change_varnos (new_rinfo ,rel -> relid ,childrel -> relid );
342343
343344childrel -> baserestrictinfo = lappend (childrel -> baserestrictinfo ,
@@ -353,7 +354,65 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
353354root -> total_table_pages += (double )childrel -> pages ;
354355
355356ereport (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)
686745result -> rangeset = irange_list_intersect (result -> rangeset ,arg -> rangeset );
687746break ;
688747default :
748+ result -> rangeset = list_make1_irange (make_irange (0 ,prel -> children_count - 1 , false));
689749break ;
690750}
691751}