]> granicus.if.org Git - postgresql/commitdiff
Move HAVING function to proper file.
authorBruce Momjian <bruce@momjian.us>
Wed, 15 Apr 1998 15:29:57 +0000 (15:29 +0000)
committerBruce Momjian <bruce@momjian.us>
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 */