aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/optimizer/plan/planagg.c20
-rw-r--r--src/backend/optimizer/prep/prepagg.c16
2 files changed, 19 insertions, 17 deletions
diff --git a/src/backend/optimizer/plan/planagg.c b/src/backend/optimizer/plan/planagg.c
index 9330908cbf1..e0e357960f2 100644
--- a/src/backend/optimizer/plan/planagg.c
+++ b/src/backend/optimizer/plan/planagg.c
@@ -137,8 +137,8 @@ preprocess_minmax_aggregates(PlannerInfo *root)
return;
/*
- * Scan the tlist and HAVING qual to find all the aggregates and verify
- * all are MIN/MAX aggregates. Stop as soon as we find one that isn't.
+ * Examine all the aggregates and verify all are MIN/MAX aggregates. Stop
+ * as soon as we find one that isn't.
*/
aggs_list = NIL;
if (!can_minmax_aggs(root, &aggs_list))
@@ -227,24 +227,24 @@ preprocess_minmax_aggregates(PlannerInfo *root)
/*
* can_minmax_aggs
- * Walk through all the aggregates in the query, and check
- * if they are all MIN/MAX aggregates. If so, build a list of the
- * distinct aggregate calls in the tree.
+ * Examine all the aggregates in the query, and check if they are
+ * all MIN/MAX aggregates. If so, build a list of MinMaxAggInfo
+ * nodes for them.
*
* Returns false if a non-MIN/MAX aggregate is found, true otherwise.
- *
- * This does not descend into subqueries, and so should be used only after
- * reduction of sublinks to subplans. There mustn't be outer-aggregate
- * references either.
*/
static bool
can_minmax_aggs(PlannerInfo *root, List **context)
{
ListCell *lc;
+ /*
+ * This function used to have to scan the query for itself, but now we can
+ * just thumb through the AggInfo list made by preprocess_aggrefs.
+ */
foreach(lc, root->agginfos)
{
- AggInfo *agginfo = (AggInfo *) lfirst(lc);
+ AggInfo *agginfo = lfirst_node(AggInfo, lc);
Aggref *aggref = agginfo->representative_aggref;
Oid aggsortop;
TargetEntry *curTarget;
diff --git a/src/backend/optimizer/prep/prepagg.c b/src/backend/optimizer/prep/prepagg.c
index 404a5f1dac8..5b12937eada 100644
--- a/src/backend/optimizer/prep/prepagg.c
+++ b/src/backend/optimizer/prep/prepagg.c
@@ -223,13 +223,13 @@ preprocess_aggref(Aggref *aggref, PlannerInfo *root)
aggno = find_compatible_agg(root, aggref, &same_input_transnos);
if (aggno != -1)
{
- AggInfo *agginfo = list_nth(root->agginfos, aggno);
+ AggInfo *agginfo = list_nth_node(AggInfo, root->agginfos, aggno);
transno = agginfo->transno;
}
else
{
- AggInfo *agginfo = palloc(sizeof(AggInfo));
+ AggInfo *agginfo = makeNode(AggInfo);
agginfo->finalfn_oid = aggfinalfn;
agginfo->representative_aggref = aggref;
@@ -266,7 +266,7 @@ preprocess_aggref(Aggref *aggref, PlannerInfo *root)
same_input_transnos);
if (transno == -1)
{
- AggTransInfo *transinfo = palloc(sizeof(AggTransInfo));
+ AggTransInfo *transinfo = makeNode(AggTransInfo);
transinfo->args = aggref->args;
transinfo->aggfilter = aggref->aggfilter;
@@ -381,7 +381,7 @@ find_compatible_agg(PlannerInfo *root, Aggref *newagg,
aggno = -1;
foreach(lc, root->agginfos)
{
- AggInfo *agginfo = (AggInfo *) lfirst(lc);
+ AggInfo *agginfo = lfirst_node(AggInfo, lc);
Aggref *existingRef;
aggno++;
@@ -452,7 +452,9 @@ find_compatible_trans(PlannerInfo *root, Aggref *newagg, bool shareable,
foreach(lc, transnos)
{
int transno = lfirst_int(lc);
- AggTransInfo *pertrans = (AggTransInfo *) list_nth(root->aggtransinfos, transno);
+ AggTransInfo *pertrans = list_nth_node(AggTransInfo,
+ root->aggtransinfos,
+ transno);
/*
* if the transfns or transition state types are not the same then the
@@ -541,7 +543,7 @@ get_agg_clause_costs(PlannerInfo *root, AggSplit aggsplit, AggClauseCosts *costs
foreach(lc, root->aggtransinfos)
{
- AggTransInfo *transinfo = (AggTransInfo *) lfirst(lc);
+ AggTransInfo *transinfo = lfirst_node(AggTransInfo, lc);
/*
* Add the appropriate component function execution costs to
@@ -645,7 +647,7 @@ get_agg_clause_costs(PlannerInfo *root, AggSplit aggsplit, AggClauseCosts *costs
foreach(lc, root->agginfos)
{
- AggInfo *agginfo = (AggInfo *) lfirst(lc);
+ AggInfo *agginfo = lfirst_node(AggInfo, lc);
Aggref *aggref = agginfo->representative_aggref;
/*