@ -289,7 +289,7 @@ static ModifyTable *make_modifytable(PlannerInfo *root,
CmdType operation , bool canSetTag ,
Index nominalRelation , List * partitioned_rels ,
bool partColsUpdated ,
List * resultRelations , List * subplans ,
List * resultRelations , List * subplans , List * subroots ,
List * withCheckOptionLists , List * returningLists ,
List * rowMarks , OnConflictExpr * onconflict , int epqParam ) ;
static GatherMerge * create_gather_merge_plan ( PlannerInfo * root ,
@ -2484,6 +2484,7 @@ create_modifytable_plan(PlannerInfo *root, ModifyTablePath *best_path)
best_path - > partColsUpdated ,
best_path - > resultRelations ,
subplans ,
best_path - > subroots ,
best_path - > withCheckOptionLists ,
best_path - > returningLists ,
best_path - > rowMarks ,
@ -6558,7 +6559,7 @@ make_modifytable(PlannerInfo *root,
CmdType operation , bool canSetTag ,
Index nominalRelation , List * partitioned_rels ,
bool partColsUpdated ,
List * resultRelations , List * subplans ,
List * resultRelations , List * subplans , List * subroots ,
List * withCheckOptionLists , List * returningLists ,
List * rowMarks , OnConflictExpr * onconflict , int epqParam )
{
@ -6566,9 +6567,11 @@ make_modifytable(PlannerInfo *root,
List * fdw_private_list ;
Bitmapset * direct_modify_plans ;
ListCell * lc ;
ListCell * lc2 ;
int i ;
Assert ( list_length ( resultRelations ) = = list_length ( subplans ) ) ;
Assert ( list_length ( resultRelations ) = = list_length ( subroots ) ) ;
Assert ( withCheckOptionLists = = NIL | |
list_length ( resultRelations ) = = list_length ( withCheckOptionLists ) ) ;
Assert ( returningLists = = NIL | |
@ -6627,9 +6630,10 @@ make_modifytable(PlannerInfo *root,
fdw_private_list = NIL ;
direct_modify_plans = NULL ;
i = 0 ;
foreac h ( lc , resultRelations )
forbot h ( lc , resultRelations , lc2 , subroot s )
{
Index rti = lfirst_int ( lc ) ;
PlannerInfo * subroot = lfirst_node ( PlannerInfo , lc2 ) ;
FdwRoutine * fdwroutine ;
List * fdw_private ;
bool direct_modify ;
@ -6641,16 +6645,16 @@ make_modifytable(PlannerInfo *root,
* so it ' s not a baserel ; and there are also corner cases for
* updatable views where the target rel isn ' t a baserel . )
*/
if ( rti < root - > simple_rel_array_size & &
root - > simple_rel_array [ rti ] ! = NULL )
if ( rti < sub root- > simple_rel_array_size & &
sub root- > simple_rel_array [ rti ] ! = NULL )
{
RelOptInfo * resultRel = root - > simple_rel_array [ rti ] ;
RelOptInfo * resultRel = sub root- > simple_rel_array [ rti ] ;
fdwroutine = resultRel - > fdwroutine ;
}
else
{
RangeTblEntry * rte = planner_rt_fetch ( rti , root ) ;
RangeTblEntry * rte = planner_rt_fetch ( rti , sub root) ;
Assert ( rte - > rtekind = = RTE_RELATION ) ;
if ( rte - > relkind = = RELKIND_FOREIGN_TABLE )
@ -6672,15 +6676,15 @@ make_modifytable(PlannerInfo *root,
fdwroutine - > IterateDirectModify ! = NULL & &
fdwroutine - > EndDirectModify ! = NULL & &
withCheckOptionLists = = NIL & &
! has_row_triggers ( root , rti , operation ) )
direct_modify = fdwroutine - > PlanDirectModify ( root , node , rti , i ) ;
! has_row_triggers ( sub root, rti , operation ) )
direct_modify = fdwroutine - > PlanDirectModify ( sub root, node , rti , i ) ;
if ( direct_modify )
direct_modify_plans = bms_add_member ( direct_modify_plans , i ) ;
if ( ! direct_modify & &
fdwroutine ! = NULL & &
fdwroutine - > PlanForeignModify ! = NULL )
fdw_private = fdwroutine - > PlanForeignModify ( root , node , rti , i ) ;
fdw_private = fdwroutine - > PlanForeignModify ( sub root, node , rti , i ) ;
else
fdw_private = NIL ;
fdw_private_list = lappend ( fdw_private_list , fdw_private ) ;