Hi, On 2019-02-25 18:41:17 -0500, Tom Lane wrote: > I wrote: > > Andres Freund <and...@anarazel.de> writes: > >>> 1. This still involves at least two palloc's for every nonempty List, > >>> because I kept the header and the data array separate. Perhaps it's > >>> worth allocating those in one palloc. > > >> Hm, I think if we force external code to audit their code, we better > >> also do this. This is a significant number of allocations, and I don't > >> think it'd be good to spread this out over two releases. > > > If we choose to do it, I'd agree with doing both in the same major release > > cycle, so that extensions see just one breakage. But I think it'd still > > best be developed as a follow-on patch. > > By the by ... this idea actively breaks the mechanism I'd proposed for > preserving foreach's behavior of evaluating the List reference only once. > If we save a hidden copy of whatever the user says the List reference > is, and then he assigns a new value to it mid-loop, we're screwed if > the list header can move.
Hm, I wonder if that's necessary / whether we can just work around user visible breakage at a small cost. I think I'm mostly concerned with two allocations for the very common case of small (1-3 entries) lists. We could just allocate the first array together with the header, and not free that if the list grows beyond that point. That'd mean we'd only do separate allocations once they actually amortize over a number of allocations. Greetings, Andres Freund