summaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/arrayfuncs.c
diff options
context:
space:
mode:
authorPavan Deolasee2011-05-20 15:06:06 +0000
committerPavan Deolasee2011-05-20 15:06:06 +0000
commitf65ae81fa4c6436093915410222dc962ec657b33 (patch)
treea7aa88a822cda01d1447ef46c68f369b7f81ff64 /src/backend/utils/adt/arrayfuncs.c
parent9bf28d03c9ca4f8a791b5e455f77b39d092dfa6c (diff)
parent1084f317702e1a039696ab8a37caf900e55ec8f2 (diff)
Merge commit '1084f317702e1a039696ab8a37caf900e55ec8f2' into int-pgxc
Merge 9.0 PostgreSQL release into PGXC. Resolve conflicts thrown by git and fix some issues raised during compilation. We still don't compile fine at this point, but we should have resolved many conflicts to make further progress. Some of the changes in the regression tests are merged to reflect whats there in 9.0 release. Those are easy to fix later when we run regressions Conflicts: contrib/Makefile contrib/pgbench/pgbench.c src/Makefile src/backend/Makefile src/backend/access/transam/varsup.c src/backend/catalog/Makefile src/backend/catalog/dependency.c src/backend/catalog/genbki.sh src/backend/commands/dbcommands.c src/backend/commands/explain.c src/backend/commands/vacuum.c src/backend/executor/execMain.c src/backend/executor/execProcnode.c src/backend/executor/execTuples.c src/backend/parser/analyze.c src/backend/parser/gram.y src/backend/parser/parse_utilcmd.c src/backend/postmaster/postmaster.c src/backend/rewrite/rewriteHandler.c src/backend/storage/ipc/procarray.c src/backend/storage/lmgr/proc.c src/backend/tcop/postgres.c src/backend/tcop/utility.c src/backend/utils/cache/relcache.c src/backend/utils/init/postinit.c src/backend/utils/misc/guc.c src/bin/pg_ctl/pg_ctl.c src/include/Makefile src/include/access/twophase.h src/include/bootstrap/bootstrap.h src/include/catalog/catversion.h src/include/catalog/dependency.h src/include/catalog/indexing.h src/include/catalog/pg_proc.h src/include/nodes/nodes.h src/include/storage/lwlock.h src/include/storage/proc.h src/include/storage/procarray.h src/include/utils/lsyscache.h src/test/regress/expected/delete.out src/test/regress/expected/float4.out src/test/regress/expected/float8.out src/test/regress/expected/geometry.out src/test/regress/expected/join.out src/test/regress/expected/point.out src/test/regress/expected/rowtypes.out src/test/regress/expected/timestamp.out src/test/regress/expected/timestamptz.out src/test/regress/expected/tsearch.out src/test/regress/sql/numeric.sql src/test/regress/sql/point.sql
Diffstat (limited to 'src/backend/utils/adt/arrayfuncs.c')
-rw-r--r--src/backend/utils/adt/arrayfuncs.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 4e33bbe2ca..533b77c1cd 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -3,12 +3,12 @@
* arrayfuncs.c
* Support functions for arrays.
*
- * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.160 2009/06/22 04:37:18 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.164 2010/02/26 02:01:07 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -328,6 +328,12 @@ array_in(PG_FUNCTION_ARGS)
SET_VARSIZE(retval, nbytes);
retval->ndim = ndim;
retval->dataoffset = dataoffset;
+
+ /*
+ * This comes from the array's pg_type.typelem (which points to the base
+ * data type's pg_type.oid) and stores system oids in user tables. This
+ * oid must be preserved by binary upgrades.
+ */
retval->elemtype = element_type;
memcpy(ARR_DIMS(retval), dim, ndim * sizeof(int));
memcpy(ARR_LBOUND(retval), lBound, ndim * sizeof(int));
@@ -1207,8 +1213,17 @@ array_recv(PG_FUNCTION_ARGS)
for (i = 0; i < ndim; i++)
{
+ int ub;
+
dim[i] = pq_getmsgint(buf, 4);
lBound[i] = pq_getmsgint(buf, 4);
+
+ ub = lBound[i] + dim[i] - 1;
+ /* overflow? */
+ if (lBound[i] > ub)
+ ereport(ERROR,
+ (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+ errmsg("integer out of range")));
}
/* This checks for overflow of array dimensions */
@@ -4180,12 +4195,12 @@ accumArrayResult(ArrayBuildState *astate,
}
/*
- * Ensure pass-by-ref stuff is copied into mcontext; and detoast it too
- * if it's varlena. (You might think that detoasting is not needed here
+ * Ensure pass-by-ref stuff is copied into mcontext; and detoast it too if
+ * it's varlena. (You might think that detoasting is not needed here
* because construct_md_array can detoast the array elements later.
* However, we must not let construct_md_array modify the ArrayBuildState
- * because that would mean array_agg_finalfn damages its input, which
- * is verboten. Also, this way frequently saves one copying step.)
+ * because that would mean array_agg_finalfn damages its input, which is
+ * verboten. Also, this way frequently saves one copying step.)
*/
if (!disnull && !astate->typbyval)
{