]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Improve error message for MaxAllocSize overrun in accumArrayResult.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 14 Jul 2023 14:35:24 +0000 (10:35 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 14 Jul 2023 14:35:49 +0000 (10:35 -0400)
Before, if you went past about 64M array elements in array_agg() and
allied functions, you got a generic "invalid memory alloc request
size" error.  This patch replaces that with "array size exceeds the
maximum allowed", which seems more user-friendly since it points you
to needing to reduce the size of your array result.  (This is the
same error text you'd get from construct_md_array in the event of
overrunning the maximum physical size for the finished array.)

Per question from Shaozhong Shi.  Since this hasn't come up often,
I don't feel a need to back-patch.

Discussion: https://postgr.es/m/CA+i5JwYtVS9z2E71PcNKAVPbOn4R2wuj-LqbJsYr_XOz73q7dQ@mail.gmail.com

src/backend/utils/adt/arrayfuncs.c

index 4359dbd83df34f7c9f49f7ad7b37a2df5892cea0..7828a6264b5822c0d69d50fc8b1b096ff47e6495 100644 (file)
@@ -5317,6 +5317,12 @@ accumArrayResult(ArrayBuildState *astate,
        if (astate->nelems >= astate->alen)
        {
                astate->alen *= 2;
+               /* give an array-related error if we go past MaxAllocSize */
+               if (!AllocSizeIsValid(astate->alen * sizeof(Datum)))
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+                                        errmsg("array size exceeds the maximum allowed (%d)",
+                                                       (int) MaxAllocSize)));
                astate->dvalues = (Datum *)
                        repalloc(astate->dvalues, astate->alen * sizeof(Datum));
                astate->dnulls = (bool *)