diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c
index e249628..3cba2a1 100644
--- a/src/backend/optimizer/prep/prepunion.c
+++ b/src/backend/optimizer/prep/prepunion.c
@@ -57,6 +57,11 @@ typedef struct
 	AppendRelInfo *appinfo;
 } adjust_appendrel_attrs_context;
 
+typedef struct {
+	AppendRelInfo	*child_appinfo;
+	Index			 target_rti;
+} transvars_merge_context;
+
 static Plan *recurse_set_operations(Node *setOp, PlannerInfo *root,
 					   double tuple_fraction,
 					   List *colTypes, List *colCollations,
@@ -98,6 +103,8 @@ static List *generate_append_tlist(List *colTypes, List *colCollations,
 					  List *input_plans,
 					  List *refnames_tlist);
 static List *generate_setop_grouplist(SetOperationStmt *op, List *targetlist);
+static Node *transvars_merge_mutator(Node *node,
+									 transvars_merge_context *ctx);
 static void expand_inherited_rtentry(PlannerInfo *root, RangeTblEntry *rte,
 						 Index rti);
 static void make_inh_translation_list(Relation oldrelation,
@@ -1210,6 +1217,34 @@ expand_inherited_tables(PlannerInfo *root)
 	}
 }
 
+static Node *
+transvars_merge_mutator(Node *node, transvars_merge_context *ctx)
+{
+	if (node == NULL)
+		return NULL;
+
+	if (IsA(node, Var))
+	{
+		Var *oldv = (Var*)node;
+
+		if (!oldv->varlevelsup && oldv->varno == ctx->target_rti)
+		{
+			if (oldv->varattno >
+					list_length(ctx->child_appinfo->translated_vars))
+				elog(ERROR,
+					 "attribute %d of relation \"%s\" does not exist",
+					 oldv->varattno,
+					 get_rel_name(ctx->child_appinfo->parent_reloid));
+			
+			return (Node*)copyObject(
+				list_nth(ctx->child_appinfo->translated_vars,
+						 oldv->varattno - 1));
+		}
+	}
+	return expression_tree_mutator(node,
+								   transvars_merge_mutator, (void*)ctx);
+}
+
 /*
  * expand_inherited_rtentry
  *		Check whether a rangetable entry represents an inheritance set.
@@ -1237,6 +1272,7 @@ expand_inherited_rtentry(PlannerInfo *root, RangeTblEntry *rte, Index rti)
 	List	   *inhOIDs;
 	List	   *appinfos;
 	ListCell   *l;
+	AppendRelInfo *parent_appinfo = NULL;
 
 	/* Does RT entry allow inheritance? */
 	if (!rte->inh)
@@ -1301,6 +1337,21 @@ expand_inherited_rtentry(PlannerInfo *root, RangeTblEntry *rte, Index rti)
 		oldrc->isParent = true;
 
 	/*
+	 * If parent relation is appearing in a subselect of UNION ALL, it has
+	 * furthur parent appendrelinfo. Save it to pull up inheritance children
+	 * later.
+	 */
+	foreach(l, root->append_rel_list)
+	{
+		AppendRelInfo *appinfo = (AppendRelInfo *)lfirst(l);
+		if(appinfo->child_relid == rti)
+		{
+			parent_appinfo = appinfo;
+			break;
+		}
+	}
+	
+	/*
 	 * Must open the parent relation to examine its tupdesc.  We need not lock
 	 * it; we assume the rewriter already did.
 	 */
@@ -1378,6 +1429,28 @@ expand_inherited_rtentry(PlannerInfo *root, RangeTblEntry *rte, Index rti)
 		}
 
 		/*
+		 * Pull up this appinfo onto just above of the parent. The parent
+		 * relation has its own parent when it appears as a subquery of UNION
+		 * ALL. Pulling up these children gives a chance to consider
+		 * MergeAppend on whole the UNION ALL tree.
+		 */
+
+		if (parent_appinfo)
+		{
+			transvars_merge_context ctx;
+
+			ctx.child_appinfo = appinfo;
+			ctx.target_rti	  = rti;
+
+			appinfo->parent_relid = parent_appinfo->parent_relid;
+			appinfo->parent_reltype = parent_appinfo->parent_reltype;
+			appinfo->parent_reloid = parent_appinfo->parent_reloid;
+			appinfo->translated_vars = (List*)expression_tree_mutator(
+				parent_appinfo->translated_vars,
+				transvars_merge_mutator, &ctx);
+		}
+
+		/*
 		 * Build a PlanRowMark if parent is marked FOR UPDATE/SHARE.
 		 */
 		if (oldrc)
