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;