@@ -37,6 +37,8 @@ _int_contains(PG_FUNCTION_ARGS)
37
37
ArrayType * b = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (1 )));
38
38
bool res ;
39
39
40
+ CHECKARRVALID (a );
41
+ CHECKARRVALID (b );
40
42
if (ARRISVOID (a ) || ARRISVOID (b ))
41
43
return FALSE;
42
44
@@ -71,9 +73,13 @@ _int_same(PG_FUNCTION_ARGS)
71
73
int * da ,
72
74
* db ;
73
75
bool result ;
74
- bool avoid = ARRISVOID ( a ) ;
75
- bool bvoid = ARRISVOID ( b ) ;
76
+ bool avoid ;
77
+ bool bvoid ;
76
78
79
+ CHECKARRVALID (a );
80
+ CHECKARRVALID (b );
81
+ avoid = ARRISVOID (a );
82
+ bvoid = ARRISVOID (b );
77
83
if (avoid || bvoid )
78
84
return (avoid && bvoid ) ? TRUE : FALSE;
79
85
@@ -112,6 +118,8 @@ _int_overlap(PG_FUNCTION_ARGS)
112
118
ArrayType * b = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (1 )));
113
119
bool result ;
114
120
121
+ CHECKARRVALID (a );
122
+ CHECKARRVALID (b );
115
123
if (ARRISVOID (a ) || ARRISVOID (b ))
116
124
return FALSE;
117
125
@@ -133,6 +141,9 @@ _int_union(PG_FUNCTION_ARGS)
133
141
ArrayType * b = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (1 )));
134
142
ArrayType * result ;
135
143
144
+ CHECKARRVALID (a );
145
+ CHECKARRVALID (b );
146
+
136
147
if (!ARRISVOID (a ))
137
148
SORT (a );
138
149
if (!ARRISVOID (b ))
@@ -155,6 +166,8 @@ _int_inter(PG_FUNCTION_ARGS)
155
166
ArrayType * b = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (1 )));
156
167
ArrayType * result ;
157
168
169
+ CHECKARRVALID (a );
170
+ CHECKARRVALID (b );
158
171
if (ARRISVOID (a ) || ARRISVOID (b ))
159
172
PG_RETURN_POINTER (new_intArrayType (0 ));
160
173
@@ -197,12 +210,6 @@ Datum intarray_del_elem(PG_FUNCTION_ARGS);
197
210
Datum intset_union_elem (PG_FUNCTION_ARGS );
198
211
Datum intset_subtract (PG_FUNCTION_ARGS );
199
212
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
-
206
213
Datum
207
214
intset (PG_FUNCTION_ARGS )
208
215
{
@@ -213,7 +220,7 @@ Datum
213
220
icount (PG_FUNCTION_ARGS )
214
221
{
215
222
ArrayType * a = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM (PG_GETARG_DATUM (0 )));
216
- int32 count = ( ARRISVOID ( a )) ? 0 : ARRNELEMS (a );
223
+ int32 count = ARRNELEMS (a );
217
224
218
225
PG_FREE_IF_COPY (a , 0 );
219
226
PG_RETURN_INT32 (count );
@@ -228,6 +235,7 @@ sort(PG_FUNCTION_ARGS)
228
235
char * d = (dirstr ) ? VARDATA (dirstr ) : NULL ;
229
236
int dir = -1 ;
230
237
238
+ CHECKARRVALID (a );
231
239
if (ARRISVOID (a ) || ARRNELEMS (a ) < 2 )
232
240
PG_RETURN_POINTER (a );
233
241
@@ -255,6 +263,7 @@ sort_asc(PG_FUNCTION_ARGS)
255
263
{
256
264
ArrayType * a = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (0 )));
257
265
266
+ CHECKARRVALID (a );
258
267
if (ARRISVOID (a ))
259
268
PG_RETURN_POINTER (a );
260
269
QSORT (a , 1 );
@@ -266,6 +275,7 @@ sort_desc(PG_FUNCTION_ARGS)
266
275
{
267
276
ArrayType * a = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (0 )));
268
277
278
+ CHECKARRVALID (a );
269
279
if (ARRISVOID (a ))
270
280
PG_RETURN_POINTER (a );
271
281
QSORT (a , 0 );
@@ -277,6 +287,7 @@ uniq(PG_FUNCTION_ARGS)
277
287
{
278
288
ArrayType * a = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (0 )));
279
289
290
+ CHECKARRVALID (a );
280
291
if (ARRISVOID (a ) || ARRNELEMS (a ) < 2 )
281
292
PG_RETURN_POINTER (a );
282
293
a = _int_unique (a );
@@ -287,8 +298,10 @@ Datum
287
298
idx (PG_FUNCTION_ARGS )
288
299
{
289
300
ArrayType * a = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM (PG_GETARG_DATUM (0 )));
290
- int32 result = ( ARRISVOID ( a )) ? 0 : ARRNELEMS ( a ) ;
301
+ int32 result ;
291
302
303
+ CHECKARRVALID (a );
304
+ result = (ARRISVOID (a )) ? 0 : ARRNELEMS (a );
292
305
if (result )
293
306
result = intarray_match_first (a , PG_GETARG_INT32 (1 ));
294
307
PG_FREE_IF_COPY (a , 0 );
@@ -305,6 +318,7 @@ subarray(PG_FUNCTION_ARGS)
305
318
int32 end = 0 ;
306
319
int32 c ;
307
320
321
+ CHECKARRVALID (a );
308
322
if (ARRISVOID (a ))
309
323
{
310
324
PG_FREE_IF_COPY (a , 0 );
@@ -371,22 +385,29 @@ Datum
371
385
intarray_del_elem (PG_FUNCTION_ARGS )
372
386
{
373
387
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 ;
376
391
int32 n = 0 ,
377
392
i ;
378
- int32 elem = PG_GETARG_INT32 (1 );
379
393
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 ++ )
382
400
{
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
+ }
387
408
}
388
- if (c > 0 )
389
409
a = resize_intArrayType (a , n );
410
+ }
390
411
PG_RETURN_POINTER (a );
391
412
}
392
413
@@ -408,15 +429,18 @@ intset_subtract(PG_FUNCTION_ARGS)
408
429
ArrayType * a = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (0 )));
409
430
ArrayType * b = (ArrayType * ) DatumGetPointer (PG_DETOAST_DATUM_COPY (PG_GETARG_DATUM (1 )));
410
431
ArrayType * result ;
411
- int32 ca = ARRISVOID ( a ) ;
412
- int32 cb = ARRISVOID ( b ) ;
432
+ int32 ca ;
433
+ int32 cb ;
413
434
int32 * aa ,
414
435
* bb ,
415
436
* r ;
416
437
int32 n = 0 ,
417
438
i = 0 ,
418
439
k = 0 ;
419
440
441
+ CHECKARRVALID (a );
442
+ CHECKARRVALID (b );
443
+
420
444
QSORT (a , 1 );
421
445
a = _int_unique (a );
422
446
ca = ARRNELEMS (a );
0 commit comments