void
 ExecInitMerge(ModifyTableState *mtstate, EState *estate)
 {
-   ModifyTable *node = (ModifyTable *) mtstate->ps.plan;
+   List       *mergeActionLists = mtstate->mt_mergeActionLists;
+   List       *mergeJoinConditions = mtstate->mt_mergeJoinConditions;
    ResultRelInfo *rootRelInfo = mtstate->rootResultRelInfo;
    ResultRelInfo *resultRelInfo;
    ExprContext *econtext;
    ListCell   *lc;
    int         i;
 
-   if (node->mergeActionLists == NIL)
+   if (mergeActionLists == NIL)
        return;
 
    mtstate->mt_merge_subcommands = 0;
     * anything here, do so there too.
     */
    i = 0;
-   foreach(lc, node->mergeActionLists)
+   foreach(lc, mergeActionLists)
    {
        List       *mergeActionList = lfirst(lc);
        Node       *joinCondition;
        TupleDesc   relationDesc;
        ListCell   *l;
 
-       joinCondition = (Node *) list_nth(node->mergeJoinConditions, i);
+       joinCondition = (Node *) list_nth(mergeJoinConditions, i);
        resultRelInfo = mtstate->resultRelInfo + i;
        i++;
        relationDesc = RelationGetDescr(resultRelInfo->ri_RelationDesc);
    List       *withCheckOptionLists = NIL;
    List       *returningLists = NIL;
    List       *updateColnosLists = NIL;
+   List       *mergeActionLists = NIL;
+   List       *mergeJoinConditions = NIL;
    ResultRelInfo *resultRelInfo;
    List       *arowmarks;
    ListCell   *l;
 
                updateColnosLists = lappend(updateColnosLists, updateColnosList);
            }
+           if (node->mergeActionLists)
+           {
+               List       *mergeActionList = list_nth(node->mergeActionLists, i);
+
+               mergeActionLists = lappend(mergeActionLists, mergeActionList);
+           }
+           if (node->mergeJoinConditions)
+           {
+               List       *mergeJoinCondition = list_nth(node->mergeJoinConditions, i);
+
+               mergeJoinConditions = lappend(mergeJoinConditions, mergeJoinCondition);
+           }
        }
        i++;
    }
    mtstate->mt_merge_updated = 0;
    mtstate->mt_merge_deleted = 0;
    mtstate->mt_updateColnosLists = updateColnosLists;
+   mtstate->mt_mergeActionLists = mergeActionLists;
+   mtstate->mt_mergeJoinConditions = mergeJoinConditions;
 
    /*----------
     * Resolve the target relation. This is the same as:
     * If it's a partitioned or inherited table, the root partition or
     * appendrel RTE doesn't appear elsewhere in the plan and its RT index is
     * given explicitly in node->rootRelation.  Otherwise, the target relation
-    * is the sole relation in the node->resultRelations list.
+    * is the sole relation in the node->resultRelations list and, since it can
+    * never be pruned, also in the resultRelations list constructed above.
     *----------
     */
    if (node->rootRelation > 0)
    else
    {
        Assert(list_length(node->resultRelations) == 1);
+       Assert(list_length(resultRelations) == 1);
        mtstate->rootResultRelInfo = mtstate->resultRelInfo;
        ExecInitResultRelation(estate, mtstate->resultRelInfo,
-                              linitial_int(node->resultRelations));
+                              linitial_int(resultRelations));
    }
 
    /* set up epqstate with dummy subplan data for the moment */
        Index       resultRelation = lfirst_int(l);
        List       *mergeActions = NIL;
 
-       if (node->mergeActionLists)
-           mergeActions = list_nth(node->mergeActionLists, i);
+       if (mergeActionLists)
+           mergeActions = list_nth(mergeActionLists, i);
 
        if (resultRelInfo != mtstate->rootResultRelInfo)
        {
 
 execute update_part_abc_view (2, 'a');
 ERROR:  new row violates check option for view "part_abc_view"
 DETAIL:  Failing row contains (2, a, t).
+-- All pruned.
+explain (costs off) execute update_part_abc_view (3, 'a');
+         QUERY PLAN          
+-----------------------------
+ Update on part_abc
+   ->  Append
+         Subplans Removed: 2
+(3 rows)
+
+execute update_part_abc_view (3, 'a');
+ a | b | c 
+---+---+---
+(0 rows)
+
 deallocate update_part_abc_view;
+-- Runtime pruning on MERGE using a stable function
+create function stable_one() returns int as $$ begin return 1; end; $$ language plpgsql stable;
+explain (costs off)
+merge into part_abc_view pt
+using (select stable_one() as pid) as q join part_abc_1 pt1 on (q.pid = pt1.a) on pt.a = pt1.a
+when matched then delete returning pt.a;
+                              QUERY PLAN                               
+-----------------------------------------------------------------------
+ Merge on part_abc
+   Merge on part_abc_1
+   ->  Nested Loop
+         ->  Append
+               Subplans Removed: 1
+               ->  Seq Scan on part_abc_1
+                     Filter: ((b <> 'a'::text) AND (a = stable_one()))
+         ->  Materialize
+               ->  Seq Scan on part_abc_1 pt1
+                     Filter: (a = stable_one())
+(10 rows)
+
+merge into part_abc_view pt
+using (select stable_one() as pid) as q join part_abc_1 pt1 on (q.pid = pt1.a) on pt.a = pt1.a
+when matched then delete returning pt.a;
+ a 
+---
+ 1
+(1 row)
+
+table part_abc_view;
+ a | b | c 
+---+---+---
+ 2 | c | t
+(1 row)
+
+-- All pruned.
+explain (costs off)
+merge into part_abc_view pt
+using (select stable_one() + 2 as pid) as q join part_abc_1 pt1 on (q.pid = pt1.a) on pt.a = pt1.a
+when matched then delete returning pt.a;
+                      QUERY PLAN                      
+------------------------------------------------------
+ Merge on part_abc
+   ->  Nested Loop
+         ->  Append
+               Subplans Removed: 2
+         ->  Materialize
+               ->  Seq Scan on part_abc_1 pt1
+                     Filter: (a = (stable_one() + 2))
+(7 rows)
+
+merge into part_abc_view pt
+using (select stable_one() + 2 as pid) as q join part_abc_1 pt1 on (q.pid = pt1.a) on pt.a = pt1.a
+when matched then delete returning pt.a;
+ a 
+---
+(0 rows)
+
+table part_abc_view;
+ a | b | c 
+---+---+---
+ 2 | c | t
+(1 row)
+
 drop view part_abc_view;
 drop table part_abc;
 
 execute update_part_abc_view (1, 'd');
 explain (costs off) execute update_part_abc_view (2, 'a');
 execute update_part_abc_view (2, 'a');
+-- All pruned.
+explain (costs off) execute update_part_abc_view (3, 'a');
+execute update_part_abc_view (3, 'a');
 deallocate update_part_abc_view;
+
+-- Runtime pruning on MERGE using a stable function
+create function stable_one() returns int as $$ begin return 1; end; $$ language plpgsql stable;
+explain (costs off)
+merge into part_abc_view pt
+using (select stable_one() as pid) as q join part_abc_1 pt1 on (q.pid = pt1.a) on pt.a = pt1.a
+when matched then delete returning pt.a;
+merge into part_abc_view pt
+using (select stable_one() as pid) as q join part_abc_1 pt1 on (q.pid = pt1.a) on pt.a = pt1.a
+when matched then delete returning pt.a;
+table part_abc_view;
+
+-- All pruned.
+explain (costs off)
+merge into part_abc_view pt
+using (select stable_one() + 2 as pid) as q join part_abc_1 pt1 on (q.pid = pt1.a) on pt.a = pt1.a
+when matched then delete returning pt.a;
+merge into part_abc_view pt
+using (select stable_one() + 2 as pid) as q join part_abc_1 pt1 on (q.pid = pt1.a) on pt.a = pt1.a
+when matched then delete returning pt.a;
+table part_abc_view;
+
 drop view part_abc_view;
 drop table part_abc;