1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * parse_agg.c |
4 | * handle aggregates and window functions in parser |
5 | * |
6 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
7 | * Portions Copyright (c) 1994, Regents of the University of California |
8 | * |
9 | * |
10 | * IDENTIFICATION |
11 | * src/backend/parser/parse_agg.c |
12 | * |
13 | *------------------------------------------------------------------------- |
14 | */ |
15 | #include "postgres.h" |
16 | |
17 | #include "catalog/pg_aggregate.h" |
18 | #include "catalog/pg_constraint.h" |
19 | #include "catalog/pg_type.h" |
20 | #include "nodes/makefuncs.h" |
21 | #include "nodes/nodeFuncs.h" |
22 | #include "optimizer/optimizer.h" |
23 | #include "parser/parse_agg.h" |
24 | #include "parser/parse_clause.h" |
25 | #include "parser/parse_coerce.h" |
26 | #include "parser/parse_expr.h" |
27 | #include "parser/parsetree.h" |
28 | #include "rewrite/rewriteManip.h" |
29 | #include "utils/builtins.h" |
30 | #include "utils/lsyscache.h" |
31 | |
32 | |
33 | typedef struct |
34 | { |
35 | ParseState *pstate; |
36 | int min_varlevel; |
37 | int min_agglevel; |
38 | int sublevels_up; |
39 | } check_agg_arguments_context; |
40 | |
41 | typedef struct |
42 | { |
43 | ParseState *pstate; |
44 | Query *qry; |
45 | bool hasJoinRTEs; |
46 | List *groupClauses; |
47 | List *groupClauseCommonVars; |
48 | bool have_non_var_grouping; |
49 | List **func_grouped_rels; |
50 | int sublevels_up; |
51 | bool in_agg_direct_args; |
52 | } check_ungrouped_columns_context; |
53 | |
54 | static int check_agg_arguments(ParseState *pstate, |
55 | List *directargs, |
56 | List *args, |
57 | Expr *filter); |
58 | static bool check_agg_arguments_walker(Node *node, |
59 | check_agg_arguments_context *context); |
60 | static void check_ungrouped_columns(Node *node, ParseState *pstate, Query *qry, |
61 | List *groupClauses, List *groupClauseVars, |
62 | bool have_non_var_grouping, |
63 | List **func_grouped_rels); |
64 | static bool check_ungrouped_columns_walker(Node *node, |
65 | check_ungrouped_columns_context *context); |
66 | static void finalize_grouping_exprs(Node *node, ParseState *pstate, Query *qry, |
67 | List *groupClauses, bool hasJoinRTEs, |
68 | bool have_non_var_grouping); |
69 | static bool finalize_grouping_exprs_walker(Node *node, |
70 | check_ungrouped_columns_context *context); |
71 | static void check_agglevels_and_constraints(ParseState *pstate, Node *expr); |
72 | static List *expand_groupingset_node(GroupingSet *gs); |
73 | static Node *make_agg_arg(Oid argtype, Oid argcollation); |
74 | |
75 | |
76 | /* |
77 | * transformAggregateCall - |
78 | * Finish initial transformation of an aggregate call |
79 | * |
80 | * parse_func.c has recognized the function as an aggregate, and has set up |
81 | * all the fields of the Aggref except aggargtypes, aggdirectargs, args, |
82 | * aggorder, aggdistinct and agglevelsup. The passed-in args list has been |
83 | * through standard expression transformation and type coercion to match the |
84 | * agg's declared arg types, while the passed-in aggorder list hasn't been |
85 | * transformed at all. |
86 | * |
87 | * Here we separate the args list into direct and aggregated args, storing the |
88 | * former in agg->aggdirectargs and the latter in agg->args. The regular |
89 | * args, but not the direct args, are converted into a targetlist by inserting |
90 | * TargetEntry nodes. We then transform the aggorder and agg_distinct |
91 | * specifications to produce lists of SortGroupClause nodes for agg->aggorder |
92 | * and agg->aggdistinct. (For a regular aggregate, this might result in |
93 | * adding resjunk expressions to the targetlist; but for ordered-set |
94 | * aggregates the aggorder list will always be one-to-one with the aggregated |
95 | * args.) |
96 | * |
97 | * We must also determine which query level the aggregate actually belongs to, |
98 | * set agglevelsup accordingly, and mark p_hasAggs true in the corresponding |
99 | * pstate level. |
100 | */ |
101 | void |
102 | transformAggregateCall(ParseState *pstate, Aggref *agg, |
103 | List *args, List *aggorder, bool agg_distinct) |
104 | { |
105 | List *argtypes = NIL; |
106 | List *tlist = NIL; |
107 | List *torder = NIL; |
108 | List *tdistinct = NIL; |
109 | AttrNumber attno = 1; |
110 | int save_next_resno; |
111 | ListCell *lc; |
112 | |
113 | /* |
114 | * Before separating the args into direct and aggregated args, make a list |
115 | * of their data type OIDs for use later. |
116 | */ |
117 | foreach(lc, args) |
118 | { |
119 | Expr *arg = (Expr *) lfirst(lc); |
120 | |
121 | argtypes = lappend_oid(argtypes, exprType((Node *) arg)); |
122 | } |
123 | agg->aggargtypes = argtypes; |
124 | |
125 | if (AGGKIND_IS_ORDERED_SET(agg->aggkind)) |
126 | { |
127 | /* |
128 | * For an ordered-set agg, the args list includes direct args and |
129 | * aggregated args; we must split them apart. |
130 | */ |
131 | int numDirectArgs = list_length(args) - list_length(aggorder); |
132 | List *aargs; |
133 | ListCell *lc2; |
134 | |
135 | Assert(numDirectArgs >= 0); |
136 | |
137 | aargs = list_copy_tail(args, numDirectArgs); |
138 | agg->aggdirectargs = list_truncate(args, numDirectArgs); |
139 | |
140 | /* |
141 | * Build a tlist from the aggregated args, and make a sortlist entry |
142 | * for each one. Note that the expressions in the SortBy nodes are |
143 | * ignored (they are the raw versions of the transformed args); we are |
144 | * just looking at the sort information in the SortBy nodes. |
145 | */ |
146 | forboth(lc, aargs, lc2, aggorder) |
147 | { |
148 | Expr *arg = (Expr *) lfirst(lc); |
149 | SortBy *sortby = (SortBy *) lfirst(lc2); |
150 | TargetEntry *tle; |
151 | |
152 | /* We don't bother to assign column names to the entries */ |
153 | tle = makeTargetEntry(arg, attno++, NULL, false); |
154 | tlist = lappend(tlist, tle); |
155 | |
156 | torder = addTargetToSortList(pstate, tle, |
157 | torder, tlist, sortby); |
158 | } |
159 | |
160 | /* Never any DISTINCT in an ordered-set agg */ |
161 | Assert(!agg_distinct); |
162 | } |
163 | else |
164 | { |
165 | /* Regular aggregate, so it has no direct args */ |
166 | agg->aggdirectargs = NIL; |
167 | |
168 | /* |
169 | * Transform the plain list of Exprs into a targetlist. |
170 | */ |
171 | foreach(lc, args) |
172 | { |
173 | Expr *arg = (Expr *) lfirst(lc); |
174 | TargetEntry *tle; |
175 | |
176 | /* We don't bother to assign column names to the entries */ |
177 | tle = makeTargetEntry(arg, attno++, NULL, false); |
178 | tlist = lappend(tlist, tle); |
179 | } |
180 | |
181 | /* |
182 | * If we have an ORDER BY, transform it. This will add columns to the |
183 | * tlist if they appear in ORDER BY but weren't already in the arg |
184 | * list. They will be marked resjunk = true so we can tell them apart |
185 | * from regular aggregate arguments later. |
186 | * |
187 | * We need to mess with p_next_resno since it will be used to number |
188 | * any new targetlist entries. |
189 | */ |
190 | save_next_resno = pstate->p_next_resno; |
191 | pstate->p_next_resno = attno; |
192 | |
193 | torder = transformSortClause(pstate, |
194 | aggorder, |
195 | &tlist, |
196 | EXPR_KIND_ORDER_BY, |
197 | true /* force SQL99 rules */ ); |
198 | |
199 | /* |
200 | * If we have DISTINCT, transform that to produce a distinctList. |
201 | */ |
202 | if (agg_distinct) |
203 | { |
204 | tdistinct = transformDistinctClause(pstate, &tlist, torder, true); |
205 | |
206 | /* |
207 | * Remove this check if executor support for hashed distinct for |
208 | * aggregates is ever added. |
209 | */ |
210 | foreach(lc, tdistinct) |
211 | { |
212 | SortGroupClause *sortcl = (SortGroupClause *) lfirst(lc); |
213 | |
214 | if (!OidIsValid(sortcl->sortop)) |
215 | { |
216 | Node *expr = get_sortgroupclause_expr(sortcl, tlist); |
217 | |
218 | ereport(ERROR, |
219 | (errcode(ERRCODE_UNDEFINED_FUNCTION), |
220 | errmsg("could not identify an ordering operator for type %s" , |
221 | format_type_be(exprType(expr))), |
222 | errdetail("Aggregates with DISTINCT must be able to sort their inputs." ), |
223 | parser_errposition(pstate, exprLocation(expr)))); |
224 | } |
225 | } |
226 | } |
227 | |
228 | pstate->p_next_resno = save_next_resno; |
229 | } |
230 | |
231 | /* Update the Aggref with the transformation results */ |
232 | agg->args = tlist; |
233 | agg->aggorder = torder; |
234 | agg->aggdistinct = tdistinct; |
235 | |
236 | check_agglevels_and_constraints(pstate, (Node *) agg); |
237 | } |
238 | |
239 | /* |
240 | * transformGroupingFunc |
241 | * Transform a GROUPING expression |
242 | * |
243 | * GROUPING() behaves very like an aggregate. Processing of levels and nesting |
244 | * is done as for aggregates. We set p_hasAggs for these expressions too. |
245 | */ |
246 | Node * |
247 | transformGroupingFunc(ParseState *pstate, GroupingFunc *p) |
248 | { |
249 | ListCell *lc; |
250 | List *args = p->args; |
251 | List *result_list = NIL; |
252 | GroupingFunc *result = makeNode(GroupingFunc); |
253 | |
254 | if (list_length(args) > 31) |
255 | ereport(ERROR, |
256 | (errcode(ERRCODE_TOO_MANY_ARGUMENTS), |
257 | errmsg("GROUPING must have fewer than 32 arguments" ), |
258 | parser_errposition(pstate, p->location))); |
259 | |
260 | foreach(lc, args) |
261 | { |
262 | Node *current_result; |
263 | |
264 | current_result = transformExpr(pstate, (Node *) lfirst(lc), pstate->p_expr_kind); |
265 | |
266 | /* acceptability of expressions is checked later */ |
267 | |
268 | result_list = lappend(result_list, current_result); |
269 | } |
270 | |
271 | result->args = result_list; |
272 | result->location = p->location; |
273 | |
274 | check_agglevels_and_constraints(pstate, (Node *) result); |
275 | |
276 | return (Node *) result; |
277 | } |
278 | |
279 | /* |
280 | * Aggregate functions and grouping operations (which are combined in the spec |
281 | * as <set function specification>) are very similar with regard to level and |
282 | * nesting restrictions (though we allow a lot more things than the spec does). |
283 | * Centralise those restrictions here. |
284 | */ |
285 | static void |
286 | check_agglevels_and_constraints(ParseState *pstate, Node *expr) |
287 | { |
288 | List *directargs = NIL; |
289 | List *args = NIL; |
290 | Expr *filter = NULL; |
291 | int min_varlevel; |
292 | int location = -1; |
293 | Index *p_levelsup; |
294 | const char *err; |
295 | bool errkind; |
296 | bool isAgg = IsA(expr, Aggref); |
297 | |
298 | if (isAgg) |
299 | { |
300 | Aggref *agg = (Aggref *) expr; |
301 | |
302 | directargs = agg->aggdirectargs; |
303 | args = agg->args; |
304 | filter = agg->aggfilter; |
305 | location = agg->location; |
306 | p_levelsup = &agg->agglevelsup; |
307 | } |
308 | else |
309 | { |
310 | GroupingFunc *grp = (GroupingFunc *) expr; |
311 | |
312 | args = grp->args; |
313 | location = grp->location; |
314 | p_levelsup = &grp->agglevelsup; |
315 | } |
316 | |
317 | /* |
318 | * Check the arguments to compute the aggregate's level and detect |
319 | * improper nesting. |
320 | */ |
321 | min_varlevel = check_agg_arguments(pstate, |
322 | directargs, |
323 | args, |
324 | filter); |
325 | |
326 | *p_levelsup = min_varlevel; |
327 | |
328 | /* Mark the correct pstate level as having aggregates */ |
329 | while (min_varlevel-- > 0) |
330 | pstate = pstate->parentParseState; |
331 | pstate->p_hasAggs = true; |
332 | |
333 | /* |
334 | * Check to see if the aggregate function is in an invalid place within |
335 | * its aggregation query. |
336 | * |
337 | * For brevity we support two schemes for reporting an error here: set |
338 | * "err" to a custom message, or set "errkind" true if the error context |
339 | * is sufficiently identified by what ParseExprKindName will return, *and* |
340 | * what it will return is just a SQL keyword. (Otherwise, use a custom |
341 | * message to avoid creating translation problems.) |
342 | */ |
343 | err = NULL; |
344 | errkind = false; |
345 | switch (pstate->p_expr_kind) |
346 | { |
347 | case EXPR_KIND_NONE: |
348 | Assert(false); /* can't happen */ |
349 | break; |
350 | case EXPR_KIND_OTHER: |
351 | |
352 | /* |
353 | * Accept aggregate/grouping here; caller must throw error if |
354 | * wanted |
355 | */ |
356 | break; |
357 | case EXPR_KIND_JOIN_ON: |
358 | case EXPR_KIND_JOIN_USING: |
359 | if (isAgg) |
360 | err = _("aggregate functions are not allowed in JOIN conditions" ); |
361 | else |
362 | err = _("grouping operations are not allowed in JOIN conditions" ); |
363 | |
364 | break; |
365 | case EXPR_KIND_FROM_SUBSELECT: |
366 | /* Should only be possible in a LATERAL subquery */ |
367 | Assert(pstate->p_lateral_active); |
368 | |
369 | /* |
370 | * Aggregate/grouping scope rules make it worth being explicit |
371 | * here |
372 | */ |
373 | if (isAgg) |
374 | err = _("aggregate functions are not allowed in FROM clause of their own query level" ); |
375 | else |
376 | err = _("grouping operations are not allowed in FROM clause of their own query level" ); |
377 | |
378 | break; |
379 | case EXPR_KIND_FROM_FUNCTION: |
380 | if (isAgg) |
381 | err = _("aggregate functions are not allowed in functions in FROM" ); |
382 | else |
383 | err = _("grouping operations are not allowed in functions in FROM" ); |
384 | |
385 | break; |
386 | case EXPR_KIND_WHERE: |
387 | errkind = true; |
388 | break; |
389 | case EXPR_KIND_POLICY: |
390 | if (isAgg) |
391 | err = _("aggregate functions are not allowed in policy expressions" ); |
392 | else |
393 | err = _("grouping operations are not allowed in policy expressions" ); |
394 | |
395 | break; |
396 | case EXPR_KIND_HAVING: |
397 | /* okay */ |
398 | break; |
399 | case EXPR_KIND_FILTER: |
400 | errkind = true; |
401 | break; |
402 | case EXPR_KIND_WINDOW_PARTITION: |
403 | /* okay */ |
404 | break; |
405 | case EXPR_KIND_WINDOW_ORDER: |
406 | /* okay */ |
407 | break; |
408 | case EXPR_KIND_WINDOW_FRAME_RANGE: |
409 | if (isAgg) |
410 | err = _("aggregate functions are not allowed in window RANGE" ); |
411 | else |
412 | err = _("grouping operations are not allowed in window RANGE" ); |
413 | |
414 | break; |
415 | case EXPR_KIND_WINDOW_FRAME_ROWS: |
416 | if (isAgg) |
417 | err = _("aggregate functions are not allowed in window ROWS" ); |
418 | else |
419 | err = _("grouping operations are not allowed in window ROWS" ); |
420 | |
421 | break; |
422 | case EXPR_KIND_WINDOW_FRAME_GROUPS: |
423 | if (isAgg) |
424 | err = _("aggregate functions are not allowed in window GROUPS" ); |
425 | else |
426 | err = _("grouping operations are not allowed in window GROUPS" ); |
427 | |
428 | break; |
429 | case EXPR_KIND_SELECT_TARGET: |
430 | /* okay */ |
431 | break; |
432 | case EXPR_KIND_INSERT_TARGET: |
433 | case EXPR_KIND_UPDATE_SOURCE: |
434 | case EXPR_KIND_UPDATE_TARGET: |
435 | errkind = true; |
436 | break; |
437 | case EXPR_KIND_GROUP_BY: |
438 | errkind = true; |
439 | break; |
440 | case EXPR_KIND_ORDER_BY: |
441 | /* okay */ |
442 | break; |
443 | case EXPR_KIND_DISTINCT_ON: |
444 | /* okay */ |
445 | break; |
446 | case EXPR_KIND_LIMIT: |
447 | case EXPR_KIND_OFFSET: |
448 | errkind = true; |
449 | break; |
450 | case EXPR_KIND_RETURNING: |
451 | errkind = true; |
452 | break; |
453 | case EXPR_KIND_VALUES: |
454 | case EXPR_KIND_VALUES_SINGLE: |
455 | errkind = true; |
456 | break; |
457 | case EXPR_KIND_CHECK_CONSTRAINT: |
458 | case EXPR_KIND_DOMAIN_CHECK: |
459 | if (isAgg) |
460 | err = _("aggregate functions are not allowed in check constraints" ); |
461 | else |
462 | err = _("grouping operations are not allowed in check constraints" ); |
463 | |
464 | break; |
465 | case EXPR_KIND_COLUMN_DEFAULT: |
466 | case EXPR_KIND_FUNCTION_DEFAULT: |
467 | |
468 | if (isAgg) |
469 | err = _("aggregate functions are not allowed in DEFAULT expressions" ); |
470 | else |
471 | err = _("grouping operations are not allowed in DEFAULT expressions" ); |
472 | |
473 | break; |
474 | case EXPR_KIND_INDEX_EXPRESSION: |
475 | if (isAgg) |
476 | err = _("aggregate functions are not allowed in index expressions" ); |
477 | else |
478 | err = _("grouping operations are not allowed in index expressions" ); |
479 | |
480 | break; |
481 | case EXPR_KIND_INDEX_PREDICATE: |
482 | if (isAgg) |
483 | err = _("aggregate functions are not allowed in index predicates" ); |
484 | else |
485 | err = _("grouping operations are not allowed in index predicates" ); |
486 | |
487 | break; |
488 | case EXPR_KIND_ALTER_COL_TRANSFORM: |
489 | if (isAgg) |
490 | err = _("aggregate functions are not allowed in transform expressions" ); |
491 | else |
492 | err = _("grouping operations are not allowed in transform expressions" ); |
493 | |
494 | break; |
495 | case EXPR_KIND_EXECUTE_PARAMETER: |
496 | if (isAgg) |
497 | err = _("aggregate functions are not allowed in EXECUTE parameters" ); |
498 | else |
499 | err = _("grouping operations are not allowed in EXECUTE parameters" ); |
500 | |
501 | break; |
502 | case EXPR_KIND_TRIGGER_WHEN: |
503 | if (isAgg) |
504 | err = _("aggregate functions are not allowed in trigger WHEN conditions" ); |
505 | else |
506 | err = _("grouping operations are not allowed in trigger WHEN conditions" ); |
507 | |
508 | break; |
509 | case EXPR_KIND_PARTITION_BOUND: |
510 | if (isAgg) |
511 | err = _("aggregate functions are not allowed in partition bound" ); |
512 | else |
513 | err = _("grouping operations are not allowed in partition bound" ); |
514 | |
515 | break; |
516 | case EXPR_KIND_PARTITION_EXPRESSION: |
517 | if (isAgg) |
518 | err = _("aggregate functions are not allowed in partition key expressions" ); |
519 | else |
520 | err = _("grouping operations are not allowed in partition key expressions" ); |
521 | |
522 | break; |
523 | case EXPR_KIND_GENERATED_COLUMN: |
524 | |
525 | if (isAgg) |
526 | err = _("aggregate functions are not allowed in column generation expressions" ); |
527 | else |
528 | err = _("grouping operations are not allowed in column generation expressions" ); |
529 | |
530 | break; |
531 | |
532 | case EXPR_KIND_CALL_ARGUMENT: |
533 | if (isAgg) |
534 | err = _("aggregate functions are not allowed in CALL arguments" ); |
535 | else |
536 | err = _("grouping operations are not allowed in CALL arguments" ); |
537 | |
538 | break; |
539 | |
540 | case EXPR_KIND_COPY_WHERE: |
541 | if (isAgg) |
542 | err = _("aggregate functions are not allowed in COPY FROM WHERE conditions" ); |
543 | else |
544 | err = _("grouping operations are not allowed in COPY FROM WHERE conditions" ); |
545 | |
546 | break; |
547 | |
548 | /* |
549 | * There is intentionally no default: case here, so that the |
550 | * compiler will warn if we add a new ParseExprKind without |
551 | * extending this switch. If we do see an unrecognized value at |
552 | * runtime, the behavior will be the same as for EXPR_KIND_OTHER, |
553 | * which is sane anyway. |
554 | */ |
555 | } |
556 | |
557 | if (err) |
558 | ereport(ERROR, |
559 | (errcode(ERRCODE_GROUPING_ERROR), |
560 | errmsg_internal("%s" , err), |
561 | parser_errposition(pstate, location))); |
562 | |
563 | if (errkind) |
564 | { |
565 | if (isAgg) |
566 | /* translator: %s is name of a SQL construct, eg GROUP BY */ |
567 | err = _("aggregate functions are not allowed in %s" ); |
568 | else |
569 | /* translator: %s is name of a SQL construct, eg GROUP BY */ |
570 | err = _("grouping operations are not allowed in %s" ); |
571 | |
572 | ereport(ERROR, |
573 | (errcode(ERRCODE_GROUPING_ERROR), |
574 | errmsg_internal(err, |
575 | ParseExprKindName(pstate->p_expr_kind)), |
576 | parser_errposition(pstate, location))); |
577 | } |
578 | } |
579 | |
580 | /* |
581 | * check_agg_arguments |
582 | * Scan the arguments of an aggregate function to determine the |
583 | * aggregate's semantic level (zero is the current select's level, |
584 | * one is its parent, etc). |
585 | * |
586 | * The aggregate's level is the same as the level of the lowest-level variable |
587 | * or aggregate in its aggregated arguments (including any ORDER BY columns) |
588 | * or filter expression; or if it contains no variables at all, we presume it |
589 | * to be local. |
590 | * |
591 | * Vars/Aggs in direct arguments are *not* counted towards determining the |
592 | * agg's level, as those arguments aren't evaluated per-row but only |
593 | * per-group, and so in some sense aren't really agg arguments. However, |
594 | * this can mean that we decide an agg is upper-level even when its direct |
595 | * args contain lower-level Vars/Aggs, and that case has to be disallowed. |
596 | * (This is a little strange, but the SQL standard seems pretty definite that |
597 | * direct args are not to be considered when setting the agg's level.) |
598 | * |
599 | * We also take this opportunity to detect any aggregates or window functions |
600 | * nested within the arguments. We can throw error immediately if we find |
601 | * a window function. Aggregates are a bit trickier because it's only an |
602 | * error if the inner aggregate is of the same semantic level as the outer, |
603 | * which we can't know until we finish scanning the arguments. |
604 | */ |
605 | static int |
606 | check_agg_arguments(ParseState *pstate, |
607 | List *directargs, |
608 | List *args, |
609 | Expr *filter) |
610 | { |
611 | int agglevel; |
612 | check_agg_arguments_context context; |
613 | |
614 | context.pstate = pstate; |
615 | context.min_varlevel = -1; /* signifies nothing found yet */ |
616 | context.min_agglevel = -1; |
617 | context.sublevels_up = 0; |
618 | |
619 | (void) expression_tree_walker((Node *) args, |
620 | check_agg_arguments_walker, |
621 | (void *) &context); |
622 | |
623 | (void) expression_tree_walker((Node *) filter, |
624 | check_agg_arguments_walker, |
625 | (void *) &context); |
626 | |
627 | /* |
628 | * If we found no vars nor aggs at all, it's a level-zero aggregate; |
629 | * otherwise, its level is the minimum of vars or aggs. |
630 | */ |
631 | if (context.min_varlevel < 0) |
632 | { |
633 | if (context.min_agglevel < 0) |
634 | agglevel = 0; |
635 | else |
636 | agglevel = context.min_agglevel; |
637 | } |
638 | else if (context.min_agglevel < 0) |
639 | agglevel = context.min_varlevel; |
640 | else |
641 | agglevel = Min(context.min_varlevel, context.min_agglevel); |
642 | |
643 | /* |
644 | * If there's a nested aggregate of the same semantic level, complain. |
645 | */ |
646 | if (agglevel == context.min_agglevel) |
647 | { |
648 | int aggloc; |
649 | |
650 | aggloc = locate_agg_of_level((Node *) args, agglevel); |
651 | if (aggloc < 0) |
652 | aggloc = locate_agg_of_level((Node *) filter, agglevel); |
653 | ereport(ERROR, |
654 | (errcode(ERRCODE_GROUPING_ERROR), |
655 | errmsg("aggregate function calls cannot be nested" ), |
656 | parser_errposition(pstate, aggloc))); |
657 | } |
658 | |
659 | /* |
660 | * Now check for vars/aggs in the direct arguments, and throw error if |
661 | * needed. Note that we allow a Var of the agg's semantic level, but not |
662 | * an Agg of that level. In principle such Aggs could probably be |
663 | * supported, but it would create an ordering dependency among the |
664 | * aggregates at execution time. Since the case appears neither to be |
665 | * required by spec nor particularly useful, we just treat it as a |
666 | * nested-aggregate situation. |
667 | */ |
668 | if (directargs) |
669 | { |
670 | context.min_varlevel = -1; |
671 | context.min_agglevel = -1; |
672 | (void) expression_tree_walker((Node *) directargs, |
673 | check_agg_arguments_walker, |
674 | (void *) &context); |
675 | if (context.min_varlevel >= 0 && context.min_varlevel < agglevel) |
676 | ereport(ERROR, |
677 | (errcode(ERRCODE_GROUPING_ERROR), |
678 | errmsg("outer-level aggregate cannot contain a lower-level variable in its direct arguments" ), |
679 | parser_errposition(pstate, |
680 | locate_var_of_level((Node *) directargs, |
681 | context.min_varlevel)))); |
682 | if (context.min_agglevel >= 0 && context.min_agglevel <= agglevel) |
683 | ereport(ERROR, |
684 | (errcode(ERRCODE_GROUPING_ERROR), |
685 | errmsg("aggregate function calls cannot be nested" ), |
686 | parser_errposition(pstate, |
687 | locate_agg_of_level((Node *) directargs, |
688 | context.min_agglevel)))); |
689 | } |
690 | return agglevel; |
691 | } |
692 | |
693 | static bool |
694 | check_agg_arguments_walker(Node *node, |
695 | check_agg_arguments_context *context) |
696 | { |
697 | if (node == NULL) |
698 | return false; |
699 | if (IsA(node, Var)) |
700 | { |
701 | int varlevelsup = ((Var *) node)->varlevelsup; |
702 | |
703 | /* convert levelsup to frame of reference of original query */ |
704 | varlevelsup -= context->sublevels_up; |
705 | /* ignore local vars of subqueries */ |
706 | if (varlevelsup >= 0) |
707 | { |
708 | if (context->min_varlevel < 0 || |
709 | context->min_varlevel > varlevelsup) |
710 | context->min_varlevel = varlevelsup; |
711 | } |
712 | return false; |
713 | } |
714 | if (IsA(node, Aggref)) |
715 | { |
716 | int agglevelsup = ((Aggref *) node)->agglevelsup; |
717 | |
718 | /* convert levelsup to frame of reference of original query */ |
719 | agglevelsup -= context->sublevels_up; |
720 | /* ignore local aggs of subqueries */ |
721 | if (agglevelsup >= 0) |
722 | { |
723 | if (context->min_agglevel < 0 || |
724 | context->min_agglevel > agglevelsup) |
725 | context->min_agglevel = agglevelsup; |
726 | } |
727 | /* no need to examine args of the inner aggregate */ |
728 | return false; |
729 | } |
730 | if (IsA(node, GroupingFunc)) |
731 | { |
732 | int agglevelsup = ((GroupingFunc *) node)->agglevelsup; |
733 | |
734 | /* convert levelsup to frame of reference of original query */ |
735 | agglevelsup -= context->sublevels_up; |
736 | /* ignore local aggs of subqueries */ |
737 | if (agglevelsup >= 0) |
738 | { |
739 | if (context->min_agglevel < 0 || |
740 | context->min_agglevel > agglevelsup) |
741 | context->min_agglevel = agglevelsup; |
742 | } |
743 | /* Continue and descend into subtree */ |
744 | } |
745 | |
746 | /* |
747 | * SRFs and window functions can be rejected immediately, unless we are |
748 | * within a sub-select within the aggregate's arguments; in that case |
749 | * they're OK. |
750 | */ |
751 | if (context->sublevels_up == 0) |
752 | { |
753 | if ((IsA(node, FuncExpr) &&((FuncExpr *) node)->funcretset) || |
754 | (IsA(node, OpExpr) &&((OpExpr *) node)->opretset)) |
755 | ereport(ERROR, |
756 | (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), |
757 | errmsg("aggregate function calls cannot contain set-returning function calls" ), |
758 | errhint("You might be able to move the set-returning function into a LATERAL FROM item." ), |
759 | parser_errposition(context->pstate, exprLocation(node)))); |
760 | if (IsA(node, WindowFunc)) |
761 | ereport(ERROR, |
762 | (errcode(ERRCODE_GROUPING_ERROR), |
763 | errmsg("aggregate function calls cannot contain window function calls" ), |
764 | parser_errposition(context->pstate, |
765 | ((WindowFunc *) node)->location))); |
766 | } |
767 | if (IsA(node, Query)) |
768 | { |
769 | /* Recurse into subselects */ |
770 | bool result; |
771 | |
772 | context->sublevels_up++; |
773 | result = query_tree_walker((Query *) node, |
774 | check_agg_arguments_walker, |
775 | (void *) context, |
776 | 0); |
777 | context->sublevels_up--; |
778 | return result; |
779 | } |
780 | |
781 | return expression_tree_walker(node, |
782 | check_agg_arguments_walker, |
783 | (void *) context); |
784 | } |
785 | |
786 | /* |
787 | * transformWindowFuncCall - |
788 | * Finish initial transformation of a window function call |
789 | * |
790 | * parse_func.c has recognized the function as a window function, and has set |
791 | * up all the fields of the WindowFunc except winref. Here we must (1) add |
792 | * the WindowDef to the pstate (if not a duplicate of one already present) and |
793 | * set winref to link to it; and (2) mark p_hasWindowFuncs true in the pstate. |
794 | * Unlike aggregates, only the most closely nested pstate level need be |
795 | * considered --- there are no "outer window functions" per SQL spec. |
796 | */ |
797 | void |
798 | transformWindowFuncCall(ParseState *pstate, WindowFunc *wfunc, |
799 | WindowDef *windef) |
800 | { |
801 | const char *err; |
802 | bool errkind; |
803 | |
804 | /* |
805 | * A window function call can't contain another one (but aggs are OK). XXX |
806 | * is this required by spec, or just an unimplemented feature? |
807 | * |
808 | * Note: we don't need to check the filter expression here, because the |
809 | * context checks done below and in transformAggregateCall would have |
810 | * already rejected any window funcs or aggs within the filter. |
811 | */ |
812 | if (pstate->p_hasWindowFuncs && |
813 | contain_windowfuncs((Node *) wfunc->args)) |
814 | ereport(ERROR, |
815 | (errcode(ERRCODE_WINDOWING_ERROR), |
816 | errmsg("window function calls cannot be nested" ), |
817 | parser_errposition(pstate, |
818 | locate_windowfunc((Node *) wfunc->args)))); |
819 | |
820 | /* |
821 | * Check to see if the window function is in an invalid place within the |
822 | * query. |
823 | * |
824 | * For brevity we support two schemes for reporting an error here: set |
825 | * "err" to a custom message, or set "errkind" true if the error context |
826 | * is sufficiently identified by what ParseExprKindName will return, *and* |
827 | * what it will return is just a SQL keyword. (Otherwise, use a custom |
828 | * message to avoid creating translation problems.) |
829 | */ |
830 | err = NULL; |
831 | errkind = false; |
832 | switch (pstate->p_expr_kind) |
833 | { |
834 | case EXPR_KIND_NONE: |
835 | Assert(false); /* can't happen */ |
836 | break; |
837 | case EXPR_KIND_OTHER: |
838 | /* Accept window func here; caller must throw error if wanted */ |
839 | break; |
840 | case EXPR_KIND_JOIN_ON: |
841 | case EXPR_KIND_JOIN_USING: |
842 | err = _("window functions are not allowed in JOIN conditions" ); |
843 | break; |
844 | case EXPR_KIND_FROM_SUBSELECT: |
845 | /* can't get here, but just in case, throw an error */ |
846 | errkind = true; |
847 | break; |
848 | case EXPR_KIND_FROM_FUNCTION: |
849 | err = _("window functions are not allowed in functions in FROM" ); |
850 | break; |
851 | case EXPR_KIND_WHERE: |
852 | errkind = true; |
853 | break; |
854 | case EXPR_KIND_POLICY: |
855 | err = _("window functions are not allowed in policy expressions" ); |
856 | break; |
857 | case EXPR_KIND_HAVING: |
858 | errkind = true; |
859 | break; |
860 | case EXPR_KIND_FILTER: |
861 | errkind = true; |
862 | break; |
863 | case EXPR_KIND_WINDOW_PARTITION: |
864 | case EXPR_KIND_WINDOW_ORDER: |
865 | case EXPR_KIND_WINDOW_FRAME_RANGE: |
866 | case EXPR_KIND_WINDOW_FRAME_ROWS: |
867 | case EXPR_KIND_WINDOW_FRAME_GROUPS: |
868 | err = _("window functions are not allowed in window definitions" ); |
869 | break; |
870 | case EXPR_KIND_SELECT_TARGET: |
871 | /* okay */ |
872 | break; |
873 | case EXPR_KIND_INSERT_TARGET: |
874 | case EXPR_KIND_UPDATE_SOURCE: |
875 | case EXPR_KIND_UPDATE_TARGET: |
876 | errkind = true; |
877 | break; |
878 | case EXPR_KIND_GROUP_BY: |
879 | errkind = true; |
880 | break; |
881 | case EXPR_KIND_ORDER_BY: |
882 | /* okay */ |
883 | break; |
884 | case EXPR_KIND_DISTINCT_ON: |
885 | /* okay */ |
886 | break; |
887 | case EXPR_KIND_LIMIT: |
888 | case EXPR_KIND_OFFSET: |
889 | errkind = true; |
890 | break; |
891 | case EXPR_KIND_RETURNING: |
892 | errkind = true; |
893 | break; |
894 | case EXPR_KIND_VALUES: |
895 | case EXPR_KIND_VALUES_SINGLE: |
896 | errkind = true; |
897 | break; |
898 | case EXPR_KIND_CHECK_CONSTRAINT: |
899 | case EXPR_KIND_DOMAIN_CHECK: |
900 | err = _("window functions are not allowed in check constraints" ); |
901 | break; |
902 | case EXPR_KIND_COLUMN_DEFAULT: |
903 | case EXPR_KIND_FUNCTION_DEFAULT: |
904 | err = _("window functions are not allowed in DEFAULT expressions" ); |
905 | break; |
906 | case EXPR_KIND_INDEX_EXPRESSION: |
907 | err = _("window functions are not allowed in index expressions" ); |
908 | break; |
909 | case EXPR_KIND_INDEX_PREDICATE: |
910 | err = _("window functions are not allowed in index predicates" ); |
911 | break; |
912 | case EXPR_KIND_ALTER_COL_TRANSFORM: |
913 | err = _("window functions are not allowed in transform expressions" ); |
914 | break; |
915 | case EXPR_KIND_EXECUTE_PARAMETER: |
916 | err = _("window functions are not allowed in EXECUTE parameters" ); |
917 | break; |
918 | case EXPR_KIND_TRIGGER_WHEN: |
919 | err = _("window functions are not allowed in trigger WHEN conditions" ); |
920 | break; |
921 | case EXPR_KIND_PARTITION_BOUND: |
922 | err = _("window functions are not allowed in partition bound" ); |
923 | break; |
924 | case EXPR_KIND_PARTITION_EXPRESSION: |
925 | err = _("window functions are not allowed in partition key expressions" ); |
926 | break; |
927 | case EXPR_KIND_CALL_ARGUMENT: |
928 | err = _("window functions are not allowed in CALL arguments" ); |
929 | break; |
930 | case EXPR_KIND_COPY_WHERE: |
931 | err = _("window functions are not allowed in COPY FROM WHERE conditions" ); |
932 | break; |
933 | case EXPR_KIND_GENERATED_COLUMN: |
934 | err = _("window functions are not allowed in column generation expressions" ); |
935 | break; |
936 | |
937 | /* |
938 | * There is intentionally no default: case here, so that the |
939 | * compiler will warn if we add a new ParseExprKind without |
940 | * extending this switch. If we do see an unrecognized value at |
941 | * runtime, the behavior will be the same as for EXPR_KIND_OTHER, |
942 | * which is sane anyway. |
943 | */ |
944 | } |
945 | if (err) |
946 | ereport(ERROR, |
947 | (errcode(ERRCODE_WINDOWING_ERROR), |
948 | errmsg_internal("%s" , err), |
949 | parser_errposition(pstate, wfunc->location))); |
950 | if (errkind) |
951 | ereport(ERROR, |
952 | (errcode(ERRCODE_WINDOWING_ERROR), |
953 | /* translator: %s is name of a SQL construct, eg GROUP BY */ |
954 | errmsg("window functions are not allowed in %s" , |
955 | ParseExprKindName(pstate->p_expr_kind)), |
956 | parser_errposition(pstate, wfunc->location))); |
957 | |
958 | /* |
959 | * If the OVER clause just specifies a window name, find that WINDOW |
960 | * clause (which had better be present). Otherwise, try to match all the |
961 | * properties of the OVER clause, and make a new entry in the p_windowdefs |
962 | * list if no luck. |
963 | */ |
964 | if (windef->name) |
965 | { |
966 | Index winref = 0; |
967 | ListCell *lc; |
968 | |
969 | Assert(windef->refname == NULL && |
970 | windef->partitionClause == NIL && |
971 | windef->orderClause == NIL && |
972 | windef->frameOptions == FRAMEOPTION_DEFAULTS); |
973 | |
974 | foreach(lc, pstate->p_windowdefs) |
975 | { |
976 | WindowDef *refwin = (WindowDef *) lfirst(lc); |
977 | |
978 | winref++; |
979 | if (refwin->name && strcmp(refwin->name, windef->name) == 0) |
980 | { |
981 | wfunc->winref = winref; |
982 | break; |
983 | } |
984 | } |
985 | if (lc == NULL) /* didn't find it? */ |
986 | ereport(ERROR, |
987 | (errcode(ERRCODE_UNDEFINED_OBJECT), |
988 | errmsg("window \"%s\" does not exist" , windef->name), |
989 | parser_errposition(pstate, windef->location))); |
990 | } |
991 | else |
992 | { |
993 | Index winref = 0; |
994 | ListCell *lc; |
995 | |
996 | foreach(lc, pstate->p_windowdefs) |
997 | { |
998 | WindowDef *refwin = (WindowDef *) lfirst(lc); |
999 | |
1000 | winref++; |
1001 | if (refwin->refname && windef->refname && |
1002 | strcmp(refwin->refname, windef->refname) == 0) |
1003 | /* matched on refname */ ; |
1004 | else if (!refwin->refname && !windef->refname) |
1005 | /* matched, no refname */ ; |
1006 | else |
1007 | continue; |
1008 | if (equal(refwin->partitionClause, windef->partitionClause) && |
1009 | equal(refwin->orderClause, windef->orderClause) && |
1010 | refwin->frameOptions == windef->frameOptions && |
1011 | equal(refwin->startOffset, windef->startOffset) && |
1012 | equal(refwin->endOffset, windef->endOffset)) |
1013 | { |
1014 | /* found a duplicate window specification */ |
1015 | wfunc->winref = winref; |
1016 | break; |
1017 | } |
1018 | } |
1019 | if (lc == NULL) /* didn't find it? */ |
1020 | { |
1021 | pstate->p_windowdefs = lappend(pstate->p_windowdefs, windef); |
1022 | wfunc->winref = list_length(pstate->p_windowdefs); |
1023 | } |
1024 | } |
1025 | |
1026 | pstate->p_hasWindowFuncs = true; |
1027 | } |
1028 | |
1029 | /* |
1030 | * parseCheckAggregates |
1031 | * Check for aggregates where they shouldn't be and improper grouping. |
1032 | * This function should be called after the target list and qualifications |
1033 | * are finalized. |
1034 | * |
1035 | * Misplaced aggregates are now mostly detected in transformAggregateCall, |
1036 | * but it seems more robust to check for aggregates in recursive queries |
1037 | * only after everything is finalized. In any case it's hard to detect |
1038 | * improper grouping on-the-fly, so we have to make another pass over the |
1039 | * query for that. |
1040 | */ |
1041 | void |
1042 | parseCheckAggregates(ParseState *pstate, Query *qry) |
1043 | { |
1044 | List *gset_common = NIL; |
1045 | List *groupClauses = NIL; |
1046 | List *groupClauseCommonVars = NIL; |
1047 | bool have_non_var_grouping; |
1048 | List *func_grouped_rels = NIL; |
1049 | ListCell *l; |
1050 | bool hasJoinRTEs; |
1051 | bool hasSelfRefRTEs; |
1052 | Node *clause; |
1053 | |
1054 | /* This should only be called if we found aggregates or grouping */ |
1055 | Assert(pstate->p_hasAggs || qry->groupClause || qry->havingQual || qry->groupingSets); |
1056 | |
1057 | /* |
1058 | * If we have grouping sets, expand them and find the intersection of all |
1059 | * sets. |
1060 | */ |
1061 | if (qry->groupingSets) |
1062 | { |
1063 | /* |
1064 | * The limit of 4096 is arbitrary and exists simply to avoid resource |
1065 | * issues from pathological constructs. |
1066 | */ |
1067 | List *gsets = expand_grouping_sets(qry->groupingSets, 4096); |
1068 | |
1069 | if (!gsets) |
1070 | ereport(ERROR, |
1071 | (errcode(ERRCODE_STATEMENT_TOO_COMPLEX), |
1072 | errmsg("too many grouping sets present (maximum 4096)" ), |
1073 | parser_errposition(pstate, |
1074 | qry->groupClause |
1075 | ? exprLocation((Node *) qry->groupClause) |
1076 | : exprLocation((Node *) qry->groupingSets)))); |
1077 | |
1078 | /* |
1079 | * The intersection will often be empty, so help things along by |
1080 | * seeding the intersect with the smallest set. |
1081 | */ |
1082 | gset_common = linitial(gsets); |
1083 | |
1084 | if (gset_common) |
1085 | { |
1086 | for_each_cell(l, lnext(list_head(gsets))) |
1087 | { |
1088 | gset_common = list_intersection_int(gset_common, lfirst(l)); |
1089 | if (!gset_common) |
1090 | break; |
1091 | } |
1092 | } |
1093 | |
1094 | /* |
1095 | * If there was only one grouping set in the expansion, AND if the |
1096 | * groupClause is non-empty (meaning that the grouping set is not |
1097 | * empty either), then we can ditch the grouping set and pretend we |
1098 | * just had a normal GROUP BY. |
1099 | */ |
1100 | if (list_length(gsets) == 1 && qry->groupClause) |
1101 | qry->groupingSets = NIL; |
1102 | } |
1103 | |
1104 | /* |
1105 | * Scan the range table to see if there are JOIN or self-reference CTE |
1106 | * entries. We'll need this info below. |
1107 | */ |
1108 | hasJoinRTEs = hasSelfRefRTEs = false; |
1109 | foreach(l, pstate->p_rtable) |
1110 | { |
1111 | RangeTblEntry *rte = (RangeTblEntry *) lfirst(l); |
1112 | |
1113 | if (rte->rtekind == RTE_JOIN) |
1114 | hasJoinRTEs = true; |
1115 | else if (rte->rtekind == RTE_CTE && rte->self_reference) |
1116 | hasSelfRefRTEs = true; |
1117 | } |
1118 | |
1119 | /* |
1120 | * Build a list of the acceptable GROUP BY expressions for use by |
1121 | * check_ungrouped_columns(). |
1122 | * |
1123 | * We get the TLE, not just the expr, because GROUPING wants to know the |
1124 | * sortgroupref. |
1125 | */ |
1126 | foreach(l, qry->groupClause) |
1127 | { |
1128 | SortGroupClause *grpcl = (SortGroupClause *) lfirst(l); |
1129 | TargetEntry *expr; |
1130 | |
1131 | expr = get_sortgroupclause_tle(grpcl, qry->targetList); |
1132 | if (expr == NULL) |
1133 | continue; /* probably cannot happen */ |
1134 | |
1135 | groupClauses = lcons(expr, groupClauses); |
1136 | } |
1137 | |
1138 | /* |
1139 | * If there are join alias vars involved, we have to flatten them to the |
1140 | * underlying vars, so that aliased and unaliased vars will be correctly |
1141 | * taken as equal. We can skip the expense of doing this if no rangetable |
1142 | * entries are RTE_JOIN kind. |
1143 | */ |
1144 | if (hasJoinRTEs) |
1145 | groupClauses = (List *) flatten_join_alias_vars(qry, |
1146 | (Node *) groupClauses); |
1147 | |
1148 | /* |
1149 | * Detect whether any of the grouping expressions aren't simple Vars; if |
1150 | * they're all Vars then we don't have to work so hard in the recursive |
1151 | * scans. (Note we have to flatten aliases before this.) |
1152 | * |
1153 | * Track Vars that are included in all grouping sets separately in |
1154 | * groupClauseCommonVars, since these are the only ones we can use to |
1155 | * check for functional dependencies. |
1156 | */ |
1157 | have_non_var_grouping = false; |
1158 | foreach(l, groupClauses) |
1159 | { |
1160 | TargetEntry *tle = lfirst(l); |
1161 | |
1162 | if (!IsA(tle->expr, Var)) |
1163 | { |
1164 | have_non_var_grouping = true; |
1165 | } |
1166 | else if (!qry->groupingSets || |
1167 | list_member_int(gset_common, tle->ressortgroupref)) |
1168 | { |
1169 | groupClauseCommonVars = lappend(groupClauseCommonVars, tle->expr); |
1170 | } |
1171 | } |
1172 | |
1173 | /* |
1174 | * Check the targetlist and HAVING clause for ungrouped variables. |
1175 | * |
1176 | * Note: because we check resjunk tlist elements as well as regular ones, |
1177 | * this will also find ungrouped variables that came from ORDER BY and |
1178 | * WINDOW clauses. For that matter, it's also going to examine the |
1179 | * grouping expressions themselves --- but they'll all pass the test ... |
1180 | * |
1181 | * We also finalize GROUPING expressions, but for that we need to traverse |
1182 | * the original (unflattened) clause in order to modify nodes. |
1183 | */ |
1184 | clause = (Node *) qry->targetList; |
1185 | finalize_grouping_exprs(clause, pstate, qry, |
1186 | groupClauses, hasJoinRTEs, |
1187 | have_non_var_grouping); |
1188 | if (hasJoinRTEs) |
1189 | clause = flatten_join_alias_vars(qry, clause); |
1190 | check_ungrouped_columns(clause, pstate, qry, |
1191 | groupClauses, groupClauseCommonVars, |
1192 | have_non_var_grouping, |
1193 | &func_grouped_rels); |
1194 | |
1195 | clause = (Node *) qry->havingQual; |
1196 | finalize_grouping_exprs(clause, pstate, qry, |
1197 | groupClauses, hasJoinRTEs, |
1198 | have_non_var_grouping); |
1199 | if (hasJoinRTEs) |
1200 | clause = flatten_join_alias_vars(qry, clause); |
1201 | check_ungrouped_columns(clause, pstate, qry, |
1202 | groupClauses, groupClauseCommonVars, |
1203 | have_non_var_grouping, |
1204 | &func_grouped_rels); |
1205 | |
1206 | /* |
1207 | * Per spec, aggregates can't appear in a recursive term. |
1208 | */ |
1209 | if (pstate->p_hasAggs && hasSelfRefRTEs) |
1210 | ereport(ERROR, |
1211 | (errcode(ERRCODE_INVALID_RECURSION), |
1212 | errmsg("aggregate functions are not allowed in a recursive query's recursive term" ), |
1213 | parser_errposition(pstate, |
1214 | locate_agg_of_level((Node *) qry, 0)))); |
1215 | } |
1216 | |
1217 | /* |
1218 | * check_ungrouped_columns - |
1219 | * Scan the given expression tree for ungrouped variables (variables |
1220 | * that are not listed in the groupClauses list and are not within |
1221 | * the arguments of aggregate functions). Emit a suitable error message |
1222 | * if any are found. |
1223 | * |
1224 | * NOTE: we assume that the given clause has been transformed suitably for |
1225 | * parser output. This means we can use expression_tree_walker. |
1226 | * |
1227 | * NOTE: we recognize grouping expressions in the main query, but only |
1228 | * grouping Vars in subqueries. For example, this will be rejected, |
1229 | * although it could be allowed: |
1230 | * SELECT |
1231 | * (SELECT x FROM bar where y = (foo.a + foo.b)) |
1232 | * FROM foo |
1233 | * GROUP BY a + b; |
1234 | * The difficulty is the need to account for different sublevels_up. |
1235 | * This appears to require a whole custom version of equal(), which is |
1236 | * way more pain than the feature seems worth. |
1237 | */ |
1238 | static void |
1239 | check_ungrouped_columns(Node *node, ParseState *pstate, Query *qry, |
1240 | List *groupClauses, List *groupClauseCommonVars, |
1241 | bool have_non_var_grouping, |
1242 | List **func_grouped_rels) |
1243 | { |
1244 | check_ungrouped_columns_context context; |
1245 | |
1246 | context.pstate = pstate; |
1247 | context.qry = qry; |
1248 | context.hasJoinRTEs = false; /* assume caller flattened join Vars */ |
1249 | context.groupClauses = groupClauses; |
1250 | context.groupClauseCommonVars = groupClauseCommonVars; |
1251 | context.have_non_var_grouping = have_non_var_grouping; |
1252 | context.func_grouped_rels = func_grouped_rels; |
1253 | context.sublevels_up = 0; |
1254 | context.in_agg_direct_args = false; |
1255 | check_ungrouped_columns_walker(node, &context); |
1256 | } |
1257 | |
1258 | static bool |
1259 | check_ungrouped_columns_walker(Node *node, |
1260 | check_ungrouped_columns_context *context) |
1261 | { |
1262 | ListCell *gl; |
1263 | |
1264 | if (node == NULL) |
1265 | return false; |
1266 | if (IsA(node, Const) || |
1267 | IsA(node, Param)) |
1268 | return false; /* constants are always acceptable */ |
1269 | |
1270 | if (IsA(node, Aggref)) |
1271 | { |
1272 | Aggref *agg = (Aggref *) node; |
1273 | |
1274 | if ((int) agg->agglevelsup == context->sublevels_up) |
1275 | { |
1276 | /* |
1277 | * If we find an aggregate call of the original level, do not |
1278 | * recurse into its normal arguments, ORDER BY arguments, or |
1279 | * filter; ungrouped vars there are not an error. But we should |
1280 | * check direct arguments as though they weren't in an aggregate. |
1281 | * We set a special flag in the context to help produce a useful |
1282 | * error message for ungrouped vars in direct arguments. |
1283 | */ |
1284 | bool result; |
1285 | |
1286 | Assert(!context->in_agg_direct_args); |
1287 | context->in_agg_direct_args = true; |
1288 | result = check_ungrouped_columns_walker((Node *) agg->aggdirectargs, |
1289 | context); |
1290 | context->in_agg_direct_args = false; |
1291 | return result; |
1292 | } |
1293 | |
1294 | /* |
1295 | * We can skip recursing into aggregates of higher levels altogether, |
1296 | * since they could not possibly contain Vars of concern to us (see |
1297 | * transformAggregateCall). We do need to look at aggregates of lower |
1298 | * levels, however. |
1299 | */ |
1300 | if ((int) agg->agglevelsup > context->sublevels_up) |
1301 | return false; |
1302 | } |
1303 | |
1304 | if (IsA(node, GroupingFunc)) |
1305 | { |
1306 | GroupingFunc *grp = (GroupingFunc *) node; |
1307 | |
1308 | /* handled GroupingFunc separately, no need to recheck at this level */ |
1309 | |
1310 | if ((int) grp->agglevelsup >= context->sublevels_up) |
1311 | return false; |
1312 | } |
1313 | |
1314 | /* |
1315 | * If we have any GROUP BY items that are not simple Vars, check to see if |
1316 | * subexpression as a whole matches any GROUP BY item. We need to do this |
1317 | * at every recursion level so that we recognize GROUPed-BY expressions |
1318 | * before reaching variables within them. But this only works at the outer |
1319 | * query level, as noted above. |
1320 | */ |
1321 | if (context->have_non_var_grouping && context->sublevels_up == 0) |
1322 | { |
1323 | foreach(gl, context->groupClauses) |
1324 | { |
1325 | TargetEntry *tle = lfirst(gl); |
1326 | |
1327 | if (equal(node, tle->expr)) |
1328 | return false; /* acceptable, do not descend more */ |
1329 | } |
1330 | } |
1331 | |
1332 | /* |
1333 | * If we have an ungrouped Var of the original query level, we have a |
1334 | * failure. Vars below the original query level are not a problem, and |
1335 | * neither are Vars from above it. (If such Vars are ungrouped as far as |
1336 | * their own query level is concerned, that's someone else's problem...) |
1337 | */ |
1338 | if (IsA(node, Var)) |
1339 | { |
1340 | Var *var = (Var *) node; |
1341 | RangeTblEntry *rte; |
1342 | char *attname; |
1343 | |
1344 | if (var->varlevelsup != context->sublevels_up) |
1345 | return false; /* it's not local to my query, ignore */ |
1346 | |
1347 | /* |
1348 | * Check for a match, if we didn't do it above. |
1349 | */ |
1350 | if (!context->have_non_var_grouping || context->sublevels_up != 0) |
1351 | { |
1352 | foreach(gl, context->groupClauses) |
1353 | { |
1354 | Var *gvar = (Var *) ((TargetEntry *) lfirst(gl))->expr; |
1355 | |
1356 | if (IsA(gvar, Var) && |
1357 | gvar->varno == var->varno && |
1358 | gvar->varattno == var->varattno && |
1359 | gvar->varlevelsup == 0) |
1360 | return false; /* acceptable, we're okay */ |
1361 | } |
1362 | } |
1363 | |
1364 | /* |
1365 | * Check whether the Var is known functionally dependent on the GROUP |
1366 | * BY columns. If so, we can allow the Var to be used, because the |
1367 | * grouping is really a no-op for this table. However, this deduction |
1368 | * depends on one or more constraints of the table, so we have to add |
1369 | * those constraints to the query's constraintDeps list, because it's |
1370 | * not semantically valid anymore if the constraint(s) get dropped. |
1371 | * (Therefore, this check must be the last-ditch effort before raising |
1372 | * error: we don't want to add dependencies unnecessarily.) |
1373 | * |
1374 | * Because this is a pretty expensive check, and will have the same |
1375 | * outcome for all columns of a table, we remember which RTEs we've |
1376 | * already proven functional dependency for in the func_grouped_rels |
1377 | * list. This test also prevents us from adding duplicate entries to |
1378 | * the constraintDeps list. |
1379 | */ |
1380 | if (list_member_int(*context->func_grouped_rels, var->varno)) |
1381 | return false; /* previously proven acceptable */ |
1382 | |
1383 | Assert(var->varno > 0 && |
1384 | (int) var->varno <= list_length(context->pstate->p_rtable)); |
1385 | rte = rt_fetch(var->varno, context->pstate->p_rtable); |
1386 | if (rte->rtekind == RTE_RELATION) |
1387 | { |
1388 | if (check_functional_grouping(rte->relid, |
1389 | var->varno, |
1390 | 0, |
1391 | context->groupClauseCommonVars, |
1392 | &context->qry->constraintDeps)) |
1393 | { |
1394 | *context->func_grouped_rels = |
1395 | lappend_int(*context->func_grouped_rels, var->varno); |
1396 | return false; /* acceptable */ |
1397 | } |
1398 | } |
1399 | |
1400 | /* Found an ungrouped local variable; generate error message */ |
1401 | attname = get_rte_attribute_name(rte, var->varattno); |
1402 | if (context->sublevels_up == 0) |
1403 | ereport(ERROR, |
1404 | (errcode(ERRCODE_GROUPING_ERROR), |
1405 | errmsg("column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" , |
1406 | rte->eref->aliasname, attname), |
1407 | context->in_agg_direct_args ? |
1408 | errdetail("Direct arguments of an ordered-set aggregate must use only grouped columns." ) : 0, |
1409 | parser_errposition(context->pstate, var->location))); |
1410 | else |
1411 | ereport(ERROR, |
1412 | (errcode(ERRCODE_GROUPING_ERROR), |
1413 | errmsg("subquery uses ungrouped column \"%s.%s\" from outer query" , |
1414 | rte->eref->aliasname, attname), |
1415 | parser_errposition(context->pstate, var->location))); |
1416 | } |
1417 | |
1418 | if (IsA(node, Query)) |
1419 | { |
1420 | /* Recurse into subselects */ |
1421 | bool result; |
1422 | |
1423 | context->sublevels_up++; |
1424 | result = query_tree_walker((Query *) node, |
1425 | check_ungrouped_columns_walker, |
1426 | (void *) context, |
1427 | 0); |
1428 | context->sublevels_up--; |
1429 | return result; |
1430 | } |
1431 | return expression_tree_walker(node, check_ungrouped_columns_walker, |
1432 | (void *) context); |
1433 | } |
1434 | |
1435 | /* |
1436 | * finalize_grouping_exprs - |
1437 | * Scan the given expression tree for GROUPING() and related calls, |
1438 | * and validate and process their arguments. |
1439 | * |
1440 | * This is split out from check_ungrouped_columns above because it needs |
1441 | * to modify the nodes (which it does in-place, not via a mutator) while |
1442 | * check_ungrouped_columns may see only a copy of the original thanks to |
1443 | * flattening of join alias vars. So here, we flatten each individual |
1444 | * GROUPING argument as we see it before comparing it. |
1445 | */ |
1446 | static void |
1447 | finalize_grouping_exprs(Node *node, ParseState *pstate, Query *qry, |
1448 | List *groupClauses, bool hasJoinRTEs, |
1449 | bool have_non_var_grouping) |
1450 | { |
1451 | check_ungrouped_columns_context context; |
1452 | |
1453 | context.pstate = pstate; |
1454 | context.qry = qry; |
1455 | context.hasJoinRTEs = hasJoinRTEs; |
1456 | context.groupClauses = groupClauses; |
1457 | context.groupClauseCommonVars = NIL; |
1458 | context.have_non_var_grouping = have_non_var_grouping; |
1459 | context.func_grouped_rels = NULL; |
1460 | context.sublevels_up = 0; |
1461 | context.in_agg_direct_args = false; |
1462 | finalize_grouping_exprs_walker(node, &context); |
1463 | } |
1464 | |
1465 | static bool |
1466 | finalize_grouping_exprs_walker(Node *node, |
1467 | check_ungrouped_columns_context *context) |
1468 | { |
1469 | ListCell *gl; |
1470 | |
1471 | if (node == NULL) |
1472 | return false; |
1473 | if (IsA(node, Const) || |
1474 | IsA(node, Param)) |
1475 | return false; /* constants are always acceptable */ |
1476 | |
1477 | if (IsA(node, Aggref)) |
1478 | { |
1479 | Aggref *agg = (Aggref *) node; |
1480 | |
1481 | if ((int) agg->agglevelsup == context->sublevels_up) |
1482 | { |
1483 | /* |
1484 | * If we find an aggregate call of the original level, do not |
1485 | * recurse into its normal arguments, ORDER BY arguments, or |
1486 | * filter; GROUPING exprs of this level are not allowed there. But |
1487 | * check direct arguments as though they weren't in an aggregate. |
1488 | */ |
1489 | bool result; |
1490 | |
1491 | Assert(!context->in_agg_direct_args); |
1492 | context->in_agg_direct_args = true; |
1493 | result = finalize_grouping_exprs_walker((Node *) agg->aggdirectargs, |
1494 | context); |
1495 | context->in_agg_direct_args = false; |
1496 | return result; |
1497 | } |
1498 | |
1499 | /* |
1500 | * We can skip recursing into aggregates of higher levels altogether, |
1501 | * since they could not possibly contain exprs of concern to us (see |
1502 | * transformAggregateCall). We do need to look at aggregates of lower |
1503 | * levels, however. |
1504 | */ |
1505 | if ((int) agg->agglevelsup > context->sublevels_up) |
1506 | return false; |
1507 | } |
1508 | |
1509 | if (IsA(node, GroupingFunc)) |
1510 | { |
1511 | GroupingFunc *grp = (GroupingFunc *) node; |
1512 | |
1513 | /* |
1514 | * We only need to check GroupingFunc nodes at the exact level to |
1515 | * which they belong, since they cannot mix levels in arguments. |
1516 | */ |
1517 | |
1518 | if ((int) grp->agglevelsup == context->sublevels_up) |
1519 | { |
1520 | ListCell *lc; |
1521 | List *ref_list = NIL; |
1522 | |
1523 | foreach(lc, grp->args) |
1524 | { |
1525 | Node *expr = lfirst(lc); |
1526 | Index ref = 0; |
1527 | |
1528 | if (context->hasJoinRTEs) |
1529 | expr = flatten_join_alias_vars(context->qry, expr); |
1530 | |
1531 | /* |
1532 | * Each expression must match a grouping entry at the current |
1533 | * query level. Unlike the general expression case, we don't |
1534 | * allow functional dependencies or outer references. |
1535 | */ |
1536 | |
1537 | if (IsA(expr, Var)) |
1538 | { |
1539 | Var *var = (Var *) expr; |
1540 | |
1541 | if (var->varlevelsup == context->sublevels_up) |
1542 | { |
1543 | foreach(gl, context->groupClauses) |
1544 | { |
1545 | TargetEntry *tle = lfirst(gl); |
1546 | Var *gvar = (Var *) tle->expr; |
1547 | |
1548 | if (IsA(gvar, Var) && |
1549 | gvar->varno == var->varno && |
1550 | gvar->varattno == var->varattno && |
1551 | gvar->varlevelsup == 0) |
1552 | { |
1553 | ref = tle->ressortgroupref; |
1554 | break; |
1555 | } |
1556 | } |
1557 | } |
1558 | } |
1559 | else if (context->have_non_var_grouping && |
1560 | context->sublevels_up == 0) |
1561 | { |
1562 | foreach(gl, context->groupClauses) |
1563 | { |
1564 | TargetEntry *tle = lfirst(gl); |
1565 | |
1566 | if (equal(expr, tle->expr)) |
1567 | { |
1568 | ref = tle->ressortgroupref; |
1569 | break; |
1570 | } |
1571 | } |
1572 | } |
1573 | |
1574 | if (ref == 0) |
1575 | ereport(ERROR, |
1576 | (errcode(ERRCODE_GROUPING_ERROR), |
1577 | errmsg("arguments to GROUPING must be grouping expressions of the associated query level" ), |
1578 | parser_errposition(context->pstate, |
1579 | exprLocation(expr)))); |
1580 | |
1581 | ref_list = lappend_int(ref_list, ref); |
1582 | } |
1583 | |
1584 | grp->refs = ref_list; |
1585 | } |
1586 | |
1587 | if ((int) grp->agglevelsup > context->sublevels_up) |
1588 | return false; |
1589 | } |
1590 | |
1591 | if (IsA(node, Query)) |
1592 | { |
1593 | /* Recurse into subselects */ |
1594 | bool result; |
1595 | |
1596 | context->sublevels_up++; |
1597 | result = query_tree_walker((Query *) node, |
1598 | finalize_grouping_exprs_walker, |
1599 | (void *) context, |
1600 | 0); |
1601 | context->sublevels_up--; |
1602 | return result; |
1603 | } |
1604 | return expression_tree_walker(node, finalize_grouping_exprs_walker, |
1605 | (void *) context); |
1606 | } |
1607 | |
1608 | |
1609 | /* |
1610 | * Given a GroupingSet node, expand it and return a list of lists. |
1611 | * |
1612 | * For EMPTY nodes, return a list of one empty list. |
1613 | * |
1614 | * For SIMPLE nodes, return a list of one list, which is the node content. |
1615 | * |
1616 | * For CUBE and ROLLUP nodes, return a list of the expansions. |
1617 | * |
1618 | * For SET nodes, recursively expand contained CUBE and ROLLUP. |
1619 | */ |
1620 | static List * |
1621 | expand_groupingset_node(GroupingSet *gs) |
1622 | { |
1623 | List *result = NIL; |
1624 | |
1625 | switch (gs->kind) |
1626 | { |
1627 | case GROUPING_SET_EMPTY: |
1628 | result = list_make1(NIL); |
1629 | break; |
1630 | |
1631 | case GROUPING_SET_SIMPLE: |
1632 | result = list_make1(gs->content); |
1633 | break; |
1634 | |
1635 | case GROUPING_SET_ROLLUP: |
1636 | { |
1637 | List *rollup_val = gs->content; |
1638 | ListCell *lc; |
1639 | int curgroup_size = list_length(gs->content); |
1640 | |
1641 | while (curgroup_size > 0) |
1642 | { |
1643 | List *current_result = NIL; |
1644 | int i = curgroup_size; |
1645 | |
1646 | foreach(lc, rollup_val) |
1647 | { |
1648 | GroupingSet *gs_current = (GroupingSet *) lfirst(lc); |
1649 | |
1650 | Assert(gs_current->kind == GROUPING_SET_SIMPLE); |
1651 | |
1652 | current_result |
1653 | = list_concat(current_result, |
1654 | list_copy(gs_current->content)); |
1655 | |
1656 | /* If we are done with making the current group, break */ |
1657 | if (--i == 0) |
1658 | break; |
1659 | } |
1660 | |
1661 | result = lappend(result, current_result); |
1662 | --curgroup_size; |
1663 | } |
1664 | |
1665 | result = lappend(result, NIL); |
1666 | } |
1667 | break; |
1668 | |
1669 | case GROUPING_SET_CUBE: |
1670 | { |
1671 | List *cube_list = gs->content; |
1672 | int number_bits = list_length(cube_list); |
1673 | uint32 num_sets; |
1674 | uint32 i; |
1675 | |
1676 | /* parser should cap this much lower */ |
1677 | Assert(number_bits < 31); |
1678 | |
1679 | num_sets = (1U << number_bits); |
1680 | |
1681 | for (i = 0; i < num_sets; i++) |
1682 | { |
1683 | List *current_result = NIL; |
1684 | ListCell *lc; |
1685 | uint32 mask = 1U; |
1686 | |
1687 | foreach(lc, cube_list) |
1688 | { |
1689 | GroupingSet *gs_current = (GroupingSet *) lfirst(lc); |
1690 | |
1691 | Assert(gs_current->kind == GROUPING_SET_SIMPLE); |
1692 | |
1693 | if (mask & i) |
1694 | { |
1695 | current_result |
1696 | = list_concat(current_result, |
1697 | list_copy(gs_current->content)); |
1698 | } |
1699 | |
1700 | mask <<= 1; |
1701 | } |
1702 | |
1703 | result = lappend(result, current_result); |
1704 | } |
1705 | } |
1706 | break; |
1707 | |
1708 | case GROUPING_SET_SETS: |
1709 | { |
1710 | ListCell *lc; |
1711 | |
1712 | foreach(lc, gs->content) |
1713 | { |
1714 | List *current_result = expand_groupingset_node(lfirst(lc)); |
1715 | |
1716 | result = list_concat(result, current_result); |
1717 | } |
1718 | } |
1719 | break; |
1720 | } |
1721 | |
1722 | return result; |
1723 | } |
1724 | |
1725 | static int |
1726 | cmp_list_len_asc(const void *a, const void *b) |
1727 | { |
1728 | int la = list_length(*(List *const *) a); |
1729 | int lb = list_length(*(List *const *) b); |
1730 | |
1731 | return (la > lb) ? 1 : (la == lb) ? 0 : -1; |
1732 | } |
1733 | |
1734 | /* |
1735 | * Expand a groupingSets clause to a flat list of grouping sets. |
1736 | * The returned list is sorted by length, shortest sets first. |
1737 | * |
1738 | * This is mainly for the planner, but we use it here too to do |
1739 | * some consistency checks. |
1740 | */ |
1741 | List * |
1742 | expand_grouping_sets(List *groupingSets, int limit) |
1743 | { |
1744 | List *expanded_groups = NIL; |
1745 | List *result = NIL; |
1746 | double numsets = 1; |
1747 | ListCell *lc; |
1748 | |
1749 | if (groupingSets == NIL) |
1750 | return NIL; |
1751 | |
1752 | foreach(lc, groupingSets) |
1753 | { |
1754 | List *current_result = NIL; |
1755 | GroupingSet *gs = lfirst(lc); |
1756 | |
1757 | current_result = expand_groupingset_node(gs); |
1758 | |
1759 | Assert(current_result != NIL); |
1760 | |
1761 | numsets *= list_length(current_result); |
1762 | |
1763 | if (limit >= 0 && numsets > limit) |
1764 | return NIL; |
1765 | |
1766 | expanded_groups = lappend(expanded_groups, current_result); |
1767 | } |
1768 | |
1769 | /* |
1770 | * Do cartesian product between sublists of expanded_groups. While at it, |
1771 | * remove any duplicate elements from individual grouping sets (we must |
1772 | * NOT change the number of sets though) |
1773 | */ |
1774 | |
1775 | foreach(lc, (List *) linitial(expanded_groups)) |
1776 | { |
1777 | result = lappend(result, list_union_int(NIL, (List *) lfirst(lc))); |
1778 | } |
1779 | |
1780 | for_each_cell(lc, lnext(list_head(expanded_groups))) |
1781 | { |
1782 | List *p = lfirst(lc); |
1783 | List *new_result = NIL; |
1784 | ListCell *lc2; |
1785 | |
1786 | foreach(lc2, result) |
1787 | { |
1788 | List *q = lfirst(lc2); |
1789 | ListCell *lc3; |
1790 | |
1791 | foreach(lc3, p) |
1792 | { |
1793 | new_result = lappend(new_result, |
1794 | list_union_int(q, (List *) lfirst(lc3))); |
1795 | } |
1796 | } |
1797 | result = new_result; |
1798 | } |
1799 | |
1800 | if (list_length(result) > 1) |
1801 | { |
1802 | int result_len = list_length(result); |
1803 | List **buf = palloc(sizeof(List *) * result_len); |
1804 | List **ptr = buf; |
1805 | |
1806 | foreach(lc, result) |
1807 | { |
1808 | *ptr++ = lfirst(lc); |
1809 | } |
1810 | |
1811 | qsort(buf, result_len, sizeof(List *), cmp_list_len_asc); |
1812 | |
1813 | result = NIL; |
1814 | ptr = buf; |
1815 | |
1816 | while (result_len-- > 0) |
1817 | result = lappend(result, *ptr++); |
1818 | |
1819 | pfree(buf); |
1820 | } |
1821 | |
1822 | return result; |
1823 | } |
1824 | |
1825 | /* |
1826 | * get_aggregate_argtypes |
1827 | * Identify the specific datatypes passed to an aggregate call. |
1828 | * |
1829 | * Given an Aggref, extract the actual datatypes of the input arguments. |
1830 | * The input datatypes are reported in a way that matches up with the |
1831 | * aggregate's declaration, ie, any ORDER BY columns attached to a plain |
1832 | * aggregate are ignored, but we report both direct and aggregated args of |
1833 | * an ordered-set aggregate. |
1834 | * |
1835 | * Datatypes are returned into inputTypes[], which must reference an array |
1836 | * of length FUNC_MAX_ARGS. |
1837 | * |
1838 | * The function result is the number of actual arguments. |
1839 | */ |
1840 | int |
1841 | get_aggregate_argtypes(Aggref *aggref, Oid *inputTypes) |
1842 | { |
1843 | int numArguments = 0; |
1844 | ListCell *lc; |
1845 | |
1846 | Assert(list_length(aggref->aggargtypes) <= FUNC_MAX_ARGS); |
1847 | |
1848 | foreach(lc, aggref->aggargtypes) |
1849 | { |
1850 | inputTypes[numArguments++] = lfirst_oid(lc); |
1851 | } |
1852 | |
1853 | return numArguments; |
1854 | } |
1855 | |
1856 | /* |
1857 | * resolve_aggregate_transtype |
1858 | * Identify the transition state value's datatype for an aggregate call. |
1859 | * |
1860 | * This function resolves a polymorphic aggregate's state datatype. |
1861 | * It must be passed the aggtranstype from the aggregate's catalog entry, |
1862 | * as well as the actual argument types extracted by get_aggregate_argtypes. |
1863 | * (We could fetch pg_aggregate.aggtranstype internally, but all existing |
1864 | * callers already have the value at hand, so we make them pass it.) |
1865 | */ |
1866 | Oid |
1867 | resolve_aggregate_transtype(Oid aggfuncid, |
1868 | Oid aggtranstype, |
1869 | Oid *inputTypes, |
1870 | int numArguments) |
1871 | { |
1872 | /* resolve actual type of transition state, if polymorphic */ |
1873 | if (IsPolymorphicType(aggtranstype)) |
1874 | { |
1875 | /* have to fetch the agg's declared input types... */ |
1876 | Oid *declaredArgTypes; |
1877 | int agg_nargs; |
1878 | |
1879 | (void) get_func_signature(aggfuncid, &declaredArgTypes, &agg_nargs); |
1880 | |
1881 | /* |
1882 | * VARIADIC ANY aggs could have more actual than declared args, but |
1883 | * such extra args can't affect polymorphic type resolution. |
1884 | */ |
1885 | Assert(agg_nargs <= numArguments); |
1886 | |
1887 | aggtranstype = enforce_generic_type_consistency(inputTypes, |
1888 | declaredArgTypes, |
1889 | agg_nargs, |
1890 | aggtranstype, |
1891 | false); |
1892 | pfree(declaredArgTypes); |
1893 | } |
1894 | return aggtranstype; |
1895 | } |
1896 | |
1897 | /* |
1898 | * Create an expression tree for the transition function of an aggregate. |
1899 | * This is needed so that polymorphic functions can be used within an |
1900 | * aggregate --- without the expression tree, such functions would not know |
1901 | * the datatypes they are supposed to use. (The trees will never actually |
1902 | * be executed, however, so we can skimp a bit on correctness.) |
1903 | * |
1904 | * agg_input_types and agg_state_type identifies the input types of the |
1905 | * aggregate. These should be resolved to actual types (ie, none should |
1906 | * ever be ANYELEMENT etc). |
1907 | * agg_input_collation is the aggregate function's input collation. |
1908 | * |
1909 | * For an ordered-set aggregate, remember that agg_input_types describes |
1910 | * the direct arguments followed by the aggregated arguments. |
1911 | * |
1912 | * transfn_oid and invtransfn_oid identify the funcs to be called; the |
1913 | * latter may be InvalidOid, however if invtransfn_oid is set then |
1914 | * transfn_oid must also be set. |
1915 | * |
1916 | * Pointers to the constructed trees are returned into *transfnexpr, |
1917 | * *invtransfnexpr. If there is no invtransfn, the respective pointer is set |
1918 | * to NULL. Since use of the invtransfn is optional, NULL may be passed for |
1919 | * invtransfnexpr. |
1920 | */ |
1921 | void |
1922 | build_aggregate_transfn_expr(Oid *agg_input_types, |
1923 | int agg_num_inputs, |
1924 | int agg_num_direct_inputs, |
1925 | bool agg_variadic, |
1926 | Oid agg_state_type, |
1927 | Oid agg_input_collation, |
1928 | Oid transfn_oid, |
1929 | Oid invtransfn_oid, |
1930 | Expr **transfnexpr, |
1931 | Expr **invtransfnexpr) |
1932 | { |
1933 | List *args; |
1934 | FuncExpr *fexpr; |
1935 | int i; |
1936 | |
1937 | /* |
1938 | * Build arg list to use in the transfn FuncExpr node. |
1939 | */ |
1940 | args = list_make1(make_agg_arg(agg_state_type, agg_input_collation)); |
1941 | |
1942 | for (i = agg_num_direct_inputs; i < agg_num_inputs; i++) |
1943 | { |
1944 | args = lappend(args, |
1945 | make_agg_arg(agg_input_types[i], agg_input_collation)); |
1946 | } |
1947 | |
1948 | fexpr = makeFuncExpr(transfn_oid, |
1949 | agg_state_type, |
1950 | args, |
1951 | InvalidOid, |
1952 | agg_input_collation, |
1953 | COERCE_EXPLICIT_CALL); |
1954 | fexpr->funcvariadic = agg_variadic; |
1955 | *transfnexpr = (Expr *) fexpr; |
1956 | |
1957 | /* |
1958 | * Build invtransfn expression if requested, with same args as transfn |
1959 | */ |
1960 | if (invtransfnexpr != NULL) |
1961 | { |
1962 | if (OidIsValid(invtransfn_oid)) |
1963 | { |
1964 | fexpr = makeFuncExpr(invtransfn_oid, |
1965 | agg_state_type, |
1966 | args, |
1967 | InvalidOid, |
1968 | agg_input_collation, |
1969 | COERCE_EXPLICIT_CALL); |
1970 | fexpr->funcvariadic = agg_variadic; |
1971 | *invtransfnexpr = (Expr *) fexpr; |
1972 | } |
1973 | else |
1974 | *invtransfnexpr = NULL; |
1975 | } |
1976 | } |
1977 | |
1978 | /* |
1979 | * Like build_aggregate_transfn_expr, but creates an expression tree for the |
1980 | * combine function of an aggregate, rather than the transition function. |
1981 | */ |
1982 | void |
1983 | build_aggregate_combinefn_expr(Oid agg_state_type, |
1984 | Oid agg_input_collation, |
1985 | Oid combinefn_oid, |
1986 | Expr **combinefnexpr) |
1987 | { |
1988 | Node *argp; |
1989 | List *args; |
1990 | FuncExpr *fexpr; |
1991 | |
1992 | /* combinefn takes two arguments of the aggregate state type */ |
1993 | argp = make_agg_arg(agg_state_type, agg_input_collation); |
1994 | |
1995 | args = list_make2(argp, argp); |
1996 | |
1997 | fexpr = makeFuncExpr(combinefn_oid, |
1998 | agg_state_type, |
1999 | args, |
2000 | InvalidOid, |
2001 | agg_input_collation, |
2002 | COERCE_EXPLICIT_CALL); |
2003 | /* combinefn is currently never treated as variadic */ |
2004 | *combinefnexpr = (Expr *) fexpr; |
2005 | } |
2006 | |
2007 | /* |
2008 | * Like build_aggregate_transfn_expr, but creates an expression tree for the |
2009 | * serialization function of an aggregate. |
2010 | */ |
2011 | void |
2012 | build_aggregate_serialfn_expr(Oid serialfn_oid, |
2013 | Expr **serialfnexpr) |
2014 | { |
2015 | List *args; |
2016 | FuncExpr *fexpr; |
2017 | |
2018 | /* serialfn always takes INTERNAL and returns BYTEA */ |
2019 | args = list_make1(make_agg_arg(INTERNALOID, InvalidOid)); |
2020 | |
2021 | fexpr = makeFuncExpr(serialfn_oid, |
2022 | BYTEAOID, |
2023 | args, |
2024 | InvalidOid, |
2025 | InvalidOid, |
2026 | COERCE_EXPLICIT_CALL); |
2027 | *serialfnexpr = (Expr *) fexpr; |
2028 | } |
2029 | |
2030 | /* |
2031 | * Like build_aggregate_transfn_expr, but creates an expression tree for the |
2032 | * deserialization function of an aggregate. |
2033 | */ |
2034 | void |
2035 | build_aggregate_deserialfn_expr(Oid deserialfn_oid, |
2036 | Expr **deserialfnexpr) |
2037 | { |
2038 | List *args; |
2039 | FuncExpr *fexpr; |
2040 | |
2041 | /* deserialfn always takes BYTEA, INTERNAL and returns INTERNAL */ |
2042 | args = list_make2(make_agg_arg(BYTEAOID, InvalidOid), |
2043 | make_agg_arg(INTERNALOID, InvalidOid)); |
2044 | |
2045 | fexpr = makeFuncExpr(deserialfn_oid, |
2046 | INTERNALOID, |
2047 | args, |
2048 | InvalidOid, |
2049 | InvalidOid, |
2050 | COERCE_EXPLICIT_CALL); |
2051 | *deserialfnexpr = (Expr *) fexpr; |
2052 | } |
2053 | |
2054 | /* |
2055 | * Like build_aggregate_transfn_expr, but creates an expression tree for the |
2056 | * final function of an aggregate, rather than the transition function. |
2057 | */ |
2058 | void |
2059 | build_aggregate_finalfn_expr(Oid *agg_input_types, |
2060 | int num_finalfn_inputs, |
2061 | Oid agg_state_type, |
2062 | Oid agg_result_type, |
2063 | Oid agg_input_collation, |
2064 | Oid finalfn_oid, |
2065 | Expr **finalfnexpr) |
2066 | { |
2067 | List *args; |
2068 | int i; |
2069 | |
2070 | /* |
2071 | * Build expr tree for final function |
2072 | */ |
2073 | args = list_make1(make_agg_arg(agg_state_type, agg_input_collation)); |
2074 | |
2075 | /* finalfn may take additional args, which match agg's input types */ |
2076 | for (i = 0; i < num_finalfn_inputs - 1; i++) |
2077 | { |
2078 | args = lappend(args, |
2079 | make_agg_arg(agg_input_types[i], agg_input_collation)); |
2080 | } |
2081 | |
2082 | *finalfnexpr = (Expr *) makeFuncExpr(finalfn_oid, |
2083 | agg_result_type, |
2084 | args, |
2085 | InvalidOid, |
2086 | agg_input_collation, |
2087 | COERCE_EXPLICIT_CALL); |
2088 | /* finalfn is currently never treated as variadic */ |
2089 | } |
2090 | |
2091 | /* |
2092 | * Convenience function to build dummy argument expressions for aggregates. |
2093 | * |
2094 | * We really only care that an aggregate support function can discover its |
2095 | * actual argument types at runtime using get_fn_expr_argtype(), so it's okay |
2096 | * to use Param nodes that don't correspond to any real Param. |
2097 | */ |
2098 | static Node * |
2099 | make_agg_arg(Oid argtype, Oid argcollation) |
2100 | { |
2101 | Param *argp = makeNode(Param); |
2102 | |
2103 | argp->paramkind = PARAM_EXEC; |
2104 | argp->paramid = -1; |
2105 | argp->paramtype = argtype; |
2106 | argp->paramtypmod = -1; |
2107 | argp->paramcollid = argcollation; |
2108 | argp->location = -1; |
2109 | return (Node *) argp; |
2110 | } |
2111 | |