Re: Cleaning up array_in() - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Cleaning up array_in()
Date
Msg-id 2162169.1699899810@sss.pgh.pa.us
Whole thread Raw
In response to Re: Cleaning up array_in()  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
I wrote:
> Heikki Linnakangas <hlinnaka@iki.fi> writes:
>> 2. This was the same before this patch, but:

>> postgres=# select '{{{{{{{{{{1}}}}}}}}}}'::int[];
>> ERROR:  number of array dimensions (7) exceeds the maximum allowed (6)
>> LINE 1: select '{{{{{{{{{{1}}}}}}}}}}'::int[];
>> ^
>> The error message isn't great, as the literal contains 10 dimensions, 
>> not 7 as the error message claims.

> Yeah.  To make that report accurate, we'd have to somehow postpone
> issuing the error until we've seen all the left braces (or at least
> all the initial ones).  There's a related problem in reading an
> explicitly-dimensioned array:

> postgres=# select '[1][2][3][4][5][6][7][8][9]={}'::text[];
> ERROR:  number of array dimensions (7) exceeds the maximum allowed (6)

> I kind of think it's not worth the trouble.  What was discussed
> upthread was revising the message to not claim it knows how many
> dimensions there are.

I pushed the main patch.  Here's a proposed delta to deal with
the bogus-dimensionality-count issue.  There are a few more places
where I left things alone because the code does know what the
intended dimensionality will be; so there are still two versions
of the translatable error message.

            regards, tom lane

diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index d71967de01..631012a0f2 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -429,8 +429,8 @@ ReadArrayDimensions(char **srcptr, int *ndim_p, int *dim, int *lBound,
         if (ndim >= MAXDIM)
             ereturn(escontext, false,
                     (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
-                     errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
-                            ndim + 1, MAXDIM)));
+                     errmsg("number of array dimensions exceeds the maximum allowed (%d)",
+                            MAXDIM)));

         q = p;
         if (!ReadDimensionInt(&p, &i, origStr, escontext))
@@ -641,8 +641,8 @@ ReadArrayStr(char **srcptr,
                 if (nest_level >= MAXDIM)
                     ereturn(escontext, false,
                             (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
-                             errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
-                                    nest_level + 1, MAXDIM)));
+                             errmsg("number of array dimensions exceeds the maximum allowed (%d)",
+                                    MAXDIM)));

                 nelems[nest_level] = 0;
                 nest_level++;
diff --git a/src/pl/plperl/expected/plperl_array.out b/src/pl/plperl/expected/plperl_array.out
index bd04a062fb..260a55ea7e 100644
--- a/src/pl/plperl/expected/plperl_array.out
+++ b/src/pl/plperl/expected/plperl_array.out
@@ -61,7 +61,7 @@ select plperl_sum_array('{{{{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},
 {{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}},
 {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}}}'
 );
-ERROR:  number of array dimensions (7) exceeds the maximum allowed (6)
+ERROR:  number of array dimensions exceeds the maximum allowed (6)
 LINE 1: select plperl_sum_array('{{{{{{{1,2},{3,4}},{{5,6},{7,8}}},{...
                                 ^
 select plperl_sum_array('{{{1,2,3}, {4,5,6,7}}, {{7,8,9}, {10, 11, 12}}}');
diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c
index 863864253f..d68ad7be34 100644
--- a/src/pl/plperl/plperl.c
+++ b/src/pl/plperl/plperl.c
@@ -1201,8 +1201,8 @@ array_to_datum_internal(AV *av, ArrayBuildState **astatep,
                 if (cur_depth + 1 > MAXDIM)
                     ereport(ERROR,
                             (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
-                             errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
-                                    cur_depth + 1, MAXDIM)));
+                             errmsg("number of array dimensions exceeds the maximum allowed (%d)",
+                                    MAXDIM)));
                 /* OK, add a dimension */
                 dims[*ndims] = av_len(nav) + 1;
                 (*ndims)++;

pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: COPY TO (FREEZE)?
Next
From: Nathan Bossart
Date:
Subject: retire MemoryContextResetAndDeleteChildren backwards compatibility macro