@@ -1631,6 +1631,18 @@ multirange_contains_range(PG_FUNCTION_ARGS)
16311631 PG_RETURN_BOOL (multirange_contains_range_internal (typcache , mr , r ));
16321632}
16331633
1634+ Datum
1635+ range_contains_multirange (PG_FUNCTION_ARGS )
1636+ {
1637+ RangeType * r = PG_GETARG_RANGE_P (0 );
1638+ MultirangeType * mr = PG_GETARG_MULTIRANGE_P (1 );
1639+ TypeCacheEntry * typcache ;
1640+
1641+ typcache = multirange_get_typcache (fcinfo , MultirangeTypeGetOid (mr ));
1642+
1643+ PG_RETURN_BOOL (range_contains_multirange_internal (typcache , r , mr ));
1644+ }
1645+
16341646/* contained by? */
16351647Datum
16361648range_contained_by_multirange (PG_FUNCTION_ARGS )
@@ -1644,6 +1656,18 @@ range_contained_by_multirange(PG_FUNCTION_ARGS)
16441656 PG_RETURN_BOOL (multirange_contains_range_internal (typcache , mr , r ));
16451657}
16461658
1659+ Datum
1660+ multirange_contained_by_range (PG_FUNCTION_ARGS )
1661+ {
1662+ MultirangeType * mr = PG_GETARG_MULTIRANGE_P (0 );
1663+ RangeType * r = PG_GETARG_RANGE_P (1 );
1664+ TypeCacheEntry * typcache ;
1665+
1666+ typcache = multirange_get_typcache (fcinfo , MultirangeTypeGetOid (mr ));
1667+
1668+ PG_RETURN_BOOL (range_contains_multirange_internal (typcache , r , mr ));
1669+ }
1670+
16471671/*
16481672 * Comparison function for checking if any range of multirange contains given
16491673 * key range using binary search.
@@ -1701,6 +1725,42 @@ multirange_contains_range_internal(TypeCacheEntry *typcache, MultirangeType *mr,
17011725 multirange_range_contains_bsearch_comparison );
17021726}
17031727
1728+ /*
1729+ * Test whether range r contains a multirange mr.
1730+ */
1731+ bool
1732+ range_contains_multirange_internal (TypeCacheEntry * typcache , RangeType * r ,
1733+ MultirangeType * mr )
1734+ {
1735+ TypeCacheEntry * rangetyp ;
1736+ RangeBound lower1 ,
1737+ upper1 ,
1738+ lower2 ,
1739+ upper2 ,
1740+ tmp ;
1741+ bool empty ;
1742+
1743+ rangetyp = typcache -> rngtype ;
1744+
1745+ /*
1746+ * Every range contains an infinite number of empty multiranges, even an
1747+ * empty one.
1748+ */
1749+ if (MultirangeIsEmpty (mr ))
1750+ return true;
1751+
1752+ if (RangeIsEmpty (r ))
1753+ return false;
1754+
1755+ /* Range contains multirange iff it contains its union range. */
1756+ range_deserialize (rangetyp , r , & lower1 , & upper1 , & empty );
1757+ Assert (!empty );
1758+ multirange_get_bounds (rangetyp , mr , 0 , & lower2 , & tmp );
1759+ multirange_get_bounds (rangetyp , mr , mr -> rangeCount - 1 , & tmp , & upper2 );
1760+
1761+ return range_bounds_contains (rangetyp , & lower1 , & upper1 , & lower2 , & upper2 );
1762+ }
1763+
17041764
17051765/* multirange, multirange -> bool functions */
17061766
0 commit comments