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

Generated by: LCOV version 1.16