* 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,
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? */
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));
}
/*
* 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);
}
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
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? */
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
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));
}
/*
* 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.
* 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,
tmp;
bool empty;
- rangetyp = typcache->rngtype;
-
/*
* Every range contains an infinite number of empty multiranges, even an
* empty one.
/* 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;
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 */
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? */
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
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
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));
}
/*
}
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.)
}
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;
if (MultirangeIsEmpty(mr1) || MultirangeIsEmpty(mr2))
return false;
- rangetyp = typcache->rngtype;
-
range_count1 = mr1->rangeCount;
range_count2 = mr2->rangeCount;
}
/* 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,
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
}
/* 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,
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, 0, &lower2, &upper2);
+ multirange_get_bounds(rangetyp, mr, 0, &lower2, &upper2);
- PG_RETURN_BOOL(range_cmp_bounds(typcache->rngtype, &lower1, &lower2) >= 0);
+ 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));
+
+ PG_RETURN_BOOL(range_overright_multirange_internal(typcache->rngtype, r, mr));
}
Datum
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? */
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,
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
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
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
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? */
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
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
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,
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,
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,
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,
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;
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
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
#ifndef MULTIRANGETYPES_H
#define MULTIRANGETYPES_H
+#include "utils/rangetypes.h"
#include "utils/typcache.h"
-#include "utils/expandeddatum.h"
/*
*/
/* 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,