mirror of
https://github.com/postgres/postgres.git
synced 2025-08-27 07:42:10 +03:00
Convert planner's AggInfo and AggTransInfo structs to proper Nodes.
This is mostly just to get outfuncs.c support for them, so that the agginfos and aggtransinfos lists can be dumped when dumping the contents of PlannerInfo. While here, improve some related comments; notably, clean up obsolete comments left over from when preprocess_minmax_aggregates had to make its own scan of the query tree. Discussion: https://postgr.es/m/742479.1658160504@sss.pgh.pa.us
This commit is contained in:
@@ -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;
|
||||
|
@@ -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;
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user