mirror of
https://github.com/postgres/postgres.git
synced 2025-05-03 22:24:49 +03:00
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:
parent
4d7684cc75
commit
d1d61a8b23
@ -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
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user