Re: [BUGS] Combination of ordered-set aggregate function terminates JDBC connection on PostgreSQL 9.6.5 - Mailing list pgsql-bugs
From | Tom Lane |
---|---|
Subject | Re: [BUGS] Combination of ordered-set aggregate function terminates JDBC connection on PostgreSQL 9.6.5 |
Date | |
Msg-id | 11027.1508123471@sss.pgh.pa.us Whole thread Raw |
In response to | Re: [BUGS] Combination of ordered-set aggregate function terminates JDBC connection on PostgreSQL 9.6.5 (Tom Lane <tgl@sss.pgh.pa.us>) |
List | pgsql-bugs |
I wrote: > BTW ... I was quite surprised to notice that the aggdirectargs > are treated as a property that has to be matched in order to > combine transition states. They aren't used during the transition > phase, so this seems like a pointless constraint. We could move > the aggdirectargs ExprState list to AggStatePerAggData and treat > the aggdirectargs as part of the finalfn-related data, instead. Here's a pretty-lightly-tested patch for that. regards, tom lane diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 807822b..8f5f7f1 100644 *** a/src/backend/executor/nodeAgg.c --- b/src/backend/executor/nodeAgg.c *************** typedef struct AggStatePerTransData *** 260,272 **** bool aggshared; /* - * Nominal number of arguments for aggregate function. For plain aggs, - * this excludes any ORDER BY expressions. For ordered-set aggs, this - * counts both the direct and aggregated (ORDER BY) arguments. - */ - int numArguments; - - /* * Number of aggregated input columns. This includes ORDER BY expressions * in both the plain-agg and ordered-set cases. Ordered-set direct args * are not counted, though. --- 260,265 ---- *************** typedef struct AggStatePerTransData *** 300,308 **** /* Oid of state value's datatype */ Oid aggtranstype; ! /* ExprStates of the FILTER and argument expressions. */ ! ExprState *aggfilter; /* state of FILTER expression, if any */ ! List *aggdirectargs; /* states of direct-argument expressions */ /* * fmgr lookup data for transition function or combine function. Note in --- 293,300 ---- /* Oid of state value's datatype */ Oid aggtranstype; ! /* ExprState for the FILTER expression, if any. */ ! ExprState *aggfilter; /* * fmgr lookup data for transition function or combine function. Note in *************** typedef struct AggStatePerAggData *** 442,447 **** --- 434,442 ---- */ int numFinalArgs; + /* ExprStates for any direct-argument expressions */ + List *aggdirectargs; + /* * We need the len and byval info for the agg's result data type in order * to know how to copy/delete values. *************** finalize_aggregate(AggState *aggstate, *** 1526,1532 **** * for the transition state value. */ i = 1; ! foreach(lc, pertrans->aggdirectargs) { ExprState *expr = (ExprState *) lfirst(lc); --- 1521,1527 ---- * for the transition state value. */ i = 1; ! foreach(lc, peragg->aggdirectargs) { ExprState *expr = (ExprState *) lfirst(lc); *************** ExecInitAgg(Agg *node, EState *estate, i *** 3293,3298 **** --- 3288,3297 ---- else peragg->numFinalArgs = numDirectArgs + 1; + /* Initialize any direct-argument expressions */ + peragg->aggdirectargs = ExecInitExprList(aggref->aggdirectargs, + (PlanState *) aggstate); + /* * build expression trees using actual argument & result types for the * finalfn, if it exists and is required. *************** build_pertrans_for_aggref(AggStatePerTra *** 3605,3615 **** } ! /* Initialize the input and FILTER expressions */ pertrans->aggfilter = ExecInitExpr(aggref->aggfilter, (PlanState *) aggstate); - pertrans->aggdirectargs = ExecInitExprList(aggref->aggdirectargs, - (PlanState *) aggstate); /* * If we're doing either DISTINCT or ORDER BY for a plain agg, then we --- 3604,3612 ---- } ! /* Initialize the FILTER expression */ pertrans->aggfilter = ExecInitExpr(aggref->aggfilter, (PlanState *) aggstate); /* * If we're doing either DISTINCT or ORDER BY for a plain agg, then we *************** find_compatible_peragg(Aggref *newagg, A *** 3793,3799 **** newagg->aggstar != existingRef->aggstar || newagg->aggvariadic != existingRef->aggvariadic || newagg->aggkind != existingRef->aggkind || - !equal(newagg->aggdirectargs, existingRef->aggdirectargs) || !equal(newagg->args, existingRef->args) || !equal(newagg->aggorder, existingRef->aggorder) || !equal(newagg->aggdistinct, existingRef->aggdistinct) || --- 3790,3795 ---- *************** find_compatible_peragg(Aggref *newagg, A *** 3803,3809 **** /* if it's the same aggregate function then report exact match */ if (newagg->aggfnoid == existingRef->aggfnoid && newagg->aggtype == existingRef->aggtype && ! newagg->aggcollid == existingRef->aggcollid) { list_free(*same_input_transnos); *same_input_transnos = NIL; --- 3799,3806 ---- /* if it's the same aggregate function then report exact match */ if (newagg->aggfnoid == existingRef->aggfnoid && newagg->aggtype == existingRef->aggtype && ! newagg->aggcollid == existingRef->aggcollid && ! equal(newagg->aggdirectargs, existingRef->aggdirectargs)) { list_free(*same_input_transnos); *same_input_transnos = NIL; -- Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-bugs
pgsql-bugs by date: