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