72 #define MultirangeGetItemsPtr(mr) ((uint32 *) ((Pointer) (mr) + \
73 sizeof(MultirangeType)))
74 #define MultirangeGetFlagsPtr(mr) ((uint8 *) ((Pointer) (mr) + \
75 sizeof(MultirangeType) + ((mr)->rangeCount - 1) * sizeof(uint32)))
76 #define MultirangeGetBoundariesPtr(mr, align) ((Pointer) (mr) + \
77 att_align_nominal(sizeof(MultirangeType) + \
78 ((mr)->rangeCount - 1) * sizeof(uint32) + \
79 (mr)->rangeCount * sizeof(uint8), (align)))
81 #define MULTIRANGE_ITEM_OFF_BIT 0x80000000
82 #define MULTIRANGE_ITEM_GET_OFFLEN(item) ((item) & 0x7FFFFFFF)
83 #define MULTIRANGE_ITEM_HAS_OFF(item) ((item) & MULTIRANGE_ITEM_OFF_BIT)
84 #define MULTIRANGE_ITEM_OFFSET_STRIDE 4
96 int32 input_range_count,
123 Node *escontext = fcinfo->context;
125 int32 ranges_seen = 0;
126 int32 range_count = 0;
127 int32 range_capacity = 8;
133 const char *ptr = input_str;
134 const char *range_str_begin = NULL;
143 while (*ptr !=
'\0' && isspace((
unsigned char) *ptr))
150 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
151 errmsg(
"malformed multirange literal: \"%s\"",
163 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
164 errmsg(
"malformed multirange literal: \"%s\"",
169 if (isspace((
unsigned char) ch))
175 if (ch ==
'[' || ch ==
'(')
177 range_str_begin = ptr;
180 else if (ch ==
'}' && ranges_seen == 0)
192 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
193 errmsg(
"malformed multirange literal: \"%s\"",
198 if (ch ==
']' || ch ==
')')
200 range_str_len = ptr - range_str_begin + 1;
201 range_str =
pnstrdup(range_str_begin, range_str_len);
202 if (range_capacity == range_count)
218 ranges[range_count++] =
range;
244 if (*(ptr + 1) ==
'"')
266 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
267 errmsg(
"malformed multirange literal: \"%s\"",
269 errdetail(
"Expected comma or end of multirange.")));
280 elog(
ERROR,
"unknown parse state: %d", parse_state);
285 while (*ptr !=
'\0' && isspace((
unsigned char) *ptr))
290 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
291 errmsg(
"malformed multirange literal: \"%s\"",
293 errdetail(
"Junk after closing right brace.")));
319 for (
i = 0;
i < range_count;
i++)
355 for (
int i = 0;
i < range_count;
i++)
373 range_count, ranges);
395 for (
int i = 0;
i < range_count;
i++)
433 elog(
ERROR,
"type %u is not a multirange type", mltrngtypid);
450 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
451 errmsg(
"no binary input function available for type %s",
455 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
456 errmsg(
"no binary output function available for type %s",
484 int32 output_range_count = 0;
491 for (
i = 0;
i < input_range_count;
i++)
493 currentRange = ranges[
i];
497 if (lastRange == NULL)
499 ranges[output_range_count++] = lastRange = currentRange;
511 ranges[output_range_count - 1] = lastRange =
517 lastRange = ranges[output_range_count] = currentRange;
518 output_range_count++;
523 ranges[output_range_count - 1] = lastRange =
528 return output_range_count;
553 if (typcache == NULL ||
554 typcache->
type_id != mltrngtypid)
558 elog(
ERROR,
"type %u is not a multirange type", mltrngtypid);
581 Max(range_count - 1, 0) *
sizeof(
uint32) +
582 range_count *
sizeof(
uint8), elemalign);
585 for (
i = 0;
i < range_count;
i++)
588 sizeof(
char), elemalign);
611 for (
i = 0;
i < range_count;
i++)
622 items[
i - 1] = ptr - begin;
624 items[
i - 1] -= prev_offset;
627 prev_offset = ptr - begin;
708 Assert(i < multirange->rangeCount);
733 memcpy(
range + 1, begin, ptr - begin);
734 *((
uint8 *) (
range + 1) + (ptr - begin)) = flags;
758 Assert(i < multirange->rangeCount);
771 lbound =
fetch_att(ptr, typbyval, typlen);
781 ubound =
fetch_att(ptr, typbyval, typlen);
796 upper->lower =
false;
834 if (*range_count > 0)
839 for (
i = 0;
i < *range_count;
i++)
917 comparison = (*cmp_func) (typcache, &
lower, &
upper,
key, &match);
921 else if (comparison > 0)
974 "multirange values cannot contain null members");
981 (
errcode(ERRCODE_CARDINALITY_VIOLATION),
982 errmsg(
"multiranges cannot be constructed from multidimensional arrays")));
985 if (rngtypid != rangetyp->
type_id)
986 elog(
ERROR,
"type %u does not match constructor type", rngtypid);
1000 rangetyp->
typalign, &elements, &nulls, &range_count);
1003 for (
i = 0;
i < range_count;
i++)
1007 (
errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
1008 errmsg(
"multirange values cannot contain null members")));
1042 "multirange values cannot contain null members");
1048 if (rngtypid != rangetyp->
type_id)
1049 elog(
ERROR,
"type %u does not match constructor type", rngtypid);
1069 "niladic multirange constructor must not receive arguments");
1105 range_count3 = range_count1 + range_count2;
1107 memcpy(ranges3, ranges1, range_count1 *
sizeof(
RangeType *));
1108 memcpy(ranges3 + range_count1, ranges2, range_count2 *
sizeof(
RangeType *));
1110 range_count3, ranges3));
1170 for (i1 = 0, i2 = 0; i1 < range_count1; i1++)
1177 r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
1189 r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
1207 r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
1223 ranges3[range_count3++] = r1;
1226 return make_multirange(mltrngtypoid, rangetyp, range_count3, ranges3);
1272 if (range_count1 == 0 || range_count2 == 0)
1296 for (i1 = 0, i2 = 0; i1 < range_count1; i1++)
1303 r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
1315 r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
1331 return make_multirange(mltrngtypoid, rangetyp, range_count3, ranges3);
1348 elog(
ERROR,
"range_agg_transfn called in non-aggregate context");
1352 elog(
ERROR,
"range_agg must be called with a range");
1384 elog(
ERROR,
"range_agg_finalfn called in non-aggregate context");
1392 range_count =
state->nelems;
1393 if (range_count == 0)
1400 for (
i = 0;
i < range_count;
i++)
1422 elog(
ERROR,
"multirange_agg_transfn called in non-aggregate context");
1426 elog(
ERROR,
"range_agg must be called with a multirange");
1429 rngtypcache = typcache->
rngtype;
1445 if (range_count == 0)
1453 false, rngtypcache->
type_id, aggContext);
1457 for (
int32 i = 0;
i < range_count;
i++)
1479 elog(
ERROR,
"multirange_intersect_agg_transfn called in non-aggregate context");
1483 elog(
ERROR,
"range_intersect_agg must be called with a multirange");
1523 if (!
lower.infinite)
1546 if (!
upper.infinite)
1677 void *
key,
bool *match)
1682 if (!
lower->infinite)
1691 if (!
upper->infinite)
1777 void *
key,
bool *match)
1869 int32 range_count_1;
1870 int32 range_count_2;
1879 elog(
ERROR,
"multirange types do not match");
1884 if (range_count_1 != range_count_2)
1887 for (
i = 0;
i < range_count_1;
i++)
1979 void *
key,
bool *match)
2048 for (i1 = 0, i2 = 0; i2 < range_count2; i2++)
2055 if (++i1 >= range_count1)
2287 if (range_count2 == 0)
2289 if (range_count1 == 0)
2298 for (i2 = 0; i2 < range_count2; i2++)
2305 if (++i1 >= range_count1)
2496 if (range_count > 1)
2561 if (range_count1 > 1)
2564 if (range_count2 > 1)
2580 int32 range_count_1;
2581 int32 range_count_2;
2582 int32 range_count_max;
2589 elog(
ERROR,
"multirange types do not match");
2597 range_count_max =
Max(range_count_1, range_count_2);
2598 for (
i = 0;
i < range_count_max;
i++)
2612 if (
i >= range_count_1)
2617 if (
i >= range_count_2)
2701 &firstLower, &firstUpper);
2703 &lastLower, &lastUpper);
2721 } multirange_unnest_fctx;
2724 multirange_unnest_fctx *fctx;
2750 fctx = (multirange_unnest_fctx *)
palloc(
sizeof(multirange_unnest_fctx));
2766 if (fctx->index < fctx->mr->rangeCount)
2805 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
2806 errmsg(
"could not identify a hash function for type %s",
2811 for (
i = 0;
i < range_count;
i++)
2838 range_hash ^= lower_hash;
2840 range_hash ^= upper_hash;
2846 result = (result << 5) - result + range_hash;
2877 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
2878 errmsg(
"could not identify a hash function for type %s",
2883 for (
i = 0;
i < range_count;
i++)
2913 range_hash ^= lower_hash;
2915 range_hash ^= upper_hash;
2921 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(ArrayType *array, Oid elmtype, int elmlen, bool elmbyval, char elmalign, Datum **elemsp, bool **nullsp, int *nelemsp)
#define OidIsValid(objectId)
elog(ERROR, "%s: %s", p2, msg)
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)
bool InputFunctionCallSafe(FmgrInfo *flinfo, char *str, Oid typioparam, int32 typmod, fmNodePtr escontext, Datum *result)
Oid get_fn_expr_argtype(FmgrInfo *flinfo, int argnum)
bytea * SendFunctionCall(FmgrInfo *flinfo, Datum val)
Datum FunctionCall1Coll(FmgrInfo *flinfo, Oid collation, Datum arg1)
Oid get_fn_expr_rettype(FmgrInfo *flinfo)
char * OutputFunctionCall(FmgrInfo *flinfo, Datum val)
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)
#define ROTATE_HIGH_AND_LOW_32BITS(v)
static Datum hash_uint32(uint32 k)
static Datum hash_uint32_extended(uint32 k, uint64 seed)
if(TABLE==NULL||TABLE_index==NULL)
Assert(fmt[strlen(fmt) - 1] !='\n')
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)
char * pnstrdup(const char *in, Size len)
void pfree(void *pointer)
void * palloc0(Size size)
void * repalloc(void *pointer, Size size)
void * MemoryContextAlloc(MemoryContext context, Size size)
struct MultirangeIOData MultirangeIOData
#define MULTIRANGE_ITEM_GET_OFFLEN(item)
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)
TypeCacheEntry * multirange_get_typcache(FunctionCallInfo fcinfo, Oid mltrngtypid)
MultirangeType * multirange_minus_internal(Oid mltrngtypoid, TypeCacheEntry *rangetyp, int32 range_count1, RangeType **ranges1, int32 range_count2, RangeType **ranges2)
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)
MultirangeType * multirange_intersect_internal(Oid mltrngtypoid, TypeCacheEntry *rangetyp, int32 range_count1, RangeType **ranges1, int32 range_count2, RangeType **ranges2)
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)
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)
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)
RangeType * multirange_get_range(TypeCacheEntry *rangetyp, const MultirangeType *multirange, int i)
Datum multirange_out(PG_FUNCTION_ARGS)
Datum multirange_constructor1(PG_FUNCTION_ARGS)
MultirangeType * make_empty_multirange(Oid mltrngtypoid, TypeCacheEntry *rangetyp)
Datum multirange_in(PG_FUNCTION_ARGS)
Datum multirange_constructor2(PG_FUNCTION_ARGS)
MultirangeType * make_multirange(Oid mltrngtypoid, TypeCacheEntry *rangetyp, int32 range_count, RangeType **ranges)
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_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)
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)
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)
RangeType * multirange_get_union_range(TypeCacheEntry *rangetyp, const MultirangeType *mr)
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)
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 Datum PointerGetDatum(const void *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)
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_minus_internal(TypeCacheEntry *typcache, RangeType *r1, RangeType *r2)
RangeType * make_range(TypeCacheEntry *typcache, RangeBound *lower, RangeBound *upper, bool empty, struct Node *escontext)
void range_deserialize(TypeCacheEntry *typcache, const RangeType *range, RangeBound *lower, RangeBound *upper, bool *empty)
bool range_adjacent_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
RangeType * make_empty_range(TypeCacheEntry *typcache)
bool range_overleft_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
int range_compare(const void *key1, const void *key2, void *arg)
RangeType * range_union_internal(TypeCacheEntry *typcache, RangeType *r1, RangeType *r2, bool strict)
RangeType * range_intersect_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
#define RANGE_HAS_UBOUND(flags)
static Datum RangeTypePGetDatum(const RangeType *X)
#define PG_RETURN_RANGE_P(x)
#define RANGE_HAS_LBOUND(flags)
static RangeType * DatumGetRangeTypeP(Datum X)
#define PG_GETARG_RANGE_P(n)
#define RANGE_EMPTY_LITERAL
#define RangeTypeGetOid(r)
static struct cvec * range(struct vars *v, chr a, chr b, int cases)
static int cmp(const chr *x, const chr *y, size_t len)
StringInfo makeStringInfo(void)
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)
StringInfoData * StringInfo
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
#define SET_VARSIZE(PTR, len)
static StringInfoData tmpbuf