Re: Crash with a CUBE query on 9.6

Tom Lane <tgl@sss.pgh.pa.us>

From: Tom Lane <tgl@sss.pgh.pa.us>
To: Heikki Linnakangas <hlinnaka@iki.fi>
Cc: Pg Bugs <pgsql-bugs@postgresql.org>, David Rowley <david.rowley@2ndquadrant.com>
Date: 2016-12-19T19:37:20Z
Lists: pgsql-bugs
Heikki Linnakangas <hlinnaka@iki.fi> writes:
> The attached test case crashes on REL9_6_STABLE and master. On 9.5, it 
> worked.

As best I can tell, this is the fault of commit 804163bc2.  The problem
query can be simplified to

SELECT
  STDDEV(DISTINCT floor(sale.cn)),
  AVG(DISTINCT floor(sale.cn))
FROM sale,vendor
WHERE sale.vn=vendor.vn
GROUP BY CUBE((sale.cn,sale.dt,sale.dt),(sale.pn,sale.prc),(sale.qty,sale.vn)),sale.qty order by 1,2 ;

The two aggregates share a "pertrans" state, but finalize_aggregates
does not account for that and calls process_ordered_aggregate_single()
twice on the same pertrans state.  The second time crashes because we
already deleted the tuplesort object the first time.

Probably, the loop in finalize_aggregates needs to be split into two,
one over the pertrans states and then a second one over the peragg states.
But this code has been hacked up enough since I last looked at it that
I'm hesitant to try to fix it myself.

			regards, tom lane


Commits

  1. Fix sharing Agg transition state of DISTINCT or ordered aggs.

  2. Share transition state between different aggregates when possible.