Fix using GroupBy/non-GroupBy expressions in HAVING.
authorVadim B. Mikheev
Wed, 9 Sep 1998 03:48:17 +0000 (03:48 +0000)
committerVadim B. Mikheev
Wed, 9 Sep 1998 03:48:17 +0000 (03:48 +0000)
src/backend/optimizer/plan/planner.c
src/backend/optimizer/plan/setrefs.c
src/backend/parser/parse_agg.c

index 4fa4a11b7b4354da177211f12e95d615567c6da5..9cf0746145a9065d9918664bdf5fe10b3efc7fb7 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.34 1998/09/08 02:50:20 vadim Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.35 1998/09/09 03:48:01 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -185,9 +185,6 @@ union_planner(Query *parse)
     */
    if (parse->hasAggs)
    {
-       int         old_length = 0,
-                   new_length = 0;
-
        result_plan = (Plan *) make_agg(tlist, result_plan);
 
        /*
@@ -256,31 +253,10 @@ union_planner(Query *parse)
             */
            foreach(clause, ((Agg *) result_plan)->plan.qual)
            {
-
-               /*
-                * Make sure there are aggregates in the havingQual if so,
-                * the list must be longer after
-                * check_having_qual_for_aggs
-                */
-               old_length = length(((Agg *) result_plan)->aggs);
-
                ((Agg *) result_plan)->aggs = nconc(((Agg *) result_plan)->aggs,
                      check_having_qual_for_aggs((Node *) lfirst(clause),
                        ((Agg *) result_plan)->plan.lefttree->targetlist,
                                         ((List *) parse->groupClause)));
-
-               /*
-                * Have a look at the length of the returned list. If
-                * there is no difference, no aggregates have been found
-                * and that means, that the Qual belongs to the where
-                * clause
-                */
-               if (((new_length = length(((Agg *) result_plan)->aggs)) == old_length) ||
-                   (new_length == 0))
-               {
-                   elog(ERROR, "This could have been done in a where clause!!");
-                   return (Plan *) NIL;
-               }
            }
            PlannerVarParam = lnext(PlannerVarParam);
            if (vpm != NULL)
index 6f134acddba8fca185dd261000e00fa364cdde0a..72c5bc66fe33fd2becb955ae954c3dbcb2a418e1 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.26 1998/09/01 04:29:54 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.27 1998/09/09 03:48:02 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1045,36 +1045,15 @@ check_having_qual_for_aggs(Node *clause, List *subplanTargetList, List *groupCla
    else if (is_funcclause(clause) || not_clause(clause) ||
             or_clause(clause) || and_clause(clause))
    {
-       int         new_length = 0,
-                   old_length = 0;
-
        /*
         * This is a function. Recursively call this routine for its
         * arguments... (i.e. for AND, OR, ... clauses!)
         */
        foreach(t, ((Expr *) clause)->args)
        {
-           old_length = length((List *) agg_list);
-
            agg_list = nconc(agg_list,
                 check_having_qual_for_aggs(lfirst(t), subplanTargetList,
                                            groupClause));
-
-           /*
-            * The arguments of OR or AND clauses are comparisons or
-            * relations and because we are in the havingQual there must
-            * be at least one operand using an aggregate function. If so,
-            * we will find it and the lenght of the agg_list will be
-            * increased after the above call to
-            * check_having_qual_for_aggs. If there are no aggregates
-            * used, the query could have been formulated using the
-            * 'where' clause
-            */
-           if (((new_length = length((List *) agg_list)) == old_length) || (new_length == 0))
-           {
-               elog(ERROR, "This could have been done in a where clause!!");
-               return NIL;
-           }
        }
        return agg_list;
    }
@@ -1199,7 +1178,6 @@ check_having_qual_for_aggs(Node *clause, List *subplanTargetList, List *groupCla
    }
    else
    {
-
        /*
         * Ooops! we can not handle that!
         */
index bb8d87d383bc5197ff4d08eae6e97db9b31c2eec..eef2808f50da9dd94747cfbe5c9252aabda2eb21 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/parser/parse_agg.c,v 1.13 1998/09/01 04:30:26 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/parser/parse_agg.c,v 1.14 1998/09/09 03:48:17 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -104,7 +104,8 @@ exprIsAggOrGroupCol(Node *expr, List *groupClause)
    List       *gl;
 
    if (expr == NULL || IsA(expr, Const) ||
-       IsA(expr, Param) ||IsA(expr, Aggreg))
+       IsA(expr, Param) || IsA(expr, Aggreg) || 
+       IsA(expr, SubLink))     /* can't handle currently !!! */
        return TRUE;
 
    foreach(gl, groupClause)
@@ -207,13 +208,10 @@ parseCheckAggregates(ParseState *pstate, Query *qry)
     * the expression specified in the HAVING clause has the same
     * restriction as those in the target list.
     */
-/*
- * Need to change here when we get HAVING works. Currently
- * qry->havingQual is NULL.        - vadim 04/05/97
+
    if (!exprIsAggOrGroupCol(qry->havingQual, qry->groupClause))
        elog(ERROR,
             "parser: illegal use of aggregates or non-group column in HAVING clause");
- */
    return;
 }