LCOV - code coverage report
Current view: top level - src/backend/parser - parse_agg.c (source / functions) Hit Total Coverage
Test: PostgreSQL 19devel Lines: 635 830 76.5 %
Date: 2025-09-18 03:18:10 Functions: 24 24 100.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.16