@@ -68,18 +68,12 @@ CustomScanMethods partition_filter_plan_methods;
68
68
CustomExecMethods partition_filter_exec_methods ;
69
69
70
70
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 );
83
77
static Node * fix_returning_list_mutator (Node * node , void * state );
84
78
85
79
static Index append_rte_to_estate (EState * estate , RangeTblEntry * rte );
@@ -143,7 +137,7 @@ init_result_parts_storage(ResultPartsStorage *parts_storage,
143
137
EState * estate ,
144
138
bool speculative_inserts ,
145
139
Size table_entry_size ,
146
- on_new_rri_holder on_new_rri_holder_cb ,
140
+ on_rri_holder on_new_rri_holder_cb ,
147
141
void * on_new_rri_holder_cb_arg )
148
142
{
149
143
HASHCTL * result_rels_table_config = & parts_storage -> result_rels_table_config ;
@@ -177,16 +171,21 @@ init_result_parts_storage(ResultPartsStorage *parts_storage,
177
171
178
172
/* Free ResultPartsStorage (close relations etc) */
179
173
void
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 )
181
176
{
182
177
HASH_SEQ_STATUS stat ;
183
178
ResultRelInfoHolder * rri_holder ; /* ResultRelInfo holder */
184
179
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 )
187
182
{
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 )
190
189
{
191
190
ExecCloseIndices (rri_holder -> result_rel_info );
192
191
@@ -202,13 +201,8 @@ fini_result_parts_storage(ResultPartsStorage *parts_storage, bool close_rels)
202
201
203
202
free_conversion_map (rri_holder -> tuple_map );
204
203
}
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
212
206
{
213
207
/* Skip if there's no map */
214
208
if (!rri_holder -> tuple_map )
@@ -329,10 +323,8 @@ scan_result_parts_storage(Oid partid, ResultPartsStorage *parts_storage)
329
323
330
324
/* Call on_new_rri_holder_callback() if needed */
331
325
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 );
336
328
337
329
/* Finally append ResultRelInfo to storage->es_alloc_result_rels */
338
330
append_rri_to_estate (parts_storage -> estate , child_result_rel_info );
@@ -702,7 +694,7 @@ partition_filter_end(CustomScanState *node)
702
694
PartitionFilterState * state = (PartitionFilterState * ) node ;
703
695
704
696
/* 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 );
706
698
707
699
Assert (list_length (node -> custom_ps ) == 1 );
708
700
ExecEndNode ((PlanState * ) linitial (node -> custom_ps ));
@@ -793,34 +785,33 @@ pfilter_build_tlist(Relation parent_rel, List *tlist)
793
785
794
786
/* Main trigger */
795
787
static 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 )
800
790
{
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 );
803
793
}
804
794
805
795
/* Prepare 'RETURNING *' tlist & projection */
806
796
static 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 )
811
799
{
812
800
PartitionFilterState * pfstate ;
813
801
List * returning_list ;
814
802
ResultRelInfo * child_rri ,
815
803
* parent_rri ;
816
804
Index parent_rt_idx ;
817
805
TupleTableSlot * result_slot ;
806
+ EState * estate ;
807
+
808
+ estate = rps_storage -> estate ;
818
809
819
810
/* We don't need to do anything ff there's no map */
820
811
if (!rri_holder -> tuple_map )
821
812
return ;
822
813
823
- pfstate = (PartitionFilterState * ) arg ;
814
+ pfstate = (PartitionFilterState * ) rps_storage -> callback_arg ;
824
815
returning_list = pfstate -> returning_list ;
825
816
826
817
/* Exit if there's no RETURNING list */
@@ -857,14 +848,15 @@ prepare_rri_returning_for_insert(EState *estate,
857
848
858
849
/* Prepare FDW access structs */
859
850
static 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 )
864
853
{
865
854
ResultRelInfo * rri = rri_holder -> result_rel_info ;
866
855
FdwRoutine * fdw_routine = rri -> ri_FdwRoutine ;
867
856
Oid partid ;
857
+ EState * estate ;
858
+
859
+ estate = rps_storage -> estate ;
868
860
869
861
/* Nothing to do if not FDW */
870
862
if (fdw_routine == NULL )
0 commit comments