PostgreSQL Source Code git master
rangetypes.h
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * rangetypes.h
4 * Declarations for Postgres range types.
5 *
6 *
7 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
9 *
10 * src/include/utils/rangetypes.h
11 *
12 *-------------------------------------------------------------------------
13 */
14#ifndef RANGETYPES_H
15#define RANGETYPES_H
16
17#include "utils/typcache.h"
18
19
20/*
21 * Ranges are varlena objects, so must meet the varlena convention that
22 * the first int32 of the object contains the total object size in bytes.
23 * Be sure to use VARSIZE() and SET_VARSIZE() to access it, though!
24 */
25typedef struct
26{
27 int32 vl_len_; /* varlena header (do not touch directly!) */
28 Oid rangetypid; /* range type's own OID */
29 /* Following the OID are zero to two bound values, then a flags byte */
30} RangeType;
31
32#define RANGE_EMPTY_LITERAL "empty"
33
34/* Use this macro in preference to fetching rangetypid field directly */
35#define RangeTypeGetOid(r) ((r)->rangetypid)
36
37/* A range's flags byte contains these bits: */
38#define RANGE_EMPTY 0x01 /* range is empty */
39#define RANGE_LB_INC 0x02 /* lower bound is inclusive */
40#define RANGE_UB_INC 0x04 /* upper bound is inclusive */
41#define RANGE_LB_INF 0x08 /* lower bound is -infinity */
42#define RANGE_UB_INF 0x10 /* upper bound is +infinity */
43#define RANGE_LB_NULL 0x20 /* lower bound is null (NOT USED) */
44#define RANGE_UB_NULL 0x40 /* upper bound is null (NOT USED) */
45#define RANGE_CONTAIN_EMPTY 0x80 /* marks a GiST internal-page entry whose
46 * subtree contains some empty ranges */
48#define RANGE_HAS_LBOUND(flags) (!((flags) & (RANGE_EMPTY | \
49 RANGE_LB_NULL | \
50 RANGE_LB_INF)))
52#define RANGE_HAS_UBOUND(flags) (!((flags) & (RANGE_EMPTY | \
53 RANGE_UB_NULL | \
54 RANGE_UB_INF)))
56#define RangeIsEmpty(r) ((range_get_flags(r) & RANGE_EMPTY) != 0)
57#define RangeIsOrContainsEmpty(r) \
58 ((range_get_flags(r) & (RANGE_EMPTY | RANGE_CONTAIN_EMPTY)) != 0)
59
60
61/* Internal representation of either bound of a range (not what's on disk) */
62typedef struct
64 Datum val; /* the bound value, if any */
65 bool infinite; /* bound is +/- infinity */
66 bool inclusive; /* bound is inclusive (vs exclusive) */
67 bool lower; /* this is the lower (vs upper) bound */
69
70/*
71 * fmgr functions for range type objects
72 */
73static inline RangeType *
75{
76 return (RangeType *) PG_DETOAST_DATUM(X);
77}
78
79static inline RangeType *
81{
82 return (RangeType *) PG_DETOAST_DATUM_COPY(X);
83}
84
85static inline Datum
87{
88 return PointerGetDatum(X);
89}
91#define PG_GETARG_RANGE_P(n) DatumGetRangeTypeP(PG_GETARG_DATUM(n))
92#define PG_GETARG_RANGE_P_COPY(n) DatumGetRangeTypePCopy(PG_GETARG_DATUM(n))
93#define PG_RETURN_RANGE_P(x) return RangeTypePGetDatum(x)
94
95/* Operator strategy numbers used in the GiST and SP-GiST range opclasses */
96/* Numbers are chosen to match up operator names with existing usages */
97#define RANGESTRAT_BEFORE RTLeftStrategyNumber
98#define RANGESTRAT_OVERLEFT RTOverLeftStrategyNumber
99#define RANGESTRAT_OVERLAPS RTOverlapStrategyNumber
100#define RANGESTRAT_OVERRIGHT RTOverRightStrategyNumber
101#define RANGESTRAT_AFTER RTRightStrategyNumber
102#define RANGESTRAT_ADJACENT RTSameStrategyNumber
103#define RANGESTRAT_CONTAINS RTContainsStrategyNumber
104#define RANGESTRAT_CONTAINED_BY RTContainedByStrategyNumber
105#define RANGESTRAT_CONTAINS_ELEM RTContainsElemStrategyNumber
106#define RANGESTRAT_EQ RTEqualStrategyNumber
107
108/*
109 * prototypes for functions defined in rangetypes.c
110 */
111
112extern bool range_contains_elem_internal(TypeCacheEntry *typcache, const RangeType *r, Datum val);
113
114/* internal versions of the above */
115extern bool range_eq_internal(TypeCacheEntry *typcache, const RangeType *r1,
116 const RangeType *r2);
117extern bool range_ne_internal(TypeCacheEntry *typcache, const RangeType *r1,
118 const RangeType *r2);
119extern bool range_contains_internal(TypeCacheEntry *typcache, const RangeType *r1,
120 const RangeType *r2);
121extern bool range_contained_by_internal(TypeCacheEntry *typcache, const RangeType *r1,
122 const RangeType *r2);
123extern bool range_before_internal(TypeCacheEntry *typcache, const RangeType *r1,
124 const RangeType *r2);
125extern bool range_after_internal(TypeCacheEntry *typcache, const RangeType *r1,
126 const RangeType *r2);
127extern bool range_adjacent_internal(TypeCacheEntry *typcache, const RangeType *r1,
128 const RangeType *r2);
129extern bool range_overlaps_internal(TypeCacheEntry *typcache, const RangeType *r1,
130 const RangeType *r2);
131extern bool range_overleft_internal(TypeCacheEntry *typcache, const RangeType *r1,
132 const RangeType *r2);
133extern bool range_overright_internal(TypeCacheEntry *typcache, const RangeType *r1,
134 const RangeType *r2);
136 RangeType *r2, bool strict);
138 RangeType *r2);
140 const RangeType *r2);
141
142/* assorted support functions */
144 Oid rngtypid);
146 RangeBound *upper, bool empty,
147 struct Node *escontext);
148extern void range_deserialize(TypeCacheEntry *typcache, const RangeType *range,
150 bool *empty);
151extern char range_get_flags(const RangeType *range);
154 RangeBound *upper, bool empty,
155 struct Node *escontext);
156extern int range_cmp_bounds(TypeCacheEntry *typcache, const RangeBound *b1,
157 const RangeBound *b2);
158extern int range_cmp_bound_values(TypeCacheEntry *typcache, const RangeBound *b1,
159 const RangeBound *b2);
160extern int range_compare(const void *key1, const void *key2, void *arg);
161extern bool bounds_adjacent(TypeCacheEntry *typcache, RangeBound boundA,
162 RangeBound boundB);
163extern RangeType *make_empty_range(TypeCacheEntry *typcache);
164extern bool range_split_internal(TypeCacheEntry *typcache, const RangeType *r1,
165 const RangeType *r2, RangeType **output1,
166 RangeType **output2);
167
168#endif /* RANGETYPES_H */
int32_t int32
Definition: c.h:484
#define PG_DETOAST_DATUM_COPY(datum)
Definition: fmgr.h:242
#define PG_DETOAST_DATUM(datum)
Definition: fmgr.h:240
long val
Definition: informix.c:689
Datum lower(PG_FUNCTION_ARGS)
Definition: oracle_compat.c:49
Datum upper(PG_FUNCTION_ARGS)
Definition: oracle_compat.c:80
void * arg
static Datum PointerGetDatum(const void *X)
Definition: postgres.h:327
uintptr_t Datum
Definition: postgres.h:69
unsigned int Oid
Definition: postgres_ext.h:32
bool range_ne_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
Definition: rangetypes.c:618
int range_cmp_bounds(TypeCacheEntry *typcache, const RangeBound *b1, const RangeBound *b2)
Definition: rangetypes.c:2016
static RangeType * DatumGetRangeTypeP(Datum X)
Definition: rangetypes.h:73
static RangeType * DatumGetRangeTypePCopy(Datum X)
Definition: rangetypes.h:79
bool range_split_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2, RangeType **output1, RangeType **output2)
Definition: rangetypes.c:1182
RangeType * range_serialize(TypeCacheEntry *typcache, RangeBound *lower, RangeBound *upper, bool empty, struct Node *escontext)
Definition: rangetypes.c:1727
bool range_contained_by_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
Definition: rangetypes.c:2618
RangeType * make_range(TypeCacheEntry *typcache, RangeBound *lower, RangeBound *upper, bool empty, struct Node *escontext)
Definition: rangetypes.c:1952
bool range_contains_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
Definition: rangetypes.c:2586
bool range_after_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
Definition: rangetypes.c:702
bool bounds_adjacent(TypeCacheEntry *typcache, RangeBound boundA, RangeBound boundB)
Definition: rangetypes.c:757
bool range_overlaps_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
Definition: rangetypes.c:841
bool range_before_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
Definition: rangetypes.c:664
bool range_overright_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
Definition: rangetypes.c:928
bool range_contains_elem_internal(TypeCacheEntry *typcache, const RangeType *r, Datum val)
Definition: rangetypes.c:2627
RangeType * range_intersect_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
Definition: rangetypes.c:1143
static Datum RangeTypePGetDatum(const RangeType *X)
Definition: rangetypes.h:85
RangeType * range_minus_internal(TypeCacheEntry *typcache, RangeType *r1, RangeType *r2)
Definition: rangetypes.c:993
void range_deserialize(TypeCacheEntry *typcache, const RangeType *range, RangeBound *lower, RangeBound *upper, bool *empty)
Definition: rangetypes.c:1856
RangeType * range_union_internal(TypeCacheEntry *typcache, RangeType *r1, RangeType *r2, bool strict)
Definition: rangetypes.c:1052
bool range_eq_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
Definition: rangetypes.c:573
bool range_adjacent_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
Definition: rangetypes.c:798
void range_set_contain_empty(RangeType *range)
Definition: rangetypes.c:1937
TypeCacheEntry * range_get_typcache(FunctionCallInfo fcinfo, Oid rngtypid)
Definition: rangetypes.c:1703
char range_get_flags(const RangeType *range)
Definition: rangetypes.c:1923
bool range_overleft_internal(TypeCacheEntry *typcache, const RangeType *r1, const RangeType *r2)
Definition: rangetypes.c:887
int range_compare(const void *key1, const void *key2, void *arg)
Definition: rangetypes.c:2129
RangeType * make_empty_range(TypeCacheEntry *typcache)
Definition: rangetypes.c:2165
int range_cmp_bound_values(TypeCacheEntry *typcache, const RangeBound *b1, const RangeBound *b2)
Definition: rangetypes.c:2090
static struct cvec * range(struct vars *v, chr a, chr b, int cases)
Definition: regc_locale.c:412
Definition: nodes.h:129
int32 vl_len_
Definition: rangetypes.h:27
Oid rangetypid
Definition: rangetypes.h:28