RE: [HACKERS] SPI_prepare() doesn't work well ? - Mailing list pgsql-hackers
| From | Hiroshi Inoue |
|---|---|
| Subject | RE: [HACKERS] SPI_prepare() doesn't work well ? |
| Date | |
| Msg-id | 001201be45d1$d2362dc0$2801007e@cadzone.tpf.co.jp Whole thread Raw |
| In response to | Re: [HACKERS] SPI_prepare() doesn't work well ? (Bruce Momjian <maillist@candle.pha.pa.us>) |
| List | pgsql-hackers |
> -----Original Message-----
> From: Bruce Momjian [mailto:maillist@candle.pha.pa.us]
> Sent: Friday, January 22, 1999 1:38 PM
> To: Hiroshi Inoue
> Cc: jwieck@debis.com; pgsql-hackers@postgreSQL.org
> Subject: Re: [HACKERS] SPI_prepare() doesn't work well ?
>
>
[snip]
> > > >
> > > > 2. Aggregates in PL/pgSQL cause wrong results.
> > > >
[snip]
>
> It is my understanding that this has always been a problem. I have
> never 100% been confident I understand it.
>
> As I remember, there used to be a:
>
> Aggreg **qry_agg
>
> that was a member of the Query structure, and cause all sorts of
> problems because the Agg was in the target list _and_ in the qry_agg.
> That was removed. Looks like I did it, but I don't remember doing it:
>
> revision 1.44
> date: 1998/01/15 19:00:11; author: momjian; state: Exp;
> lines: +2 -4
> Remove Query->qry_aggs and qry_numaggs and replace with
> Query->hasAggs.
>
> Pass List* of Aggregs into executor, and create needed array there.
> No longer need to double-processs Aggregs with second copy in Query.
>
> The removal of that fixed many problems. Can you explain a little more
> on how multiple Agg references happen. Perhaps we can get a good clean
> fix for this. Maybe redesign is needed, as I did for the removal of
> qry_aggs.
>
Sorry,I don't know details.
The source tree I can trace is as follows..
1.Multiple references to Aggreg nodes [ Fucntion union_planner() in src/backend/optimizer/plan/planner.c ]
if (parse->hasAggs) { result_plan = (Plan *) make_agg(tlist, result_plan);
/* * set the varno/attno entries to the appropriate references
to * the result tuple of the subplans. */ ((Agg *) result_plan)->aggs =
set_agg_tlist_references((Agg *) result_plan);
[ Function set_agg_tlist_references() in optimzer/opt/setrefs.c ]
aggreg_list = nconc( replace_agg_clause(tle->expr, subplanTargetList),
aggreg_list)
; } return aggreg_list;
[ Function replace_agg_clause() in optimizer/opt/setrefs.c ]
else if (IsA(clause, Aggreg)) { return lcons(clause, ^^^^^^^
replace_agg_clause(((Aggreg *) clause)->target,
subplanTargetList));
clause is contained in the return of replace_agg_clause() and so contained in the return of
set_agg_tlist_references().
2.aggno's of aggs list members are set [ Function ExecAgg() in executor/nodeAgg.c ]
alist = node->aggs; for (i = 0; i < nagg; i++) {
aggregates[i]= lfirst(alist); aggregates[i]->aggno = i; alist =
lnext(alist); }
3.aggno's are used [ Function ExecEvalAggreg() in executor/execQual.c called from ExecEvalExpr() ]
static Datum
ExecEvalAggreg(Aggreg *agg, ExprContext *econtext, bool *isNull)
{ *isNull = econtext->ecxt_nulls[agg->aggno]; return econtext->ecxt_values[agg->aggno];
}
Thanks.
Hiroshi Inoue
Inoue@tpf.co.jp
pgsql-hackers by date: