2 * contrib/intarray/_int_op.c
11 PG_FUNCTION_INFO_V1(_int_different);
12 PG_FUNCTION_INFO_V1(_int_same);
13 PG_FUNCTION_INFO_V1(_int_contains);
14 PG_FUNCTION_INFO_V1(_int_contained);
15 PG_FUNCTION_INFO_V1(_int_overlap);
16 PG_FUNCTION_INFO_V1(_int_union);
17 PG_FUNCTION_INFO_V1(_int_inter);
20 _int_contained(PG_FUNCTION_ARGS)
22 /* just reverse the operands and call _int_contains */
23 return DirectFunctionCall2(_int_contains,
29 _int_contains(PG_FUNCTION_ARGS)
31 /* Force copy so we can modify the arrays in-place */
32 ArrayType *a = PG_GETARG_ARRAYTYPE_P_COPY(0);
33 ArrayType *b = PG_GETARG_ARRAYTYPE_P_COPY(1);
40 res = inner_int_contains(a, b);
47 _int_different(PG_FUNCTION_ARGS)
49 PG_RETURN_BOOL(!DatumGetBool(
52 PointerGetDatum(PG_GETARG_POINTER(0)),
53 PointerGetDatum(PG_GETARG_POINTER(1))
59 _int_same(PG_FUNCTION_ARGS)
61 ArrayType *a = PG_GETARG_ARRAYTYPE_P_COPY(0);
62 ArrayType *b = PG_GETARG_ARRAYTYPE_P_COPY(1);
85 for (n = 0; n < na; n++)
98 PG_RETURN_BOOL(result);
101 /* _int_overlap -- does a overlap b?
104 _int_overlap(PG_FUNCTION_ARGS)
106 ArrayType *a = PG_GETARG_ARRAYTYPE_P_COPY(0);
107 ArrayType *b = PG_GETARG_ARRAYTYPE_P_COPY(1);
112 if (ARRISEMPTY(a) || ARRISEMPTY(b))
118 result = inner_int_overlap(a, b);
123 PG_RETURN_BOOL(result);
127 _int_union(PG_FUNCTION_ARGS)
129 ArrayType *a = PG_GETARG_ARRAYTYPE_P_COPY(0);
130 ArrayType *b = PG_GETARG_ARRAYTYPE_P_COPY(1);
139 result = inner_int_union(a, b);
144 PG_RETURN_POINTER(result);
148 _int_inter(PG_FUNCTION_ARGS)
150 ArrayType *a = PG_GETARG_ARRAYTYPE_P_COPY(0);
151 ArrayType *b = PG_GETARG_ARRAYTYPE_P_COPY(1);
160 result = inner_int_inter(a, b);
165 PG_RETURN_POINTER(result);
169 PG_FUNCTION_INFO_V1(intset);
170 PG_FUNCTION_INFO_V1(icount);
171 PG_FUNCTION_INFO_V1(sort);
172 PG_FUNCTION_INFO_V1(sort_asc);
173 PG_FUNCTION_INFO_V1(sort_desc);
174 PG_FUNCTION_INFO_V1(uniq);
175 PG_FUNCTION_INFO_V1(idx);
176 PG_FUNCTION_INFO_V1(subarray);
177 PG_FUNCTION_INFO_V1(intarray_push_elem);
178 PG_FUNCTION_INFO_V1(intarray_push_array);
179 PG_FUNCTION_INFO_V1(intarray_del_elem);
180 PG_FUNCTION_INFO_V1(intset_union_elem);
181 PG_FUNCTION_INFO_V1(intset_subtract);
184 intset(PG_FUNCTION_ARGS)
186 PG_RETURN_POINTER(int_to_intset(PG_GETARG_INT32(0)));
190 icount(PG_FUNCTION_ARGS)
192 ArrayType *a = PG_GETARG_ARRAYTYPE_P(0);
193 int32 count = ARRNELEMS(a);
195 PG_FREE_IF_COPY(a, 0);
196 PG_RETURN_INT32(count);
200 sort(PG_FUNCTION_ARGS)
202 ArrayType *a = PG_GETARG_ARRAYTYPE_P_COPY(0);
203 text *dirstr = (fcinfo->nargs == 2) ? PG_GETARG_TEXT_P(1) : NULL;
204 int32 dc = (dirstr) ? VARSIZE(dirstr) - VARHDRSZ : 0;
205 char *d = (dirstr) ? VARDATA(dirstr) : NULL;
209 if (ARRNELEMS(a) < 2)
210 PG_RETURN_POINTER(a);
212 if (dirstr == NULL || (dc == 3
213 && (d[0] == 'A' || d[0] == 'a')
214 && (d[1] == 'S' || d[1] == 's')
215 && (d[2] == 'C' || d[2] == 'c')))
218 && (d[0] == 'D' || d[0] == 'd')
219 && (d[1] == 'E' || d[1] == 'e')
220 && (d[2] == 'S' || d[2] == 's')
221 && (d[3] == 'C' || d[3] == 'c'))
225 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
226 errmsg("second parameter must be \"ASC\" or \"DESC\"")));
228 PG_RETURN_POINTER(a);
232 sort_asc(PG_FUNCTION_ARGS)
234 ArrayType *a = PG_GETARG_ARRAYTYPE_P_COPY(0);
238 PG_RETURN_POINTER(a);
242 sort_desc(PG_FUNCTION_ARGS)
244 ArrayType *a = PG_GETARG_ARRAYTYPE_P_COPY(0);
248 PG_RETURN_POINTER(a);
252 uniq(PG_FUNCTION_ARGS)
254 ArrayType *a = PG_GETARG_ARRAYTYPE_P_COPY(0);
257 if (ARRNELEMS(a) < 2)
258 PG_RETURN_POINTER(a);
260 PG_RETURN_POINTER(a);
264 idx(PG_FUNCTION_ARGS)
266 ArrayType *a = PG_GETARG_ARRAYTYPE_P(0);
270 result = ARRNELEMS(a);
272 result = intarray_match_first(a, PG_GETARG_INT32(1));
273 PG_FREE_IF_COPY(a, 0);
274 PG_RETURN_INT32(result);
278 subarray(PG_FUNCTION_ARGS)
280 ArrayType *a = PG_GETARG_ARRAYTYPE_P(0);
281 int32 start = PG_GETARG_INT32(1);
282 int32 len = (fcinfo->nargs == 3) ? PG_GETARG_INT32(2) : 0;
287 start = (start > 0) ? start - 1 : start;
292 PG_FREE_IF_COPY(a, 0);
293 PG_RETURN_POINTER(new_intArrayType(0));
314 if (start >= end || end <= 0)
316 PG_FREE_IF_COPY(a, 0);
317 PG_RETURN_POINTER(new_intArrayType(0));
320 result = new_intArrayType(end - start);
322 memcpy(ARRPTR(result), ARRPTR(a) + start, (end - start) * sizeof(int32));
323 PG_FREE_IF_COPY(a, 0);
324 PG_RETURN_POINTER(result);
328 intarray_push_elem(PG_FUNCTION_ARGS)
330 ArrayType *a = PG_GETARG_ARRAYTYPE_P(0);
333 result = intarray_add_elem(a, PG_GETARG_INT32(1));
334 PG_FREE_IF_COPY(a, 0);
335 PG_RETURN_POINTER(result);
339 intarray_push_array(PG_FUNCTION_ARGS)
341 ArrayType *a = PG_GETARG_ARRAYTYPE_P(0);
342 ArrayType *b = PG_GETARG_ARRAYTYPE_P(1);
345 result = intarray_concat_arrays(a, b);
346 PG_FREE_IF_COPY(a, 0);
347 PG_FREE_IF_COPY(b, 1);
348 PG_RETURN_POINTER(result);
352 intarray_del_elem(PG_FUNCTION_ARGS)
354 ArrayType *a = PG_GETARG_ARRAYTYPE_P_COPY(0);
355 int32 elem = PG_GETARG_INT32(1);
366 for (i = 0; i < c; i++)
376 a = resize_intArrayType(a, n);
378 PG_RETURN_POINTER(a);
382 intset_union_elem(PG_FUNCTION_ARGS)
384 ArrayType *a = PG_GETARG_ARRAYTYPE_P(0);
387 result = intarray_add_elem(a, PG_GETARG_INT32(1));
388 PG_FREE_IF_COPY(a, 0);
390 PG_RETURN_POINTER(_int_unique(result));
394 intset_subtract(PG_FUNCTION_ARGS)
396 ArrayType *a = PG_GETARG_ARRAYTYPE_P_COPY(0);
397 ArrayType *b = PG_GETARG_ARRAYTYPE_P_COPY(1);
417 result = new_intArrayType(ca);
423 if (k == cb || aa[i] < bb[k])
425 else if (aa[i] == bb[k])
433 result = resize_intArrayType(result, n);
436 PG_RETURN_POINTER(result);