71#define MultirangeGetItemsPtr(mr) ((uint32 *) ((Pointer) (mr) + \
72 sizeof(MultirangeType)))
73#define MultirangeGetFlagsPtr(mr) ((uint8 *) ((Pointer) (mr) + \
74 sizeof(MultirangeType) + ((mr)->rangeCount - 1) * sizeof(uint32)))
75#define MultirangeGetBoundariesPtr(mr, align) ((Pointer) (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);
394 for (
int i = 0;
i < range_count;
i++)
432 elog(
ERROR,
"type %u is not a multirange type", mltrngtypid);
449 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
450 errmsg(
"no binary input function available for type %s",
454 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
455 errmsg(
"no binary output function available for type %s",
483 int32 output_range_count = 0;
490 for (
i = 0;
i < input_range_count;
i++)
492 currentRange = ranges[
i];
496 if (lastRange == NULL)
498 ranges[output_range_count++] = lastRange = currentRange;
510 ranges[output_range_count - 1] = lastRange =
516 lastRange = ranges[output_range_count] = currentRange;
517 output_range_count++;
522 ranges[output_range_count - 1] = lastRange =
527 return output_range_count;
552 if (typcache == NULL ||
553 typcache->
type_id != mltrngtypid)
557 elog(
ERROR,
"type %u is not a multirange type", mltrngtypid);
580 Max(range_count - 1, 0) *
sizeof(
uint32) +
581 range_count *
sizeof(
uint8), elemalign);
584 for (
i = 0;
i < range_count;
i++)
587 sizeof(
char), elemalign);
610 for (
i = 0;
i < range_count;
i++)
621 items[
i - 1] = ptr - begin;
623 items[
i - 1] -= prev_offset;
626 prev_offset = ptr - begin;
707 Assert(i < multirange->rangeCount);
732 memcpy(
range + 1, begin, ptr - begin);
733 *((
uint8 *) (
range + 1) + (ptr - begin)) = flags;
757 Assert(i < multirange->rangeCount);
770 lbound =
fetch_att(ptr, typbyval, typlen);
780 ubound =
fetch_att(ptr, typbyval, typlen);
795 upper->lower =
false;
833 if (*range_count > 0)
838 for (
i = 0;
i < *range_count;
i++)
916 comparison = (*cmp_func) (typcache, &
lower, &
upper,
key, &match);
920 else if (comparison > 0)
973 "multirange values cannot contain null members");
980 (
errcode(ERRCODE_CARDINALITY_VIOLATION),
981 errmsg(
"multiranges cannot be constructed from multidimensional arrays")));
984 if (rngtypid != rangetyp->
type_id)
985 elog(
ERROR,
"type %u does not match constructor type", rngtypid);
999 rangetyp->
typalign, &elements, &nulls, &range_count);
1002 for (
i = 0;
i < range_count;
i++)
1006 (
errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
1007 errmsg(
"multirange values cannot contain null members")));
1041 "multirange values cannot contain null members");
1047 if (rngtypid != rangetyp->
type_id)
1048 elog(
ERROR,
"type %u does not match constructor type", rngtypid);
1068 "niladic multirange constructor must not receive arguments");
1104 range_count3 = range_count1 + range_count2;
1106 memcpy(ranges3, ranges1, range_count1 *
sizeof(
RangeType *));
1107 memcpy(ranges3 + range_count1, ranges2, range_count2 *
sizeof(
RangeType *));
1109 range_count3, ranges3));
1169 for (i1 = 0, i2 = 0; i1 < range_count1; i1++)
1176 r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
1188 r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
1206 r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
1222 ranges3[range_count3++] = r1;
1225 return make_multirange(mltrngtypoid, rangetyp, range_count3, ranges3);
1271 if (range_count1 == 0 || range_count2 == 0)
1295 for (i1 = 0, i2 = 0; i1 < range_count1; i1++)
1302 r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
1314 r2 = ++i2 >= range_count2 ? NULL : ranges2[i2];
1330 return make_multirange(mltrngtypoid, rangetyp, range_count3, ranges3);
1347 elog(
ERROR,
"range_agg_transfn called in non-aggregate context");
1351 elog(
ERROR,
"range_agg must be called with a range");
1383 elog(
ERROR,
"range_agg_finalfn called in non-aggregate context");
1391 range_count =
state->nelems;
1392 if (range_count == 0)
1399 for (
i = 0;
i < range_count;
i++)
1421 elog(
ERROR,
"multirange_agg_transfn called in non-aggregate context");
1425 elog(
ERROR,
"range_agg must be called with a multirange");
1428 rngtypcache = typcache->
rngtype;
1444 if (range_count == 0)
1452 false, rngtypcache->
type_id, aggContext);
1456 for (
int32 i = 0;
i < range_count;
i++)
1478 elog(
ERROR,
"multirange_intersect_agg_transfn called in non-aggregate context");
1482 elog(
ERROR,
"range_intersect_agg must be called with a multirange");
1522 if (!
lower.infinite)
1545 if (!
upper.infinite)
1676 void *
key,
bool *match)
1681 if (!
lower->infinite)
1690 if (!
upper->infinite)
1776 void *
key,
bool *match)
1868 int32 range_count_1;
1869 int32 range_count_2;
1878 elog(
ERROR,
"multirange types do not match");
1883 if (range_count_1 != range_count_2)
1886 for (
i = 0;
i < range_count_1;
i++)
1978 void *
key,
bool *match)
2047 for (i1 = 0, i2 = 0; i2 < range_count2; i2++)
2054 if (++i1 >= range_count1)
2286 if (range_count2 == 0)
2288 if (range_count1 == 0)
2297 for (i2 = 0; i2 < range_count2; i2++)
2304 if (++i1 >= range_count1)
2495 if (range_count > 1)
2560 if (range_count1 > 1)
2563 if (range_count2 > 1)
2579 int32 range_count_1;
2580 int32 range_count_2;
2581 int32 range_count_max;
2588 elog(
ERROR,
"multirange types do not match");
2596 range_count_max =
Max(range_count_1, range_count_2);
2597 for (
i = 0;
i < range_count_max;
i++)
2611 if (
i >= range_count_1)
2616 if (
i >= range_count_2)
2700 &firstLower, &firstUpper);
2702 &lastLower, &lastUpper);
2720 } multirange_unnest_fctx;
2723 multirange_unnest_fctx *fctx;
2749 fctx = (multirange_unnest_fctx *)
palloc(
sizeof(multirange_unnest_fctx));
2765 if (fctx->index < fctx->mr->rangeCount)
2804 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
2805 errmsg(
"could not identify a hash function for type %s",
2810 for (
i = 0;
i < range_count;
i++)
2837 range_hash ^= lower_hash;
2839 range_hash ^= upper_hash;
2845 result = (result << 5) - result + range_hash;
2876 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
2877 errmsg(
"could not identify a hash function for type %s",
2882 for (
i = 0;
i < range_count;
i++)
2912 range_hash ^= lower_hash;
2914 range_hash ^= upper_hash;
2920 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)
void deconstruct_array(ArrayType *array, Oid elmtype, int elmlen, bool elmbyval, char elmalign, Datum **elemsp, bool **nullsp, int *nelemsp)
ArrayBuildState * initArrayResult(Oid element_type, MemoryContext rcontext, bool subcontext)
#define Assert(condition)
#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, fmNodePtr 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)
#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)
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_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)
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)
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)
static pg_noinline void Size size
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