@@ -976,13 +976,18 @@ prepare_rri_fdw_for_insert(ResultRelInfoHolder *rri_holder,
976976 if (fdw_routine -> PlanForeignModify )
977977 {
978978 RangeTblEntry * rte ;
979- ModifyTableState mtstate ;
980- List * fdw_private ;
981979 Query query ;
980+ PlanState pstate ,
981+ * pstate_ptr ;
982+ ModifyTableState mtstate ;
982983 PlannedStmt * plan ;
984+
985+ /* This is the value we'd like to get */
986+ List * fdw_private ;
987+
983988 TupleDesc tupdesc ;
984- int i ,
985- target_attr ;
989+ int target_attr ,
990+ i ;
986991
987992 /* Fetch RangeTblEntry for partition */
988993 rte = rt_fetch (rri -> ri_RangeTableIndex , estate -> es_range_table );
@@ -1033,26 +1038,33 @@ prepare_rri_fdw_for_insert(ResultRelInfoHolder *rri_holder,
10331038 target_attr ++ ;
10341039 }
10351040
1036- /* Create fake ModifyTableState */
1037- memset ((void * ) & mtstate , 0 , sizeof (ModifyTableState ));
1041+ /* HACK: plan a fake query for FDW access to be planned as well */
1042+ elog (DEBUG1 , "FDW(%u): plan fake query for fdw_private" , partid );
1043+ plan = standard_planner (& query , 0 , NULL );
1044+
1045+ /* HACK: create a fake PlanState */
1046+ memset (& pstate , 0 , sizeof (PlanState ));
1047+ pstate .plan = plan -> planTree ;
1048+ pstate_ptr = & pstate ;
1049+
1050+ /* HACK: create a fake ModifyTableState */
1051+ memset (& mtstate , 0 , sizeof (ModifyTableState ));
10381052 NodeSetTag (& mtstate , T_ModifyTableState );
10391053 mtstate .ps .state = estate ;
10401054 mtstate .operation = CMD_INSERT ;
1055+ mtstate .mt_plans = & pstate_ptr ;
1056+ mtstate .mt_nplans = 1 ;
1057+ mtstate .mt_whichplan = 0 ;
10411058 mtstate .resultRelInfo = rri ;
10421059#if PG_VERSION_NUM < 110000
10431060 mtstate .mt_onconflict = ONCONFLICT_NONE ;
10441061#endif
10451062
1046- /* Plan fake query in for FDW access to be planned as well */
1047- elog (DEBUG1 , "FDW(%u): plan fake query for fdw_private" , partid );
1048- plan = standard_planner (& query , 0 , NULL );
1049-
10501063 /* Extract fdw_private from useless plan */
10511064 elog (DEBUG1 , "FDW(%u): extract fdw_private" , partid );
1052- fdw_private = (List * )
1053- linitial (((ModifyTable * ) plan -> planTree )-> fdwPrivLists );
1065+ fdw_private = linitial (((ModifyTable * ) plan -> planTree )-> fdwPrivLists );
10541066
1055- /* call BeginForeignModify on 'rri' */
1067+ /* HACK: call BeginForeignModify on 'rri' */
10561068 elog (DEBUG1 , "FDW(%u): call BeginForeignModify on a fake INSERT node" , partid );
10571069 fdw_routine -> BeginForeignModify (& mtstate , rri , fdw_private , 0 , 0 );
10581070
0 commit comments