/src/postgres/src/include/utils/geo_decls.h
Line | Count | Source (jump to first uncovered line) |
1 | | /*------------------------------------------------------------------------- |
2 | | * |
3 | | * geo_decls.h - Declarations for various 2D constructs. |
4 | | * |
5 | | * |
6 | | * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group |
7 | | * Portions Copyright (c) 1994, Regents of the University of California |
8 | | * |
9 | | * src/include/utils/geo_decls.h |
10 | | * |
11 | | * XXX These routines were not written by a numerical analyst. |
12 | | * |
13 | | * XXX I have made some attempt to flesh out the operators |
14 | | * and data types. There are still some more to do. - tgl 97/04/19 |
15 | | * |
16 | | *------------------------------------------------------------------------- |
17 | | */ |
18 | | #ifndef GEO_DECLS_H |
19 | | #define GEO_DECLS_H |
20 | | |
21 | | #include <math.h> |
22 | | |
23 | | #include "fmgr.h" |
24 | | |
25 | | /*-------------------------------------------------------------------- |
26 | | * Useful floating point utilities and constants. |
27 | | *-------------------------------------------------------------------- |
28 | | * |
29 | | * "Fuzzy" floating-point comparisons: values within EPSILON of each other |
30 | | * are considered equal. Beware of normal reasoning about the behavior of |
31 | | * these comparisons, since for example FPeq does not behave transitively. |
32 | | * |
33 | | * Note that these functions are not NaN-aware and will give FALSE for |
34 | | * any case involving NaN inputs. |
35 | | * |
36 | | * Also note that these will give sane answers for infinite inputs, |
37 | | * where it's important to avoid computing Inf minus Inf; we do so |
38 | | * by eliminating equality cases before subtracting. |
39 | | */ |
40 | | |
41 | 0 | #define EPSILON 1.0E-06 |
42 | | |
43 | | #ifdef EPSILON |
44 | 0 | #define FPzero(A) (fabs(A) <= EPSILON) |
45 | | |
46 | | static inline bool |
47 | | FPeq(double A, double B) |
48 | 0 | { |
49 | 0 | return A == B || fabs(A - B) <= EPSILON; |
50 | 0 | } Unexecuted instantiation: reloptions.c:FPeq Unexecuted instantiation: gistproc.c:FPeq Unexecuted instantiation: spgdoinsert.c:FPeq Unexecuted instantiation: spginsert.c:FPeq Unexecuted instantiation: spgkdtreeproc.c:FPeq Unexecuted instantiation: spgproc.c:FPeq Unexecuted instantiation: spgquadtreeproc.c:FPeq Unexecuted instantiation: spgscan.c:FPeq Unexecuted instantiation: spgutils.c:FPeq Unexecuted instantiation: spgvacuum.c:FPeq Unexecuted instantiation: spgxlog.c:FPeq Unexecuted instantiation: geo_ops.c:FPeq Unexecuted instantiation: geo_spgist.c:FPeq |
51 | | |
52 | | static inline bool |
53 | | FPne(double A, double B) |
54 | 0 | { |
55 | 0 | return A != B && fabs(A - B) > EPSILON; |
56 | 0 | } Unexecuted instantiation: reloptions.c:FPne Unexecuted instantiation: gistproc.c:FPne Unexecuted instantiation: spgdoinsert.c:FPne Unexecuted instantiation: spginsert.c:FPne Unexecuted instantiation: spgkdtreeproc.c:FPne Unexecuted instantiation: spgproc.c:FPne Unexecuted instantiation: spgquadtreeproc.c:FPne Unexecuted instantiation: spgscan.c:FPne Unexecuted instantiation: spgutils.c:FPne Unexecuted instantiation: spgvacuum.c:FPne Unexecuted instantiation: spgxlog.c:FPne Unexecuted instantiation: geo_ops.c:FPne Unexecuted instantiation: geo_spgist.c:FPne |
57 | | |
58 | | static inline bool |
59 | | FPlt(double A, double B) |
60 | 0 | { |
61 | 0 | return A + EPSILON < B; |
62 | 0 | } Unexecuted instantiation: reloptions.c:FPlt Unexecuted instantiation: gistproc.c:FPlt Unexecuted instantiation: spgdoinsert.c:FPlt Unexecuted instantiation: spginsert.c:FPlt Unexecuted instantiation: spgkdtreeproc.c:FPlt Unexecuted instantiation: spgproc.c:FPlt Unexecuted instantiation: spgquadtreeproc.c:FPlt Unexecuted instantiation: spgscan.c:FPlt Unexecuted instantiation: spgutils.c:FPlt Unexecuted instantiation: spgvacuum.c:FPlt Unexecuted instantiation: spgxlog.c:FPlt Unexecuted instantiation: geo_ops.c:FPlt Unexecuted instantiation: geo_spgist.c:FPlt |
63 | | |
64 | | static inline bool |
65 | | FPle(double A, double B) |
66 | 0 | { |
67 | 0 | return A <= B + EPSILON; |
68 | 0 | } Unexecuted instantiation: reloptions.c:FPle Unexecuted instantiation: gistproc.c:FPle Unexecuted instantiation: spgdoinsert.c:FPle Unexecuted instantiation: spginsert.c:FPle Unexecuted instantiation: spgkdtreeproc.c:FPle Unexecuted instantiation: spgproc.c:FPle Unexecuted instantiation: spgquadtreeproc.c:FPle Unexecuted instantiation: spgscan.c:FPle Unexecuted instantiation: spgutils.c:FPle Unexecuted instantiation: spgvacuum.c:FPle Unexecuted instantiation: spgxlog.c:FPle Unexecuted instantiation: geo_ops.c:FPle Unexecuted instantiation: geo_spgist.c:FPle |
69 | | |
70 | | static inline bool |
71 | | FPgt(double A, double B) |
72 | 0 | { |
73 | 0 | return A > B + EPSILON; |
74 | 0 | } Unexecuted instantiation: reloptions.c:FPgt Unexecuted instantiation: gistproc.c:FPgt Unexecuted instantiation: spgdoinsert.c:FPgt Unexecuted instantiation: spginsert.c:FPgt Unexecuted instantiation: spgkdtreeproc.c:FPgt Unexecuted instantiation: spgproc.c:FPgt Unexecuted instantiation: spgquadtreeproc.c:FPgt Unexecuted instantiation: spgscan.c:FPgt Unexecuted instantiation: spgutils.c:FPgt Unexecuted instantiation: spgvacuum.c:FPgt Unexecuted instantiation: spgxlog.c:FPgt Unexecuted instantiation: geo_ops.c:FPgt Unexecuted instantiation: geo_spgist.c:FPgt |
75 | | |
76 | | static inline bool |
77 | | FPge(double A, double B) |
78 | 0 | { |
79 | 0 | return A + EPSILON >= B; |
80 | 0 | } Unexecuted instantiation: reloptions.c:FPge Unexecuted instantiation: gistproc.c:FPge Unexecuted instantiation: spgdoinsert.c:FPge Unexecuted instantiation: spginsert.c:FPge Unexecuted instantiation: spgkdtreeproc.c:FPge Unexecuted instantiation: spgproc.c:FPge Unexecuted instantiation: spgquadtreeproc.c:FPge Unexecuted instantiation: spgscan.c:FPge Unexecuted instantiation: spgutils.c:FPge Unexecuted instantiation: spgvacuum.c:FPge Unexecuted instantiation: spgxlog.c:FPge Unexecuted instantiation: geo_ops.c:FPge Unexecuted instantiation: geo_spgist.c:FPge |
81 | | #else |
82 | | #define FPzero(A) ((A) == 0) |
83 | | #define FPeq(A,B) ((A) == (B)) |
84 | | #define FPne(A,B) ((A) != (B)) |
85 | | #define FPlt(A,B) ((A) < (B)) |
86 | | #define FPle(A,B) ((A) <= (B)) |
87 | | #define FPgt(A,B) ((A) > (B)) |
88 | | #define FPge(A,B) ((A) >= (B)) |
89 | | #endif |
90 | | |
91 | 0 | #define HYPOT(A, B) pg_hypot(A, B) |
92 | | |
93 | | /*--------------------------------------------------------------------- |
94 | | * Point - (x,y) |
95 | | *-------------------------------------------------------------------*/ |
96 | | typedef struct |
97 | | { |
98 | | float8 x, |
99 | | y; |
100 | | } Point; |
101 | | |
102 | | |
103 | | /*--------------------------------------------------------------------- |
104 | | * LSEG - A straight line, specified by endpoints. |
105 | | *-------------------------------------------------------------------*/ |
106 | | typedef struct |
107 | | { |
108 | | Point p[2]; |
109 | | } LSEG; |
110 | | |
111 | | |
112 | | /*--------------------------------------------------------------------- |
113 | | * PATH - Specified by vertex points. |
114 | | *-------------------------------------------------------------------*/ |
115 | | typedef struct |
116 | | { |
117 | | int32 vl_len_; /* varlena header (do not touch directly!) */ |
118 | | int32 npts; |
119 | | int32 closed; /* is this a closed polygon? */ |
120 | | int32 dummy; /* padding to make it double align */ |
121 | | Point p[FLEXIBLE_ARRAY_MEMBER]; |
122 | | } PATH; |
123 | | |
124 | | |
125 | | /*--------------------------------------------------------------------- |
126 | | * LINE - Specified by its general equation (Ax+By+C=0). |
127 | | *-------------------------------------------------------------------*/ |
128 | | typedef struct |
129 | | { |
130 | | float8 A, |
131 | | B, |
132 | | C; |
133 | | } LINE; |
134 | | |
135 | | |
136 | | /*--------------------------------------------------------------------- |
137 | | * BOX - Specified by two corner points, which are |
138 | | * sorted to save calculation time later. |
139 | | *-------------------------------------------------------------------*/ |
140 | | typedef struct |
141 | | { |
142 | | Point high, |
143 | | low; /* corner POINTs */ |
144 | | } BOX; |
145 | | |
146 | | /*--------------------------------------------------------------------- |
147 | | * POLYGON - Specified by an array of doubles defining the points, |
148 | | * keeping the number of points and the bounding box for |
149 | | * speed purposes. |
150 | | *-------------------------------------------------------------------*/ |
151 | | typedef struct |
152 | | { |
153 | | int32 vl_len_; /* varlena header (do not touch directly!) */ |
154 | | int32 npts; |
155 | | BOX boundbox; |
156 | | Point p[FLEXIBLE_ARRAY_MEMBER]; |
157 | | } POLYGON; |
158 | | |
159 | | /*--------------------------------------------------------------------- |
160 | | * CIRCLE - Specified by a center point and radius. |
161 | | *-------------------------------------------------------------------*/ |
162 | | typedef struct |
163 | | { |
164 | | Point center; |
165 | | float8 radius; |
166 | | } CIRCLE; |
167 | | |
168 | | /* |
169 | | * fmgr interface functions |
170 | | * |
171 | | * Path and Polygon are toastable varlena types, the others are just |
172 | | * fixed-size pass-by-reference types. |
173 | | */ |
174 | | |
175 | | static inline Point * |
176 | | DatumGetPointP(Datum X) |
177 | 0 | { |
178 | 0 | return (Point *) DatumGetPointer(X); |
179 | 0 | } Unexecuted instantiation: reloptions.c:DatumGetPointP Unexecuted instantiation: gistproc.c:DatumGetPointP Unexecuted instantiation: spgdoinsert.c:DatumGetPointP Unexecuted instantiation: spginsert.c:DatumGetPointP Unexecuted instantiation: spgkdtreeproc.c:DatumGetPointP Unexecuted instantiation: spgproc.c:DatumGetPointP Unexecuted instantiation: spgquadtreeproc.c:DatumGetPointP Unexecuted instantiation: spgscan.c:DatumGetPointP Unexecuted instantiation: spgutils.c:DatumGetPointP Unexecuted instantiation: spgvacuum.c:DatumGetPointP Unexecuted instantiation: spgxlog.c:DatumGetPointP Unexecuted instantiation: geo_ops.c:DatumGetPointP Unexecuted instantiation: geo_spgist.c:DatumGetPointP |
180 | | static inline Datum |
181 | | PointPGetDatum(const Point *X) |
182 | 0 | { |
183 | 0 | return PointerGetDatum(X); |
184 | 0 | } Unexecuted instantiation: reloptions.c:PointPGetDatum Unexecuted instantiation: gistproc.c:PointPGetDatum Unexecuted instantiation: spgdoinsert.c:PointPGetDatum Unexecuted instantiation: spginsert.c:PointPGetDatum Unexecuted instantiation: spgkdtreeproc.c:PointPGetDatum Unexecuted instantiation: spgproc.c:PointPGetDatum Unexecuted instantiation: spgquadtreeproc.c:PointPGetDatum Unexecuted instantiation: spgscan.c:PointPGetDatum Unexecuted instantiation: spgutils.c:PointPGetDatum Unexecuted instantiation: spgvacuum.c:PointPGetDatum Unexecuted instantiation: spgxlog.c:PointPGetDatum Unexecuted instantiation: geo_ops.c:PointPGetDatum Unexecuted instantiation: geo_spgist.c:PointPGetDatum |
185 | 0 | #define PG_GETARG_POINT_P(n) DatumGetPointP(PG_GETARG_DATUM(n)) |
186 | 0 | #define PG_RETURN_POINT_P(x) return PointPGetDatum(x) |
187 | | |
188 | | static inline LSEG * |
189 | | DatumGetLsegP(Datum X) |
190 | 0 | { |
191 | 0 | return (LSEG *) DatumGetPointer(X); |
192 | 0 | } Unexecuted instantiation: reloptions.c:DatumGetLsegP Unexecuted instantiation: gistproc.c:DatumGetLsegP Unexecuted instantiation: spgdoinsert.c:DatumGetLsegP Unexecuted instantiation: spginsert.c:DatumGetLsegP Unexecuted instantiation: spgkdtreeproc.c:DatumGetLsegP Unexecuted instantiation: spgproc.c:DatumGetLsegP Unexecuted instantiation: spgquadtreeproc.c:DatumGetLsegP Unexecuted instantiation: spgscan.c:DatumGetLsegP Unexecuted instantiation: spgutils.c:DatumGetLsegP Unexecuted instantiation: spgvacuum.c:DatumGetLsegP Unexecuted instantiation: spgxlog.c:DatumGetLsegP Unexecuted instantiation: geo_ops.c:DatumGetLsegP Unexecuted instantiation: geo_spgist.c:DatumGetLsegP |
193 | | static inline Datum |
194 | | LsegPGetDatum(const LSEG *X) |
195 | 0 | { |
196 | 0 | return PointerGetDatum(X); |
197 | 0 | } Unexecuted instantiation: reloptions.c:LsegPGetDatum Unexecuted instantiation: gistproc.c:LsegPGetDatum Unexecuted instantiation: spgdoinsert.c:LsegPGetDatum Unexecuted instantiation: spginsert.c:LsegPGetDatum Unexecuted instantiation: spgkdtreeproc.c:LsegPGetDatum Unexecuted instantiation: spgproc.c:LsegPGetDatum Unexecuted instantiation: spgquadtreeproc.c:LsegPGetDatum Unexecuted instantiation: spgscan.c:LsegPGetDatum Unexecuted instantiation: spgutils.c:LsegPGetDatum Unexecuted instantiation: spgvacuum.c:LsegPGetDatum Unexecuted instantiation: spgxlog.c:LsegPGetDatum Unexecuted instantiation: geo_ops.c:LsegPGetDatum Unexecuted instantiation: geo_spgist.c:LsegPGetDatum |
198 | 0 | #define PG_GETARG_LSEG_P(n) DatumGetLsegP(PG_GETARG_DATUM(n)) |
199 | 0 | #define PG_RETURN_LSEG_P(x) return LsegPGetDatum(x) |
200 | | |
201 | | static inline PATH * |
202 | | DatumGetPathP(Datum X) |
203 | 0 | { |
204 | 0 | return (PATH *) PG_DETOAST_DATUM(X); |
205 | 0 | } Unexecuted instantiation: reloptions.c:DatumGetPathP Unexecuted instantiation: gistproc.c:DatumGetPathP Unexecuted instantiation: spgdoinsert.c:DatumGetPathP Unexecuted instantiation: spginsert.c:DatumGetPathP Unexecuted instantiation: spgkdtreeproc.c:DatumGetPathP Unexecuted instantiation: spgproc.c:DatumGetPathP Unexecuted instantiation: spgquadtreeproc.c:DatumGetPathP Unexecuted instantiation: spgscan.c:DatumGetPathP Unexecuted instantiation: spgutils.c:DatumGetPathP Unexecuted instantiation: spgvacuum.c:DatumGetPathP Unexecuted instantiation: spgxlog.c:DatumGetPathP Unexecuted instantiation: geo_ops.c:DatumGetPathP Unexecuted instantiation: geo_spgist.c:DatumGetPathP |
206 | | static inline PATH * |
207 | | DatumGetPathPCopy(Datum X) |
208 | 0 | { |
209 | 0 | return (PATH *) PG_DETOAST_DATUM_COPY(X); |
210 | 0 | } Unexecuted instantiation: reloptions.c:DatumGetPathPCopy Unexecuted instantiation: gistproc.c:DatumGetPathPCopy Unexecuted instantiation: spgdoinsert.c:DatumGetPathPCopy Unexecuted instantiation: spginsert.c:DatumGetPathPCopy Unexecuted instantiation: spgkdtreeproc.c:DatumGetPathPCopy Unexecuted instantiation: spgproc.c:DatumGetPathPCopy Unexecuted instantiation: spgquadtreeproc.c:DatumGetPathPCopy Unexecuted instantiation: spgscan.c:DatumGetPathPCopy Unexecuted instantiation: spgutils.c:DatumGetPathPCopy Unexecuted instantiation: spgvacuum.c:DatumGetPathPCopy Unexecuted instantiation: spgxlog.c:DatumGetPathPCopy Unexecuted instantiation: geo_ops.c:DatumGetPathPCopy Unexecuted instantiation: geo_spgist.c:DatumGetPathPCopy |
211 | | static inline Datum |
212 | | PathPGetDatum(const PATH *X) |
213 | 0 | { |
214 | 0 | return PointerGetDatum(X); |
215 | 0 | } Unexecuted instantiation: reloptions.c:PathPGetDatum Unexecuted instantiation: gistproc.c:PathPGetDatum Unexecuted instantiation: spgdoinsert.c:PathPGetDatum Unexecuted instantiation: spginsert.c:PathPGetDatum Unexecuted instantiation: spgkdtreeproc.c:PathPGetDatum Unexecuted instantiation: spgproc.c:PathPGetDatum Unexecuted instantiation: spgquadtreeproc.c:PathPGetDatum Unexecuted instantiation: spgscan.c:PathPGetDatum Unexecuted instantiation: spgutils.c:PathPGetDatum Unexecuted instantiation: spgvacuum.c:PathPGetDatum Unexecuted instantiation: spgxlog.c:PathPGetDatum Unexecuted instantiation: geo_ops.c:PathPGetDatum Unexecuted instantiation: geo_spgist.c:PathPGetDatum |
216 | 0 | #define PG_GETARG_PATH_P(n) DatumGetPathP(PG_GETARG_DATUM(n)) |
217 | 0 | #define PG_GETARG_PATH_P_COPY(n) DatumGetPathPCopy(PG_GETARG_DATUM(n)) |
218 | 0 | #define PG_RETURN_PATH_P(x) return PathPGetDatum(x) |
219 | | |
220 | | static inline LINE * |
221 | | DatumGetLineP(Datum X) |
222 | 0 | { |
223 | 0 | return (LINE *) DatumGetPointer(X); |
224 | 0 | } Unexecuted instantiation: reloptions.c:DatumGetLineP Unexecuted instantiation: gistproc.c:DatumGetLineP Unexecuted instantiation: spgdoinsert.c:DatumGetLineP Unexecuted instantiation: spginsert.c:DatumGetLineP Unexecuted instantiation: spgkdtreeproc.c:DatumGetLineP Unexecuted instantiation: spgproc.c:DatumGetLineP Unexecuted instantiation: spgquadtreeproc.c:DatumGetLineP Unexecuted instantiation: spgscan.c:DatumGetLineP Unexecuted instantiation: spgutils.c:DatumGetLineP Unexecuted instantiation: spgvacuum.c:DatumGetLineP Unexecuted instantiation: spgxlog.c:DatumGetLineP Unexecuted instantiation: geo_ops.c:DatumGetLineP Unexecuted instantiation: geo_spgist.c:DatumGetLineP |
225 | | static inline Datum |
226 | | LinePGetDatum(const LINE *X) |
227 | 0 | { |
228 | 0 | return PointerGetDatum(X); |
229 | 0 | } Unexecuted instantiation: reloptions.c:LinePGetDatum Unexecuted instantiation: gistproc.c:LinePGetDatum Unexecuted instantiation: spgdoinsert.c:LinePGetDatum Unexecuted instantiation: spginsert.c:LinePGetDatum Unexecuted instantiation: spgkdtreeproc.c:LinePGetDatum Unexecuted instantiation: spgproc.c:LinePGetDatum Unexecuted instantiation: spgquadtreeproc.c:LinePGetDatum Unexecuted instantiation: spgscan.c:LinePGetDatum Unexecuted instantiation: spgutils.c:LinePGetDatum Unexecuted instantiation: spgvacuum.c:LinePGetDatum Unexecuted instantiation: spgxlog.c:LinePGetDatum Unexecuted instantiation: geo_ops.c:LinePGetDatum Unexecuted instantiation: geo_spgist.c:LinePGetDatum |
230 | 0 | #define PG_GETARG_LINE_P(n) DatumGetLineP(PG_GETARG_DATUM(n)) |
231 | 0 | #define PG_RETURN_LINE_P(x) return LinePGetDatum(x) |
232 | | |
233 | | static inline BOX * |
234 | | DatumGetBoxP(Datum X) |
235 | 0 | { |
236 | 0 | return (BOX *) DatumGetPointer(X); |
237 | 0 | } Unexecuted instantiation: reloptions.c:DatumGetBoxP Unexecuted instantiation: gistproc.c:DatumGetBoxP Unexecuted instantiation: spgdoinsert.c:DatumGetBoxP Unexecuted instantiation: spginsert.c:DatumGetBoxP Unexecuted instantiation: spgkdtreeproc.c:DatumGetBoxP Unexecuted instantiation: spgproc.c:DatumGetBoxP Unexecuted instantiation: spgquadtreeproc.c:DatumGetBoxP Unexecuted instantiation: spgscan.c:DatumGetBoxP Unexecuted instantiation: spgutils.c:DatumGetBoxP Unexecuted instantiation: spgvacuum.c:DatumGetBoxP Unexecuted instantiation: spgxlog.c:DatumGetBoxP Unexecuted instantiation: geo_ops.c:DatumGetBoxP Unexecuted instantiation: geo_spgist.c:DatumGetBoxP |
238 | | static inline Datum |
239 | | BoxPGetDatum(const BOX *X) |
240 | 0 | { |
241 | 0 | return PointerGetDatum(X); |
242 | 0 | } Unexecuted instantiation: reloptions.c:BoxPGetDatum Unexecuted instantiation: gistproc.c:BoxPGetDatum Unexecuted instantiation: spgdoinsert.c:BoxPGetDatum Unexecuted instantiation: spginsert.c:BoxPGetDatum Unexecuted instantiation: spgkdtreeproc.c:BoxPGetDatum Unexecuted instantiation: spgproc.c:BoxPGetDatum Unexecuted instantiation: spgquadtreeproc.c:BoxPGetDatum Unexecuted instantiation: spgscan.c:BoxPGetDatum Unexecuted instantiation: spgutils.c:BoxPGetDatum Unexecuted instantiation: spgvacuum.c:BoxPGetDatum Unexecuted instantiation: spgxlog.c:BoxPGetDatum Unexecuted instantiation: geo_ops.c:BoxPGetDatum Unexecuted instantiation: geo_spgist.c:BoxPGetDatum |
243 | 0 | #define PG_GETARG_BOX_P(n) DatumGetBoxP(PG_GETARG_DATUM(n)) |
244 | 0 | #define PG_RETURN_BOX_P(x) return BoxPGetDatum(x) |
245 | | |
246 | | static inline POLYGON * |
247 | | DatumGetPolygonP(Datum X) |
248 | 0 | { |
249 | 0 | return (POLYGON *) PG_DETOAST_DATUM(X); |
250 | 0 | } Unexecuted instantiation: reloptions.c:DatumGetPolygonP Unexecuted instantiation: gistproc.c:DatumGetPolygonP Unexecuted instantiation: spgdoinsert.c:DatumGetPolygonP Unexecuted instantiation: spginsert.c:DatumGetPolygonP Unexecuted instantiation: spgkdtreeproc.c:DatumGetPolygonP Unexecuted instantiation: spgproc.c:DatumGetPolygonP Unexecuted instantiation: spgquadtreeproc.c:DatumGetPolygonP Unexecuted instantiation: spgscan.c:DatumGetPolygonP Unexecuted instantiation: spgutils.c:DatumGetPolygonP Unexecuted instantiation: spgvacuum.c:DatumGetPolygonP Unexecuted instantiation: spgxlog.c:DatumGetPolygonP Unexecuted instantiation: geo_ops.c:DatumGetPolygonP Unexecuted instantiation: geo_spgist.c:DatumGetPolygonP |
251 | | static inline POLYGON * |
252 | | DatumGetPolygonPCopy(Datum X) |
253 | 0 | { |
254 | 0 | return (POLYGON *) PG_DETOAST_DATUM_COPY(X); |
255 | 0 | } Unexecuted instantiation: reloptions.c:DatumGetPolygonPCopy Unexecuted instantiation: gistproc.c:DatumGetPolygonPCopy Unexecuted instantiation: spgdoinsert.c:DatumGetPolygonPCopy Unexecuted instantiation: spginsert.c:DatumGetPolygonPCopy Unexecuted instantiation: spgkdtreeproc.c:DatumGetPolygonPCopy Unexecuted instantiation: spgproc.c:DatumGetPolygonPCopy Unexecuted instantiation: spgquadtreeproc.c:DatumGetPolygonPCopy Unexecuted instantiation: spgscan.c:DatumGetPolygonPCopy Unexecuted instantiation: spgutils.c:DatumGetPolygonPCopy Unexecuted instantiation: spgvacuum.c:DatumGetPolygonPCopy Unexecuted instantiation: spgxlog.c:DatumGetPolygonPCopy Unexecuted instantiation: geo_ops.c:DatumGetPolygonPCopy Unexecuted instantiation: geo_spgist.c:DatumGetPolygonPCopy |
256 | | static inline Datum |
257 | | PolygonPGetDatum(const POLYGON *X) |
258 | 0 | { |
259 | 0 | return PointerGetDatum(X); |
260 | 0 | } Unexecuted instantiation: reloptions.c:PolygonPGetDatum Unexecuted instantiation: gistproc.c:PolygonPGetDatum Unexecuted instantiation: spgdoinsert.c:PolygonPGetDatum Unexecuted instantiation: spginsert.c:PolygonPGetDatum Unexecuted instantiation: spgkdtreeproc.c:PolygonPGetDatum Unexecuted instantiation: spgproc.c:PolygonPGetDatum Unexecuted instantiation: spgquadtreeproc.c:PolygonPGetDatum Unexecuted instantiation: spgscan.c:PolygonPGetDatum Unexecuted instantiation: spgutils.c:PolygonPGetDatum Unexecuted instantiation: spgvacuum.c:PolygonPGetDatum Unexecuted instantiation: spgxlog.c:PolygonPGetDatum Unexecuted instantiation: geo_ops.c:PolygonPGetDatum Unexecuted instantiation: geo_spgist.c:PolygonPGetDatum |
261 | 0 | #define PG_GETARG_POLYGON_P(n) DatumGetPolygonP(PG_GETARG_DATUM(n)) |
262 | | #define PG_GETARG_POLYGON_P_COPY(n) DatumGetPolygonPCopy(PG_GETARG_DATUM(n)) |
263 | 0 | #define PG_RETURN_POLYGON_P(x) return PolygonPGetDatum(x) |
264 | | |
265 | | static inline CIRCLE * |
266 | | DatumGetCircleP(Datum X) |
267 | 0 | { |
268 | 0 | return (CIRCLE *) DatumGetPointer(X); |
269 | 0 | } Unexecuted instantiation: reloptions.c:DatumGetCircleP Unexecuted instantiation: gistproc.c:DatumGetCircleP Unexecuted instantiation: spgdoinsert.c:DatumGetCircleP Unexecuted instantiation: spginsert.c:DatumGetCircleP Unexecuted instantiation: spgkdtreeproc.c:DatumGetCircleP Unexecuted instantiation: spgproc.c:DatumGetCircleP Unexecuted instantiation: spgquadtreeproc.c:DatumGetCircleP Unexecuted instantiation: spgscan.c:DatumGetCircleP Unexecuted instantiation: spgutils.c:DatumGetCircleP Unexecuted instantiation: spgvacuum.c:DatumGetCircleP Unexecuted instantiation: spgxlog.c:DatumGetCircleP Unexecuted instantiation: geo_ops.c:DatumGetCircleP Unexecuted instantiation: geo_spgist.c:DatumGetCircleP |
270 | | static inline Datum |
271 | | CirclePGetDatum(const CIRCLE *X) |
272 | 0 | { |
273 | 0 | return PointerGetDatum(X); |
274 | 0 | } Unexecuted instantiation: reloptions.c:CirclePGetDatum Unexecuted instantiation: gistproc.c:CirclePGetDatum Unexecuted instantiation: spgdoinsert.c:CirclePGetDatum Unexecuted instantiation: spginsert.c:CirclePGetDatum Unexecuted instantiation: spgkdtreeproc.c:CirclePGetDatum Unexecuted instantiation: spgproc.c:CirclePGetDatum Unexecuted instantiation: spgquadtreeproc.c:CirclePGetDatum Unexecuted instantiation: spgscan.c:CirclePGetDatum Unexecuted instantiation: spgutils.c:CirclePGetDatum Unexecuted instantiation: spgvacuum.c:CirclePGetDatum Unexecuted instantiation: spgxlog.c:CirclePGetDatum Unexecuted instantiation: geo_ops.c:CirclePGetDatum Unexecuted instantiation: geo_spgist.c:CirclePGetDatum |
275 | 0 | #define PG_GETARG_CIRCLE_P(n) DatumGetCircleP(PG_GETARG_DATUM(n)) |
276 | 0 | #define PG_RETURN_CIRCLE_P(x) return CirclePGetDatum(x) |
277 | | |
278 | | |
279 | | /* |
280 | | * in geo_ops.c |
281 | | */ |
282 | | |
283 | | extern float8 pg_hypot(float8 x, float8 y); |
284 | | |
285 | | #endif /* GEO_DECLS_H */ |