Minor code cleanup: remove no-longer-useful pull_subplans() function,

and convert pull_agg_clause() into count_agg_clause(), which is a more
efficient way of doing what it's really being used for.
This commit is contained in:
Tom Lane 2003-02-04 00:50:01 +00:00
parent 85caf1784a
commit 2d1f940542
3 changed files with 20 additions and 52 deletions

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.143 2003/02/03 15:07:07 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.144 2003/02/04 00:50:00 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -623,11 +623,14 @@ grouping_planner(Query *parse, double tuple_fraction)
* Will need actual number of aggregates for estimating costs. * Will need actual number of aggregates for estimating costs.
* Also, it's possible that optimization has eliminated all * Also, it's possible that optimization has eliminated all
* aggregates, and we may as well check for that here. * aggregates, and we may as well check for that here.
*
* Note: we do not attempt to detect duplicate aggregates here;
* a somewhat-overestimated count is okay for our present purposes.
*/ */
if (parse->hasAggs) if (parse->hasAggs)
{ {
numAggs = length(pull_agg_clause((Node *) tlist)) + numAggs = count_agg_clause((Node *) tlist) +
length(pull_agg_clause(parse->havingQual)); count_agg_clause(parse->havingQual);
if (numAggs == 0) if (numAggs == 0)
parse->hasAggs = false; parse->hasAggs = false;
} }

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.126 2003/02/03 21:15:44 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.127 2003/02/04 00:50:00 tgl Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
@ -51,10 +51,9 @@ typedef struct
static bool contain_agg_clause_walker(Node *node, void *context); static bool contain_agg_clause_walker(Node *node, void *context);
static bool contain_distinct_agg_clause_walker(Node *node, void *context); static bool contain_distinct_agg_clause_walker(Node *node, void *context);
static bool pull_agg_clause_walker(Node *node, List **listptr); static bool count_agg_clause_walker(Node *node, int *count);
static bool expression_returns_set_walker(Node *node, void *context); static bool expression_returns_set_walker(Node *node, void *context);
static bool contain_subplans_walker(Node *node, void *context); static bool contain_subplans_walker(Node *node, void *context);
static bool pull_subplans_walker(Node *node, List **listptr);
static bool contain_mutable_functions_walker(Node *node, void *context); static bool contain_mutable_functions_walker(Node *node, void *context);
static bool contain_volatile_functions_walker(Node *node, void *context); static bool contain_volatile_functions_walker(Node *node, void *context);
static bool contain_nonstrict_functions_walker(Node *node, void *context); static bool contain_nonstrict_functions_walker(Node *node, void *context);
@ -373,31 +372,28 @@ contain_distinct_agg_clause_walker(Node *node, void *context)
} }
/* /*
* pull_agg_clause * count_agg_clause
* Recursively pulls all Aggref nodes from an expression tree. * Recursively count the Aggref nodes in an expression tree.
*
* Returns list of Aggref nodes found. Note the nodes themselves are not
* copied, only referenced.
* *
* Note: this also checks for nested aggregates, which are an error. * Note: this also checks for nested aggregates, which are an error.
*/ */
List * int
pull_agg_clause(Node *clause) count_agg_clause(Node *clause)
{ {
List *result = NIL; int result = 0;
pull_agg_clause_walker(clause, &result); count_agg_clause_walker(clause, &result);
return result; return result;
} }
static bool static bool
pull_agg_clause_walker(Node *node, List **listptr) count_agg_clause_walker(Node *node, int *count)
{ {
if (node == NULL) if (node == NULL)
return false; return false;
if (IsA(node, Aggref)) if (IsA(node, Aggref))
{ {
*listptr = lappend(*listptr, node); (*count)++;
/* /*
* Complain if the aggregate's argument contains any aggregates; * Complain if the aggregate's argument contains any aggregates;
@ -411,8 +407,8 @@ pull_agg_clause_walker(Node *node, List **listptr)
*/ */
return false; return false;
} }
return expression_tree_walker(node, pull_agg_clause_walker, return expression_tree_walker(node, count_agg_clause_walker,
(void *) listptr); (void *) count);
} }
@ -511,36 +507,6 @@ contain_subplans_walker(Node *node, void *context)
return expression_tree_walker(node, contain_subplans_walker, context); return expression_tree_walker(node, contain_subplans_walker, context);
} }
/*
* pull_subplans
* Recursively pulls all subplans from an expression tree.
*
* Returns list of SubPlan nodes found. Note the nodes themselves
* are not copied, only referenced.
*/
List *
pull_subplans(Node *clause)
{
List *result = NIL;
pull_subplans_walker(clause, &result);
return result;
}
static bool
pull_subplans_walker(Node *node, List **listptr)
{
if (node == NULL)
return false;
if (is_subplan(node))
{
*listptr = lappend(*listptr, node);
/* fall through to check args to subplan */
}
return expression_tree_walker(node, pull_subplans_walker,
(void *) listptr);
}
/***************************************************************************** /*****************************************************************************
* Check clauses for mutable functions * Check clauses for mutable functions

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Id: clauses.h,v 1.61 2003/01/17 03:25:04 tgl Exp $ * $Id: clauses.h,v 1.62 2003/02/04 00:50:01 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -46,12 +46,11 @@ extern List *make_ands_implicit(Expr *clause);
extern bool contain_agg_clause(Node *clause); extern bool contain_agg_clause(Node *clause);
extern bool contain_distinct_agg_clause(Node *clause); extern bool contain_distinct_agg_clause(Node *clause);
extern List *pull_agg_clause(Node *clause); extern int count_agg_clause(Node *clause);
extern bool expression_returns_set(Node *clause); extern bool expression_returns_set(Node *clause);
extern bool contain_subplans(Node *clause); extern bool contain_subplans(Node *clause);
extern List *pull_subplans(Node *clause);
extern bool contain_mutable_functions(Node *clause); extern bool contain_mutable_functions(Node *clause);
extern bool contain_volatile_functions(Node *clause); extern bool contain_volatile_functions(Node *clause);