@@ -68,18 +68,12 @@ CustomScanMethods partition_filter_plan_methods;
6868CustomExecMethods partition_filter_exec_methods ;
6969
7070
71- static void prepare_rri_for_insert (EState * estate ,
72- ResultRelInfoHolder * rri_holder ,
73- const ResultPartsStorage * rps_storage ,
74- void * arg );
75- static void prepare_rri_returning_for_insert (EState * estate ,
76- ResultRelInfoHolder * rri_holder ,
77- const ResultPartsStorage * rps_storage ,
78- void * arg );
79- static void prepare_rri_fdw_for_insert (EState * estate ,
80- ResultRelInfoHolder * rri_holder ,
81- const ResultPartsStorage * rps_storage ,
82- void * arg );
71+ static void prepare_rri_for_insert (ResultRelInfoHolder * rri_holder ,
72+ const ResultPartsStorage * rps_storage );
73+ static void prepare_rri_returning_for_insert (ResultRelInfoHolder * rri_holder ,
74+ const ResultPartsStorage * rps_storage );
75+ static void prepare_rri_fdw_for_insert (ResultRelInfoHolder * rri_holder ,
76+ const ResultPartsStorage * rps_storage );
8377static Node * fix_returning_list_mutator (Node * node , void * state );
8478
8579static Index append_rte_to_estate (EState * estate , RangeTblEntry * rte );
@@ -143,7 +137,7 @@ init_result_parts_storage(ResultPartsStorage *parts_storage,
143137 EState * estate ,
144138 bool speculative_inserts ,
145139 Size table_entry_size ,
146- on_new_rri_holder on_new_rri_holder_cb ,
140+ on_rri_holder on_new_rri_holder_cb ,
147141 void * on_new_rri_holder_cb_arg )
148142{
149143 HASHCTL * result_rels_table_config = & parts_storage -> result_rels_table_config ;
@@ -177,16 +171,21 @@ init_result_parts_storage(ResultPartsStorage *parts_storage,
177171
178172/* Free ResultPartsStorage (close relations etc) */
179173void
180- fini_result_parts_storage (ResultPartsStorage * parts_storage , bool close_rels )
174+ fini_result_parts_storage (ResultPartsStorage * parts_storage , bool close_rels ,
175+ on_rri_holder hook )
181176{
182177 HASH_SEQ_STATUS stat ;
183178 ResultRelInfoHolder * rri_holder ; /* ResultRelInfo holder */
184179
185- /* Close partitions and free free conversion-related stuff */
186- if ( close_rels )
180+ hash_seq_init ( & stat , parts_storage -> result_rels_table );
181+ while (( rri_holder = ( ResultRelInfoHolder * ) hash_seq_search ( & stat )) != NULL )
187182 {
188- hash_seq_init (& stat , parts_storage -> result_rels_table );
189- while ((rri_holder = (ResultRelInfoHolder * ) hash_seq_search (& stat )) != NULL )
183+ /* Call destruction hook, if needed */
184+ if (hook != NULL )
185+ hook (rri_holder , parts_storage );
186+
187+ /* Close partitions and free free conversion-related stuff */
188+ if (close_rels )
190189 {
191190 ExecCloseIndices (rri_holder -> result_rel_info );
192191
@@ -202,13 +201,8 @@ fini_result_parts_storage(ResultPartsStorage *parts_storage, bool close_rels)
202201
203202 free_conversion_map (rri_holder -> tuple_map );
204203 }
205- }
206-
207- /* Else just free conversion-related stuff */
208- else
209- {
210- hash_seq_init (& stat , parts_storage -> result_rels_table );
211- while ((rri_holder = (ResultRelInfoHolder * ) hash_seq_search (& stat )) != NULL )
204+ /* Else just free conversion-related stuff */
205+ else
212206 {
213207 /* Skip if there's no map */
214208 if (!rri_holder -> tuple_map )
@@ -329,10 +323,8 @@ scan_result_parts_storage(Oid partid, ResultPartsStorage *parts_storage)
329323
330324 /* Call on_new_rri_holder_callback() if needed */
331325 if (parts_storage -> on_new_rri_holder_callback )
332- parts_storage -> on_new_rri_holder_callback (parts_storage -> estate ,
333- rri_holder ,
334- parts_storage ,
335- parts_storage -> callback_arg );
326+ parts_storage -> on_new_rri_holder_callback (rri_holder ,
327+ parts_storage );
336328
337329 /* Finally append ResultRelInfo to storage->es_alloc_result_rels */
338330 append_rri_to_estate (parts_storage -> estate , child_result_rel_info );
@@ -702,7 +694,7 @@ partition_filter_end(CustomScanState *node)
702694 PartitionFilterState * state = (PartitionFilterState * ) node ;
703695
704696 /* Executor will close rels via estate->es_result_relations */
705- fini_result_parts_storage (& state -> result_parts , false);
697+ fini_result_parts_storage (& state -> result_parts , false, NULL );
706698
707699 Assert (list_length (node -> custom_ps ) == 1 );
708700 ExecEndNode ((PlanState * ) linitial (node -> custom_ps ));
@@ -793,34 +785,33 @@ pfilter_build_tlist(Relation parent_rel, List *tlist)
793785
794786/* Main trigger */
795787static void
796- prepare_rri_for_insert (EState * estate ,
797- ResultRelInfoHolder * rri_holder ,
798- const ResultPartsStorage * rps_storage ,
799- void * arg )
788+ prepare_rri_for_insert (ResultRelInfoHolder * rri_holder ,
789+ const ResultPartsStorage * rps_storage )
800790{
801- prepare_rri_returning_for_insert (estate , rri_holder , rps_storage , arg );
802- prepare_rri_fdw_for_insert (estate , rri_holder , rps_storage , arg );
791+ prepare_rri_returning_for_insert (rri_holder , rps_storage );
792+ prepare_rri_fdw_for_insert (rri_holder , rps_storage );
803793}
804794
805795/* Prepare 'RETURNING *' tlist & projection */
806796static void
807- prepare_rri_returning_for_insert (EState * estate ,
808- ResultRelInfoHolder * rri_holder ,
809- const ResultPartsStorage * rps_storage ,
810- void * arg )
797+ prepare_rri_returning_for_insert (ResultRelInfoHolder * rri_holder ,
798+ const ResultPartsStorage * rps_storage )
811799{
812800 PartitionFilterState * pfstate ;
813801 List * returning_list ;
814802 ResultRelInfo * child_rri ,
815803 * parent_rri ;
816804 Index parent_rt_idx ;
817805 TupleTableSlot * result_slot ;
806+ EState * estate ;
807+
808+ estate = rps_storage -> estate ;
818809
819810 /* We don't need to do anything ff there's no map */
820811 if (!rri_holder -> tuple_map )
821812 return ;
822813
823- pfstate = (PartitionFilterState * ) arg ;
814+ pfstate = (PartitionFilterState * ) rps_storage -> callback_arg ;
824815 returning_list = pfstate -> returning_list ;
825816
826817 /* Exit if there's no RETURNING list */
@@ -857,14 +848,15 @@ prepare_rri_returning_for_insert(EState *estate,
857848
858849/* Prepare FDW access structs */
859850static void
860- prepare_rri_fdw_for_insert (EState * estate ,
861- ResultRelInfoHolder * rri_holder ,
862- const ResultPartsStorage * rps_storage ,
863- void * arg )
851+ prepare_rri_fdw_for_insert (ResultRelInfoHolder * rri_holder ,
852+ const ResultPartsStorage * rps_storage )
864853{
865854 ResultRelInfo * rri = rri_holder -> result_rel_info ;
866855 FdwRoutine * fdw_routine = rri -> ri_FdwRoutine ;
867856 Oid partid ;
857+ EState * estate ;
858+
859+ estate = rps_storage -> estate ;
868860
869861 /* Nothing to do if not FDW */
870862 if (fdw_routine == NULL )
0 commit comments