1 | /*-------------------------------------------------------------------- |
2 | * execPartition.h |
3 | * POSTGRES partitioning executor interface |
4 | * |
5 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
6 | * Portions Copyright (c) 1994, Regents of the University of California |
7 | * |
8 | * IDENTIFICATION |
9 | * src/include/executor/execPartition.h |
10 | *-------------------------------------------------------------------- |
11 | */ |
12 | |
13 | #ifndef EXECPARTITION_H |
14 | #define EXECPARTITION_H |
15 | |
16 | #include "nodes/execnodes.h" |
17 | #include "nodes/parsenodes.h" |
18 | #include "nodes/plannodes.h" |
19 | #include "partitioning/partprune.h" |
20 | |
21 | /* See execPartition.c for the definitions. */ |
22 | typedef struct PartitionDispatchData *PartitionDispatch; |
23 | typedef struct PartitionTupleRouting PartitionTupleRouting; |
24 | |
25 | /* |
26 | * PartitionRoutingInfo |
27 | * |
28 | * Additional result relation information specific to routing tuples to a |
29 | * table partition. |
30 | */ |
31 | typedef struct PartitionRoutingInfo |
32 | { |
33 | /* |
34 | * Map for converting tuples in root partitioned table format into |
35 | * partition format, or NULL if no conversion is required. |
36 | */ |
37 | TupleConversionMap *pi_RootToPartitionMap; |
38 | |
39 | /* |
40 | * Map for converting tuples in partition format into the root partitioned |
41 | * table format, or NULL if no conversion is required. |
42 | */ |
43 | TupleConversionMap *pi_PartitionToRootMap; |
44 | |
45 | /* |
46 | * Slot to store tuples in partition format, or NULL when no translation |
47 | * is required between root and partition. |
48 | */ |
49 | TupleTableSlot *pi_PartitionTupleSlot; |
50 | } PartitionRoutingInfo; |
51 | |
52 | /* |
53 | * PartitionedRelPruningData - Per-partitioned-table data for run-time pruning |
54 | * of partitions. For a multilevel partitioned table, we have one of these |
55 | * for the topmost partition plus one for each non-leaf child partition. |
56 | * |
57 | * subplan_map[] and subpart_map[] have the same definitions as in |
58 | * PartitionedRelPruneInfo (see plannodes.h); though note that here, |
59 | * subpart_map contains indexes into PartitionPruningData.partrelprunedata[]. |
60 | * |
61 | * nparts Length of subplan_map[] and subpart_map[]. |
62 | * subplan_map Subplan index by partition index, or -1. |
63 | * subpart_map Subpart index by partition index, or -1. |
64 | * present_parts A Bitmapset of the partition indexes that we |
65 | * have subplans or subparts for. |
66 | * initial_pruning_steps List of PartitionPruneSteps used to |
67 | * perform executor startup pruning. |
68 | * exec_pruning_steps List of PartitionPruneSteps used to |
69 | * perform per-scan pruning. |
70 | * initial_context If initial_pruning_steps isn't NIL, contains |
71 | * the details needed to execute those steps. |
72 | * exec_context If exec_pruning_steps isn't NIL, contains |
73 | * the details needed to execute those steps. |
74 | */ |
75 | typedef struct PartitionedRelPruningData |
76 | { |
77 | int nparts; |
78 | int *subplan_map; |
79 | int *subpart_map; |
80 | Bitmapset *present_parts; |
81 | List *initial_pruning_steps; |
82 | List *exec_pruning_steps; |
83 | PartitionPruneContext initial_context; |
84 | PartitionPruneContext exec_context; |
85 | } PartitionedRelPruningData; |
86 | |
87 | /* |
88 | * PartitionPruningData - Holds all the run-time pruning information for |
89 | * a single partitioning hierarchy containing one or more partitions. |
90 | * partrelprunedata[] is an array ordered such that parents appear before |
91 | * their children; in particular, the first entry is the topmost partition, |
92 | * which was actually named in the SQL query. |
93 | */ |
94 | typedef struct PartitionPruningData |
95 | { |
96 | int num_partrelprunedata; /* number of array entries */ |
97 | PartitionedRelPruningData partrelprunedata[FLEXIBLE_ARRAY_MEMBER]; |
98 | } PartitionPruningData; |
99 | |
100 | /* |
101 | * PartitionPruneState - State object required for plan nodes to perform |
102 | * run-time partition pruning. |
103 | * |
104 | * This struct can be attached to plan types which support arbitrary Lists of |
105 | * subplans containing partitions, to allow subplans to be eliminated due to |
106 | * the clauses being unable to match to any tuple that the subplan could |
107 | * possibly produce. |
108 | * |
109 | * execparamids Contains paramids of PARAM_EXEC Params found within |
110 | * any of the partprunedata structs. Pruning must be |
111 | * done again each time the value of one of these |
112 | * parameters changes. |
113 | * other_subplans Contains indexes of subplans that don't belong to any |
114 | * "partprunedata", e.g UNION ALL children that are not |
115 | * partitioned tables, or a partitioned table that the |
116 | * planner deemed run-time pruning to be useless for. |
117 | * These must not be pruned. |
118 | * prune_context A short-lived memory context in which to execute the |
119 | * partition pruning functions. |
120 | * do_initial_prune true if pruning should be performed during executor |
121 | * startup (at any hierarchy level). |
122 | * do_exec_prune true if pruning should be performed during |
123 | * executor run (at any hierarchy level). |
124 | * num_partprunedata Number of items in "partprunedata" array. |
125 | * partprunedata Array of PartitionPruningData pointers for the plan's |
126 | * partitioned relation(s), one for each partitioning |
127 | * hierarchy that requires run-time pruning. |
128 | */ |
129 | typedef struct PartitionPruneState |
130 | { |
131 | Bitmapset *execparamids; |
132 | Bitmapset *other_subplans; |
133 | MemoryContext prune_context; |
134 | bool do_initial_prune; |
135 | bool do_exec_prune; |
136 | int num_partprunedata; |
137 | PartitionPruningData *partprunedata[FLEXIBLE_ARRAY_MEMBER]; |
138 | } PartitionPruneState; |
139 | |
140 | extern PartitionTupleRouting *ExecSetupPartitionTupleRouting(EState *estate, |
141 | ModifyTableState *mtstate, |
142 | Relation rel); |
143 | extern ResultRelInfo *ExecFindPartition(ModifyTableState *mtstate, |
144 | ResultRelInfo *rootResultRelInfo, |
145 | PartitionTupleRouting *proute, |
146 | TupleTableSlot *slot, |
147 | EState *estate); |
148 | extern void ExecCleanupTupleRouting(ModifyTableState *mtstate, |
149 | PartitionTupleRouting *proute); |
150 | extern PartitionPruneState *ExecCreatePartitionPruneState(PlanState *planstate, |
151 | PartitionPruneInfo *partitionpruneinfo); |
152 | extern Bitmapset *ExecFindMatchingSubPlans(PartitionPruneState *prunestate); |
153 | extern Bitmapset *ExecFindInitialMatchingSubPlans(PartitionPruneState *prunestate, |
154 | int nsubplans); |
155 | |
156 | #endif /* EXECPARTITION_H */ |
157 | |