• Tom Lane's avatar
    Fix bogus "out of memory" reports in tuplestore.c. · 8ea3e7a7
    Tom Lane authored
    The tuplesort/tuplestore memory management logic assumed that the chunk
    allocation overhead for its memtuples array could not increase when
    increasing the array size.  This is and always was true for tuplesort,
    but we (I, I think) blindly copied that logic into tuplestore.c without
    noticing that the assumption failed to hold for the much smaller array
    elements used by tuplestore.  Given rather small work_mem, this could
    result in an improper complaint about "unexpected out-of-memory situation",
    as reported by Brent DeSpain in bug #13530.
    
    The easiest way to fix this is just to increase tuplestore's initial
    array size so that the assumption holds.  Rather than relying on magic
    constants, though, let's export a #define from aset.c that represents
    the safe allocation threshold, and make tuplestore's calculation depend
    on that.
    
    Do the same in tuplesort.c to keep the logic looking parallel, even though
    tuplesort.c isn't actually at risk at present.  This will keep us from
    breaking it if we ever muck with the allocation parameters in aset.c.
    
    Back-patch to all supported versions.  The error message doesn't occur
    pre-9.3, not so much because the problem can't happen as because the
    pre-9.3 tuplestore code neglected to check for it.  (The chance of
    trouble is a great deal larger as of 9.3, though, due to changes in the
    array-size-increasing strategy.)  However, allowing LACKMEM() to become
    true unexpectedly could still result in less-than-desirable behavior,
    so let's patch it all the way back.
    8ea3e7a7
memutils.h 5.67 KB