diff options
Diffstat (limited to 'src/backend/utils/adt/oid.c')
-rw-r--r-- | src/backend/utils/adt/oid.c | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/src/backend/utils/adt/oid.c b/src/backend/utils/adt/oid.c index b5af4223412..7de31d73d33 100644 --- a/src/backend/utils/adt/oid.c +++ b/src/backend/utils/adt/oid.c @@ -195,24 +195,27 @@ oidvectorin(PG_FUNCTION_ARGS) { char *oidString = PG_GETARG_CSTRING(0); oidvector *result; + int nalloc; int n; - result = (oidvector *) palloc0(OidVectorSize(FUNC_MAX_ARGS)); + nalloc = 32; /* arbitrary initial size guess */ + result = (oidvector *) palloc0(OidVectorSize(nalloc)); - for (n = 0; n < FUNC_MAX_ARGS; n++) + for (n = 0;; n++) { while (*oidString && isspace((unsigned char) *oidString)) oidString++; if (*oidString == '\0') break; + + if (n >= nalloc) + { + nalloc *= 2; + result = (oidvector *) repalloc(result, OidVectorSize(nalloc)); + } + result->values[n] = oidin_subr(oidString, &oidString); } - while (*oidString && isspace((unsigned char) *oidString)) - oidString++; - if (*oidString) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("oidvector has too many elements"))); SET_VARSIZE(result, OidVectorSize(n)); result->ndim = 1; @@ -289,12 +292,6 @@ oidvectorrecv(PG_FUNCTION_ARGS) (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), errmsg("invalid oidvector data"))); - /* check length for consistency with oidvectorin() */ - if (ARR_DIMS(result)[0] > FUNC_MAX_ARGS) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("oidvector has too many elements"))); - PG_RETURN_POINTER(result); } |