~ubuntu-branches/ubuntu/trusty/postgis/trusty-security

« back to all changes in this revision

Viewing changes to lwgeom/lwgeom_btree.c

  • Committer: Bazaar Package Importer
  • Author(s): Francesco Paolo Lovergine
  • Date: 2009-12-11 13:10:34 UTC
  • mfrom: (1.1.9 upstream) (5.2.1 experimental)
  • Revision ID: james.westby@ubuntu.com-20091211131034-wmsz69wxvt95pe5r
Tags: 1.4.0-2
* Upload to unstable.
* Better parameterized debian/rules against postgis $(VERSION).
* Added dblatex and libcunit1-dev among build-deps.
* Added postgis_comments.sql to contrib/ SQL templates.
* Dropping 8.3 support, no more supported for squeeze.
  (closes: #559587)
* Do not stop on error in postrm if the target dir does not exist.
  (closes: #560409)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/***********************************************************
2
 
 *
3
 
 * $Id: lwgeom_btree.c 2273 2006-01-09 15:55:55Z strk $
4
 
 *
5
 
 * Comparision function for use in Binary Tree searches
6
 
 * (ORDER BY, GROUP BY, DISTINCT)
7
 
 *
8
 
 ***********************************************************/
9
 
 
10
 
#include <math.h>
11
 
#include <float.h>
12
 
#include <string.h>
13
 
#include <stdio.h>
14
 
#include <errno.h>
15
 
 
16
 
#include "postgres.h"
17
 
#include "fmgr.h"
18
 
#include "utils/geo_decls.h"
19
 
 
20
 
#include "liblwgeom.h"
21
 
#include "lwgeom_pg.h"
22
 
 
23
 
Datum lwgeom_lt(PG_FUNCTION_ARGS);
24
 
Datum lwgeom_le(PG_FUNCTION_ARGS);
25
 
Datum lwgeom_eq(PG_FUNCTION_ARGS);
26
 
Datum lwgeom_ge(PG_FUNCTION_ARGS);
27
 
Datum lwgeom_gt(PG_FUNCTION_ARGS);
28
 
Datum lwgeom_cmp(PG_FUNCTION_ARGS);
29
 
 
30
 
/* #define PGIS_DEBUG */
31
 
 
32
 
#if USE_VERSION == 72
33
 
#define BTREE_SRID_MISMATCH_SEVERITY NOTICE
34
 
#else
35
 
#if USE_VERSION < 80
36
 
#define BTREE_SRID_MISMATCH_SEVERITY WARNING
37
 
#else
38
 
#define BTREE_SRID_MISMATCH_SEVERITY ERROR
39
 
#endif
40
 
#endif
41
 
 
42
 
PG_FUNCTION_INFO_V1(lwgeom_lt);
43
 
Datum lwgeom_lt(PG_FUNCTION_ARGS)
44
 
{
45
 
        PG_LWGEOM *geom1 = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
46
 
        PG_LWGEOM *geom2 = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
47
 
        BOX2DFLOAT4 box1;
48
 
        BOX2DFLOAT4 box2;
49
 
 
50
 
#ifdef PGIS_DEBUG
51
 
        elog(NOTICE, "lwgeom_lt called");
52
 
#endif
53
 
 
54
 
        if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2))
55
 
        {
56
 
                elog(BTREE_SRID_MISMATCH_SEVERITY,
57
 
                        "Operation on two GEOMETRIES with different SRIDs\n");
58
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
59
 
                        pfree(geom1);
60
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 )
61
 
                        pfree(geom2);
62
 
                PG_RETURN_NULL();
63
 
        }
64
 
 
65
 
#ifdef PGIS_DEBUG
66
 
        elog(NOTICE, "lwgeom_lt passed getSRID test");
67
 
#endif
68
 
 
69
 
        getbox2d_p(SERIALIZED_FORM(geom1), &box1);
70
 
        getbox2d_p(SERIALIZED_FORM(geom2), &box2);
71
 
 
72
 
#ifdef PGIS_DEBUG
73
 
        elog(NOTICE, "lwgeom_lt getbox2d_p passed");
74
 
#endif
75
 
 
76
 
        if  ( ! FPeq(box1.xmin , box2.xmin) ) {
77
 
                if  (box1.xmin < box2.xmin)
78
 
                        PG_RETURN_BOOL(TRUE);
79
 
        }
80
 
 
81
 
        if  ( ! FPeq(box1.ymin , box2.ymin) ) {
82
 
                if  (box1.ymin < box2.ymin)
83
 
                        PG_RETURN_BOOL(TRUE);
84
 
        }
85
 
 
86
 
        if  ( ! FPeq(box1.xmax , box2.xmax) ) {
87
 
                if  (box1.xmax < box2.xmax)
88
 
                        PG_RETURN_BOOL(TRUE);
89
 
        }
90
 
 
91
 
        if  ( ! FPeq(box1.ymax , box2.ymax) ) {
92
 
                if  (box1.ymax < box2.ymax)
93
 
                        PG_RETURN_BOOL(TRUE);
94
 
        }
95
 
 
96
 
        PG_RETURN_BOOL(FALSE);
97
 
}
98
 
 
99
 
PG_FUNCTION_INFO_V1(lwgeom_le);
100
 
Datum lwgeom_le(PG_FUNCTION_ARGS)
101
 
{
102
 
        PG_LWGEOM *geom1 = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
103
 
        PG_LWGEOM *geom2 = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
104
 
        BOX2DFLOAT4 box1;
105
 
        BOX2DFLOAT4 box2;
106
 
 
107
 
#ifdef PGIS_DEBUG
108
 
        elog(NOTICE, "lwgeom_le called");
109
 
#endif
110
 
 
111
 
        if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2))
112
 
        {
113
 
                elog(BTREE_SRID_MISMATCH_SEVERITY,
114
 
                        "Operation on two GEOMETRIES with different SRIDs\n");
115
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
116
 
                        pfree(geom1);
117
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 )
118
 
                        pfree(geom2);
119
 
                PG_RETURN_NULL();
120
 
        }
121
 
 
122
 
        getbox2d_p(SERIALIZED_FORM(geom1), &box1);
123
 
        getbox2d_p(SERIALIZED_FORM(geom2), &box2);
124
 
 
125
 
        if  ( ! FPeq(box1.xmin , box2.xmin) ) {
126
 
                if  (box1.xmin < box2.xmin)
127
 
                {
128
 
                        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
129
 
                        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
130
 
                        PG_RETURN_BOOL(TRUE);
131
 
                }
132
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
133
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
134
 
                PG_RETURN_BOOL(FALSE);
135
 
        }
136
 
 
137
 
        if  ( ! FPeq(box1.ymin , box2.ymin) ) {
138
 
                if  (box1.ymin < box2.ymin)
139
 
                {
140
 
                        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
141
 
                        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
142
 
                        PG_RETURN_BOOL(TRUE);
143
 
                }
144
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
145
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
146
 
                PG_RETURN_BOOL(FALSE);
147
 
        }
148
 
 
149
 
        if  ( ! FPeq(box1.xmax , box2.xmax) ) {
150
 
                if  (box1.xmax < box2.xmax)
151
 
                {
152
 
                        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
153
 
                        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
154
 
                        PG_RETURN_BOOL(TRUE);
155
 
                }
156
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
157
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
158
 
                PG_RETURN_BOOL(FALSE);
159
 
        }
160
 
 
161
 
        if  ( ! FPeq(box1.ymax , box2.ymax) ) {
162
 
                if  (box1.ymax < box2.ymax)
163
 
                {
164
 
                        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
165
 
                        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
166
 
                        PG_RETURN_BOOL(TRUE);
167
 
                }
168
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
169
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
170
 
                PG_RETURN_BOOL(FALSE);
171
 
        }
172
 
 
173
 
        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
174
 
        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
175
 
 
176
 
        PG_RETURN_BOOL(TRUE);
177
 
}
178
 
 
179
 
PG_FUNCTION_INFO_V1(lwgeom_eq);
180
 
Datum lwgeom_eq(PG_FUNCTION_ARGS)
181
 
{
182
 
        PG_LWGEOM *geom1 = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
183
 
        PG_LWGEOM *geom2 = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
184
 
        BOX2DFLOAT4 box1;
185
 
        BOX2DFLOAT4 box2;
186
 
 
187
 
#ifdef PGIS_DEBUG
188
 
        elog(NOTICE, "lwgeom_eq called");
189
 
#endif
190
 
 
191
 
        if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2))
192
 
        {
193
 
                elog(BTREE_SRID_MISMATCH_SEVERITY,
194
 
                        "Operation on two GEOMETRIES with different SRIDs\n");
195
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
196
 
                        pfree(geom1);
197
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 )
198
 
                        pfree(geom2);
199
 
                PG_RETURN_NULL();
200
 
        }
201
 
 
202
 
        getbox2d_p(SERIALIZED_FORM(geom1), &box1);
203
 
        getbox2d_p(SERIALIZED_FORM(geom2), &box2);
204
 
 
205
 
        if  ( ! FPeq(box1.xmin , box2.xmin) ) 
206
 
        {
207
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
208
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
209
 
                PG_RETURN_BOOL(FALSE);
210
 
        }
211
 
 
212
 
        if  ( ! FPeq(box1.ymin , box2.ymin) ) 
213
 
        {
214
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
215
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
216
 
                PG_RETURN_BOOL(FALSE);
217
 
        }
218
 
 
219
 
        if  ( ! FPeq(box1.xmax , box2.xmax) ) 
220
 
        {
221
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
222
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
223
 
                PG_RETURN_BOOL(FALSE);
224
 
        }
225
 
 
226
 
        if  ( ! FPeq(box1.ymax , box2.ymax) )
227
 
        {
228
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
229
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
230
 
                PG_RETURN_BOOL(FALSE);
231
 
        }
232
 
 
233
 
        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
234
 
        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
235
 
 
236
 
        PG_RETURN_BOOL(TRUE);
237
 
}
238
 
 
239
 
PG_FUNCTION_INFO_V1(lwgeom_ge);
240
 
Datum lwgeom_ge(PG_FUNCTION_ARGS)
241
 
{
242
 
        PG_LWGEOM *geom1 = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
243
 
        PG_LWGEOM *geom2 = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
244
 
        BOX2DFLOAT4 box1;
245
 
        BOX2DFLOAT4 box2;
246
 
 
247
 
#ifdef PGIS_DEBUG
248
 
        elog(NOTICE, "lwgeom_ge called");
249
 
#endif
250
 
 
251
 
        if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2))
252
 
        {
253
 
                elog(BTREE_SRID_MISMATCH_SEVERITY,
254
 
                        "Operation on two GEOMETRIES with different SRIDs\n");
255
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
256
 
                        pfree(geom1);
257
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 )
258
 
                        pfree(geom2);
259
 
                PG_RETURN_NULL();
260
 
        }
261
 
 
262
 
        getbox2d_p(SERIALIZED_FORM(geom1), &box1);
263
 
        getbox2d_p(SERIALIZED_FORM(geom2), &box2);
264
 
 
265
 
        if  ( ! FPeq(box1.xmin , box2.xmin) ) {
266
 
                if  (box1.xmin > box2.xmin)
267
 
                {
268
 
                        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
269
 
                        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
270
 
                        PG_RETURN_BOOL(TRUE);
271
 
                }
272
 
                PG_RETURN_BOOL(FALSE);
273
 
        }
274
 
 
275
 
        if  ( ! FPeq(box1.ymin , box2.ymin) ) {
276
 
                if  (box1.ymin > box2.ymin)
277
 
                {
278
 
                        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
279
 
                        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
280
 
                        PG_RETURN_BOOL(TRUE);
281
 
                }
282
 
                PG_RETURN_BOOL(FALSE);
283
 
        }
284
 
 
285
 
        if  ( ! FPeq(box1.xmax , box2.xmax) ) {
286
 
                if  (box1.xmax > box2.xmax)
287
 
                {
288
 
                        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
289
 
                        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
290
 
                        PG_RETURN_BOOL(TRUE);
291
 
                }
292
 
                PG_RETURN_BOOL(FALSE);
293
 
        }
294
 
 
295
 
        if  ( ! FPeq(box1.ymax , box2.ymax) ) {
296
 
                if  (box1.ymax > box2.ymax)
297
 
                {
298
 
                        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
299
 
                        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
300
 
                        PG_RETURN_BOOL(TRUE);
301
 
                }
302
 
                PG_RETURN_BOOL(FALSE);
303
 
        }
304
 
 
305
 
        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
306
 
        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
307
 
 
308
 
        PG_RETURN_BOOL(TRUE);
309
 
}
310
 
 
311
 
PG_FUNCTION_INFO_V1(lwgeom_gt);
312
 
Datum lwgeom_gt(PG_FUNCTION_ARGS)
313
 
{
314
 
        PG_LWGEOM *geom1 = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
315
 
        PG_LWGEOM *geom2 = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
316
 
        BOX2DFLOAT4 box1;
317
 
        BOX2DFLOAT4 box2;
318
 
 
319
 
#ifdef PGIS_DEBUG
320
 
        elog(NOTICE, "lwgeom_gt called");
321
 
#endif
322
 
 
323
 
        if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2))
324
 
        {
325
 
                elog(BTREE_SRID_MISMATCH_SEVERITY,
326
 
                        "Operation on two GEOMETRIES with different SRIDs\n");
327
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
328
 
                        pfree(geom1);
329
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 )
330
 
                        pfree(geom2);
331
 
                PG_RETURN_NULL();
332
 
        }
333
 
 
334
 
        getbox2d_p(SERIALIZED_FORM(geom1), &box1);
335
 
        getbox2d_p(SERIALIZED_FORM(geom2), &box2);
336
 
 
337
 
        if  ( ! FPeq(box1.xmin , box2.xmin) ) {
338
 
                if  (box1.xmin > box2.xmin)
339
 
                {
340
 
                        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
341
 
                        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
342
 
                        PG_RETURN_BOOL(TRUE);
343
 
                }
344
 
        }
345
 
 
346
 
        if  ( ! FPeq(box1.ymin , box2.ymin) ) {
347
 
                if  (box1.ymin > box2.ymin)
348
 
                {
349
 
                        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
350
 
                        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
351
 
                        PG_RETURN_BOOL(TRUE);
352
 
                }
353
 
        }
354
 
 
355
 
        if  ( ! FPeq(box1.xmax , box2.xmax) ) {
356
 
                if  (box1.xmax > box2.xmax)
357
 
                {
358
 
                        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
359
 
                        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
360
 
                        PG_RETURN_BOOL(TRUE);
361
 
                }
362
 
        }
363
 
 
364
 
        if  ( ! FPeq(box1.ymax , box2.ymax) ) {
365
 
                if  (box1.ymax > box2.ymax)
366
 
                {
367
 
                        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
368
 
                        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
369
 
                        PG_RETURN_BOOL(TRUE);
370
 
                }
371
 
        }
372
 
 
373
 
        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
374
 
        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
375
 
 
376
 
        PG_RETURN_BOOL(FALSE);
377
 
}
378
 
 
379
 
PG_FUNCTION_INFO_V1(lwgeom_cmp);
380
 
Datum lwgeom_cmp(PG_FUNCTION_ARGS)
381
 
{
382
 
        PG_LWGEOM *geom1 = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
383
 
        PG_LWGEOM *geom2 = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
384
 
        BOX2DFLOAT4 box1;
385
 
        BOX2DFLOAT4 box2;
386
 
 
387
 
#ifdef PGIS_DEBUG
388
 
        elog(NOTICE, "lwgeom_cmp called");
389
 
#endif
390
 
 
391
 
        if (pglwgeom_getSRID(geom1) != pglwgeom_getSRID(geom2))
392
 
        {
393
 
                elog(BTREE_SRID_MISMATCH_SEVERITY,
394
 
                        "Operation on two GEOMETRIES with different SRIDs\n");
395
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 )
396
 
                        pfree(geom1);
397
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 )
398
 
                        pfree(geom2);
399
 
                PG_RETURN_NULL();
400
 
        }
401
 
 
402
 
        getbox2d_p(SERIALIZED_FORM(geom1), &box1);
403
 
        getbox2d_p(SERIALIZED_FORM(geom2), &box2);
404
 
 
405
 
        if  ( ! FPeq(box1.xmin , box2.xmin) ) {
406
 
                if  (box1.xmin < box2.xmin)
407
 
                {
408
 
                        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
409
 
                        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
410
 
                        PG_RETURN_INT32(-1);
411
 
                }
412
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
413
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
414
 
                PG_RETURN_INT32(1);
415
 
        }
416
 
 
417
 
        if  ( ! FPeq(box1.ymin , box2.ymin) ) {
418
 
                if  (box1.ymin < box2.ymin)
419
 
                {
420
 
                        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
421
 
                        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
422
 
                        PG_RETURN_INT32(-1);
423
 
                }
424
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
425
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
426
 
                PG_RETURN_INT32(1);
427
 
        }
428
 
 
429
 
        if  ( ! FPeq(box1.xmax , box2.xmax) ) {
430
 
                if  (box1.xmax < box2.xmax)
431
 
                {
432
 
                        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
433
 
                        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
434
 
                        PG_RETURN_INT32(-1);
435
 
                }
436
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
437
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
438
 
                PG_RETURN_INT32(1);
439
 
        }
440
 
 
441
 
        if  ( ! FPeq(box1.ymax , box2.ymax) ) {
442
 
                if  (box1.ymax < box2.ymax)
443
 
                {
444
 
                        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
445
 
                        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
446
 
                        PG_RETURN_INT32(-1);
447
 
                }
448
 
                if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
449
 
                if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
450
 
                PG_RETURN_INT32(1);
451
 
        }
452
 
 
453
 
        if ( (Pointer *)PG_GETARG_DATUM(0) != (Pointer *)geom1 ) pfree(geom1);
454
 
        if ( (Pointer *)PG_GETARG_DATUM(1) != (Pointer *)geom2 ) pfree(geom2);
455
 
 
456
 
        PG_RETURN_INT32(0);
457
 
}
458
 
 
459
 
/***********************************************************
460
 
 *
461
 
 * $Log$
462
 
 * Revision 1.9  2006/01/09 15:55:55  strk
463
 
 * ISO C90 comments (finished in lwgeom/)
464
 
 *
465
 
 * Revision 1.8  2005/06/15 16:04:11  strk
466
 
 * fault tolerant btree ops
467
 
 *
468
 
 * Revision 1.7  2005/02/07 13:21:10  strk
469
 
 * Replaced DEBUG* macros with PGIS_DEBUG*, to avoid clashes with postgresql DEBUG
470
 
 *
471
 
 * Revision 1.6  2005/01/05 12:44:47  strk
472
 
 * Added is_worth_caching_serialized_bbox(). Renamed lwgeom_setSRID() to
473
 
 * pglwgeom_setSRID(). Fixed a bug in PG_LWGEOM_construct support for
474
 
 * AUTOCACHE_BBOX.
475
 
 *
476
 
 * Revision 1.5  2004/09/29 10:50:30  strk
477
 
 * Big layout change.
478
 
 * lwgeom.h is public API
479
 
 * liblwgeom.h is private header
480
 
 * lwgeom_pg.h is for PG-links
481
 
 * lw<type>.c contains type-specific functions
482
 
 *
483
 
 * Revision 1.4  2004/09/29 06:31:42  strk
484
 
 * Changed LWGEOM to PG_LWGEOM.
485
 
 * Changed LWGEOM_construct to PG_LWGEOM_construct.
486
 
 *
487
 
 * Revision 1.3  2004/08/20 14:08:41  strk
488
 
 * Added Geom{etry,}FromWkb(<geometry>,[<int4>]) funx.
489
 
 * Added LWGEOM typedef and SERIALIZED_FORM(LWGEOM) macro.
490
 
 * Made lwgeom_setSRID an API function.
491
 
 * Added LWGEOM_setAllocator().
492
 
 *
493
 
 * Revision 1.2  2004/08/19 13:10:13  strk
494
 
 * fixed typos
495
 
 *
496
 
 * (ORDER BY, GROUP BY, DISTINCT)
497
 
 *
498
 
 ***********************************************************/