1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-27 12:41:57 +03:00

Defend against nulls-in-arrays in contrib/intarray. I may have put in

more tests than strictly necessary, but did not feel like tracing call
paths in detail ...
This commit is contained in:
Tom Lane
2005-11-19 03:00:09 +00:00
parent 25c00833cb
commit 8ef289dba1
6 changed files with 131 additions and 44 deletions

View File

@ -37,6 +37,8 @@ _int_contains(PG_FUNCTION_ARGS)
ArrayType *b = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1)));
bool res;
CHECKARRVALID(a);
CHECKARRVALID(b);
if (ARRISVOID(a) || ARRISVOID(b))
return FALSE;
@ -71,9 +73,13 @@ _int_same(PG_FUNCTION_ARGS)
int *da,
*db;
bool result;
bool avoid = ARRISVOID(a);
bool bvoid = ARRISVOID(b);
bool avoid;
bool bvoid;
CHECKARRVALID(a);
CHECKARRVALID(b);
avoid = ARRISVOID(a);
bvoid = ARRISVOID(b);
if (avoid || bvoid)
return (avoid && bvoid) ? TRUE : FALSE;
@ -112,6 +118,8 @@ _int_overlap(PG_FUNCTION_ARGS)
ArrayType *b = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1)));
bool result;
CHECKARRVALID(a);
CHECKARRVALID(b);
if (ARRISVOID(a) || ARRISVOID(b))
return FALSE;
@ -133,6 +141,9 @@ _int_union(PG_FUNCTION_ARGS)
ArrayType *b = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1)));
ArrayType *result;
CHECKARRVALID(a);
CHECKARRVALID(b);
if (!ARRISVOID(a))
SORT(a);
if (!ARRISVOID(b))
@ -155,6 +166,8 @@ _int_inter(PG_FUNCTION_ARGS)
ArrayType *b = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1)));
ArrayType *result;
CHECKARRVALID(a);
CHECKARRVALID(b);
if (ARRISVOID(a) || ARRISVOID(b))
PG_RETURN_POINTER(new_intArrayType(0));
@ -197,12 +210,6 @@ Datum intarray_del_elem(PG_FUNCTION_ARGS);
Datum intset_union_elem(PG_FUNCTION_ARGS);
Datum intset_subtract(PG_FUNCTION_ARGS);
#define QSORT(a, direction) \
if (ARRNELEMS(a) > 1) \
qsort((void*)ARRPTR(a), ARRNELEMS(a),sizeof(int4), \
(direction) ? compASC : compDESC )
Datum
intset(PG_FUNCTION_ARGS)
{
@ -213,7 +220,7 @@ Datum
icount(PG_FUNCTION_ARGS)
{
ArrayType *a = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0)));
int32 count = (ARRISVOID(a)) ? 0 : ARRNELEMS(a);
int32 count = ARRNELEMS(a);
PG_FREE_IF_COPY(a, 0);
PG_RETURN_INT32(count);
@ -228,6 +235,7 @@ sort(PG_FUNCTION_ARGS)
char *d = (dirstr) ? VARDATA(dirstr) : NULL;
int dir = -1;
CHECKARRVALID(a);
if (ARRISVOID(a) || ARRNELEMS(a) < 2)
PG_RETURN_POINTER(a);
@ -255,6 +263,7 @@ sort_asc(PG_FUNCTION_ARGS)
{
ArrayType *a = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0)));
CHECKARRVALID(a);
if (ARRISVOID(a))
PG_RETURN_POINTER(a);
QSORT(a, 1);
@ -266,6 +275,7 @@ sort_desc(PG_FUNCTION_ARGS)
{
ArrayType *a = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0)));
CHECKARRVALID(a);
if (ARRISVOID(a))
PG_RETURN_POINTER(a);
QSORT(a, 0);
@ -277,6 +287,7 @@ uniq(PG_FUNCTION_ARGS)
{
ArrayType *a = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0)));
CHECKARRVALID(a);
if (ARRISVOID(a) || ARRNELEMS(a) < 2)
PG_RETURN_POINTER(a);
a = _int_unique(a);
@ -287,8 +298,10 @@ Datum
idx(PG_FUNCTION_ARGS)
{
ArrayType *a = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0)));
int32 result = (ARRISVOID(a)) ? 0 : ARRNELEMS(a);
int32 result;
CHECKARRVALID(a);
result = (ARRISVOID(a)) ? 0 : ARRNELEMS(a);
if (result)
result = intarray_match_first(a, PG_GETARG_INT32(1));
PG_FREE_IF_COPY(a, 0);
@ -305,6 +318,7 @@ subarray(PG_FUNCTION_ARGS)
int32 end = 0;
int32 c;
CHECKARRVALID(a);
if (ARRISVOID(a))
{
PG_FREE_IF_COPY(a, 0);
@ -371,22 +385,29 @@ Datum
intarray_del_elem(PG_FUNCTION_ARGS)
{
ArrayType *a = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0)));
int32 c = (ARRISVOID(a)) ? 0 : ARRNELEMS(a);
int32 *aa = ARRPTR(a);
int32 elem = PG_GETARG_INT32(1);
int32 c;
int32 *aa;
int32 n = 0,
i;
int32 elem = PG_GETARG_INT32(1);
for (i = 0; i < c; i++)
if (aa[i] != elem)
CHECKARRVALID(a);
if (!ARRISVOID(a))
{
c = ARRNELEMS(a);
aa = ARRPTR(a);
for (i = 0; i < c; i++)
{
if (i > n)
aa[n++] = aa[i];
else
n++;
if (aa[i] != elem)
{
if (i > n)
aa[n++] = aa[i];
else
n++;
}
}
if (c > 0)
a = resize_intArrayType(a, n);
}
PG_RETURN_POINTER(a);
}
@ -408,8 +429,8 @@ intset_subtract(PG_FUNCTION_ARGS)
ArrayType *a = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0)));
ArrayType *b = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1)));
ArrayType *result;
int32 ca = ARRISVOID(a);
int32 cb = ARRISVOID(b);
int32 ca;
int32 cb;
int32 *aa,
*bb,
*r;
@ -417,6 +438,9 @@ intset_subtract(PG_FUNCTION_ARGS)
i = 0,
k = 0;
CHECKARRVALID(a);
CHECKARRVALID(b);
QSORT(a, 1);
a = _int_unique(a);
ca = ARRNELEMS(a);