From 5529b783a80447ce97ccab22d91eaa0f36f3ab9d Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Wed, 15 Apr 1998 15:29:57 +0000
Subject: [PATCH] Move HAVING function to proper file.

---
 src/backend/optimizer/plan/planner.c | 108 +-------------------------
 src/backend/optimizer/plan/setrefs.c | 109 ++++++++++++++++++++++++++-
 src/include/optimizer/planmain.h     |   4 +-
 3 files changed, 111 insertions(+), 110 deletions(-)

diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index 64549bfc98a..c88d201501c 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -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)
 {
diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c
index de4bbf95198..422ef3cc29a 100644
--- a/src/backend/optimizer/plan/setrefs.c
+++ b/src/backend/optimizer/plan/setrefs.c
@@ -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;
+	}
+}
+
+
+
diff --git a/src/include/optimizer/planmain.h b/src/include/optimizer/planmain.h
index 0e7708c60e1..a80cf48e135 100644
--- a/src/include/optimizer/planmain.h
+++ b/src/include/optimizer/planmain.h
@@ -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 */
-- 
GitLab