]> granicus.if.org Git - postgresql/commitdiff
arrays: tighten checks for multi-dimensional input
authorBruce Momjian <bruce@momjian.us>
Sat, 1 Feb 2014 15:49:17 +0000 (10:49 -0500)
committerBruce Momjian <bruce@momjian.us>
Sat, 1 Feb 2014 15:49:17 +0000 (10:49 -0500)
Previously an input array string that started with a single-element
array dimension would then later accept a multi-dimensional segment.

BACKWARD INCOMPATIBILITY

src/backend/utils/adt/arrayfuncs.c
src/test/regress/expected/arrays.out
src/test/regress/sql/arrays.sql

index 311d0c22f065ccc270f60a1c9cbea6620528ce4d..91df1842427f995d2a75c3167a284f28494a24a3 100644 (file)
@@ -425,8 +425,8 @@ ArrayCount(const char *str, int *dim, char typdelim)
 
        for (i = 0; i < MAXDIM; ++i)
        {
-               temp[i] = dim[i] = 0;
-               nelems_last[i] = nelems[i] = 1;
+               temp[i] = dim[i] = nelems_last[i] = 0;
+               nelems[i] = 1;
        }
 
        ptr = str;
@@ -540,8 +540,8 @@ ArrayCount(const char *str, int *dim, char typdelim)
                                                        errmsg("malformed array literal: \"%s\"", str)));
                                                nest_level--;
 
-                                               if ((nelems_last[nest_level] != 1) &&
-                                                       (nelems[nest_level] != nelems_last[nest_level]))
+                                               if (nelems_last[nest_level] != 0 &&
+                                                       nelems[nest_level] != nelems_last[nest_level])
                                                        ereport(ERROR,
                                                           (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
                                                                errmsg("multidimensional arrays must have "
index e1b9d7f0a841ec3014adbe7930dc56d912603965..6dce5c9301b47f37fbc400683a5f9c4f6662f9a3 100644 (file)
@@ -1491,7 +1491,7 @@ select cardinality('{{1,2},{3,4},{5,6}}'::int[]);
            6
 (1 row)
 
-select cardinality('{{{1}},{{2,3},{3,4}}}'::int[]);
+select cardinality('{{{1,9},{5,6}},{{2,3},{3,4}}}'::int[]);
  cardinality 
 -------------
            8
index 64630d9ab7817ab2bb1923b6b815867a793dafd9..92af172dfc4ba599ae71671726440c3fec3bfb71 100644 (file)
@@ -425,7 +425,7 @@ select cardinality(array[1,2,3]);
 select cardinality('[2:4]={5,6,7}'::int[]);
 select cardinality('{{1,2}}'::int[]);
 select cardinality('{{1,2},{3,4},{5,6}}'::int[]);
-select cardinality('{{{1}},{{2,3},{3,4}}}'::int[]);
+select cardinality('{{{1,9},{5,6}},{{2,3},{3,4}}}'::int[]);
 
 select array_agg(unique1) from (select unique1 from tenk1 where unique1 < 15 order by unique1) ss;
 select array_agg(ten) from (select ten from tenk1 where unique1 < 15 order by unique1) ss;