aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/oid.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/oid.c')
-rw-r--r--src/backend/utils/adt/oid.c25
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);
}