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