@ -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 * range typ,
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 ( range typ, 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 ) ;
typcache = multirange_get_typcache ( fcinfo , MultirangeTypeGetOid ( mr ) ) ;
range_deserialize ( rangetyp , r , & lower1 , & upper1 , & empty ) ;
range_deserialize ( typcache - > rngtype , r , & lower1 , & upper1 , & empty ) ;
Assert ( ! 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
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 * range typ,
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