diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c index d887619b70..5049fb79f6 100644 --- a/src/backend/utils/adt/arrayfuncs.c +++ b/src/backend/utils/adt/arrayfuncs.c @@ -2899,7 +2899,14 @@ array_set_slice(Datum arraydatum, errdetail("When assigning to a slice of an empty array value," " slice boundaries must be fully specified."))); - dim[i] = 1 + upperIndx[i] - lowerIndx[i]; + /* compute "upperIndx[i] - lowerIndx[i] + 1", detecting overflow */ + if (pg_sub_s32_overflow(upperIndx[i], lowerIndx[i], &dim[i]) || + pg_add_s32_overflow(dim[i], 1, &dim[i])) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("array size exceeds the maximum allowed (%d)", + (int) MaxArraySize))); + lb[i] = lowerIndx[i]; } diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out index a58994780c..666d892969 100644 --- a/src/test/regress/expected/arrays.out +++ b/src/test/regress/expected/arrays.out @@ -1402,6 +1402,10 @@ update arr_pk_tbl set f1[2147483647] = 42 where pk = 10; ERROR: 54000 update arr_pk_tbl set f1[2147483646:2147483647] = array[4,2] where pk = 10; ERROR: 54000 +insert into arr_pk_tbl(pk, f1[0:2147483647]) values (2, '{}'); +ERROR: 54000 +insert into arr_pk_tbl(pk, f1[-2147483648:2147483647]) values (2, '{}'); +ERROR: 54000 -- also exercise the expanded-array case do $$ declare a int[]; begin diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql index df5a34034b..dea76ffed1 100644 --- a/src/test/regress/sql/arrays.sql +++ b/src/test/regress/sql/arrays.sql @@ -441,6 +441,8 @@ reset enable_bitmapscan; insert into arr_pk_tbl values(10, '[-2147483648:-2147483647]={1,2}'); update arr_pk_tbl set f1[2147483647] = 42 where pk = 10; update arr_pk_tbl set f1[2147483646:2147483647] = array[4,2] where pk = 10; +insert into arr_pk_tbl(pk, f1[0:2147483647]) values (2, '{}'); +insert into arr_pk_tbl(pk, f1[-2147483648:2147483647]) values (2, '{}'); -- also exercise the expanded-array case do $$ declare a int[];