]> granicus.if.org Git - postgresql/commitdiff
Pass incompletely-transformed aggregate argument lists as separate parameters
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 17 Mar 2010 16:52:38 +0000 (16:52 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 17 Mar 2010 16:52:38 +0000 (16:52 +0000)
to transformAggregateCall, instead of abusing fields in Aggref to carry them
temporarily.  No change in functionality but hopefully the code is a bit
clearer now.  Per gripe from Gokulakannan Somasundaram.

src/backend/parser/parse_agg.c
src/backend/parser/parse_func.c
src/include/parser/parse_agg.h

index d30d01261f77a584cd9cbc4f732a6bc60d22af54..c36c5fb08c6144a932886e1307d5916838a2253d 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/parser/parse_agg.c,v 1.92 2010/02/26 02:00:49 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/parser/parse_agg.c,v 1.93 2010/03/17 16:52:38 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -44,10 +44,11 @@ static bool check_ungrouped_columns_walker(Node *node,
  * transformAggregateCall -
  *             Finish initial transformation of an aggregate call
  *
- * parse_func.c has recognized the function as an aggregate, and has set
- * up all the fields of the Aggref except aggdistinct and agglevelsup.
- * However, the args list is just bare expressions, and the aggorder list
- * hasn't been transformed at all.
+ * parse_func.c has recognized the function as an aggregate, and has set up
+ * all the fields of the Aggref except args, aggorder, aggdistinct and
+ * agglevelsup.  The passed-in args list has been through standard expression
+ * transformation, while the passed-in aggorder list hasn't been transformed
+ * at all.
  *
  * Here we convert the args list into a targetlist by inserting TargetEntry
  * nodes, and then transform the aggorder and agg_distinct specifications to
@@ -59,7 +60,8 @@ static bool check_ungrouped_columns_walker(Node *node,
  * pstate level.
  */
 void
-transformAggregateCall(ParseState *pstate, Aggref *agg, bool agg_distinct)
+transformAggregateCall(ParseState *pstate, Aggref *agg,
+                                          List *args, List *aggorder, bool agg_distinct)
 {
        List       *tlist;
        List       *torder;
@@ -75,7 +77,7 @@ transformAggregateCall(ParseState *pstate, Aggref *agg, bool agg_distinct)
         */
        tlist = NIL;
        attno = 1;
-       foreach(lc, agg->args)
+       foreach(lc, args)
        {
                Expr       *arg = (Expr *) lfirst(lc);
                TargetEntry *tle = makeTargetEntry(arg, attno++, NULL, false);
@@ -96,7 +98,7 @@ transformAggregateCall(ParseState *pstate, Aggref *agg, bool agg_distinct)
        pstate->p_next_resno = attno;
 
        torder = transformSortClause(pstate,
-                                                                agg->aggorder,
+                                                                aggorder,
                                                                 &tlist,
                                                                 true /* fix unknowns */ ,
                                                                 true /* force SQL99 rules */ );
index dffc24c09e39ea38f4aff7720573c09d799ebaff..8a2663c232c66bd212c732cf6176aabcbc24a51d 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/parser/parse_func.c,v 1.222 2010/02/26 02:00:52 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/parser/parse_func.c,v 1.223 2010/03/17 16:52:38 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -381,10 +381,7 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
 
                aggref->aggfnoid = funcid;
                aggref->aggtype = rettype;
-               /* args and aggorder will be modified by transformAggregateCall */
-               aggref->args = fargs;
-               aggref->aggorder = agg_order;
-               /* aggdistinct will be set by transformAggregateCall */
+               /* args, aggorder, aggdistinct will be set by transformAggregateCall */
                aggref->aggstar = agg_star;
                /* agglevelsup will be set by transformAggregateCall */
                aggref->location = location;
@@ -419,7 +416,7 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
                                         parser_errposition(pstate, location)));
 
                /* parse_agg.c does additional aggregate-specific processing */
-               transformAggregateCall(pstate, aggref, agg_distinct);
+               transformAggregateCall(pstate, aggref, fargs, agg_order, agg_distinct);
 
                retval = (Node *) aggref;
        }
index 8da37ef3077c3e36fdf52da671e01d830b8283c6..5dc0da2f9b5693a4298d8e49cbfd1b3bd1e94c6d 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/parser/parse_agg.h,v 1.42 2010/02/26 02:01:26 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/parser/parse_agg.h,v 1.43 2010/03/17 16:52:38 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -16,6 +16,7 @@
 #include "parser/parse_node.h"
 
 extern void transformAggregateCall(ParseState *pstate, Aggref *agg,
+                                          List *args, List *aggorder,
                                           bool agg_distinct);
 extern void transformWindowFuncCall(ParseState *pstate, WindowFunc *wfunc,
                                                WindowDef *windef);