@@ -17,33 +17,51 @@ CustomScanMethodspickyappend_plan_methods;
17
17
CustomExecMethods pickyappend_exec_methods ;
18
18
19
19
20
+ typedef struct
21
+ {
22
+ Oid relid ;/* relid of the corresponding partition */
23
+ PlanState * ps ;
24
+ }PreservedPlanState ;
25
+
26
+
20
27
static void
21
- clear_plan_states (ChildScanCommon * selected_plans , int n )
28
+ clear_plan_states (PickyAppendState * scan_state )
22
29
{
23
- int i ;
30
+ PreservedPlanState * pps ;
31
+ HASH_SEQ_STATUS seqstat ;
24
32
25
- if (!selected_plans )
26
- return ;
33
+ hash_seq_init (& seqstat ,scan_state -> plan_state_table );
27
34
28
- for ( i = 0 ; i < n ; i ++ )
35
+ while (( pps = ( PreservedPlanState * ) hash_seq_search ( & seqstat )) )
29
36
{
30
- ChildScanCommon child = selected_plans [i ];
31
-
32
- ExecEndNode (child -> content .plan_state );
37
+ ExecEndNode (pps -> ps );
33
38
}
34
39
}
35
40
36
41
static void
37
- transform_plans_into_states (ChildScanCommon * selected_plans ,int n ,EState * estate )
42
+ transform_plans_into_states (PickyAppendState * scan_state ,
43
+ ChildScanCommon * selected_plans ,int n ,
44
+ EState * estate )
38
45
{
39
46
int i ;
40
47
41
48
for (i = 0 ;i < n ;i ++ )
42
49
{
43
- ChildScanCommon child = selected_plans [i ];
50
+ ChildScanCommon child = selected_plans [i ];
51
+ PreservedPlanState * pps ;
52
+ bool pps_found ;
53
+
54
+ pps = (PreservedPlanState * )hash_search (scan_state -> plan_state_table ,
55
+ (const void * )& child -> relid ,
56
+ HASH_ENTER ,& pps_found );
57
+
58
+ if (!pps_found )
59
+ pps -> ps = ExecInitNode (child -> content .plan ,estate ,0 );
60
+ else
61
+ ExecReScan (pps -> ps );
44
62
45
63
child -> content_type = CHILD_PLAN_STATE ;
46
- child -> content .plan_state = ExecInitNode ( child -> content . plan , estate , 0 ) ;
64
+ child -> content .plan_state = pps -> ps ;
47
65
}
48
66
}
49
67
@@ -158,8 +176,7 @@ create_pickyappend_path(PlannerInfo *root,
158
176
RelOptInfo * outerrel ,
159
177
RelOptInfo * innerrel ,
160
178
ParamPathInfo * param_info ,
161
- JoinPathExtraData * extra ,
162
- PartRelationInfo * inner_prel )
179
+ JoinPathExtraData * extra )
163
180
{
164
181
AppendPath * inner_append = (AppendPath * )innerrel -> cheapest_total_path ;
165
182
List * joinrestrictclauses = extra -> restrictlist ;
@@ -279,7 +296,7 @@ pathman_join_pathlist_hook(PlannerInfo *root,
279
296
inner = create_pickyappend_path (root ,joinrel ,outerrel ,innerrel ,
280
297
get_appendrel_parampathinfo (innerrel ,
281
298
inner_required ),
282
- extra , inner_prel );
299
+ extra );
283
300
284
301
initial_cost_nestloop (root ,& workspace ,jointype ,
285
302
outer ,inner ,
@@ -393,7 +410,17 @@ void
393
410
pickyappend_begin (CustomScanState * node ,EState * estate ,int eflags )
394
411
{
395
412
PickyAppendState * scan_state = (PickyAppendState * )node ;
413
+ HTAB * plan_state_table = scan_state -> plan_state_table ;
414
+ HASHCTL * plan_state_table_config = & scan_state -> plan_state_table_config ;
415
+
416
+ memset (plan_state_table_config ,0 ,sizeof (HASHCTL ));
417
+ plan_state_table_config -> keysize = sizeof (Oid );
418
+ plan_state_table_config -> entrysize = sizeof (PreservedPlanState );
396
419
420
+ plan_state_table = hash_create ("PlanState storage" ,128 ,
421
+ plan_state_table_config ,HASH_ELEM |HASH_BLOBS );
422
+
423
+ scan_state -> plan_state_table = plan_state_table ;
397
424
scan_state -> custom_expr_states = (List * )ExecInitExpr ((Expr * )scan_state -> custom_exprs ,
398
425
(PlanState * )scan_state );
399
426
}
@@ -436,7 +463,8 @@ pickyappend_end(CustomScanState *node)
436
463
{
437
464
PickyAppendState * scan_state = (PickyAppendState * )node ;
438
465
439
- clear_plan_states (scan_state -> cur_plans ,scan_state -> ncur_plans );
466
+ clear_plan_states (scan_state );
467
+ hash_destroy (scan_state -> plan_state_table );
440
468
}
441
469
442
470
void
@@ -465,15 +493,15 @@ pickyappend_rescan(CustomScanState *node)
465
493
466
494
parts = get_partition_oids (ranges ,& nparts ,prel );
467
495
468
- clear_plan_states (scan_state -> cur_plans ,scan_state -> ncur_plans );
469
-
470
496
scan_state -> cur_plans = select_required_plans (scan_state -> children ,
471
497
scan_state -> nchildren ,
472
498
parts ,nparts ,
473
499
& scan_state -> ncur_plans );
474
500
pfree (parts );
475
501
476
- transform_plans_into_states (scan_state -> cur_plans ,scan_state -> ncur_plans ,
502
+ transform_plans_into_states (scan_state ,
503
+ scan_state -> cur_plans ,
504
+ scan_state -> ncur_plans ,
477
505
scan_state -> css .ss .ps .state );
478
506
479
507
scan_state -> running_idx = 0 ;
@@ -484,4 +512,6 @@ pickyappend_rescan(CustomScanState *node)
484
512
void
485
513
pickyppend_explain (CustomScanState * node ,List * ancestors ,ExplainState * es )
486
514
{
515
+ PickyAppendState * scan_state = (PickyAppendState * )node ;
516
+ StringInfoData str ;
487
517
}