@@ -37,6 +37,8 @@ _int_contains(PG_FUNCTION_ARGS)
3737 ArrayType * b = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (1 )));
3838 bool res ;
3939
40+ CHECKARRVALID (a );
41+ CHECKARRVALID (b );
4042 if (ARRISVOID (a ) || ARRISVOID (b ))
4143 return FALSE;
4244
@@ -71,9 +73,13 @@ _int_same(PG_FUNCTION_ARGS)
7173 int * da ,
7274 * db ;
7375 bool result ;
74- bool avoid = ARRISVOID ( a ) ;
75- bool bvoid = ARRISVOID ( b ) ;
76+ bool avoid ;
77+ bool bvoid ;
7678
79+ CHECKARRVALID (a );
80+ CHECKARRVALID (b );
81+ avoid = ARRISVOID (a );
82+ bvoid = ARRISVOID (b );
7783 if (avoid || bvoid )
7884 return (avoid && bvoid ) ? TRUE : FALSE;
7985
@@ -112,6 +118,8 @@ _int_overlap(PG_FUNCTION_ARGS)
112118 ArrayType * b = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (1 )));
113119 bool result ;
114120
121+ CHECKARRVALID (a );
122+ CHECKARRVALID (b );
115123 if (ARRISVOID (a ) || ARRISVOID (b ))
116124 return FALSE;
117125
@@ -133,6 +141,9 @@ _int_union(PG_FUNCTION_ARGS)
133141 ArrayType * b = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (1 )));
134142 ArrayType * result ;
135143
144+ CHECKARRVALID (a );
145+ CHECKARRVALID (b );
146+
136147 if (!ARRISVOID (a ))
137148 SORT (a );
138149 if (!ARRISVOID (b ))
@@ -155,6 +166,8 @@ _int_inter(PG_FUNCTION_ARGS)
155166 ArrayType * b = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (1 )));
156167 ArrayType * result ;
157168
169+ CHECKARRVALID (a );
170+ CHECKARRVALID (b );
158171 if (ARRISVOID (a ) || ARRISVOID (b ))
159172 PG_RETURN_POINTER (new_intArrayType (0 ));
160173
@@ -197,12 +210,6 @@ Datum intarray_del_elem(PG_FUNCTION_ARGS);
197210Datum intset_union_elem (PG_FUNCTION_ARGS );
198211Datum intset_subtract (PG_FUNCTION_ARGS );
199212
200- #define QSORT (a , direction ) \
201- if (ARRNELEMS(a) > 1) \
202- qsort((void*)ARRPTR(a), ARRNELEMS(a),sizeof(int4), \
203- (direction) ? compASC : compDESC )
204-
205-
206213Datum
207214intset (PG_FUNCTION_ARGS )
208215{
@@ -213,7 +220,7 @@ Datum
213220icount (PG_FUNCTION_ARGS )
214221{
215222 ArrayType * a = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM (PG_GETARG_DATUM (0 )));
216- int32 count = ( ARRISVOID ( a )) ? 0 : ARRNELEMS (a );
223+ int32 count = ARRNELEMS (a );
217224
218225 PG_FREE_IF_COPY (a , 0 );
219226 PG_RETURN_INT32 (count );
@@ -228,6 +235,7 @@ sort(PG_FUNCTION_ARGS)
228235 char * d = (dirstr ) ? VARDATA (dirstr ) : NULL ;
229236 int dir = -1 ;
230237
238+ CHECKARRVALID (a );
231239 if (ARRISVOID (a ) || ARRNELEMS (a ) < 2 )
232240 PG_RETURN_POINTER (a );
233241
@@ -255,6 +263,7 @@ sort_asc(PG_FUNCTION_ARGS)
255263{
256264 ArrayType * a = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (0 )));
257265
266+ CHECKARRVALID (a );
258267 if (ARRISVOID (a ))
259268 PG_RETURN_POINTER (a );
260269 QSORT (a , 1 );
@@ -266,6 +275,7 @@ sort_desc(PG_FUNCTION_ARGS)
266275{
267276 ArrayType * a = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (0 )));
268277
278+ CHECKARRVALID (a );
269279 if (ARRISVOID (a ))
270280 PG_RETURN_POINTER (a );
271281 QSORT (a , 0 );
@@ -277,6 +287,7 @@ uniq(PG_FUNCTION_ARGS)
277287{
278288 ArrayType * a = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (0 )));
279289
290+ CHECKARRVALID (a );
280291 if (ARRISVOID (a ) || ARRNELEMS (a ) < 2 )
281292 PG_RETURN_POINTER (a );
282293 a = _int_unique (a );
@@ -287,8 +298,10 @@ Datum
287298idx (PG_FUNCTION_ARGS )
288299{
289300 ArrayType * a = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM (PG_GETARG_DATUM (0 )));
290- int32 result = ( ARRISVOID ( a )) ? 0 : ARRNELEMS ( a ) ;
301+ int32 result ;
291302
303+ CHECKARRVALID (a );
304+ result = (ARRISVOID (a )) ? 0 : ARRNELEMS (a );
292305 if (result )
293306 result = intarray_match_first (a , PG_GETARG_INT32 (1 ));
294307 PG_FREE_IF_COPY (a , 0 );
@@ -305,6 +318,7 @@ subarray(PG_FUNCTION_ARGS)
305318 int32 end = 0 ;
306319 int32 c ;
307320
321+ CHECKARRVALID (a );
308322 if (ARRISVOID (a ))
309323 {
310324 PG_FREE_IF_COPY (a , 0 );
@@ -371,22 +385,29 @@ Datum
371385intarray_del_elem (PG_FUNCTION_ARGS )
372386{
373387 ArrayType * a = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (0 )));
374- int32 c = (ARRISVOID (a )) ? 0 : ARRNELEMS (a );
375- int32 * aa = ARRPTR (a );
388+ int32 elem = PG_GETARG_INT32 (1 );
389+ int32 c ;
390+ int32 * aa ;
376391 int32 n = 0 ,
377392 i ;
378- int32 elem = PG_GETARG_INT32 (1 );
379393
380- for (i = 0 ; i < c ; i ++ )
381- if (aa [i ] != elem )
394+ CHECKARRVALID (a );
395+ if (!ARRISVOID (a ))
396+ {
397+ c = ARRNELEMS (a );
398+ aa = ARRPTR (a );
399+ for (i = 0 ; i < c ; i ++ )
382400 {
383- if (i > n )
384- aa [n ++ ] = aa [i ];
385- else
386- n ++ ;
401+ if (aa [i ] != elem )
402+ {
403+ if (i > n )
404+ aa [n ++ ] = aa [i ];
405+ else
406+ n ++ ;
407+ }
387408 }
388- if (c > 0 )
389409 a = resize_intArrayType (a , n );
410+ }
390411 PG_RETURN_POINTER (a );
391412}
392413
@@ -408,15 +429,18 @@ intset_subtract(PG_FUNCTION_ARGS)
408429 ArrayType * a = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (0 )));
409430 ArrayType * b = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (1 )));
410431 ArrayType * result ;
411- int32 ca = ARRISVOID ( a ) ;
412- int32 cb = ARRISVOID ( b ) ;
432+ int32 ca ;
433+ int32 cb ;
413434 int32 * aa ,
414435 * bb ,
415436 * r ;
416437 int32 n = 0 ,
417438 i = 0 ,
418439 k = 0 ;
419440
441+ CHECKARRVALID (a );
442+ CHECKARRVALID (b );
443+
420444 QSORT (a , 1 );
421445 a = _int_unique (a );
422446 ca = ARRNELEMS (a );
0 commit comments