mirror of
https://github.com/postgres/postgres.git
synced 2025-06-05 00:02:04 -04:00
Move HAVING function to proper file.
This commit is contained in:
parent
11c091272a
commit
5529b783a8
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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
|
* 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 *
|
Plan *
|
||||||
planner(Query *parse)
|
planner(Query *parse)
|
||||||
{
|
{
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* 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 List *set_agg_tlist_references(Agg *aggNode);
|
||||||
extern void set_agg_agglist_references(Agg *aggNode);
|
extern void set_agg_agglist_references(Agg *aggNode);
|
||||||
extern void del_agg_tlist_references(List *tlist);
|
extern void del_agg_tlist_references(List *tlist);
|
||||||
|
extern List *check_having_qual_for_aggs(Node *clause, List *subplanTargetList);
|
||||||
|
|
||||||
#endif /* PLANMAIN_H */
|
#endif /* PLANMAIN_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user