@@ -89,6 +89,7 @@ static WrapperNode *handle_arrexpr(const ScalarArrayOpExpr *expr, const PartRela
8989static void change_varnos_in_restrinct_info (RestrictInfo * rinfo ,change_varno_context * context );
9090static void change_varnos (Node * node ,Oid old_varno ,Oid new_varno );
9191static bool change_varno_walker (Node * node ,change_varno_context * context );
92+ static RestrictInfo * rebuild_restrictinfo (Node * clause ,RestrictInfo * old_rinfo );
9293
9394/* copied from allpaths.h */
9495static void set_plain_rel_size (PlannerInfo * root ,RelOptInfo * rel ,
@@ -636,28 +637,38 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
636637bool alwaysTrue ;
637638WrapperNode * wrap = (WrapperNode * )lfirst (lc );
638639Node * new_clause = wrapper_make_expression (wrap ,index ,& alwaysTrue );
639- RestrictInfo * old_rinfo = (RestrictInfo * )lfirst (lc2 ),
640- * new_rinfo ;
640+ RestrictInfo * old_rinfo = (RestrictInfo * )lfirst (lc2 );
641641
642642if (alwaysTrue )
643643{
644644continue ;
645645}
646646Assert (new_clause );
647647
648- new_rinfo = make_restrictinfo ((Expr * )new_clause ,
649- old_rinfo -> is_pushed_down ,
650- old_rinfo -> outerjoin_delayed ,
651- old_rinfo -> pseudoconstant ,
652- old_rinfo -> required_relids ,
653- old_rinfo -> outer_relids ,
654- old_rinfo -> nullable_relids );
648+ if (and_clause ((Node * )new_clause ))
649+ {
650+ ListCell * alc ;
651+
652+ foreach (alc , ((BoolExpr * )new_clause )-> args )
653+ {
654+ Node * arg = (Node * )lfirst (alc );
655+ RestrictInfo * new_rinfo = rebuild_restrictinfo (arg ,old_rinfo );
656+
657+ change_varnos ((Node * )new_rinfo ,rel -> relid ,childrel -> relid );
658+ childrel -> baserestrictinfo = lappend (childrel -> baserestrictinfo ,
659+ new_rinfo );
660+ }
661+ }
662+ else
663+ {
664+ RestrictInfo * new_rinfo = rebuild_restrictinfo (new_clause ,old_rinfo );
655665
656- /* Replace old relids with new ones */
657- change_varnos ((Node * )new_rinfo ,rel -> relid ,childrel -> relid );
666+ /* Replace old relids with new ones */
667+ change_varnos ((Node * )new_rinfo ,rel -> relid ,childrel -> relid );
658668
659- childrel -> baserestrictinfo = lappend (childrel -> baserestrictinfo ,
660- (void * )new_rinfo );
669+ childrel -> baserestrictinfo = lappend (childrel -> baserestrictinfo ,
670+ (void * )new_rinfo );
671+ }
661672}
662673
663674/* Build an AppendRelInfo for this parent and child */
@@ -707,6 +718,19 @@ append_child_relation(PlannerInfo *root, RelOptInfo *rel, Index rti,
707718return childRTindex ;
708719}
709720
721+ /* Create new restriction based on clause */
722+ static RestrictInfo *
723+ rebuild_restrictinfo (Node * clause ,RestrictInfo * old_rinfo )
724+ {
725+ return make_restrictinfo ((Expr * )clause ,
726+ old_rinfo -> is_pushed_down ,
727+ old_rinfo -> outerjoin_delayed ,
728+ old_rinfo -> pseudoconstant ,
729+ old_rinfo -> required_relids ,
730+ old_rinfo -> outer_relids ,
731+ old_rinfo -> nullable_relids );
732+ }
733+
710734/* Convert wrapper into expression for given index */
711735static Node *
712736wrapper_make_expression (WrapperNode * wrap ,int index ,bool * alwaysTrue )