Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
multirangetypes.h151 linesDownload Raw Back to utils
1/*-------------------------------------------------------------------------2 *3 * multirangetypes.h4 *	  Declarations for Postgres multirange types.5 *6 *7 * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group8 * Portions Copyright (c) 1994, Regents of the University of California9 *10 * src/include/utils/multirangetypes.h11 *12 *-------------------------------------------------------------------------13 */14#ifndef MULTIRANGETYPES_H15#define MULTIRANGETYPES_H16 17#include "utils/rangetypes.h"18#include "utils/typcache.h"19 20 21/*22 * Multiranges are varlena objects, so must meet the varlena convention that23 * the first int32 of the object contains the total object size in bytes.24 * Be sure to use VARSIZE() and SET_VARSIZE() to access it, though!25 */26typedef struct27{28	int32		vl_len_;		/* varlena header (do not touch directly!) */29	Oid			multirangetypid;	/* multirange type's own OID */30	uint32		rangeCount;		/* the number of ranges */31 32	/*33	 * Following the count are the range objects themselves, as ShortRangeType34	 * structs. Note that ranges are varlena too, depending on whether they35	 * have lower/upper bounds and because even their base types can be36	 * varlena. So we can't really index into this list.37	 */38} MultirangeType;39 40/* Use these macros in preference to accessing these fields directly */41#define MultirangeTypeGetOid(mr)	((mr)->multirangetypid)42#define MultirangeIsEmpty(mr)  ((mr)->rangeCount == 0)43 44/*45 * fmgr functions for multirange type objects46 */47static inline MultirangeType *48DatumGetMultirangeTypeP(Datum X)49{50	return (MultirangeType *) PG_DETOAST_DATUM(X);51}52 53static inline MultirangeType *54DatumGetMultirangeTypePCopy(Datum X)55{56	return (MultirangeType *) PG_DETOAST_DATUM_COPY(X);57}58 59static inline Datum60MultirangeTypePGetDatum(const MultirangeType *X)61{62	return PointerGetDatum(X);63}64 65#define PG_GETARG_MULTIRANGE_P(n)		DatumGetMultirangeTypeP(PG_GETARG_DATUM(n))66#define PG_GETARG_MULTIRANGE_P_COPY(n)	DatumGetMultirangeTypePCopy(PG_GETARG_DATUM(n))67#define PG_RETURN_MULTIRANGE_P(x)		return MultirangeTypePGetDatum(x)68 69/*70 * prototypes for functions defined in multirangetypes.c71 */72 73/* internal versions of the above */74extern bool multirange_eq_internal(TypeCacheEntry *rangetyp,75								   const MultirangeType *mr1,76								   const MultirangeType *mr2);77extern bool multirange_ne_internal(TypeCacheEntry *rangetyp,78								   const MultirangeType *mr1,79								   const MultirangeType *mr2);80extern bool multirange_contains_elem_internal(TypeCacheEntry *rangetyp,81											  const MultirangeType *mr,82											  Datum val);83extern bool multirange_contains_range_internal(TypeCacheEntry *rangetyp,84											   const MultirangeType *mr,85											   const RangeType *r);86extern bool range_contains_multirange_internal(TypeCacheEntry *rangetyp,87											   const RangeType *r,88											   const MultirangeType *mr);89extern bool multirange_contains_multirange_internal(TypeCacheEntry *rangetyp,90													const MultirangeType *mr1,91													const MultirangeType *mr2);92extern bool range_overlaps_multirange_internal(TypeCacheEntry *rangetyp,93											   const RangeType *r,94											   const MultirangeType *mr);95extern bool multirange_overlaps_multirange_internal(TypeCacheEntry *rangetyp,96													const MultirangeType *mr1,97													const MultirangeType *mr2);98extern bool range_overleft_multirange_internal(TypeCacheEntry *rangetyp,99											   const RangeType *r,100											   const MultirangeType *mr);101extern bool range_overright_multirange_internal(TypeCacheEntry *rangetyp,102												const RangeType *r,103												const MultirangeType *mr);104extern bool range_before_multirange_internal(TypeCacheEntry *rangetyp,105											 const RangeType *r,106											 const MultirangeType *mr);107extern bool range_after_multirange_internal(TypeCacheEntry *rangetyp,108											const RangeType *r,109											const MultirangeType *mr);110extern bool range_adjacent_multirange_internal(TypeCacheEntry *rangetyp,111											   const RangeType *r,112											   const MultirangeType *mr);113extern bool multirange_before_multirange_internal(TypeCacheEntry *rangetyp,114												  const MultirangeType *mr1,115												  const MultirangeType *mr2);116extern MultirangeType *multirange_minus_internal(Oid mltrngtypoid,117												 TypeCacheEntry *rangetyp,118												 int32 range_count1,119												 RangeType **ranges1,120												 int32 range_count2,121												 RangeType **ranges2);122extern MultirangeType *multirange_intersect_internal(Oid mltrngtypoid,123													 TypeCacheEntry *rangetyp,124													 int32 range_count1,125													 RangeType **ranges1,126													 int32 range_count2,127													 RangeType **ranges2);128 129/* assorted support functions */130extern TypeCacheEntry *multirange_get_typcache(FunctionCallInfo fcinfo,131											   Oid mltrngtypid);132extern void multirange_deserialize(TypeCacheEntry *rangetyp,133								   const MultirangeType *multirange,134								   int32 *range_count,135								   RangeType ***ranges);136extern MultirangeType *make_multirange(Oid mltrngtypoid,137									   TypeCacheEntry *rangetyp,138									   int32 range_count, RangeType **ranges);139extern MultirangeType *make_empty_multirange(Oid mltrngtypoid,140											 TypeCacheEntry *rangetyp);141extern void multirange_get_bounds(TypeCacheEntry *rangetyp,142								  const MultirangeType *multirange,143								  uint32 i,144								  RangeBound *lower, RangeBound *upper);145extern RangeType *multirange_get_range(TypeCacheEntry *rangetyp,146									   const MultirangeType *multirange, int i);147extern RangeType *multirange_get_union_range(TypeCacheEntry *rangetyp,148											 const MultirangeType *mr);149 150#endif							/* MULTIRANGETYPES_H */151 
codekingpro/portable-devtools · Team Ai