---------------------------------------------------------------- * ExecInitMergeAppend * * Begin all of the subscans of the MergeAppend node. * ---------------------------------------------------------------- */
| 62 | * ---------------------------------------------------------------- |
| 63 | */ |
| 64 | MergeAppendState * |
| 65 | ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags) |
| 66 | { |
| 67 | MergeAppendState *mergestate = makeNode(MergeAppendState); |
| 68 | PlanState **mergeplanstates; |
| 69 | Bitmapset *validsubplans; |
| 70 | int nplans; |
| 71 | int i, |
| 72 | j; |
| 73 | |
| 74 | /* check for unsupported flags */ |
| 75 | Assert(!(eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK))); |
| 76 | |
| 77 | /* |
| 78 | * create new MergeAppendState for our node |
| 79 | */ |
| 80 | mergestate->ps.plan = (Plan *) node; |
| 81 | mergestate->ps.state = estate; |
| 82 | mergestate->ps.ExecProcNode = ExecMergeAppend; |
| 83 | |
| 84 | /* If run-time partition pruning is enabled, then set that up now */ |
| 85 | if (node->part_prune_info != NULL) |
| 86 | { |
| 87 | PartitionPruneState *prunestate; |
| 88 | |
| 89 | /* We may need an expression context to evaluate partition exprs */ |
| 90 | ExecAssignExprContext(estate, &mergestate->ps); |
| 91 | |
| 92 | prunestate = ExecCreatePartitionPruneState(&mergestate->ps, |
| 93 | node->part_prune_info); |
| 94 | mergestate->ms_prune_state = prunestate; |
| 95 | |
| 96 | /* Perform an initial partition prune, if required. */ |
| 97 | if (prunestate->do_initial_prune) |
| 98 | { |
| 99 | /* Determine which subplans survive initial pruning */ |
| 100 | validsubplans = ExecFindInitialMatchingSubPlans(prunestate, |
| 101 | list_length(node->mergeplans)); |
| 102 | |
| 103 | nplans = bms_num_members(validsubplans); |
| 104 | } |
| 105 | else |
| 106 | { |
| 107 | /* We'll need to initialize all subplans */ |
| 108 | nplans = list_length(node->mergeplans); |
| 109 | Assert(nplans > 0); |
| 110 | validsubplans = bms_add_range(NULL, 0, nplans - 1); |
| 111 | } |
| 112 | |
| 113 | /* |
| 114 | * When no run-time pruning is required and there's at least one |
| 115 | * subplan, we can fill as_valid_subplans immediately, preventing |
| 116 | * later calls to ExecFindMatchingSubPlans. |
| 117 | */ |
| 118 | if (!prunestate->do_exec_prune && nplans > 0) |
| 119 | mergestate->ms_valid_subplans = bms_add_range(NULL, 0, nplans - 1); |
| 120 | } |
| 121 | else |
no test coverage detected