Move HAVING function to proper file.
authorBruce Momjian
Wed, 15 Apr 1998 15:29:57 +0000 (15:29 +0000)
committerBruce Momjian
Wed, 15 Apr 1998 15:29:57 +0000 (15:29 +0000)
src/backend/optimizer/plan/planner.c
src/backend/optimizer/plan/setrefs.c
src/include/optimizer/planmain.h

index 64549bfc98a8465f5459ddfb07ec4d1d648f678a..c88d201501cde45ebf881729e350e10ac8cf18eb 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.26 1998/04/13 21:07:09 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.27 1998/04/15 15:29:41 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -58,112 +58,6 @@ make_groupPlan(List **tlist, bool tuplePerGroup,
  *    Query optimizer entry point
  *
  *****************************************************************************/
-
-
-static List *
-check_having_qual_for_aggs(Node *clause, List *subplanTargetList)
-{
-   List       *t;
-   List       *agg_list = NIL;
-
-   if (IsA(clause, Var))
-   {
-     TargetEntry *subplanVar;
-     
-     /*
-      * Ha! A Var node!
-      */
-     subplanVar = match_varid((Var *) clause, subplanTargetList);
-     
-     /*
-      * Change the varno & varattno fields of the var node.
-      *
-      */
-     ((Var *) clause)->varattno = subplanVar->resdom->resno;
-     return NIL;
-   }
-   else if (is_funcclause(clause) || not_clause(clause) || 
-        or_clause(clause) || and_clause(clause))
-   {
-
-       /*
-        * This is a function. Recursively call this routine for its
-        * arguments...
-        */
-       foreach(t, ((Expr *) clause)->args)
-       {
-           agg_list = nconc(agg_list,
-                      check_having_qual_for_aggs(lfirst(t), subplanTargetList));
-       }
-       return agg_list;
-   }
-   else if (IsA(clause, Aggreg))
-   {
-       return lcons(clause,
-           check_having_qual_for_aggs(((Aggreg *) clause)->target, subplanTargetList));
-       
-   }
-   else if (IsA(clause, ArrayRef))
-   {
-       ArrayRef   *aref = (ArrayRef *) clause;
-
-       /*
-        * This is an arrayref. Recursively call this routine for its
-        * expression and its index expression...
-        */
-       foreach(t, aref->refupperindexpr)
-       {
-           agg_list = nconc(agg_list,
-                    check_having_qual_for_aggs(lfirst(t), subplanTargetList));
-       }
-       foreach(t, aref->reflowerindexpr)
-       {
-           agg_list = nconc(agg_list,
-                    check_having_qual_for_aggs(lfirst(t), subplanTargetList));
-       }
-       agg_list = nconc(agg_list,
-                check_having_qual_for_aggs(aref->refexpr, subplanTargetList));
-       agg_list = nconc(agg_list,
-                check_having_qual_for_aggs(aref->refassgnexpr, subplanTargetList));
-
-       return agg_list;
-   }
-   else if (is_opclause(clause))
-   {
-
-       /*
-        * This is an operator. Recursively call this routine for both its
-        * left and right operands
-        */
-       Node       *left = (Node *) get_leftop((Expr *) clause);
-       Node       *right = (Node *) get_rightop((Expr *) clause);
-
-       if (left != (Node *) NULL)
-           agg_list = nconc(agg_list,
-                    check_having_qual_for_aggs(left, subplanTargetList));
-       if (right != (Node *) NULL)
-           agg_list = nconc(agg_list,
-                    check_having_qual_for_aggs(right, subplanTargetList));
-
-       return agg_list;
-   }
-   else if (IsA(clause, Param) ||IsA(clause, Const))
-   {
-       /* do nothing! */
-       return NIL;
-   }
-   else
-   {
-
-       /*
-        * Ooops! we can not handle that!
-        */
-       elog(ERROR, "check_having_qual_for_aggs: Can not handle this having_qual!\n");
-       return NIL;
-   }
-}
-
-
 Plan *
 planner(Query *parse)
 {
index de4bbf9519807ffa15b79f5adbf917aabef00447..422ef3cc29aedf8338e226f1118ee5f6b8b69c78 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.20 1998/03/30 16:36:14 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.21 1998/04/15 15:29:44 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -934,3 +934,110 @@ del_agg_clause(Node *clause)
    }
    return NULL;
 }
+
+
+List *
+check_having_qual_for_aggs(Node *clause, List *subplanTargetList)
+{
+   List       *t;
+   List       *agg_list = NIL;
+
+   if (IsA(clause, Var))
+   {
+     TargetEntry *subplanVar;
+     
+     /*
+      * Ha! A Var node!
+      */
+     subplanVar = match_varid((Var *) clause, subplanTargetList);
+     
+     /*
+      * Change the varno & varattno fields of the var node.
+      *
+      */
+     ((Var *) clause)->varattno = subplanVar->resdom->resno;
+     return NIL;
+   }
+   else if (is_funcclause(clause) || not_clause(clause) || 
+        or_clause(clause) || and_clause(clause))
+   {
+
+       /*
+        * This is a function. Recursively call this routine for its
+        * arguments...
+        */
+       foreach(t, ((Expr *) clause)->args)
+       {
+           agg_list = nconc(agg_list,
+                      check_having_qual_for_aggs(lfirst(t), subplanTargetList));
+       }
+       return agg_list;
+   }
+   else if (IsA(clause, Aggreg))
+   {
+       return lcons(clause,
+           check_having_qual_for_aggs(((Aggreg *) clause)->target, subplanTargetList));
+       
+   }
+   else if (IsA(clause, ArrayRef))
+   {
+       ArrayRef   *aref = (ArrayRef *) clause;
+
+       /*
+        * This is an arrayref. Recursively call this routine for its
+        * expression and its index expression...
+        */
+       foreach(t, aref->refupperindexpr)
+       {
+           agg_list = nconc(agg_list,
+                    check_having_qual_for_aggs(lfirst(t), subplanTargetList));
+       }
+       foreach(t, aref->reflowerindexpr)
+       {
+           agg_list = nconc(agg_list,
+                    check_having_qual_for_aggs(lfirst(t), subplanTargetList));
+       }
+       agg_list = nconc(agg_list,
+                check_having_qual_for_aggs(aref->refexpr, subplanTargetList));
+       agg_list = nconc(agg_list,
+                check_having_qual_for_aggs(aref->refassgnexpr, subplanTargetList));
+
+       return agg_list;
+   }
+   else if (is_opclause(clause))
+   {
+
+       /*
+        * This is an operator. Recursively call this routine for both its
+        * left and right operands
+        */
+       Node       *left = (Node *) get_leftop((Expr *) clause);
+       Node       *right = (Node *) get_rightop((Expr *) clause);
+
+       if (left != (Node *) NULL)
+           agg_list = nconc(agg_list,
+                    check_having_qual_for_aggs(left, subplanTargetList));
+       if (right != (Node *) NULL)
+           agg_list = nconc(agg_list,
+                    check_having_qual_for_aggs(right, subplanTargetList));
+
+       return agg_list;
+   }
+   else if (IsA(clause, Param) ||IsA(clause, Const))
+   {
+       /* do nothing! */
+       return NIL;
+   }
+   else
+   {
+
+       /*
+        * Ooops! we can not handle that!
+        */
+       elog(ERROR, "check_having_qual_for_aggs: Can not handle this having_qual!\n");
+       return NIL;
+   }
+}
+
+
+
index 0e7708c60e103028c973d6838a37819acdb7dbc3..a80cf48e135626e554a15f293d13085ab712b019 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: planmain.h,v 1.11 1998/02/26 04:42:20 momjian Exp $
+ * $Id: planmain.h,v 1.12 1998/04/15 15:29:57 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -64,6 +64,6 @@ extern void set_result_tlist_references(Result *resultNode);
 extern List *set_agg_tlist_references(Agg *aggNode);
 extern void set_agg_agglist_references(Agg *aggNode);
 extern void del_agg_tlist_references(List *tlist);
-
+extern List *check_having_qual_for_aggs(Node *clause, List *subplanTargetList);
 
 #endif                         /* PLANMAIN_H */