postgresql/src/include/utils/multirangetypes.h

151 lines
5.6 KiB
C

/*-------------------------------------------------------------------------
*
* multirangetypes.h
* Declarations for Postgres multirange types.
*
*
* Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/utils/multirangetypes.h
*
*-------------------------------------------------------------------------
*/
#ifndef MULTIRANGETYPES_H
#define MULTIRANGETYPES_H
#include "utils/rangetypes.h"
#include "utils/typcache.h"
/*
* Multiranges are varlena objects, so must meet the varlena convention that
* the first int32 of the object contains the total object size in bytes.
* Be sure to use VARSIZE() and SET_VARSIZE() to access it, though!
*/
typedef struct
{
int32 vl_len_; /* varlena header (do not touch directly!) */
Oid multirangetypid; /* multirange type's own OID */
uint32 rangeCount; /* the number of ranges */
/*
* Following the count are the range objects themselves, as ShortRangeType
* structs. Note that ranges are varlena too, depending on whether they
* have lower/upper bounds and because even their base types can be
* varlena. So we can't really index into this list.
*/
} MultirangeType;
/* Use these macros in preference to accessing these fields directly */
#define MultirangeTypeGetOid(mr) ((mr)->multirangetypid)
#define MultirangeIsEmpty(mr) ((mr)->rangeCount == 0)
/*
* fmgr functions for multirange type objects
*/
static inline MultirangeType *
DatumGetMultirangeTypeP(Datum X)
{
return (MultirangeType *) PG_DETOAST_DATUM(X);
}
static inline MultirangeType *
DatumGetMultirangeTypePCopy(Datum X)
{
return (MultirangeType *) PG_DETOAST_DATUM_COPY(X);
}
static inline Datum
MultirangeTypePGetDatum(const MultirangeType *X)
{
return PointerGetDatum(X);
}
#define PG_GETARG_MULTIRANGE_P(n) DatumGetMultirangeTypeP(PG_GETARG_DATUM(n))
#define PG_GETARG_MULTIRANGE_P_COPY(n) DatumGetMultirangeTypePCopy(PG_GETARG_DATUM(n))
#define PG_RETURN_MULTIRANGE_P(x) return MultirangeTypePGetDatum(x)
/*
* prototypes for functions defined in multirangetypes.c
*/
/* internal versions of the above */
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 val);
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,
RangeType **ranges1,
int32 range_count2,
RangeType **ranges2);
extern MultirangeType *multirange_intersect_internal(Oid mltrngtypoid,
TypeCacheEntry *rangetyp,
int32 range_count1,
RangeType **ranges1,
int32 range_count2,
RangeType **ranges2);
/* assorted support functions */
extern TypeCacheEntry *multirange_get_typcache(FunctionCallInfo fcinfo,
Oid mltrngtypid);
extern void multirange_deserialize(TypeCacheEntry *rangetyp,
const MultirangeType *multirange,
int32 *range_count,
RangeType ***ranges);
extern MultirangeType *make_multirange(Oid mltrngtypoid,
TypeCacheEntry *rangetyp,
int32 range_count, RangeType **ranges);
extern MultirangeType *make_empty_multirange(Oid mltrngtypoid,
TypeCacheEntry *rangetyp);
extern void multirange_get_bounds(TypeCacheEntry *rangetyp,
const MultirangeType *multirange,
uint32 i,
RangeBound *lower, RangeBound *upper);
extern RangeType *multirange_get_range(TypeCacheEntry *rangetyp,
const MultirangeType *multirange, int i);
extern RangeType *multirange_get_union_range(TypeCacheEntry *rangetyp,
const MultirangeType *mr);
#endif /* MULTIRANGETYPES_H */