Improve the signature of internal multirange functions

There is a set of *_internal() functions exposed in
include/utils/multirangetypes.h.  This commit improves the signatures of these
functions in two ways.
 * Add const qualifies where applicable.
 * Replace multirange typecache argument with range typecache argument.
   Multirange typecache was used solely to find the range typecache.  At the
   same time, range typecache is easier for the caller to find.
This commit is contained in:
Alexander Korotkov 2020-12-29 23:35:38 +03:00
parent 4d7684cc75
commit d1d61a8b23
2 changed files with 153 additions and 122 deletions

View File

@ -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

View File

@ -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,