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

View File

@ -14,8 +14,8 @@
#ifndef MULTIRANGETYPES_H #ifndef MULTIRANGETYPES_H
#define MULTIRANGETYPES_H #define MULTIRANGETYPES_H
#include "utils/rangetypes.h"
#include "utils/typcache.h" #include "utils/typcache.h"
#include "utils/expandeddatum.h"
/* /*
@ -56,33 +56,48 @@ typedef struct
*/ */
/* internal versions of the above */ /* internal versions of the above */
extern bool multirange_eq_internal(TypeCacheEntry *typcache, MultirangeType *mr1, extern bool multirange_eq_internal(TypeCacheEntry *rangetyp,
MultirangeType *mr2); const MultirangeType *mr1,
extern bool multirange_ne_internal(TypeCacheEntry *typcache, MultirangeType *mr1, const MultirangeType *mr2);
MultirangeType *mr2); extern bool multirange_ne_internal(TypeCacheEntry *rangetyp,
extern bool multirange_contains_elem_internal(TypeCacheEntry *typcache, MultirangeType *mr, const MultirangeType *mr1,
const MultirangeType *mr2);
extern bool multirange_contains_elem_internal(TypeCacheEntry *rangetyp,
const MultirangeType *mr,
Datum elem); Datum elem);
extern bool multirange_contains_range_internal(TypeCacheEntry *typcache, MultirangeType *mr, extern bool multirange_contains_range_internal(TypeCacheEntry *rangetyp,
RangeType *r); const MultirangeType *mr,
extern bool range_contains_multirange_internal(TypeCacheEntry *typcache, RangeType *r, const RangeType *r);
MultirangeType *mr); extern bool range_contains_multirange_internal(TypeCacheEntry *rangetyp,
extern bool multirange_contains_multirange_internal(TypeCacheEntry *typcache, const RangeType *r,
MultirangeType *mr1, const MultirangeType *mr);
MultirangeType *mr2); extern bool multirange_contains_multirange_internal(TypeCacheEntry *rangetyp,
extern bool range_overlaps_multirange_internal(TypeCacheEntry *typcache, RangeType *r, const MultirangeType *mr1,
MultirangeType *mr); const MultirangeType *mr2);
extern bool multirange_overlaps_multirange_internal(TypeCacheEntry *typcache, extern bool range_overlaps_multirange_internal(TypeCacheEntry *rangetyp,
MultirangeType *mr1, const RangeType *r,
MultirangeType *mr2); const MultirangeType *mr);
extern bool range_before_multirange_internal(TypeCacheEntry *typcache, RangeType *r, extern bool multirange_overlaps_multirange_internal(TypeCacheEntry *rangetyp,
MultirangeType *mr); const MultirangeType *mr1,
extern bool range_after_multirange_internal(TypeCacheEntry *typcache, RangeType *r, const MultirangeType *mr2);
MultirangeType *mr); extern bool range_overleft_multirange_internal(TypeCacheEntry *rangetyp,
extern bool range_adjacent_multirange_internal(TypeCacheEntry *typcache, RangeType *r, const RangeType *r,
MultirangeType *mr); const MultirangeType *mr);
extern bool multirange_before_multirange_internal(TypeCacheEntry *typcache, extern bool range_overright_multirange_internal(TypeCacheEntry *rangetyp,
MultirangeType *mr1, const RangeType *r,
MultirangeType *mr2); 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, extern MultirangeType *multirange_minus_internal(Oid mltrngtypoid,
TypeCacheEntry *rangetyp, TypeCacheEntry *rangetyp,
int32 range_count1, int32 range_count1,