6
#include "catalog/pg_type.h"
12
inner_int_contains(ArrayType *a, ArrayType *b)
25
if (ARRISVOID(a) || ARRISVOID(b))
34
while (i < na && j < nb)
37
else if (da[i] == db[j])
46
return (n == nb) ? TRUE : FALSE;
50
inner_int_overlap(ArrayType *a, ArrayType *b)
62
if (ARRISVOID(a) || ARRISVOID(b))
71
while (i < na && j < nb)
74
else if (da[i] == db[j])
83
inner_int_union(ArrayType *a, ArrayType *b)
90
if (ARRISVOID(a) && ARRISVOID(b))
91
return new_intArrayType(0);
93
r = copy_intArrayType(b);
95
r = copy_intArrayType(a);
99
int na = ARRNELEMS(a),
107
r = new_intArrayType(na + nb);
112
while (i < na && j < nb)
119
else if (da[i] < db[j])
130
r = resize_intArrayType(r, dr - ARRPTR(r));
133
if (ARRNELEMS(r) > 1)
140
inner_int_inter(ArrayType *a, ArrayType *b)
154
if (ARRISVOID(a) || ARRISVOID(b))
155
return new_intArrayType(0);
161
r = new_intArrayType(Min(na, nb));
165
while (i < na && j < nb)
168
else if (da[i] == db[j])
170
if (i + j == 0 || (i + j > 0 && *(dr - 1) != db[j]))
178
if ((dr - ARRPTR(r)) == 0)
181
return new_intArrayType(0);
184
return resize_intArrayType(r, dr - ARRPTR(r));
188
rt__int_size(ArrayType *a, float *size)
190
*size = (float) ARRNELEMS(a);
198
isort(int4 *a, int len)
213
if (*(cur - 1) > *cur)
220
else if (!r && *(cur - 1) == *cur)
229
new_intArrayType(int num)
232
int nbytes = ARR_OVERHEAD_NONULLS(NDIM) + sizeof(int) * num;
234
r = (ArrayType *) palloc0(nbytes);
236
SET_VARSIZE(r, nbytes);
238
r->dataoffset = 0; /* marker for no null bitmap */
239
ARR_ELEMTYPE(r) = INT4OID;
240
*((int *) ARR_DIMS(r)) = num;
241
*((int *) ARR_LBOUND(r)) = 1;
247
resize_intArrayType(ArrayType *a, int num)
249
int nbytes = ARR_OVERHEAD_NONULLS(NDIM) + sizeof(int) * num;
251
if (num == ARRNELEMS(a))
254
a = (ArrayType *) repalloc(a, nbytes);
256
SET_VARSIZE(a, nbytes);
257
*((int *) ARR_DIMS(a)) = num;
262
copy_intArrayType(ArrayType *a)
266
r = new_intArrayType(ARRNELEMS(a));
267
memmove(r, a, VARSIZE(r));
271
/* num for compressed key */
273
internal_size(int *a, int len)
278
for (i = 0; i < len; i += 2)
279
if (!i || a[i] != a[i - 1]) /* do not count repeated range */
280
size += a[i + 1] - a[i] + 1;
285
/* r is sorted and size of r > 1 */
287
_int_unique(ArrayType *r)
292
int num = ARRNELEMS(r);
299
data = tmp = dr = ARRPTR(r);
300
while (tmp - data < num)
305
return resize_intArrayType(r, dr + 1 - ARRPTR(r));
309
gensign(BITVEC sign, int *a, int len)
313
/* we assume that the sign vector is previously zeroed */
314
for (i = 0; i < len; i++)
322
intarray_match_first(ArrayType *a, int32 elem)
333
for (i = 0; i < c; i++)
340
intarray_add_elem(ArrayType *a, int32 elem)
347
c = (ARRISVOID(a)) ? 0 : ARRNELEMS(a);
348
result = new_intArrayType(c + 1);
351
memcpy(r, ARRPTR(a), c * sizeof(int32));
357
intarray_concat_arrays(ArrayType *a, ArrayType *b)
360
int32 ac = (ARRISVOID(a)) ? 0 : ARRNELEMS(a);
361
int32 bc = (ARRISVOID(b)) ? 0 : ARRNELEMS(b);
365
result = new_intArrayType(ac + bc);
367
memcpy(ARRPTR(result), ARRPTR(a), ac * sizeof(int32));
369
memcpy(ARRPTR(result) + ac, ARRPTR(b), bc * sizeof(int32));
374
int_to_intset(int32 n)
379
result = new_intArrayType(1);
386
compASC(const void *a, const void *b)
388
if (*(int4 *) a == *(int4 *) b)
390
return (*(int4 *) a > *(int4 *) b) ? 1 : -1;
394
compDESC(const void *a, const void *b)
396
if (*(int4 *) a == *(int4 *) b)
398
return (*(int4 *) a < *(int4 *) b) ? 1 : -1;