71#define MultirangeGetItemsPtr(mr) ((uint32 *) ((char *) (mr) + \
72 sizeof(MultirangeType)))
73#define MultirangeGetFlagsPtr(mr) ((uint8 *) ((char *) (mr) + \
74 sizeof(MultirangeType) + ((mr)->rangeCount - 1) * sizeof(uint32)))
75#define MultirangeGetBoundariesPtr(mr, align) ((char *) (mr) + \
76 att_align_nominal(sizeof(MultirangeType) + \
77 ((mr)->rangeCount - 1) * sizeof(uint32) + \
78 (mr)->rangeCount * sizeof(uint8), (align)))
80#define MULTIRANGE_ITEM_OFF_BIT 0x80000000
81#define MULTIRANGE_ITEM_GET_OFFLEN(item) ((item) & 0x7FFFFFFF)
82#define MULTIRANGE_ITEM_HAS_OFF(item) ((item) & MULTIRANGE_ITEM_OFF_BIT)
83#define MULTIRANGE_ITEM_OFFSET_STRIDE 4
95 int32 input_range_count,
122 Node *escontext = fcinfo->context;
124 int32 ranges_seen = 0;
125 int32 range_count = 0;
126 int32 range_capacity = 8;
132 const char *ptr = input_str;
133 const char *range_str_begin = NULL;
142 while (*ptr !=
'\0' && isspace((
unsigned char) *ptr))
149 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
150 errmsg(
"malformed multirange literal: \"%s\"",
162 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
163 errmsg(
"malformed multirange literal: \"%s\"",
168 if (isspace((
unsigned char) ch))
174 if (ch ==
'[' || ch ==
'(')
176 range_str_begin = ptr;
179 else if (ch ==
'}' && ranges_seen == 0)
191 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
192 errmsg(
"malformed multirange literal: \"%s\"",
197 if (ch ==
']' || ch ==
')')
199 range_str_len = ptr - range_str_begin + 1;
200 range_str =
pnstrdup(range_str_begin, range_str_len);
201 if (range_capacity == range_count)
217 ranges[range_count++] =
range;
243 if (*(ptr + 1) ==
'"')
265 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
266 errmsg(
"malformed multirange literal: \"%s\"",
268 errdetail(
"Expected comma or end of multirange.")));
279 elog(
ERROR,
"unknown parse state: %d", parse_state);
284 while (*ptr !=
'\0' && isspace((
unsigned char) *ptr))
289 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
290 errmsg(
"malformed multirange literal: \"%s\"",
292 errdetail(
"Junk after closing right brace.")));
318 for (
i = 0;
i < range_count;
i++)
354 for (
int i = 0;
i < range_count;
i++)
372 range_count, ranges);
395 for (
int i = 0;
i < range_count;
i++)
434 elog(
ERROR,
"type %u is not a multirange type", mltrngtypid);
451 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
452 errmsg(
"no binary input function available for type %s",
456 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
457 errmsg(
"no binary output function available for type %s",
485 int32 output_range_count = 0;
492 for (
i = 0;
i < input_range_count;
i++)
494 currentRange = ranges[
i];
498 if (lastRange == NULL)
500 ranges[output_range_count++] = lastRange = currentRange;
512 ranges[output_range_count - 1] = lastRange =
518 lastRange = ranges[output_range_count] = currentRange;
519 output_range_count++;
524 ranges[output_range_count - 1] = lastRange =
529 return output_range_count;
554 if (typcache == NULL ||
555 typcache->
type_id != mltrngtypid)
559 elog(
ERROR,
"type %u is not a multirange type", mltrngtypid);
582 Max(range_count - 1, 0) *
sizeof(
uint32) +
583 range_count *
sizeof(
uint8), elemalign);
586 for (
i = 0;
i < range_count;
i++)
589 sizeof(
char), elemalign);
612 for (
i = 0;
i < range_count;
i++)
623 items[
i - 1] = ptr - begin;
625 items[
i - 1] -= prev_offset;
628 prev_offset = ptr - begin;
630 flags[
i] = *((
char *) ranges[
i] +
VARSIZE(ranges[
i]) -
sizeof(char));
632 memcpy(ptr, ranges[
i] + 1,
len);
709 Assert(i < multirange->rangeCount);
734 memcpy(
range + 1, begin, ptr - begin);
735 *((
uint8 *) (
range + 1) + (ptr - begin)) = flags;
759 Assert(i < multirange->rangeCount);
772 lbound =
fetch_att(ptr, typbyval, typlen);
782 ubound =
fetch_att(ptr, typbyval, typlen);
797 upper->lower =
false;
835 if (*range_count > 0)
840 for (
i = 0;
i < *range_count;
i++)
918 comparison = (*cmp_func) (typcache, &
lower, &
upper,
key, &match);
922 else if (comparison > 0)
975 "multirange values cannot contain null members");
982 (
errcode(ERRCODE_CARDINALITY_VIOLATION),
983 errmsg(
"multiranges cannot be constructed from multidimensional arrays")));
986 if (rngtypid != rangetyp->
type_id)
987 elog(
ERROR,
"type %u does not match constructor type", rngtypid);
1001 rangetyp->
typalign, &elements, &nulls, &range_count);
1004 for (
i = 0;
i < range_count;
i++)
1008 (
errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
1009 errmsg(
"multirange values cannot contain null members")));
1043 "multirange values cannot contain null members");
1049 if (rngtypid != rangetyp->
type_id)
1050 elog(
ERROR,
"type %u does not match constructor type", rngtypid);
1070 "niladic multirange constructor must not receive arguments");
1106 range_count3 = range_count1 + range_count2;
1108 memcpy(ranges3, ranges1, range_count1 *
sizeof(
RangeType *));
1109 memcpy(ranges3 + range_count1, ranges2, range_count2 *
sizeof(
RangeType *));
1111 range_count3, ranges3));
1171 for (i1 = 0, i2 = 0; i1 < range_count1; i1++)
1178 r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
1190 r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
1208 r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
1224 ranges3[range_count3++] = r1;
1227 return make_multirange(mltrngtypoid, rangetyp, range_count3, ranges3);
1272 if (typcache->
rngtype == NULL)
1273 elog(
ERROR,
"type %u is not a multirange type", mltrngtypoid);
1344 if (range_count1 == 0 || range_count2 == 0)
1368 for (i1 = 0, i2 = 0; i1 < range_count1; i1++)
1375 r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
1387 r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
1403 return make_multirange(mltrngtypoid, rangetyp, range_count3, ranges3);
1420 elog(
ERROR,
"range_agg_transfn called in non-aggregate context");
1424 elog(
ERROR,
"range_agg must be called with a range");
1456 elog(
ERROR,
"range_agg_finalfn called in non-aggregate context");
1464 range_count =
state->nelems;
1465 if (range_count == 0)
1472 for (
i = 0;
i < range_count;
i++)
1494 elog(
ERROR,
"multirange_agg_transfn called in non-aggregate context");
1498 elog(
ERROR,
"range_agg must be called with a multirange");
1501 rngtypcache = typcache->
rngtype;
1517 if (range_count == 0)
1525 false, rngtypcache->
type_id, aggContext);
1529 for (
int32 i = 0;
i < range_count;
i++)
1551 elog(
ERROR,
"multirange_intersect_agg_transfn called in non-aggregate context");
1555 elog(
ERROR,
"range_intersect_agg must be called with a multirange");
1595 if (!
lower.infinite)
1618 if (!
upper.infinite)
1749 void *
key,
bool *match)
1754 if (!
lower->infinite)
1763 if (!
upper->infinite)
1849 void *
key,
bool *match)
1941 int32 range_count_1;
1942 int32 range_count_2;
1951 elog(
ERROR,
"multirange types do not match");
1956 if (range_count_1 != range_count_2)
1959 for (
i = 0;
i < range_count_1;
i++)
2051 void *
key,
bool *match)
2120 for (i1 = 0, i2 = 0; i2 < range_count2; i2++)
2127 if (++i1 >= range_count1)
2358 if (range_count2 == 0)
2360 if (range_count1 == 0)
2369 for (i2 = 0; i2 < range_count2; i2++)
2376 if (++i1 >= range_count1)
2567 if (range_count > 1)
2632 if (range_count1 > 1)
2635 if (range_count2 > 1)
2651 int32 range_count_1;
2652 int32 range_count_2;
2653 int32 range_count_max;
2660 elog(
ERROR,
"multirange types do not match");
2668 range_count_max =
Max(range_count_1, range_count_2);
2669 for (
i = 0;
i < range_count_max;
i++)
2683 if (
i >= range_count_1)
2688 if (
i >= range_count_2)
2772 &firstLower, &firstUpper);
2774 &lastLower, &lastUpper);
2792 } multirange_unnest_fctx;
2795 multirange_unnest_fctx *fctx;
2821 fctx = (multirange_unnest_fctx *)
palloc(
sizeof(multirange_unnest_fctx));
2837 if (fctx->index < fctx->mr->rangeCount)
2876 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
2877 errmsg(
"could not identify a hash function for type %s",
2882 for (
i = 0;
i < range_count;
i++)
2909 range_hash ^= lower_hash;
2911 range_hash ^= upper_hash;
2917 result = (result << 5) - result + range_hash;
2948 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
2949 errmsg(
"could not identify a hash function for type %s",
2954 for (
i = 0;
i < range_count;
i++)
2984 range_hash ^= lower_hash;
2986 range_hash ^= upper_hash;
2992 result = (result << 5) - result + range_hash;
Datum idx(PG_FUNCTION_ARGS)
#define PG_GETARG_ARRAYTYPE_P(n)
ArrayBuildState * accumArrayResult(ArrayBuildState *astate, Datum dvalue, bool disnull, Oid element_type, MemoryContext rcontext)
ArrayBuildState * initArrayResult(Oid element_type, MemoryContext rcontext, bool subcontext)
void deconstruct_array(const ArrayType *array, Oid elmtype, int elmlen, bool elmbyval, char elmalign, Datum **elemsp, bool **nullsp, int *nelemsp)
#define OidIsValid(objectId)
int errdetail(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereturn(context, dummy_value,...)
#define ereport(elevel,...)
Datum FunctionCall2Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2)
void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
bytea * SendFunctionCall(FmgrInfo *flinfo, Datum val)
bool InputFunctionCallSafe(FmgrInfo *flinfo, char *str, Oid typioparam, int32 typmod, Node *escontext, Datum *result)
char * OutputFunctionCall(FmgrInfo *flinfo, Datum val)
Oid get_fn_expr_argtype(FmgrInfo *flinfo, int argnum)
Datum FunctionCall1Coll(FmgrInfo *flinfo, Oid collation, Datum arg1)
Oid get_fn_expr_rettype(FmgrInfo *flinfo)
Datum ReceiveFunctionCall(FmgrInfo *flinfo, StringInfo buf, Oid typioparam, int32 typmod)
#define PG_FREE_IF_COPY(ptr, n)
#define PG_RETURN_UINT32(x)
#define PG_RETURN_BYTEA_P(x)
#define PG_GETARG_POINTER(n)
#define PG_RETURN_CSTRING(x)
#define PG_GETARG_DATUM(n)
#define PG_GETARG_CSTRING(n)
#define PG_RETURN_UINT64(x)
#define PG_RETURN_INT32(x)
#define PG_GETARG_INT32(n)
#define PG_RETURN_DATUM(x)
#define PG_RETURN_POINTER(x)
#define PG_RETURN_BOOL(x)
#define SRF_IS_FIRSTCALL()
#define SRF_PERCALL_SETUP()
#define SRF_RETURN_NEXT(_funcctx, _result)
#define SRF_FIRSTCALL_INIT()
#define SRF_RETURN_DONE(_funcctx)
uint32 hash_bytes_uint32(uint32 k)
#define ROTATE_HIGH_AND_LOW_32BITS(v)
static Datum hash_uint32_extended(uint32 k, uint64 seed)
Assert(PointerIsAligned(start, uint64))
if(TABLE==NULL||TABLE_index==NULL)
bool type_is_range(Oid typid)
void get_type_io_data(Oid typid, IOFuncSelector which_func, int16 *typlen, bool *typbyval, char *typalign, char *typdelim, Oid *typioparam, Oid *func)
bool type_is_multirange(Oid typid)
void * MemoryContextAlloc(MemoryContext context, Size size)
void * repalloc(void *pointer, Size size)
void pfree(void *pointer)
void * palloc0(Size size)
char * pnstrdup(const char *in, Size len)
struct MultirangeIOData MultirangeIOData
#define MULTIRANGE_ITEM_GET_OFFLEN(item)
MultirangeType * multirange_intersect_internal(Oid mltrngtypoid, TypeCacheEntry *rangetyp, int32 range_count1, RangeType **ranges1, int32 range_count2, RangeType **ranges2)
MultirangeType * multirange_minus_internal(Oid mltrngtypoid, TypeCacheEntry *rangetyp, int32 range_count1, RangeType **ranges1, int32 range_count2, RangeType **ranges2)
Datum multirange_upper(PG_FUNCTION_ARGS)
Datum multirange_adjacent_range(PG_FUNCTION_ARGS)
Datum multirange_before_range(PG_FUNCTION_ARGS)
Datum multirange_send(PG_FUNCTION_ARGS)
Datum multirange_agg_transfn(PG_FUNCTION_ARGS)
static int multirange_range_contains_bsearch_comparison(TypeCacheEntry *typcache, RangeBound *lower, RangeBound *upper, void *key, bool *match)
bool multirange_contains_elem_internal(TypeCacheEntry *rangetyp, const MultirangeType *mr, Datum val)
Datum multirange_upper_inf(PG_FUNCTION_ARGS)
Datum multirange_intersect_agg_transfn(PG_FUNCTION_ARGS)
Datum range_overleft_multirange(PG_FUNCTION_ARGS)
RangeType * multirange_get_range(TypeCacheEntry *rangetyp, const MultirangeType *multirange, int i)
Datum range_after_multirange(PG_FUNCTION_ARGS)
Datum multirange_upper_inc(PG_FUNCTION_ARGS)
Datum elem_contained_by_multirange(PG_FUNCTION_ARGS)
bool multirange_before_multirange_internal(TypeCacheEntry *rangetyp, const MultirangeType *mr1, const MultirangeType *mr2)
Datum multirange_lt(PG_FUNCTION_ARGS)
Datum multirange_overlaps_multirange(PG_FUNCTION_ARGS)
Datum range_contained_by_multirange(PG_FUNCTION_ARGS)
Datum multirange_overright_range(PG_FUNCTION_ARGS)
Datum range_overlaps_multirange(PG_FUNCTION_ARGS)
MultirangeType * make_multirange(Oid mltrngtypoid, TypeCacheEntry *rangetyp, int32 range_count, RangeType **ranges)
bool multirange_eq_internal(TypeCacheEntry *rangetyp, const MultirangeType *mr1, const MultirangeType *mr2)
Datum multirange_ge(PG_FUNCTION_ARGS)
Datum multirange_contained_by_range(PG_FUNCTION_ARGS)
static int32 multirange_canonicalize(TypeCacheEntry *rangetyp, int32 input_range_count, RangeType **ranges)
#define MULTIRANGE_ITEM_HAS_OFF(item)
Datum multirange_gt(PG_FUNCTION_ARGS)
Datum multirange_intersect(PG_FUNCTION_ARGS)
bool multirange_contains_multirange_internal(TypeCacheEntry *rangetyp, const MultirangeType *mr1, const MultirangeType *mr2)
Datum multirange_lower_inc(PG_FUNCTION_ARGS)
MultirangeType * make_empty_multirange(Oid mltrngtypoid, TypeCacheEntry *rangetyp)
void multirange_get_bounds(TypeCacheEntry *rangetyp, const MultirangeType *multirange, uint32 i, RangeBound *lower, RangeBound *upper)
Datum multirange_overlaps_range(PG_FUNCTION_ARGS)
Datum multirange_overright_multirange(PG_FUNCTION_ARGS)
Datum range_adjacent_multirange(PG_FUNCTION_ARGS)
Datum multirange_out(PG_FUNCTION_ARGS)
Datum multirange_constructor1(PG_FUNCTION_ARGS)
Datum multirange_in(PG_FUNCTION_ARGS)
Datum multirange_constructor2(PG_FUNCTION_ARGS)
static Size multirange_size_estimate(TypeCacheEntry *rangetyp, int32 range_count, RangeType **ranges)
static void write_multirange_data(MultirangeType *multirange, TypeCacheEntry *rangetyp, int32 range_count, RangeType **ranges)
Datum multirange_overleft_range(PG_FUNCTION_ARGS)
#define MULTIRANGE_ITEM_OFFSET_STRIDE
static bool multirange_bsearch_match(TypeCacheEntry *typcache, const MultirangeType *mr, void *key, multirange_bsearch_comparison cmp_func)
bool range_adjacent_multirange_internal(TypeCacheEntry *rangetyp, const RangeType *r, const MultirangeType *mr)
Datum multirange_after_multirange(PG_FUNCTION_ARGS)
Datum multirange_contains_elem(PG_FUNCTION_ARGS)
Datum range_agg_finalfn(PG_FUNCTION_ARGS)
bool range_after_multirange_internal(TypeCacheEntry *rangetyp, const RangeType *r, const MultirangeType *mr)
Datum multirange_union(PG_FUNCTION_ARGS)
Datum multirange_adjacent_multirange(PG_FUNCTION_ARGS)
Datum multirange_before_multirange(PG_FUNCTION_ARGS)
static MultirangeIOData * get_multirange_io_data(FunctionCallInfo fcinfo, Oid mltrngtypid, IOFuncSelector func)
Datum range_overright_multirange(PG_FUNCTION_ARGS)
Datum multirange_lower(PG_FUNCTION_ARGS)
Datum multirange_minus_multi(PG_FUNCTION_ARGS)
Datum multirange_overleft_multirange(PG_FUNCTION_ARGS)
Datum multirange_ne(PG_FUNCTION_ARGS)
bool multirange_contains_range_internal(TypeCacheEntry *rangetyp, const MultirangeType *mr, const RangeType *r)
bool multirange_overlaps_multirange_internal(TypeCacheEntry *rangetyp, const MultirangeType *mr1, const MultirangeType *mr2)
Datum multirange_eq(PG_FUNCTION_ARGS)
int(* multirange_bsearch_comparison)(TypeCacheEntry *typcache, RangeBound *lower, RangeBound *upper, void *key, bool *match)
static bool range_bounds_contains(TypeCacheEntry *typcache, RangeBound *lower1, RangeBound *upper1, RangeBound *lower2, RangeBound *upper2)
void multirange_deserialize(TypeCacheEntry *rangetyp, const MultirangeType *multirange, int32 *range_count, RangeType ***ranges)
static bool range_bounds_overlaps(TypeCacheEntry *typcache, RangeBound *lower1, RangeBound *upper1, RangeBound *lower2, RangeBound *upper2)
@ MULTIRANGE_BEFORE_RANGE
@ MULTIRANGE_IN_RANGE_QUOTED_ESCAPED
@ MULTIRANGE_IN_RANGE_ESCAPED
@ MULTIRANGE_IN_RANGE_QUOTED
Datum multirange_recv(PG_FUNCTION_ARGS)
TypeCacheEntry * multirange_get_typcache(FunctionCallInfo fcinfo, Oid mltrngtypid)
Datum multirange_minus(PG_FUNCTION_ARGS)
Datum multirange_contains_multirange(PG_FUNCTION_ARGS)
#define MultirangeGetItemsPtr(mr)
Datum multirange_le(PG_FUNCTION_ARGS)
#define MultirangeGetFlagsPtr(mr)
Datum hash_multirange(PG_FUNCTION_ARGS)
RangeType * multirange_get_union_range(TypeCacheEntry *rangetyp, const MultirangeType *mr)
Datum hash_multirange_extended(PG_FUNCTION_ARGS)
Datum multirange_constructor0(PG_FUNCTION_ARGS)
Datum multirange_after_range(PG_FUNCTION_ARGS)
Datum multirange_contained_by_multirange(PG_FUNCTION_ARGS)
Datum multirange_empty(PG_FUNCTION_ARGS)
static int multirange_range_overlaps_bsearch_comparison(TypeCacheEntry *typcache, RangeBound *lower, RangeBound *upper, void *key, bool *match)
static int multirange_elem_bsearch_comparison(TypeCacheEntry *typcache, RangeBound *lower, RangeBound *upper, void *key, bool *match)
Datum range_before_multirange(PG_FUNCTION_ARGS)
bool range_before_multirange_internal(TypeCacheEntry *rangetyp, const RangeType *r, const MultirangeType *mr)
bool range_overright_multirange_internal(TypeCacheEntry *rangetyp, const RangeType *r, const MultirangeType *mr)
bool range_contains_multirange_internal(TypeCacheEntry *rangetyp, const RangeType *r, const MultirangeType *mr)
bool multirange_ne_internal(TypeCacheEntry *rangetyp, const MultirangeType *mr1, const MultirangeType *mr2)
Datum multirange_cmp(PG_FUNCTION_ARGS)
static uint32 multirange_get_bounds_offset(const MultirangeType *multirange, int32 i)
bool range_overlaps_multirange_internal(TypeCacheEntry *rangetyp, const RangeType *r, const MultirangeType *mr)
Datum range_merge_from_multirange(PG_FUNCTION_ARGS)
Datum range_agg_transfn(PG_FUNCTION_ARGS)
Datum range_contains_multirange(PG_FUNCTION_ARGS)
#define MULTIRANGE_ITEM_OFF_BIT
Datum multirange_unnest(PG_FUNCTION_ARGS)
Datum multirange_contains_range(PG_FUNCTION_ARGS)
bool range_overleft_multirange_internal(TypeCacheEntry *rangetyp, const RangeType *r, const MultirangeType *mr)
#define MultirangeGetBoundariesPtr(mr, align)
Datum multirange_lower_inf(PG_FUNCTION_ARGS)
#define MultirangeIsEmpty(mr)
#define PG_RETURN_MULTIRANGE_P(x)
#define PG_GETARG_MULTIRANGE_P(n)
#define MultirangeTypeGetOid(mr)
static Datum MultirangeTypePGetDatum(const MultirangeType *X)
int AggCheckCallContext(FunctionCallInfo fcinfo, MemoryContext *aggcontext)
Datum lower(PG_FUNCTION_ARGS)
Datum upper(PG_FUNCTION_ARGS)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static uint32 pg_rotate_left32(uint32 word, int n)
void qsort_arg(void *base, size_t nel, size_t elsize, qsort_arg_comparator cmp, void *arg)
int pg_strncasecmp(const char *s1, const char *s2, size_t n)
static uint32 DatumGetUInt32(Datum X)
static uint64 DatumGetUInt64(Datum X)
static int64 DatumGetInt64(Datum X)
static int32 DatumGetInt32(Datum X)
int range_cmp_bounds(TypeCacheEntry *typcache, const RangeBound *b1, const RangeBound *b2)
bool range_split_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2, RangeType **output1, RangeType **output2)
RangeType * make_range(TypeCacheEntry *typcache, RangeBound *lower, RangeBound *upper, bool empty, struct Node *escontext)
bool bounds_adjacent(TypeCacheEntry *typcache, RangeBound boundA, RangeBound boundB)
bool range_overlaps_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
bool range_before_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
RangeType * range_intersect_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
RangeType * range_minus_internal(TypeCacheEntry *typcache, RangeType *r1, RangeType *r2)
void range_deserialize(TypeCacheEntry *typcache, const RangeType *range, RangeBound *lower, RangeBound *upper, bool *empty)
RangeType * range_union_internal(TypeCacheEntry *typcache, RangeType *r1, RangeType *r2, bool strict)
bool range_adjacent_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
bool range_overleft_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
int range_compare(const void *key1, const void *key2, void *arg)
RangeType * make_empty_range(TypeCacheEntry *typcache)
static RangeType * DatumGetRangeTypeP(Datum X)
#define RANGE_HAS_UBOUND(flags)
static Datum RangeTypePGetDatum(const RangeType *X)
#define PG_RETURN_RANGE_P(x)
#define RANGE_HAS_LBOUND(flags)
#define PG_GETARG_RANGE_P(n)
#define RANGE_EMPTY_LITERAL
#define RangeTypeGetOid(r)
static int cmp(const chr *x, const chr *y, size_t len)
static struct cvec * range(struct vars *v, chr a, chr b, int cases)
struct StringInfoData * StringInfo
void resetStringInfo(StringInfo str)
void appendBinaryStringInfo(StringInfo str, const void *data, int datalen)
void appendStringInfoString(StringInfo str, const char *s)
void appendStringInfoChar(StringInfo str, char ch)
void initStringInfo(StringInfo str)
MemoryContext multi_call_memory_ctx
TypeCacheEntry * typcache
FmgrInfo rng_cmp_proc_finfo
struct TypeCacheEntry * rngelemtype
FmgrInfo hash_extended_proc_finfo
struct TypeCacheEntry * rngtype
#define att_align_pointer(cur_offset, attalign, attlen, attptr)
#define att_align_nominal(cur_offset, attalign)
#define att_addlength_pointer(cur_offset, attlen, attptr)
static Datum fetch_att(const void *T, bool attbyval, int attlen)
TypeCacheEntry * lookup_type_cache(Oid type_id, int flags)
#define TYPECACHE_HASH_PROC_FINFO
#define TYPECACHE_MULTIRANGE_INFO
#define TYPECACHE_HASH_EXTENDED_PROC_FINFO
static Size VARSIZE(const void *PTR)
static char * VARDATA(const void *PTR)
static void SET_VARSIZE(void *PTR, Size len)
static StringInfoData tmpbuf