1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * planmain.c |
4 | * Routines to plan a single query |
5 | * |
6 | * What's in a name, anyway? The top-level entry point of the planner/ |
7 | * optimizer is over in planner.c, not here as you might think from the |
8 | * file name. But this is the main code for planning a basic join operation, |
9 | * shorn of features like subselects, inheritance, aggregates, grouping, |
10 | * and so on. (Those are the things planner.c deals with.) |
11 | * |
12 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
13 | * Portions Copyright (c) 1994, Regents of the University of California |
14 | * |
15 | * |
16 | * IDENTIFICATION |
17 | * src/backend/optimizer/plan/planmain.c |
18 | * |
19 | *------------------------------------------------------------------------- |
20 | */ |
21 | #include "postgres.h" |
22 | |
23 | #include "optimizer/appendinfo.h" |
24 | #include "optimizer/clauses.h" |
25 | #include "optimizer/inherit.h" |
26 | #include "optimizer/optimizer.h" |
27 | #include "optimizer/orclauses.h" |
28 | #include "optimizer/pathnode.h" |
29 | #include "optimizer/paths.h" |
30 | #include "optimizer/placeholder.h" |
31 | #include "optimizer/planmain.h" |
32 | |
33 | |
34 | /* |
35 | * query_planner |
36 | * Generate a path (that is, a simplified plan) for a basic query, |
37 | * which may involve joins but not any fancier features. |
38 | * |
39 | * Since query_planner does not handle the toplevel processing (grouping, |
40 | * sorting, etc) it cannot select the best path by itself. Instead, it |
41 | * returns the RelOptInfo for the top level of joining, and the caller |
42 | * (grouping_planner) can choose among the surviving paths for the rel. |
43 | * |
44 | * root describes the query to plan |
45 | * qp_callback is a function to compute query_pathkeys once it's safe to do so |
46 | * qp_extra is optional extra data to pass to qp_callback |
47 | * |
48 | * Note: the PlannerInfo node also includes a query_pathkeys field, which |
49 | * tells query_planner the sort order that is desired in the final output |
50 | * plan. This value is *not* available at call time, but is computed by |
51 | * qp_callback once we have completed merging the query's equivalence classes. |
52 | * (We cannot construct canonical pathkeys until that's done.) |
53 | */ |
54 | RelOptInfo * |
55 | query_planner(PlannerInfo *root, |
56 | query_pathkeys_callback qp_callback, void *) |
57 | { |
58 | Query *parse = root->parse; |
59 | List *joinlist; |
60 | RelOptInfo *final_rel; |
61 | |
62 | /* |
63 | * Init planner lists to empty. |
64 | * |
65 | * NOTE: append_rel_list was set up by subquery_planner, so do not touch |
66 | * here. |
67 | */ |
68 | root->join_rel_list = NIL; |
69 | root->join_rel_hash = NULL; |
70 | root->join_rel_level = NULL; |
71 | root->join_cur_level = 0; |
72 | root->canon_pathkeys = NIL; |
73 | root->left_join_clauses = NIL; |
74 | root->right_join_clauses = NIL; |
75 | root->full_join_clauses = NIL; |
76 | root->join_info_list = NIL; |
77 | root->placeholder_list = NIL; |
78 | root->fkey_list = NIL; |
79 | root->initial_rels = NIL; |
80 | |
81 | /* |
82 | * Make a flattened version of the rangetable for faster access (this is |
83 | * OK because the rangetable won't change any more), and set up an empty |
84 | * array for indexing base relations. |
85 | */ |
86 | setup_simple_rel_arrays(root); |
87 | |
88 | /* |
89 | * In the trivial case where the jointree is a single RTE_RESULT relation, |
90 | * bypass all the rest of this function and just make a RelOptInfo and its |
91 | * one access path. This is worth optimizing because it applies for |
92 | * common cases like "SELECT expression" and "INSERT ... VALUES()". |
93 | */ |
94 | Assert(parse->jointree->fromlist != NIL); |
95 | if (list_length(parse->jointree->fromlist) == 1) |
96 | { |
97 | Node *jtnode = (Node *) linitial(parse->jointree->fromlist); |
98 | |
99 | if (IsA(jtnode, RangeTblRef)) |
100 | { |
101 | int varno = ((RangeTblRef *) jtnode)->rtindex; |
102 | RangeTblEntry *rte = root->simple_rte_array[varno]; |
103 | |
104 | Assert(rte != NULL); |
105 | if (rte->rtekind == RTE_RESULT) |
106 | { |
107 | /* Make the RelOptInfo for it directly */ |
108 | final_rel = build_simple_rel(root, varno, NULL); |
109 | |
110 | /* |
111 | * If query allows parallelism in general, check whether the |
112 | * quals are parallel-restricted. (We need not check |
113 | * final_rel->reltarget because it's empty at this point. |
114 | * Anything parallel-restricted in the query tlist will be |
115 | * dealt with later.) This is normally pretty silly, because |
116 | * a Result-only plan would never be interesting to |
117 | * parallelize. However, if force_parallel_mode is on, then |
118 | * we want to execute the Result in a parallel worker if |
119 | * possible, so we must do this. |
120 | */ |
121 | if (root->glob->parallelModeOK && |
122 | force_parallel_mode != FORCE_PARALLEL_OFF) |
123 | final_rel->consider_parallel = |
124 | is_parallel_safe(root, parse->jointree->quals); |
125 | |
126 | /* |
127 | * The only path for it is a trivial Result path. We cheat a |
128 | * bit here by using a GroupResultPath, because that way we |
129 | * can just jam the quals into it without preprocessing them. |
130 | * (But, if you hold your head at the right angle, a FROM-less |
131 | * SELECT is a kind of degenerate-grouping case, so it's not |
132 | * that much of a cheat.) |
133 | */ |
134 | add_path(final_rel, (Path *) |
135 | create_group_result_path(root, final_rel, |
136 | final_rel->reltarget, |
137 | (List *) parse->jointree->quals)); |
138 | |
139 | /* Select cheapest path (pretty easy in this case...) */ |
140 | set_cheapest(final_rel); |
141 | |
142 | /* |
143 | * We still are required to call qp_callback, in case it's |
144 | * something like "SELECT 2+2 ORDER BY 1". |
145 | */ |
146 | (*qp_callback) (root, qp_extra); |
147 | |
148 | return final_rel; |
149 | } |
150 | } |
151 | } |
152 | |
153 | /* |
154 | * Populate append_rel_array with each AppendRelInfo to allow direct |
155 | * lookups by child relid. |
156 | */ |
157 | setup_append_rel_array(root); |
158 | |
159 | /* |
160 | * Construct RelOptInfo nodes for all base relations used in the query. |
161 | * Appendrel member relations ("other rels") will be added later. |
162 | * |
163 | * Note: the reason we find the baserels by searching the jointree, rather |
164 | * than scanning the rangetable, is that the rangetable may contain RTEs |
165 | * for rels not actively part of the query, for example views. We don't |
166 | * want to make RelOptInfos for them. |
167 | */ |
168 | add_base_rels_to_query(root, (Node *) parse->jointree); |
169 | |
170 | /* |
171 | * Examine the targetlist and join tree, adding entries to baserel |
172 | * targetlists for all referenced Vars, and generating PlaceHolderInfo |
173 | * entries for all referenced PlaceHolderVars. Restrict and join clauses |
174 | * are added to appropriate lists belonging to the mentioned relations. We |
175 | * also build EquivalenceClasses for provably equivalent expressions. The |
176 | * SpecialJoinInfo list is also built to hold information about join order |
177 | * restrictions. Finally, we form a target joinlist for make_one_rel() to |
178 | * work from. |
179 | */ |
180 | build_base_rel_tlists(root, root->processed_tlist); |
181 | |
182 | find_placeholders_in_jointree(root); |
183 | |
184 | find_lateral_references(root); |
185 | |
186 | joinlist = deconstruct_jointree(root); |
187 | |
188 | /* |
189 | * Reconsider any postponed outer-join quals now that we have built up |
190 | * equivalence classes. (This could result in further additions or |
191 | * mergings of classes.) |
192 | */ |
193 | reconsider_outer_join_clauses(root); |
194 | |
195 | /* |
196 | * If we formed any equivalence classes, generate additional restriction |
197 | * clauses as appropriate. (Implied join clauses are formed on-the-fly |
198 | * later.) |
199 | */ |
200 | generate_base_implied_equalities(root); |
201 | |
202 | /* |
203 | * We have completed merging equivalence sets, so it's now possible to |
204 | * generate pathkeys in canonical form; so compute query_pathkeys and |
205 | * other pathkeys fields in PlannerInfo. |
206 | */ |
207 | (*qp_callback) (root, qp_extra); |
208 | |
209 | /* |
210 | * Examine any "placeholder" expressions generated during subquery pullup. |
211 | * Make sure that the Vars they need are marked as needed at the relevant |
212 | * join level. This must be done before join removal because it might |
213 | * cause Vars or placeholders to be needed above a join when they weren't |
214 | * so marked before. |
215 | */ |
216 | fix_placeholder_input_needed_levels(root); |
217 | |
218 | /* |
219 | * Remove any useless outer joins. Ideally this would be done during |
220 | * jointree preprocessing, but the necessary information isn't available |
221 | * until we've built baserel data structures and classified qual clauses. |
222 | */ |
223 | joinlist = remove_useless_joins(root, joinlist); |
224 | |
225 | /* |
226 | * Also, reduce any semijoins with unique inner rels to plain inner joins. |
227 | * Likewise, this can't be done until now for lack of needed info. |
228 | */ |
229 | reduce_unique_semijoins(root); |
230 | |
231 | /* |
232 | * Now distribute "placeholders" to base rels as needed. This has to be |
233 | * done after join removal because removal could change whether a |
234 | * placeholder is evaluable at a base rel. |
235 | */ |
236 | add_placeholders_to_base_rels(root); |
237 | |
238 | /* |
239 | * Construct the lateral reference sets now that we have finalized |
240 | * PlaceHolderVar eval levels. |
241 | */ |
242 | create_lateral_join_info(root); |
243 | |
244 | /* |
245 | * Match foreign keys to equivalence classes and join quals. This must be |
246 | * done after finalizing equivalence classes, and it's useful to wait till |
247 | * after join removal so that we can skip processing foreign keys |
248 | * involving removed relations. |
249 | */ |
250 | match_foreign_keys_to_quals(root); |
251 | |
252 | /* |
253 | * Look for join OR clauses that we can extract single-relation |
254 | * restriction OR clauses from. |
255 | */ |
256 | extract_restriction_or_clauses(root); |
257 | |
258 | /* |
259 | * Now expand appendrels by adding "otherrels" for their children. We |
260 | * delay this to the end so that we have as much information as possible |
261 | * available for each baserel, including all restriction clauses. That |
262 | * let us prune away partitions that don't satisfy a restriction clause. |
263 | * Also note that some information such as lateral_relids is propagated |
264 | * from baserels to otherrels here, so we must have computed it already. |
265 | */ |
266 | add_other_rels_to_query(root); |
267 | |
268 | /* |
269 | * Ready to do the primary planning. |
270 | */ |
271 | final_rel = make_one_rel(root, joinlist); |
272 | |
273 | /* Check that we got at least one usable path */ |
274 | if (!final_rel || !final_rel->cheapest_total_path || |
275 | final_rel->cheapest_total_path->param_info != NULL) |
276 | elog(ERROR, "failed to construct the join relation" ); |
277 | |
278 | return final_rel; |
279 | } |
280 | |