diff --git a/src/backend/utils/adt/multirangetypes.c b/src/backend/utils/adt/multirangetypes.c index 4b86be583ef..a77299147e7 100644 --- a/src/backend/utils/adt/multirangetypes.c +++ b/src/backend/utils/adt/multirangetypes.c @@ -847,7 +847,7 @@ range_bounds_contains(TypeCacheEntry *typcache, * that would count as a mismatch. */ static bool -multirange_bsearch_match(TypeCacheEntry *typcache, MultirangeType *mr, +multirange_bsearch_match(TypeCacheEntry *typcache, const MultirangeType *mr, void *key, multirange_bsearch_comparison cmp_func) { uint32 l, @@ -1552,7 +1552,7 @@ multirange_contains_elem(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); - PG_RETURN_BOOL(multirange_contains_elem_internal(typcache, mr, val)); + PG_RETURN_BOOL(multirange_contains_elem_internal(typcache->rngtype, mr, val)); } /* contained by? */ @@ -1565,7 +1565,7 @@ elem_contained_by_multirange(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); - PG_RETURN_BOOL(multirange_contains_elem_internal(typcache, mr, val)); + PG_RETURN_BOOL(multirange_contains_elem_internal(typcache->rngtype, mr, val)); } /* @@ -1606,13 +1606,13 @@ multirange_elem_bsearch_comparison(TypeCacheEntry *typcache, * Test whether multirange mr contains a specific element value. */ bool -multirange_contains_elem_internal(TypeCacheEntry *typcache, - MultirangeType *mr, Datum val) +multirange_contains_elem_internal(TypeCacheEntry *rangetyp, + const MultirangeType *mr, Datum val) { if (MultirangeIsEmpty(mr)) return false; - return multirange_bsearch_match(typcache->rngtype, mr, &val, + return multirange_bsearch_match(rangetyp, mr, &val, multirange_elem_bsearch_comparison); } @@ -1628,7 +1628,7 @@ multirange_contains_range(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); - PG_RETURN_BOOL(multirange_contains_range_internal(typcache, mr, r)); + PG_RETURN_BOOL(multirange_contains_range_internal(typcache->rngtype, mr, r)); } Datum @@ -1640,7 +1640,7 @@ range_contains_multirange(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); - PG_RETURN_BOOL(range_contains_multirange_internal(typcache, r, mr)); + PG_RETURN_BOOL(range_contains_multirange_internal(typcache->rngtype, r, mr)); } /* contained by? */ @@ -1653,7 +1653,7 @@ range_contained_by_multirange(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); - PG_RETURN_BOOL(multirange_contains_range_internal(typcache, mr, r)); + PG_RETURN_BOOL(multirange_contains_range_internal(typcache->rngtype, mr, r)); } Datum @@ -1665,7 +1665,7 @@ multirange_contained_by_range(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); - PG_RETURN_BOOL(range_contains_multirange_internal(typcache, r, mr)); + PG_RETURN_BOOL(range_contains_multirange_internal(typcache->rngtype, r, mr)); } /* @@ -1700,14 +1700,13 @@ multirange_range_contains_bsearch_comparison(TypeCacheEntry *typcache, * Test whether multirange mr contains a specific range r. */ bool -multirange_contains_range_internal(TypeCacheEntry *typcache, MultirangeType *mr, RangeType *r) +multirange_contains_range_internal(TypeCacheEntry *rangetyp, + const MultirangeType *mr, + const RangeType *r) { - TypeCacheEntry *rangetyp; RangeBound bounds[2]; bool empty; - rangetyp = typcache->rngtype; - /* * Every multirange contains an infinite number of empty ranges, even an * empty one. @@ -1729,10 +1728,10 @@ multirange_contains_range_internal(TypeCacheEntry *typcache, MultirangeType *mr, * Test whether range r contains a multirange mr. */ bool -range_contains_multirange_internal(TypeCacheEntry *typcache, RangeType *r, - MultirangeType *mr) +range_contains_multirange_internal(TypeCacheEntry *rangetyp, + const RangeType *r, + const MultirangeType *mr) { - TypeCacheEntry *rangetyp; RangeBound lower1, upper1, lower2, @@ -1740,8 +1739,6 @@ range_contains_multirange_internal(TypeCacheEntry *typcache, RangeType *r, tmp; bool empty; - rangetyp = typcache->rngtype; - /* * Every range contains an infinite number of empty multiranges, even an * empty one. @@ -1766,9 +1763,10 @@ range_contains_multirange_internal(TypeCacheEntry *typcache, RangeType *r, /* equality (internal version) */ bool -multirange_eq_internal(TypeCacheEntry *typcache, MultirangeType *mr1, MultirangeType *mr2) +multirange_eq_internal(TypeCacheEntry *rangetyp, + const MultirangeType *mr1, + const MultirangeType *mr2) { - TypeCacheEntry *rangetyp = typcache->rngtype; int32 range_count_1; int32 range_count_2; int32 i; @@ -1810,14 +1808,16 @@ multirange_eq(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1)); - PG_RETURN_BOOL(multirange_eq_internal(typcache, mr1, mr2)); + PG_RETURN_BOOL(multirange_eq_internal(typcache->rngtype, mr1, mr2)); } /* inequality (internal version) */ bool -multirange_ne_internal(TypeCacheEntry *typcache, MultirangeType *mr1, MultirangeType *mr2) +multirange_ne_internal(TypeCacheEntry *rangetyp, + const MultirangeType *mr1, + const MultirangeType *mr2) { - return (!multirange_eq_internal(typcache, mr1, mr2)); + return (!multirange_eq_internal(rangetyp, mr1, mr2)); } /* inequality */ @@ -1830,7 +1830,7 @@ multirange_ne(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1)); - PG_RETURN_BOOL(multirange_ne_internal(typcache, mr1, mr2)); + PG_RETURN_BOOL(multirange_ne_internal(typcache->rngtype, mr1, mr2)); } /* overlaps? */ @@ -1843,7 +1843,7 @@ range_overlaps_multirange(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); - PG_RETURN_BOOL(range_overlaps_multirange_internal(typcache, r, mr)); + PG_RETURN_BOOL(range_overlaps_multirange_internal(typcache->rngtype, r, mr)); } Datum @@ -1855,7 +1855,7 @@ multirange_overlaps_range(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); - PG_RETURN_BOOL(range_overlaps_multirange_internal(typcache, r, mr)); + PG_RETURN_BOOL(range_overlaps_multirange_internal(typcache->rngtype, r, mr)); } Datum @@ -1867,7 +1867,7 @@ multirange_overlaps_multirange(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1)); - PG_RETURN_BOOL(multirange_overlaps_multirange_internal(typcache, mr1, mr2)); + PG_RETURN_BOOL(multirange_overlaps_multirange_internal(typcache->rngtype, mr1, mr2)); } /* @@ -1892,14 +1892,13 @@ multirange_range_overlaps_bsearch_comparison(TypeCacheEntry *typcache, } bool -range_overlaps_multirange_internal(TypeCacheEntry *typcache, RangeType *r, MultirangeType *mr) +range_overlaps_multirange_internal(TypeCacheEntry *rangetyp, + const RangeType *r, + const MultirangeType *mr) { - TypeCacheEntry *rangetyp; RangeBound bounds[2]; bool empty; - rangetyp = typcache->rngtype; - /* * Empties never overlap, even with empties. (This seems strange since * they *do* contain each other, but we want to follow how ranges work.) @@ -1915,10 +1914,10 @@ range_overlaps_multirange_internal(TypeCacheEntry *typcache, RangeType *r, Multi } bool -multirange_overlaps_multirange_internal(TypeCacheEntry *typcache, MultirangeType *mr1, - MultirangeType *mr2) +multirange_overlaps_multirange_internal(TypeCacheEntry *rangetyp, + const MultirangeType *mr1, + const MultirangeType *mr2) { - TypeCacheEntry *rangetyp; int32 range_count1; int32 range_count2; int32 i1; @@ -1935,8 +1934,6 @@ multirange_overlaps_multirange_internal(TypeCacheEntry *typcache, MultirangeType if (MultirangeIsEmpty(mr1) || MultirangeIsEmpty(mr2)) return false; - rangetyp = typcache->rngtype; - range_count1 = mr1->rangeCount; range_count2 = mr2->rangeCount; @@ -1974,12 +1971,11 @@ multirange_overlaps_multirange_internal(TypeCacheEntry *typcache, MultirangeType } /* does not extend to right of? */ -Datum -range_overleft_multirange(PG_FUNCTION_ARGS) +bool +range_overleft_multirange_internal(TypeCacheEntry *rangetyp, + const RangeType *r, + const MultirangeType *mr) { - RangeType *r = PG_GETARG_RANGE_P(0); - MultirangeType *mr = PG_GETARG_MULTIRANGE_P(1); - TypeCacheEntry *typcache; RangeBound lower1, upper1, lower2, @@ -1989,14 +1985,25 @@ range_overleft_multirange(PG_FUNCTION_ARGS) if (RangeIsEmpty(r) || MultirangeIsEmpty(mr)) PG_RETURN_BOOL(false); - typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); - range_deserialize(typcache->rngtype, r, &lower1, &upper1, &empty); + range_deserialize(rangetyp, r, &lower1, &upper1, &empty); Assert(!empty); - multirange_get_bounds(typcache->rngtype, mr, mr->rangeCount - 1, + multirange_get_bounds(rangetyp, mr, mr->rangeCount - 1, &lower2, &upper2); - PG_RETURN_BOOL(range_cmp_bounds(typcache->rngtype, &upper1, &upper2) <= 0); + PG_RETURN_BOOL(range_cmp_bounds(rangetyp, &upper1, &upper2) <= 0); +} + +Datum +range_overleft_multirange(PG_FUNCTION_ARGS) +{ + RangeType *r = PG_GETARG_RANGE_P(0); + MultirangeType *mr = PG_GETARG_MULTIRANGE_P(1); + TypeCacheEntry *typcache; + + typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); + + PG_RETURN_BOOL(range_overleft_multirange_internal(typcache->rngtype, r, mr)); } Datum @@ -2049,12 +2056,11 @@ multirange_overleft_multirange(PG_FUNCTION_ARGS) } /* does not extend to left of? */ -Datum -range_overright_multirange(PG_FUNCTION_ARGS) +bool +range_overright_multirange_internal(TypeCacheEntry *rangetyp, + const RangeType *r, + const MultirangeType *mr) { - RangeType *r = PG_GETARG_RANGE_P(0); - MultirangeType *mr = PG_GETARG_MULTIRANGE_P(1); - TypeCacheEntry *typcache; RangeBound lower1, upper1, lower2, @@ -2064,13 +2070,23 @@ range_overright_multirange(PG_FUNCTION_ARGS) if (RangeIsEmpty(r) || MultirangeIsEmpty(mr)) PG_RETURN_BOOL(false); + range_deserialize(rangetyp, r, &lower1, &upper1, &empty); + Assert(!empty); + multirange_get_bounds(rangetyp, mr, 0, &lower2, &upper2); + + return (range_cmp_bounds(rangetyp, &lower1, &lower2) >= 0); +} + +Datum +range_overright_multirange(PG_FUNCTION_ARGS) +{ + RangeType *r = PG_GETARG_RANGE_P(0); + MultirangeType *mr = PG_GETARG_MULTIRANGE_P(1); + TypeCacheEntry *typcache; + typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); - range_deserialize(typcache->rngtype, r, &lower1, &upper1, &empty); - Assert(!empty); - multirange_get_bounds(typcache->rngtype, mr, 0, &lower2, &upper2); - - PG_RETURN_BOOL(range_cmp_bounds(typcache->rngtype, &lower1, &lower2) >= 0); + PG_RETURN_BOOL(range_overright_multirange_internal(typcache->rngtype, r, mr)); } Datum @@ -2129,7 +2145,7 @@ multirange_contains_multirange(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1)); - PG_RETURN_BOOL(multirange_contains_multirange_internal(typcache, mr1, mr2)); + PG_RETURN_BOOL(multirange_contains_multirange_internal(typcache->rngtype, mr1, mr2)); } /* contained by? */ @@ -2142,17 +2158,17 @@ multirange_contained_by_multirange(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1)); - PG_RETURN_BOOL(multirange_contains_multirange_internal(typcache, mr2, mr1)); + PG_RETURN_BOOL(multirange_contains_multirange_internal(typcache->rngtype, mr2, mr1)); } /* * Test whether multirange mr1 contains every range from another multirange mr2. */ bool -multirange_contains_multirange_internal(TypeCacheEntry *typcache, - MultirangeType *mr1, MultirangeType *mr2) +multirange_contains_multirange_internal(TypeCacheEntry *rangetyp, + const MultirangeType *mr1, + const MultirangeType *mr2) { - TypeCacheEntry *rangetyp; int32 range_count1 = mr1->rangeCount; int32 range_count2 = mr2->rangeCount; int i1, @@ -2162,8 +2178,6 @@ multirange_contains_multirange_internal(TypeCacheEntry *typcache, lower2, upper2; - rangetyp = typcache->rngtype; - /* * We follow the same logic for empties as ranges: - an empty multirange * contains an empty range/multirange. - an empty multirange can't contain @@ -2221,7 +2235,7 @@ range_before_multirange(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); - PG_RETURN_BOOL(range_before_multirange_internal(typcache, r, mr)); + PG_RETURN_BOOL(range_before_multirange_internal(typcache->rngtype, r, mr)); } Datum @@ -2233,7 +2247,7 @@ multirange_before_range(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); - PG_RETURN_BOOL(range_after_multirange_internal(typcache, r, mr)); + PG_RETURN_BOOL(range_after_multirange_internal(typcache->rngtype, r, mr)); } Datum @@ -2245,7 +2259,7 @@ multirange_before_multirange(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1)); - PG_RETURN_BOOL(multirange_before_multirange_internal(typcache, mr1, mr2)); + PG_RETURN_BOOL(multirange_before_multirange_internal(typcache->rngtype, mr1, mr2)); } /* strictly right of? */ @@ -2258,7 +2272,7 @@ range_after_multirange(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); - PG_RETURN_BOOL(range_after_multirange_internal(typcache, r, mr)); + PG_RETURN_BOOL(range_after_multirange_internal(typcache->rngtype, r, mr)); } Datum @@ -2270,7 +2284,7 @@ multirange_after_range(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); - PG_RETURN_BOOL(range_before_multirange_internal(typcache, r, mr)); + PG_RETURN_BOOL(range_before_multirange_internal(typcache->rngtype, r, mr)); } Datum @@ -2282,13 +2296,14 @@ multirange_after_multirange(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr1)); - PG_RETURN_BOOL(multirange_before_multirange_internal(typcache, mr2, mr1)); + PG_RETURN_BOOL(multirange_before_multirange_internal(typcache->rngtype, mr2, mr1)); } /* strictly left of? (internal version) */ bool -range_before_multirange_internal(TypeCacheEntry *typcache, RangeType *r, - MultirangeType *mr) +range_before_multirange_internal(TypeCacheEntry *rangetyp, + const RangeType *r, + const MultirangeType *mr) { RangeBound lower1, upper1, @@ -2299,19 +2314,18 @@ range_before_multirange_internal(TypeCacheEntry *typcache, RangeType *r, if (RangeIsEmpty(r) || MultirangeIsEmpty(mr)) return false; - range_deserialize(typcache->rngtype, r, &lower1, &upper1, &empty); + range_deserialize(rangetyp, r, &lower1, &upper1, &empty); Assert(!empty); - multirange_get_bounds(typcache->rngtype, mr, 0, - &lower2, &upper2); + multirange_get_bounds(rangetyp, mr, 0, &lower2, &upper2); - return (range_cmp_bounds(typcache->rngtype, &upper1, &lower2) < 0); + return (range_cmp_bounds(rangetyp, &upper1, &lower2) < 0); } bool -multirange_before_multirange_internal(TypeCacheEntry *typcache, - MultirangeType *mr1, - MultirangeType *mr2) +multirange_before_multirange_internal(TypeCacheEntry *rangetyp, + const MultirangeType *mr1, + const MultirangeType *mr2) { RangeBound lower1, upper1, @@ -2321,18 +2335,19 @@ multirange_before_multirange_internal(TypeCacheEntry *typcache, if (MultirangeIsEmpty(mr1) || MultirangeIsEmpty(mr2)) return false; - multirange_get_bounds(typcache->rngtype, mr1, mr1->rangeCount - 1, + multirange_get_bounds(rangetyp, mr1, mr1->rangeCount - 1, &lower1, &upper1); - multirange_get_bounds(typcache->rngtype, mr2, 0, + multirange_get_bounds(rangetyp, mr2, 0, &lower2, &upper2); - return (range_cmp_bounds(typcache->rngtype, &upper1, &lower2) < 0); + return (range_cmp_bounds(rangetyp, &upper1, &lower2) < 0); } /* strictly right of? (internal version) */ bool -range_after_multirange_internal(TypeCacheEntry *typcache, RangeType *r, - MultirangeType *mr) +range_after_multirange_internal(TypeCacheEntry *rangetyp, + const RangeType *r, + const MultirangeType *mr) { RangeBound lower1, upper1, @@ -2344,19 +2359,20 @@ range_after_multirange_internal(TypeCacheEntry *typcache, RangeType *r, if (RangeIsEmpty(r) || MultirangeIsEmpty(mr)) return false; - range_deserialize(typcache->rngtype, r, &lower1, &upper1, &empty); + range_deserialize(rangetyp, r, &lower1, &upper1, &empty); Assert(!empty); range_count = mr->rangeCount; - multirange_get_bounds(typcache->rngtype, mr, range_count - 1, + multirange_get_bounds(rangetyp, mr, range_count - 1, &lower2, &upper2); - return (range_cmp_bounds(typcache->rngtype, &lower1, &upper2) > 0); + return (range_cmp_bounds(rangetyp, &lower1, &upper2) > 0); } bool -range_adjacent_multirange_internal(TypeCacheEntry *typcache, RangeType *r, - MultirangeType *mr) +range_adjacent_multirange_internal(TypeCacheEntry *rangetyp, + const RangeType *r, + const MultirangeType *mr) { RangeBound lower1, upper1, @@ -2368,21 +2384,21 @@ range_adjacent_multirange_internal(TypeCacheEntry *typcache, RangeType *r, if (RangeIsEmpty(r) || MultirangeIsEmpty(mr)) return false; - range_deserialize(typcache->rngtype, r, &lower1, &upper1, &empty); + range_deserialize(rangetyp, r, &lower1, &upper1, &empty); Assert(!empty); range_count = mr->rangeCount; - multirange_get_bounds(typcache->rngtype, mr, 0, + multirange_get_bounds(rangetyp, mr, 0, &lower2, &upper2); - if (bounds_adjacent(typcache->rngtype, upper1, lower2)) + if (bounds_adjacent(rangetyp, upper1, lower2)) return true; if (range_count > 1) - multirange_get_bounds(typcache->rngtype, mr, range_count - 1, + multirange_get_bounds(rangetyp, mr, range_count - 1, &lower2, &upper2); - if (bounds_adjacent(typcache->rngtype, upper2, lower1)) + if (bounds_adjacent(rangetyp, upper2, lower1)) return true; return false; @@ -2398,7 +2414,7 @@ range_adjacent_multirange(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); - PG_RETURN_BOOL(range_adjacent_multirange_internal(typcache, r, mr)); + PG_RETURN_BOOL(range_adjacent_multirange_internal(typcache->rngtype, r, mr)); } Datum @@ -2413,7 +2429,7 @@ multirange_adjacent_range(PG_FUNCTION_ARGS) typcache = multirange_get_typcache(fcinfo, MultirangeTypeGetOid(mr)); - PG_RETURN_BOOL(range_adjacent_multirange_internal(typcache, r, mr)); + PG_RETURN_BOOL(range_adjacent_multirange_internal(typcache->rngtype, r, mr)); } Datum diff --git a/src/include/utils/multirangetypes.h b/src/include/utils/multirangetypes.h index f2290aac274..ff2e58744a9 100644 --- a/src/include/utils/multirangetypes.h +++ b/src/include/utils/multirangetypes.h @@ -14,8 +14,8 @@ #ifndef MULTIRANGETYPES_H #define MULTIRANGETYPES_H +#include "utils/rangetypes.h" #include "utils/typcache.h" -#include "utils/expandeddatum.h" /* @@ -56,33 +56,48 @@ typedef struct */ /* internal versions of the above */ -extern bool multirange_eq_internal(TypeCacheEntry *typcache, MultirangeType *mr1, - MultirangeType *mr2); -extern bool multirange_ne_internal(TypeCacheEntry *typcache, MultirangeType *mr1, - MultirangeType *mr2); -extern bool multirange_contains_elem_internal(TypeCacheEntry *typcache, MultirangeType *mr, +extern bool multirange_eq_internal(TypeCacheEntry *rangetyp, + const MultirangeType *mr1, + const MultirangeType *mr2); +extern bool multirange_ne_internal(TypeCacheEntry *rangetyp, + const MultirangeType *mr1, + const MultirangeType *mr2); +extern bool multirange_contains_elem_internal(TypeCacheEntry *rangetyp, + const MultirangeType *mr, Datum elem); -extern bool multirange_contains_range_internal(TypeCacheEntry *typcache, MultirangeType *mr, - RangeType *r); -extern bool range_contains_multirange_internal(TypeCacheEntry *typcache, RangeType *r, - MultirangeType *mr); -extern bool multirange_contains_multirange_internal(TypeCacheEntry *typcache, - MultirangeType *mr1, - MultirangeType *mr2); -extern bool range_overlaps_multirange_internal(TypeCacheEntry *typcache, RangeType *r, - MultirangeType *mr); -extern bool multirange_overlaps_multirange_internal(TypeCacheEntry *typcache, - MultirangeType *mr1, - MultirangeType *mr2); -extern bool range_before_multirange_internal(TypeCacheEntry *typcache, RangeType *r, - MultirangeType *mr); -extern bool range_after_multirange_internal(TypeCacheEntry *typcache, RangeType *r, - MultirangeType *mr); -extern bool range_adjacent_multirange_internal(TypeCacheEntry *typcache, RangeType *r, - MultirangeType *mr); -extern bool multirange_before_multirange_internal(TypeCacheEntry *typcache, - MultirangeType *mr1, - MultirangeType *mr2); +extern bool multirange_contains_range_internal(TypeCacheEntry *rangetyp, + const MultirangeType *mr, + const RangeType *r); +extern bool range_contains_multirange_internal(TypeCacheEntry *rangetyp, + const RangeType *r, + const MultirangeType *mr); +extern bool multirange_contains_multirange_internal(TypeCacheEntry *rangetyp, + const MultirangeType *mr1, + const MultirangeType *mr2); +extern bool range_overlaps_multirange_internal(TypeCacheEntry *rangetyp, + const RangeType *r, + const MultirangeType *mr); +extern bool multirange_overlaps_multirange_internal(TypeCacheEntry *rangetyp, + const MultirangeType *mr1, + const MultirangeType *mr2); +extern bool range_overleft_multirange_internal(TypeCacheEntry *rangetyp, + const RangeType *r, + const MultirangeType *mr); +extern bool range_overright_multirange_internal(TypeCacheEntry *rangetyp, + const RangeType *r, + const MultirangeType *mr); +extern bool range_before_multirange_internal(TypeCacheEntry *rangetyp, + const RangeType *r, + const MultirangeType *mr); +extern bool range_after_multirange_internal(TypeCacheEntry *rangetyp, + const RangeType *r, + const MultirangeType *mr); +extern bool range_adjacent_multirange_internal(TypeCacheEntry *rangetyp, + const RangeType *r, + const MultirangeType *mr); +extern bool multirange_before_multirange_internal(TypeCacheEntry *rangetyp, + const MultirangeType *mr1, + const MultirangeType *mr2); extern MultirangeType *multirange_minus_internal(Oid mltrngtypoid, TypeCacheEntry *rangetyp, int32 range_count1,