2 * contrib/intarray/_int_op.c
10 PG_FUNCTION_INFO_V1(_int_different
);
11 PG_FUNCTION_INFO_V1(_int_same
);
12 PG_FUNCTION_INFO_V1(_int_contains
);
13 PG_FUNCTION_INFO_V1(_int_contained
);
14 PG_FUNCTION_INFO_V1(_int_overlap
);
15 PG_FUNCTION_INFO_V1(_int_union
);
16 PG_FUNCTION_INFO_V1(_int_inter
);
19 _int_contained(PG_FUNCTION_ARGS
)
21 /* just reverse the operands and call _int_contains */
22 return DirectFunctionCall2(_int_contains
,
28 _int_contains(PG_FUNCTION_ARGS
)
30 /* Force copy so we can modify the arrays in-place */
31 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P_COPY(0);
32 ArrayType
*b
= PG_GETARG_ARRAYTYPE_P_COPY(1);
39 res
= inner_int_contains(a
, b
);
46 _int_different(PG_FUNCTION_ARGS
)
48 PG_RETURN_BOOL(!DatumGetBool(DirectFunctionCall2(_int_same
,
49 PointerGetDatum(PG_GETARG_POINTER(0)),
50 PointerGetDatum(PG_GETARG_POINTER(1)))));
54 _int_same(PG_FUNCTION_ARGS
)
56 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P_COPY(0);
57 ArrayType
*b
= PG_GETARG_ARRAYTYPE_P_COPY(1);
80 for (n
= 0; n
< na
; n
++)
93 PG_RETURN_BOOL(result
);
96 /* _int_overlap -- does a overlap b?
99 _int_overlap(PG_FUNCTION_ARGS
)
101 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P_COPY(0);
102 ArrayType
*b
= PG_GETARG_ARRAYTYPE_P_COPY(1);
107 if (ARRISEMPTY(a
) || ARRISEMPTY(b
))
113 result
= inner_int_overlap(a
, b
);
118 PG_RETURN_BOOL(result
);
122 _int_union(PG_FUNCTION_ARGS
)
124 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P_COPY(0);
125 ArrayType
*b
= PG_GETARG_ARRAYTYPE_P_COPY(1);
134 result
= inner_int_union(a
, b
);
139 PG_RETURN_POINTER(result
);
143 _int_inter(PG_FUNCTION_ARGS
)
145 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P_COPY(0);
146 ArrayType
*b
= PG_GETARG_ARRAYTYPE_P_COPY(1);
155 result
= inner_int_inter(a
, b
);
160 PG_RETURN_POINTER(result
);
164 PG_FUNCTION_INFO_V1(intset
);
165 PG_FUNCTION_INFO_V1(icount
);
166 PG_FUNCTION_INFO_V1(sort
);
167 PG_FUNCTION_INFO_V1(sort_asc
);
168 PG_FUNCTION_INFO_V1(sort_desc
);
169 PG_FUNCTION_INFO_V1(uniq
);
170 PG_FUNCTION_INFO_V1(idx
);
171 PG_FUNCTION_INFO_V1(subarray
);
172 PG_FUNCTION_INFO_V1(intarray_push_elem
);
173 PG_FUNCTION_INFO_V1(intarray_push_array
);
174 PG_FUNCTION_INFO_V1(intarray_del_elem
);
175 PG_FUNCTION_INFO_V1(intset_union_elem
);
176 PG_FUNCTION_INFO_V1(intset_subtract
);
179 intset(PG_FUNCTION_ARGS
)
181 PG_RETURN_POINTER(int_to_intset(PG_GETARG_INT32(0)));
185 icount(PG_FUNCTION_ARGS
)
187 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P(0);
188 int32 count
= ARRNELEMS(a
);
190 PG_FREE_IF_COPY(a
, 0);
191 PG_RETURN_INT32(count
);
195 sort(PG_FUNCTION_ARGS
)
197 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P_COPY(0);
198 text
*dirstr
= (fcinfo
->nargs
== 2) ? PG_GETARG_TEXT_PP(1) : NULL
;
199 int32 dc
= (dirstr
) ? VARSIZE_ANY_EXHDR(dirstr
) : 0;
200 char *d
= (dirstr
) ? VARDATA_ANY(dirstr
) : NULL
;
204 if (ARRNELEMS(a
) < 2)
205 PG_RETURN_POINTER(a
);
207 if (dirstr
== NULL
|| (dc
== 3
208 && (d
[0] == 'A' || d
[0] == 'a')
209 && (d
[1] == 'S' || d
[1] == 's')
210 && (d
[2] == 'C' || d
[2] == 'c')))
213 && (d
[0] == 'D' || d
[0] == 'd')
214 && (d
[1] == 'E' || d
[1] == 'e')
215 && (d
[2] == 'S' || d
[2] == 's')
216 && (d
[3] == 'C' || d
[3] == 'c'))
220 (errcode(ERRCODE_INVALID_PARAMETER_VALUE
),
221 errmsg("second parameter must be \"ASC\" or \"DESC\"")));
223 PG_RETURN_POINTER(a
);
227 sort_asc(PG_FUNCTION_ARGS
)
229 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P_COPY(0);
233 PG_RETURN_POINTER(a
);
237 sort_desc(PG_FUNCTION_ARGS
)
239 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P_COPY(0);
243 PG_RETURN_POINTER(a
);
247 uniq(PG_FUNCTION_ARGS
)
249 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P_COPY(0);
252 if (ARRNELEMS(a
) < 2)
253 PG_RETURN_POINTER(a
);
255 PG_RETURN_POINTER(a
);
259 idx(PG_FUNCTION_ARGS
)
261 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P(0);
265 result
= ARRNELEMS(a
);
267 result
= intarray_match_first(a
, PG_GETARG_INT32(1));
268 PG_FREE_IF_COPY(a
, 0);
269 PG_RETURN_INT32(result
);
273 subarray(PG_FUNCTION_ARGS
)
275 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P(0);
276 int32 start
= PG_GETARG_INT32(1);
277 int32 len
= (fcinfo
->nargs
== 3) ? PG_GETARG_INT32(2) : 0;
282 start
= (start
> 0) ? start
- 1 : start
;
287 PG_FREE_IF_COPY(a
, 0);
288 PG_RETURN_POINTER(new_intArrayType(0));
309 if (start
>= end
|| end
<= 0)
311 PG_FREE_IF_COPY(a
, 0);
312 PG_RETURN_POINTER(new_intArrayType(0));
315 result
= new_intArrayType(end
- start
);
317 memcpy(ARRPTR(result
), ARRPTR(a
) + start
, (end
- start
) * sizeof(int32
));
318 PG_FREE_IF_COPY(a
, 0);
319 PG_RETURN_POINTER(result
);
323 intarray_push_elem(PG_FUNCTION_ARGS
)
325 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P(0);
328 result
= intarray_add_elem(a
, PG_GETARG_INT32(1));
329 PG_FREE_IF_COPY(a
, 0);
330 PG_RETURN_POINTER(result
);
334 intarray_push_array(PG_FUNCTION_ARGS
)
336 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P(0);
337 ArrayType
*b
= PG_GETARG_ARRAYTYPE_P(1);
340 result
= intarray_concat_arrays(a
, b
);
341 PG_FREE_IF_COPY(a
, 0);
342 PG_FREE_IF_COPY(b
, 1);
343 PG_RETURN_POINTER(result
);
347 intarray_del_elem(PG_FUNCTION_ARGS
)
349 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P_COPY(0);
350 int32 elem
= PG_GETARG_INT32(1);
361 for (i
= 0; i
< c
; i
++)
371 a
= resize_intArrayType(a
, n
);
373 PG_RETURN_POINTER(a
);
377 intset_union_elem(PG_FUNCTION_ARGS
)
379 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P(0);
382 result
= intarray_add_elem(a
, PG_GETARG_INT32(1));
383 PG_FREE_IF_COPY(a
, 0);
385 PG_RETURN_POINTER(_int_unique(result
));
389 intset_subtract(PG_FUNCTION_ARGS
)
391 ArrayType
*a
= PG_GETARG_ARRAYTYPE_P_COPY(0);
392 ArrayType
*b
= PG_GETARG_ARRAYTYPE_P_COPY(1);
412 result
= new_intArrayType(ca
);
418 if (k
== cb
|| aa
[i
] < bb
[k
])
420 else if (aa
[i
] == bb
[k
])
428 result
= resize_intArrayType(result
, n
);
431 PG_RETURN_POINTER(result
);