LCOV - differential code coverage report
Current view: top level - src/backend/parser - parse_agg.c (source / functions) Coverage Total Hit UNC LBC UIC UBC GBC GIC GNC CBC EUB ECB DCB
Current: Differential Code Coverage HEAD vs 15 Lines: 75.5 % 799 603 1 22 69 104 18 360 17 208 74 371 2
Current Date: 2023-04-08 15:15:32 Functions: 100.0 % 23 23 22 1 23
Baseline: 15
Baseline Date: 2023-04-08 15:09:40
Legend: Lines: hit not hit

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

Generated by: LCOV version v1.16-55-g56c0a2a