Statistics
| Revision:

root / branches / v10 / extensions / extPublish / src-test / com / iver / cit / gvsig / publish / resources / lwpostgis.sql @ 13570

History | View | Annotate | Download (113 KB)

1

    
2

    
3
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4
-- 
5
-- $Id: lwpostgis.sql 13570 2007-09-06 15:40:28Z jvhigon $
6
--
7
-- PostGIS - Spatial Types for PostgreSQL
8
-- http://postgis.refractions.net
9
-- Copyright 2001-2003 Refractions Research Inc.
10
--
11
-- This is free software; you can redistribute and/or modify it under
12
-- the terms of the GNU General Public Licence. See the COPYING file.
13
--  
14
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
15
--
16
-- WARNING: Any change in this file must be evaluated for compatibility.
17
--          Changes cleanly handled by lwpostgis_uptrade.sql are fine,
18
--            other changes will require a bump in Major version.
19
--            Currently only function replaceble by CREATE OR REPLACE
20
--            are cleanly handled.
21
--
22
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
23

    
24

    
25

    
26

    
27

    
28

    
29
BEGIN;
30

    
31
-------------------------------------------------------------------
32
--  HISTOGRAM2D TYPE (lwhistogram2d)
33
-------------------------------------------------------------------
34

    
35

    
36
CREATE OR REPLACE FUNCTION histogram2d_in(cstring)
37
        RETURNS histogram2d
38
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'lwhistogram2d_in'
39
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
40

    
41
CREATE OR REPLACE FUNCTION histogram2d_out(histogram2d)
42
        RETURNS cstring
43
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'lwhistogram2d_out'
44
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
45

    
46
CREATE TYPE histogram2d (
47
        alignment = double,
48
        internallength = variable,
49
        input = histogram2d_in,
50
        output = histogram2d_out,
51
        storage = main
52
);
53

    
54
-------------------------------------------------------------------
55
--  SPHEROID TYPE
56
-------------------------------------------------------------------
57

    
58

    
59
CREATE OR REPLACE FUNCTION spheroid_in(cstring)
60
        RETURNS spheroid
61
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','ellipsoid_in'
62
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
63

    
64
CREATE OR REPLACE FUNCTION spheroid_out(spheroid)
65
        RETURNS cstring
66
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','ellipsoid_out'
67
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
68

    
69
CREATE TYPE spheroid (
70
        alignment = double,
71
        internallength = 65,
72
        input = spheroid_in,
73
        output = spheroid_out
74
);
75

    
76
-------------------------------------------------------------------
77
--  GEOMETRY TYPE (lwgeom)
78
-------------------------------------------------------------------
79

    
80

    
81
CREATE OR REPLACE FUNCTION geometry_in(cstring)
82
        RETURNS geometry
83
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_in'
84
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
85

    
86
CREATE OR REPLACE FUNCTION geometry_out(geometry)
87
        RETURNS cstring
88
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_out'
89
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
90

    
91
CREATE OR REPLACE FUNCTION geometry_analyze(internal)
92
        RETURNS bool
93
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_analyze'
94
        LANGUAGE 'C' VOLATILE STRICT; -- WITH (isstrict);
95

    
96
CREATE OR REPLACE FUNCTION geometry_recv(internal)
97
        RETURNS geometry
98
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_recv'
99
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
100

    
101
CREATE OR REPLACE FUNCTION geometry_send(geometry)
102
        RETURNS bytea
103
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_send'
104
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
105

    
106

    
107
CREATE TYPE geometry (
108
        internallength = variable,
109
        input = geometry_in,
110
        output = geometry_out,
111
        send = geometry_send,
112
        receive = geometry_recv,
113
        delimiter = ':',
114
        analyze = geometry_analyze,
115
        storage = main
116
);
117

    
118
-------------------------------------------
119
-- Affine transforms
120
-------------------------------------------
121

    
122
-- Availability: 1.1.2
123
CREATE OR REPLACE FUNCTION Affine(geometry,float8,float8,float8,float8,float8,float8,float8,float8,float8,float8,float8,float8)
124
        RETURNS geometry
125
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_affine'
126
        LANGUAGE 'C' IMMUTABLE STRICT; 
127

    
128
-- Availability: 1.1.2
129
CREATE OR REPLACE FUNCTION Affine(geometry,float8,float8,float8,float8,float8,float8)
130
        RETURNS geometry
131
        AS 'SELECT affine($1,  $2, $3, 0,  $4, $5, 0,  0, 0, 1,  $6, $7, 0)'
132
        LANGUAGE 'SQL' IMMUTABLE STRICT; 
133

    
134
-- Availability: 1.1.2
135
CREATE OR REPLACE FUNCTION RotateZ(geometry,float8)
136
        RETURNS geometry
137
        AS 'SELECT affine($1,  cos($2), -sin($2), 0,  sin($2), cos($2), 0,  0, 0, 1,  0, 0, 0)'
138
        LANGUAGE 'SQL' IMMUTABLE STRICT; 
139

    
140
-- Availability: 1.1.2
141
CREATE OR REPLACE FUNCTION Rotate(geometry,float8)
142
        RETURNS geometry
143
        AS 'SELECT rotateZ($1, $2)'
144
        LANGUAGE 'SQL' IMMUTABLE STRICT; 
145

    
146
-- Availability: 1.1.2
147
CREATE OR REPLACE FUNCTION RotateX(geometry,float8)
148
        RETURNS geometry
149
         AS 'SELECT affine($1, 1, 0, 0, 0, cos($2), -sin($2), 0, sin($2), cos($2), 0, 0, 0)'
150
        LANGUAGE 'SQL' IMMUTABLE STRICT; 
151

    
152
-- Availability: 1.1.2
153
CREATE OR REPLACE FUNCTION RotateY(geometry,float8)
154
        RETURNS geometry
155
         AS 'SELECT affine($1,  cos($2), 0, sin($2),  0, 1, 0,  -sin($2), 0, cos($2), 0,  0, 0)'
156
        LANGUAGE 'SQL' IMMUTABLE STRICT; 
157

    
158
CREATE OR REPLACE FUNCTION Translate(geometry,float8,float8,float8)
159
        RETURNS geometry
160
         AS 'SELECT affine($1, 1, 0, 0, 0, 1, 0, 0, 0, 1, $2, $3, $4)'
161
        LANGUAGE 'SQL' IMMUTABLE STRICT; 
162

    
163
CREATE OR REPLACE FUNCTION Translate(geometry,float8,float8)
164
        RETURNS geometry
165
        AS 'SELECT translate($1, $2, $3, 0)'
166
        LANGUAGE 'SQL' IMMUTABLE STRICT;
167

    
168
-- Availability: 1.1.0
169
CREATE OR REPLACE FUNCTION Scale(geometry,float8,float8,float8)
170
        RETURNS geometry
171
        AS 'SELECT affine($1,  $2, 0, 0,  0, $3, 0,  0, 0, $4,  0, 0, 0)'
172
        LANGUAGE 'SQL' IMMUTABLE STRICT; 
173

    
174
-- Availability: 1.1.0
175
CREATE OR REPLACE FUNCTION Scale(geometry,float8,float8)
176
        RETURNS geometry
177
        AS 'SELECT scale($1, $2, $3, 1)'
178
        LANGUAGE 'SQL' IMMUTABLE STRICT; 
179

    
180
-- Availability: 1.1.0 
181
CREATE OR REPLACE FUNCTION transscale(geometry,float8,float8,float8,float8)
182
        RETURNS geometry
183
        AS 'SELECT affine($1,  $4, 0, 0,  0, $5, 0, 
184
                0, 0, 1,  $2 * $4, $3 * $5, 0)'
185
        LANGUAGE 'SQL' IMMUTABLE STRICT;
186

    
187
-- Availability: 1.1.0
188
CREATE OR REPLACE FUNCTION shift_longitude(geometry)
189
        RETURNS geometry
190
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_longitude_shift'
191
        LANGUAGE 'C' IMMUTABLE STRICT; 
192

    
193

    
194
        
195
-------------------------------------------------------------------
196
--  BOX3D TYPE
197
-------------------------------------------------------------------
198

    
199

    
200
CREATE OR REPLACE FUNCTION box3d_in(cstring)
201
        RETURNS box3d
202
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX3D_in'
203
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
204

    
205
CREATE OR REPLACE FUNCTION box3d_out(box3d)
206
        RETURNS cstring
207
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX3D_out'
208
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
209

    
210
CREATE TYPE box3d (
211
        alignment = double,
212
        internallength = 48,
213
        input = box3d_in,
214
        output = box3d_out
215
);
216

    
217
CREATE OR REPLACE FUNCTION xmin(box3d)
218
        RETURNS FLOAT8
219
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','BOX3D_xmin'
220
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
221

    
222
CREATE OR REPLACE FUNCTION ymin(box3d)
223
        RETURNS FLOAT8
224
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','BOX3D_ymin'
225
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
226

    
227
CREATE OR REPLACE FUNCTION zmin(box3d)
228
        RETURNS FLOAT8
229
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','BOX3D_zmin'
230
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
231

    
232
CREATE OR REPLACE FUNCTION xmax(box3d)
233
        RETURNS FLOAT8
234
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','BOX3D_xmax'
235
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
236

    
237
CREATE OR REPLACE FUNCTION ymax(box3d)
238
        RETURNS FLOAT8
239
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','BOX3D_ymax'
240
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
241

    
242
CREATE OR REPLACE FUNCTION zmax(box3d)
243
        RETURNS FLOAT8
244
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','BOX3D_zmax'
245
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
246

    
247
-------------------------------------------------------------------
248
--  CHIP TYPE
249
-------------------------------------------------------------------
250

    
251

    
252
CREATE OR REPLACE FUNCTION chip_in(cstring)
253
        RETURNS chip
254
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','CHIP_in'
255
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
256

    
257
CREATE OR REPLACE FUNCTION chip_out(chip)
258
        RETURNS cstring
259
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','CHIP_out'
260
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
261

    
262
CREATE TYPE chip (
263
        alignment = double,
264
        internallength = variable,
265
        input = chip_in,
266
        output = chip_out,
267
        storage = extended
268
);
269

    
270
-----------------------------------------------------------------------
271
-- BOX2D
272
-----------------------------------------------------------------------
273

    
274

    
275

    
276
CREATE OR REPLACE FUNCTION box2d_in(cstring)
277
        RETURNS box2d
278
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','BOX2DFLOAT4_in'
279
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
280

    
281
CREATE OR REPLACE FUNCTION box2d_out(box2d)
282
        RETURNS cstring
283
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','BOX2DFLOAT4_out'
284
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
285

    
286
CREATE TYPE box2d (
287
        internallength = 16,
288
        input = box2d_in,
289
        output = box2d_out,
290
        storage = plain
291
);
292

    
293
---- BOX2D  support functions
294

    
295

    
296
CREATE OR REPLACE FUNCTION box2d_overleft(box2d, box2d) 
297
        RETURNS bool
298
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX2D_overleft'
299
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
300

    
301
CREATE OR REPLACE FUNCTION box2d_overright(box2d, box2d) 
302
        RETURNS bool
303
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX2D_overright' 
304
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
305

    
306
CREATE OR REPLACE FUNCTION box2d_left(box2d, box2d) 
307
        RETURNS bool
308
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX2D_left' 
309
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
310

    
311
CREATE OR REPLACE FUNCTION box2d_right(box2d, box2d) 
312
        RETURNS bool
313
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX2D_right' 
314
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
315

    
316
CREATE OR REPLACE FUNCTION box2d_contain(box2d, box2d) 
317
        RETURNS bool
318
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX2D_contain'
319
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
320

    
321
CREATE OR REPLACE FUNCTION box2d_contained(box2d, box2d) 
322
        RETURNS bool
323
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX2D_contained'
324
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
325

    
326
CREATE OR REPLACE FUNCTION box2d_overlap(box2d, box2d) 
327
        RETURNS bool
328
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX2D_overlap'
329
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
330

    
331
CREATE OR REPLACE FUNCTION box2d_same(box2d, box2d) 
332
        RETURNS bool
333
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX2D_same'
334
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
335

    
336
CREATE OR REPLACE FUNCTION box2d_intersects(box2d, box2d) 
337
        RETURNS bool
338
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX2D_intersects'
339
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
340

    
341
-- lwgeom  operator support functions
342

    
343
-------------------------------------------------------------------
344
-- BTREE indexes
345
-------------------------------------------------------------------
346

    
347
CREATE OR REPLACE FUNCTION geometry_lt(geometry, geometry) 
348
        RETURNS bool
349
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'lwgeom_lt'
350
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
351

    
352
CREATE OR REPLACE FUNCTION geometry_le(geometry, geometry) 
353
        RETURNS bool
354
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'lwgeom_le'
355
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
356

    
357
CREATE OR REPLACE FUNCTION geometry_gt(geometry, geometry) 
358
        RETURNS bool
359
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'lwgeom_gt'
360
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
361

    
362
CREATE OR REPLACE FUNCTION geometry_ge(geometry, geometry) 
363
        RETURNS bool
364
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'lwgeom_ge'
365
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
366

    
367
CREATE OR REPLACE FUNCTION geometry_eq(geometry, geometry) 
368
        RETURNS bool
369
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'lwgeom_eq'
370
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
371

    
372
CREATE OR REPLACE FUNCTION geometry_cmp(geometry, geometry) 
373
        RETURNS integer
374
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'lwgeom_cmp'
375
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
376

    
377
--
378
-- Sorting operators for Btree
379
--
380

381
CREATE OPERATOR < (
382
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_lt,
383
   COMMUTATOR = '>', NEGATOR = '>=',
384
   RESTRICT = contsel, JOIN = contjoinsel
385
);
386

    
387
CREATE OPERATOR <= (
388
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_le,
389
   COMMUTATOR = '>=', NEGATOR = '>',
390
   RESTRICT = contsel, JOIN = contjoinsel
391
);
392

    
393
CREATE OPERATOR = (
394
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_eq,
395
   COMMUTATOR = '=', -- we might implement a faster negator here
396
   RESTRICT = contsel, JOIN = contjoinsel
397
);
398

    
399
CREATE OPERATOR >= (
400
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_ge,
401
   COMMUTATOR = '<=', NEGATOR = '<',
402
   RESTRICT = contsel, JOIN = contjoinsel
403
);
404
CREATE OPERATOR > (
405
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_gt,
406
   COMMUTATOR = '<', NEGATOR = '<=',
407
   RESTRICT = contsel, JOIN = contjoinsel
408
);
409

    
410

    
411
CREATE OPERATOR CLASS btree_geometry_ops
412
        DEFAULT FOR TYPE geometry USING btree AS
413
        OPERATOR        1        < ,
414
        OPERATOR        2        <= ,
415
        OPERATOR        3        = ,
416
        OPERATOR        4        >= ,
417
        OPERATOR        5        > ,
418
        FUNCTION        1        geometry_cmp (geometry, geometry);
419

    
420

    
421

    
422
-------------------------------------------------------------------
423
-- GiST indexes
424
-------------------------------------------------------------------
425
CREATE OR REPLACE FUNCTION postgis_gist_sel (internal, oid, internal, int4)
426
        RETURNS float8
427
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_gist_sel'
428
        LANGUAGE 'C';
429

    
430
CREATE OR REPLACE FUNCTION postgis_gist_joinsel(internal, oid, internal, smallint)
431
        RETURNS float8
432
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_gist_joinsel'
433
        LANGUAGE 'C';
434

    
435
CREATE OR REPLACE FUNCTION geometry_overleft(geometry, geometry) 
436
        RETURNS bool
437
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_overleft'
438
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
439

    
440
CREATE OR REPLACE FUNCTION geometry_overright(geometry, geometry) 
441
        RETURNS bool
442
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_overright'
443
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
444

    
445
CREATE OR REPLACE FUNCTION geometry_overabove(geometry, geometry) 
446
        RETURNS bool
447
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_overabove'
448
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
449

    
450
CREATE OR REPLACE FUNCTION geometry_overbelow(geometry, geometry) 
451
        RETURNS bool
452
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_overbelow'
453
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
454

    
455
CREATE OR REPLACE FUNCTION geometry_left(geometry, geometry) 
456
        RETURNS bool
457
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_left'
458
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
459

    
460
CREATE OR REPLACE FUNCTION geometry_right(geometry, geometry) 
461
        RETURNS bool
462
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_right'
463
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
464

    
465
CREATE OR REPLACE FUNCTION geometry_above(geometry, geometry) 
466
        RETURNS bool
467
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_above'
468
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
469

    
470
CREATE OR REPLACE FUNCTION geometry_below(geometry, geometry) 
471
        RETURNS bool
472
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_below'
473
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
474

    
475
CREATE OR REPLACE FUNCTION geometry_contain(geometry, geometry) 
476
        RETURNS bool
477
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_contain'
478
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
479

    
480
CREATE OR REPLACE FUNCTION geometry_contained(geometry, geometry) 
481
        RETURNS bool
482
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_contained'
483
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
484

    
485
CREATE OR REPLACE FUNCTION geometry_overlap(geometry, geometry) 
486
        RETURNS bool
487
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_overlap'
488
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
489

    
490
CREATE OR REPLACE FUNCTION geometry_same(geometry, geometry) 
491
        RETURNS bool
492
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_same'
493
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
494

    
495
-- GEOMETRY operators
496

    
497
CREATE OPERATOR << (
498
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_left,
499
   COMMUTATOR = '>>',
500
   RESTRICT = positionsel, JOIN = positionjoinsel
501
);
502

    
503
CREATE OPERATOR &< (
504
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overleft,
505
   COMMUTATOR = '&>',
506
   RESTRICT = positionsel, JOIN = positionjoinsel
507
);
508

    
509
CREATE OPERATOR <<| (
510
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_below,
511
   COMMUTATOR = '|>>',
512
   RESTRICT = positionsel, JOIN = positionjoinsel
513
);
514

    
515
CREATE OPERATOR &<| (
516
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overbelow,
517
   COMMUTATOR = '|&>',
518
   RESTRICT = positionsel, JOIN = positionjoinsel
519
);
520

    
521
CREATE OPERATOR && (
522
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overlap,
523
   COMMUTATOR = '&&',
524
   RESTRICT = postgis_gist_sel, JOIN = postgis_gist_joinsel
525
);
526

    
527
CREATE OPERATOR &> (
528
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overright,
529
   COMMUTATOR = '&<',
530
   RESTRICT = positionsel, JOIN = positionjoinsel
531
);
532

    
533
CREATE OPERATOR >> (
534
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_right,
535
   COMMUTATOR = '<<',
536
   RESTRICT = positionsel, JOIN = positionjoinsel
537
);
538

    
539
CREATE OPERATOR |&> (
540
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overabove,
541
   COMMUTATOR = '&<|',
542
   RESTRICT = positionsel, JOIN = positionjoinsel
543
);
544

    
545
CREATE OPERATOR |>> (
546
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_above,
547
   COMMUTATOR = '<<|',
548
   RESTRICT = positionsel, JOIN = positionjoinsel
549
);
550

    
551
CREATE OPERATOR ~= (
552
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_same,
553
   COMMUTATOR = '~=', 
554
   RESTRICT = eqsel, JOIN = eqjoinsel
555
);
556

    
557
CREATE OPERATOR @ (
558
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_contained,
559
   COMMUTATOR = '~',
560
   RESTRICT = contsel, JOIN = contjoinsel
561
);
562

    
563
CREATE OPERATOR ~ (
564
   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_contain,
565
   COMMUTATOR = '@',
566
   RESTRICT = contsel, JOIN = contjoinsel
567
);
568

    
569
-- gist support functions
570

    
571

    
572
CREATE OR REPLACE FUNCTION LWGEOM_gist_consistent(internal,geometry,int4) 
573
        RETURNS bool 
574
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1' ,'LWGEOM_gist_consistent'
575
        LANGUAGE 'C';
576

    
577
CREATE OR REPLACE FUNCTION LWGEOM_gist_compress(internal) 
578
        RETURNS internal 
579
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_gist_compress'
580
        LANGUAGE 'C';
581

    
582
CREATE OR REPLACE FUNCTION LWGEOM_gist_penalty(internal,internal,internal) 
583
        RETURNS internal 
584
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1' ,'LWGEOM_gist_penalty'
585
        LANGUAGE 'C';
586

    
587
CREATE OR REPLACE FUNCTION LWGEOM_gist_picksplit(internal, internal) 
588
        RETURNS internal 
589
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1' ,'LWGEOM_gist_picksplit'
590
        LANGUAGE 'C';
591

    
592
CREATE OR REPLACE FUNCTION LWGEOM_gist_union(bytea, internal) 
593
        RETURNS internal 
594
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1' ,'LWGEOM_gist_union'
595
        LANGUAGE 'C';
596

    
597
CREATE OR REPLACE FUNCTION LWGEOM_gist_same(box2d, box2d, internal) 
598
        RETURNS internal 
599
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1' ,'LWGEOM_gist_same'
600
        LANGUAGE 'C';
601

    
602
CREATE OR REPLACE FUNCTION LWGEOM_gist_decompress(internal) 
603
        RETURNS internal
604
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1' ,'LWGEOM_gist_decompress'
605
        LANGUAGE 'C';
606

    
607
-------------------------------------------
608
-- GIST opclass index binding entries.
609
-------------------------------------------
610

    
611

    
612
--
613
-- Create opclass index bindings for PG>=73
614
--
615

616
CREATE OPERATOR CLASS gist_geometry_ops
617
        DEFAULT FOR TYPE geometry USING gist AS
618
        OPERATOR        1        <<         RECHECK,
619
        OPERATOR        2        &<        RECHECK,
620
        OPERATOR        3        &&        RECHECK,
621
        OPERATOR        4        &>        RECHECK,
622
        OPERATOR        5        >>        RECHECK,
623
        OPERATOR        6        ~=        RECHECK,
624
        OPERATOR        7        ~        RECHECK,
625
        OPERATOR        8        @        RECHECK,
626
        OPERATOR        9         &<|        RECHECK,
627
        OPERATOR        10         <<|        RECHECK,
628
        OPERATOR        11         |>>        RECHECK,
629
        OPERATOR        12         |&>        RECHECK,
630
        FUNCTION        1        LWGEOM_gist_consistent (internal, geometry, int4),
631
        FUNCTION        2        LWGEOM_gist_union (bytea, internal),
632
        FUNCTION        3        LWGEOM_gist_compress (internal),
633
        FUNCTION        4        LWGEOM_gist_decompress (internal),
634
        FUNCTION        5        LWGEOM_gist_penalty (internal, internal, internal),
635
        FUNCTION        6        LWGEOM_gist_picksplit (internal, internal),
636
        FUNCTION        7        LWGEOM_gist_same (box2d, box2d, internal);
637

    
638
UPDATE pg_opclass 
639
        SET opckeytype = (SELECT oid FROM pg_type 
640
                          WHERE typname = 'box2d' 
641
                          AND typnamespace = (SELECT oid FROM pg_namespace 
642
                                              WHERE nspname=current_schema())) 
643
        WHERE opcname = 'gist_geometry_ops' 
644
        AND opcnamespace = (SELECT oid from pg_namespace 
645
                            WHERE nspname=current_schema());
646
        
647
-- TODO: add btree binding...
648

    
649
        
650
-------------------------------------------
651
-- other lwgeom functions
652
-------------------------------------------
653

    
654
CREATE OR REPLACE FUNCTION addBBOX(geometry) 
655
        RETURNS geometry
656
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_addBBOX'
657
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
658

    
659
CREATE OR REPLACE FUNCTION dropBBOX(geometry) 
660
        RETURNS geometry
661
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_dropBBOX'
662
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
663

    
664
        
665
CREATE OR REPLACE FUNCTION getSRID(geometry) 
666
        RETURNS int4
667
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_getSRID'
668
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
669

    
670
CREATE OR REPLACE FUNCTION getBBOX(geometry)
671
        RETURNS box2d
672
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_to_BOX2DFLOAT4'
673
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
674

    
675
-------------------------------------------
676
--- CHIP functions
677
-------------------------------------------
678

    
679
CREATE OR REPLACE FUNCTION srid(chip)
680
        RETURNS int4
681
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','CHIP_getSRID'
682
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
683

    
684
CREATE OR REPLACE FUNCTION height(chip)
685
        RETURNS int4
686
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','CHIP_getHeight'
687
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
688

    
689
CREATE OR REPLACE FUNCTION factor(chip)
690
        RETURNS FLOAT4
691
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','CHIP_getFactor'
692
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
693

    
694
CREATE OR REPLACE FUNCTION width(chip)
695
        RETURNS int4
696
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','CHIP_getWidth'
697
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
698

    
699
CREATE OR REPLACE FUNCTION datatype(chip)
700
        RETURNS int4
701
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','CHIP_getDatatype'
702
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
703

    
704
CREATE OR REPLACE FUNCTION compression(chip)
705
        RETURNS int4
706
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','CHIP_getCompression'
707
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
708

    
709
CREATE OR REPLACE FUNCTION setSRID(chip,int4)
710
        RETURNS chip
711
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','CHIP_setSRID'
712
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
713

    
714
CREATE OR REPLACE FUNCTION setFactor(chip,float4)
715
        RETURNS chip
716
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','CHIP_setFactor'
717
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
718

    
719
------------------------------------------------------------------------
720
-- DEBUG
721
------------------------------------------------------------------------
722

    
723
CREATE OR REPLACE FUNCTION mem_size(geometry)
724
        RETURNS int4
725
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_mem_size'
726
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
727

    
728
CREATE OR REPLACE FUNCTION summary(geometry)
729
        RETURNS text
730
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_summary'
731
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
732

    
733
CREATE OR REPLACE FUNCTION npoints(geometry)
734
        RETURNS int4
735
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_npoints'
736
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
737

    
738
CREATE OR REPLACE FUNCTION nrings(geometry)
739
        RETURNS int4
740
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_nrings'
741
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
742

    
743
------------------------------------------------------------------------
744
-- Misures
745
------------------------------------------------------------------------
746

    
747
-- this is a fake (for back-compatibility)
748
-- uses 3d if 3d is available, 2d otherwise
749
CREATE OR REPLACE FUNCTION length3d(geometry)
750
        RETURNS FLOAT8
751
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_length_linestring'
752
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
753

    
754
CREATE OR REPLACE FUNCTION length2d(geometry)
755
        RETURNS FLOAT8
756
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_length2d_linestring'
757
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
758

    
759
CREATE OR REPLACE FUNCTION length(geometry)
760
        RETURNS FLOAT8
761
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_length_linestring'
762
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
763

    
764
-- this is a fake (for back-compatibility)
765
-- uses 3d if 3d is available, 2d otherwise
766
CREATE OR REPLACE FUNCTION length3d_spheroid(geometry, spheroid)
767
        RETURNS FLOAT8
768
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_length_ellipsoid_linestring'
769
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
770

    
771
CREATE OR REPLACE FUNCTION length_spheroid(geometry, spheroid)
772
        RETURNS FLOAT8
773
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_length_ellipsoid_linestring'
774
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
775

    
776
CREATE OR REPLACE FUNCTION length2d_spheroid(geometry, spheroid)
777
        RETURNS FLOAT8
778
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_length2d_ellipsoid_linestring'
779
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
780

    
781
-- this is a fake (for back-compatibility)
782
-- uses 3d if 3d is available, 2d otherwise
783
CREATE OR REPLACE FUNCTION perimeter3d(geometry)
784
        RETURNS FLOAT8
785
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_perimeter_poly'
786
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
787

    
788
CREATE OR REPLACE FUNCTION perimeter2d(geometry)
789
        RETURNS FLOAT8
790
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_perimeter2d_poly'
791
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
792

    
793
CREATE OR REPLACE FUNCTION perimeter(geometry)
794
        RETURNS FLOAT8
795
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_perimeter_poly'
796
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
797

    
798
-- this is an alias for 'area(geometry)'
799
-- there is nothing such an 'area3d'...
800
CREATE OR REPLACE FUNCTION area2d(geometry)
801
        RETURNS FLOAT8
802
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_area_polygon'
803
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
804

    
805
CREATE OR REPLACE FUNCTION area(geometry)
806
        RETURNS FLOAT8
807
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_area_polygon'
808
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
809

    
810
CREATE OR REPLACE FUNCTION distance_spheroid(geometry,geometry,spheroid)
811
        RETURNS FLOAT8
812
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_distance_ellipsoid_point'
813
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
814

    
815
CREATE OR REPLACE FUNCTION distance_sphere(geometry,geometry)
816
        RETURNS FLOAT8
817
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_distance_sphere'
818
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
819

    
820
-- Minimum distance. 2d only.
821
CREATE OR REPLACE FUNCTION distance(geometry,geometry)
822
        RETURNS float8
823
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_mindistance2d'
824
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
825

    
826
-- Maximum distance between linestrings. 2d only. Very bogus.
827
CREATE OR REPLACE FUNCTION max_distance(geometry,geometry)
828
        RETURNS float8
829
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_maxdistance2d_linestring'
830
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
831

    
832
CREATE OR REPLACE FUNCTION point_inside_circle(geometry,float8,float8,float8)
833
        RETURNS bool
834
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_inside_circle_point'
835
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
836

    
837
CREATE OR REPLACE FUNCTION azimuth(geometry,geometry)
838
        RETURNS float8
839
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_azimuth'
840
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
841

    
842

    
843
------------------------------------------------------------------------
844
-- MISC
845
------------------------------------------------------------------------
846

    
847
CREATE OR REPLACE FUNCTION force_2d(geometry) 
848
        RETURNS geometry
849
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_force_2d'
850
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
851

    
852
CREATE OR REPLACE FUNCTION force_3dz(geometry) 
853
        RETURNS geometry
854
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_force_3dz'
855
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
856

    
857
-- an alias for force_3dz
858
CREATE OR REPLACE FUNCTION force_3d(geometry) 
859
        RETURNS geometry
860
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_force_3dz'
861
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
862

    
863
CREATE OR REPLACE FUNCTION force_3dm(geometry) 
864
        RETURNS geometry
865
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_force_3dm'
866
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
867

    
868
CREATE OR REPLACE FUNCTION force_4d(geometry) 
869
        RETURNS geometry
870
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_force_4d'
871
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
872

    
873
CREATE OR REPLACE FUNCTION force_collection(geometry) 
874
        RETURNS geometry
875
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_force_collection'
876
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
877

    
878
CREATE OR REPLACE FUNCTION multi(geometry) 
879
        RETURNS geometry
880
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_force_multi'
881
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
882

    
883
CREATE OR REPLACE FUNCTION collector(geometry, geometry) 
884
        RETURNS geometry
885
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_collect'
886
        LANGUAGE 'C' IMMUTABLE;
887

    
888
CREATE OR REPLACE FUNCTION collect(geometry, geometry) 
889
        RETURNS geometry
890
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_collect'
891
        LANGUAGE 'C' IMMUTABLE;
892

    
893
CREATE AGGREGATE memcollect(
894
        sfunc = collect,
895
        basetype = geometry,
896
        stype = geometry
897
        );
898

    
899
CREATE OR REPLACE FUNCTION geom_accum (geometry[],geometry)
900
        RETURNS geometry[]
901
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_accum'
902
        LANGUAGE 'C' IMMUTABLE;
903

    
904
CREATE AGGREGATE accum (
905
        sfunc = geom_accum,
906
        basetype = geometry,
907
        stype = geometry[]
908
        );
909

    
910
CREATE OR REPLACE FUNCTION collect_garray (geometry[])
911
        RETURNS geometry
912
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_collect_garray'
913
        LANGUAGE 'C' IMMUTABLE STRICT;
914

    
915
CREATE AGGREGATE collect (
916
        sfunc = geom_accum,
917
        basetype = geometry,
918
        stype = geometry[],
919
        finalfunc = collect_garray
920
        );
921

    
922
CREATE OR REPLACE FUNCTION expand(box3d,float8)
923
        RETURNS box3d
924
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX3D_expand'
925
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
926

    
927
CREATE OR REPLACE FUNCTION expand(box2d,float8)
928
        RETURNS box2d
929
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX2DFLOAT4_expand'
930
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
931

    
932
CREATE OR REPLACE FUNCTION expand(geometry,float8)
933
        RETURNS geometry
934
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_expand'
935
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
936

    
937
CREATE OR REPLACE FUNCTION envelope(geometry)
938
        RETURNS geometry
939
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_envelope'
940
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
941

    
942
CREATE OR REPLACE FUNCTION reverse(geometry)
943
        RETURNS geometry
944
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_reverse'
945
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
946

    
947
CREATE OR REPLACE FUNCTION ForceRHR(geometry)
948
        RETURNS geometry
949
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_forceRHR_poly'
950
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
951

    
952
CREATE OR REPLACE FUNCTION noop(geometry)
953
        RETURNS geometry
954
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_noop'
955
        LANGUAGE 'C' VOLATILE STRICT; -- WITH (iscachable,isstrict);
956

    
957
CREATE OR REPLACE FUNCTION zmflag(geometry)
958
        RETURNS smallint
959
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_zmflag'
960
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
961

    
962
CREATE OR REPLACE FUNCTION hasBBOX(geometry)
963
        RETURNS bool
964
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_hasBBOX'
965
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
966

    
967
CREATE OR REPLACE FUNCTION ndims(geometry)
968
        RETURNS smallint
969
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_ndims'
970
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
971

    
972
CREATE OR REPLACE FUNCTION AsEWKT(geometry)
973
        RETURNS TEXT
974
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_asEWKT'
975
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
976

    
977
CREATE OR REPLACE FUNCTION AsEWKB(geometry)
978
        RETURNS BYTEA
979
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','WKBFromLWGEOM'
980
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
981

    
982
CREATE OR REPLACE FUNCTION AsHEXEWKB(geometry)
983
        RETURNS TEXT
984
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_asHEXEWKB'
985
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
986

    
987
CREATE OR REPLACE FUNCTION AsHEXEWKB(geometry, text)
988
        RETURNS TEXT
989
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_asHEXEWKB'
990
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
991

    
992
CREATE OR REPLACE FUNCTION AsEWKB(geometry,text)
993
        RETURNS bytea
994
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','WKBFromLWGEOM'
995
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
996

    
997
CREATE OR REPLACE FUNCTION GeomFromEWKB(bytea)
998
        RETURNS geometry
999
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOMFromWKB'
1000
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
1001

    
1002
CREATE OR REPLACE FUNCTION GeomFromEWKT(text)
1003
        RETURNS geometry
1004
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','parse_WKT_lwgeom'
1005
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
1006

    
1007
CREATE OR REPLACE FUNCTION cache_bbox()
1008
        RETURNS trigger
1009
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
1010
        LANGUAGE 'C';
1011

    
1012
------------------------------------------------------------------------
1013
-- CONSTRUCTORS
1014
------------------------------------------------------------------------
1015

    
1016
CREATE OR REPLACE FUNCTION makePoint(float8, float8)
1017
        RETURNS geometry
1018
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_makepoint'
1019
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
1020

    
1021
CREATE OR REPLACE FUNCTION makePoint(float8, float8, float8)
1022
        RETURNS geometry
1023
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_makepoint'
1024
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
1025

    
1026
CREATE OR REPLACE FUNCTION makePoint(float8, float8, float8, float8)
1027
        RETURNS geometry
1028
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_makepoint'
1029
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
1030

    
1031
CREATE OR REPLACE FUNCTION makePointM(float8, float8, float8)
1032
        RETURNS geometry
1033
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_makepoint3dm'
1034
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
1035

    
1036
CREATE OR REPLACE FUNCTION makeBox2d(geometry, geometry)
1037
        RETURNS box2d
1038
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX2DFLOAT4_construct'
1039
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
1040

    
1041
CREATE OR REPLACE FUNCTION makeBox3d(geometry, geometry)
1042
        RETURNS box3d
1043
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX3D_construct'
1044
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
1045

    
1046
CREATE OR REPLACE FUNCTION makeline_garray (geometry[])
1047
        RETURNS geometry
1048
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_makeline_garray'
1049
        LANGUAGE 'C' IMMUTABLE STRICT;
1050

    
1051
CREATE OR REPLACE FUNCTION LineFromMultiPoint(geometry)
1052
        RETURNS geometry
1053
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_line_from_mpoint'
1054
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
1055

    
1056
CREATE OR REPLACE FUNCTION MakeLine(geometry, geometry)
1057
        RETURNS geometry
1058
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_makeline'
1059
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
1060

    
1061
CREATE OR REPLACE FUNCTION AddPoint(geometry, geometry)
1062
        RETURNS geometry
1063
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_addpoint'
1064
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
1065

    
1066
CREATE OR REPLACE FUNCTION AddPoint(geometry, geometry, integer)
1067
        RETURNS geometry
1068
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_addpoint'
1069
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
1070

    
1071
CREATE OR REPLACE FUNCTION RemovePoint(geometry, integer)
1072
        RETURNS geometry
1073
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_removepoint'
1074
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
1075

    
1076
CREATE OR REPLACE FUNCTION SetPoint(geometry, integer, geometry)
1077
        RETURNS geometry
1078
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_setpoint_linestring'
1079
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
1080

    
1081
CREATE AGGREGATE makeline (
1082
        sfunc = geom_accum,
1083
        basetype = geometry,
1084
        stype = geometry[],
1085
        finalfunc = makeline_garray
1086
        );
1087

    
1088
CREATE OR REPLACE FUNCTION MakePolygon(geometry, geometry[])
1089
        RETURNS geometry
1090
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_makepoly'
1091
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
1092

    
1093
CREATE OR REPLACE FUNCTION MakePolygon(geometry)
1094
        RETURNS geometry
1095
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_makepoly'
1096
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
1097

    
1098
CREATE OR REPLACE FUNCTION BuildArea(geometry)
1099
        RETURNS geometry
1100
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_buildarea'
1101
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
1102

    
1103
CREATE OR REPLACE FUNCTION polygonize_garray (geometry[])
1104
        RETURNS geometry
1105
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'polygonize_garray'
1106
        LANGUAGE 'C' IMMUTABLE STRICT;
1107

    
1108
CREATE OR REPLACE FUNCTION LineMerge(geometry)
1109
        RETURNS geometry
1110
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'linemerge'
1111
        LANGUAGE 'C' IMMUTABLE STRICT;
1112

    
1113
CREATE AGGREGATE polygonize (
1114
        sfunc = geom_accum,
1115
        basetype = geometry,
1116
        stype = geometry[],
1117
        finalfunc = polygonize_garray
1118
        );
1119

    
1120

    
1121

    
1122
CREATE TYPE geometry_dump AS (path integer[], geom geometry);
1123

    
1124
CREATE OR REPLACE FUNCTION Dump(geometry)
1125
        RETURNS SETOF geometry_dump
1126
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_dump'
1127
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
1128

    
1129
CREATE OR REPLACE FUNCTION DumpRings(geometry)
1130
        RETURNS SETOF geometry_dump
1131
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_dump_rings'
1132
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
1133

    
1134

    
1135
------------------------------------------------------------------------
1136

    
1137
--
1138
-- Aggregate functions
1139
--
1140

1141
CREATE OR REPLACE FUNCTION combine_bbox(box2d,geometry)
1142
        RETURNS box2d
1143
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX2DFLOAT4_combine'
1144
        LANGUAGE 'C' IMMUTABLE;
1145

    
1146
CREATE AGGREGATE extent(
1147
        sfunc = combine_bbox,
1148
        basetype = geometry,
1149
        stype = box2d
1150
        );
1151

    
1152
CREATE OR REPLACE FUNCTION combine_bbox(box3d,geometry)
1153
        RETURNS box3d
1154
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'BOX3D_combine'
1155
        LANGUAGE 'C' IMMUTABLE;
1156

    
1157
CREATE AGGREGATE extent3d(
1158
        sfunc = combine_bbox,
1159
        basetype = geometry,
1160
        stype = box3d
1161
        );
1162

    
1163
-----------------------------------------------------------------------
1164
-- CREATE_HISTOGRAM2D( <box2d>, <size> )
1165
-----------------------------------------------------------------------
1166
--
1167
-- Returns a histgram with 0s in all the boxes.
1168
--
1169
-----------------------------------------------------------------------
1170
CREATE OR REPLACE FUNCTION create_histogram2d(box2d,int)
1171
        RETURNS histogram2d
1172
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','create_lwhistogram2d'
1173
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
1174

    
1175
-----------------------------------------------------------------------
1176
-- BUILD_HISTOGRAM2D( <histogram2d>, <tablename>, <columnname> )
1177
-----------------------------------------------------------------------
1178
CREATE OR REPLACE FUNCTION build_histogram2d (histogram2d,text,text)
1179
        RETURNS histogram2d
1180
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','build_lwhistogram2d'
1181
        LANGUAGE 'C' STABLE STRICT; -- WITH (isstrict);
1182

    
1183
-----------------------------------------------------------------------
1184
-- BUILD_HISTOGRAM2D(<histogram2d>,<schema>,<tablename>,<columnname>)
1185
-----------------------------------------------------------------------
1186
-- This is a wrapper to the omonimous schema unaware function,
1187
-- thanks to Carl Anderson for the idea.
1188
-----------------------------------------------------------------------
1189
CREATE OR REPLACE FUNCTION build_histogram2d (histogram2d,text,text,text)
1190
RETURNS histogram2d
1191
AS '
1192
BEGIN
1193
        EXECUTE ''SET local search_path = ''||$2||'',public'';
1194
        RETURN public.build_histogram2d($1,$3,$4);
1195
END
1196
'
1197
LANGUAGE 'plpgsql' STABLE STRICT; -- WITH (isstrict);
1198

    
1199
-----------------------------------------------------------------------
1200
-- EXPLODE_HISTOGRAM2D( <histogram2d>, <tablename> )
1201
-----------------------------------------------------------------------
1202
CREATE OR REPLACE FUNCTION explode_histogram2d (histogram2d,text)
1203
        RETURNS histogram2d
1204
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','explode_lwhistogram2d'
1205
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
1206

    
1207
-----------------------------------------------------------------------
1208
-- ESTIMATE_HISTOGRAM2D( <histogram2d>, <box> )
1209
-----------------------------------------------------------------------
1210
CREATE OR REPLACE FUNCTION estimate_histogram2d(histogram2d,box2d)
1211
        RETURNS float8
1212
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','estimate_lwhistogram2d'
1213
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
1214

    
1215
-----------------------------------------------------------------------
1216
-- ESTIMATED_EXTENT( <schema name>, <table name>, <column name> )
1217
-----------------------------------------------------------------------
1218
CREATE OR REPLACE FUNCTION estimated_extent(text,text,text) RETURNS box2d AS
1219
        '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_estimated_extent'
1220
        LANGUAGE 'C' IMMUTABLE STRICT SECURITY DEFINER;
1221

    
1222
-----------------------------------------------------------------------
1223
-- ESTIMATED_EXTENT( <table name>, <column name> )
1224
-----------------------------------------------------------------------
1225
CREATE OR REPLACE FUNCTION estimated_extent(text,text) RETURNS box2d AS
1226
        '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_estimated_extent'
1227
        LANGUAGE 'C' IMMUTABLE STRICT SECURITY DEFINER; 
1228

    
1229
-----------------------------------------------------------------------
1230
-- FIND_EXTENT( <schema name>, <table name>, <column name> )
1231
-----------------------------------------------------------------------
1232
CREATE OR REPLACE FUNCTION find_extent(text,text,text) RETURNS box2d AS
1233
'
1234
DECLARE
1235
        schemaname alias for $1;
1236
        tablename alias for $2;
1237
        columnname alias for $3;
1238
        myrec RECORD;
1239

1240
BEGIN
1241
        FOR myrec IN EXECUTE ''SELECT extent("''||columnname||''") FROM "''||schemaname||''"."''||tablename||''"'' LOOP
1242
                return myrec.extent;
1243
        END LOOP; 
1244
END;
1245
'
1246
LANGUAGE 'plpgsql' IMMUTABLE STRICT; -- WITH (isstrict);
1247

    
1248
-----------------------------------------------------------------------
1249
-- FIND_EXTENT( <table name>, <column name> )
1250
-----------------------------------------------------------------------
1251
CREATE OR REPLACE FUNCTION find_extent(text,text) RETURNS box2d AS
1252
'
1253
DECLARE
1254
        tablename alias for $1;
1255
        columnname alias for $2;
1256
        myrec RECORD;
1257

1258
BEGIN
1259
        FOR myrec IN EXECUTE ''SELECT extent("''||columnname||''") FROM "''||tablename||''"'' LOOP
1260
                return myrec.extent;
1261
        END LOOP; 
1262
END;
1263
'
1264
LANGUAGE 'plpgsql' IMMUTABLE STRICT; -- WITH (isstrict);
1265

    
1266
-------------------------------------------------------------------
1267
-- SPATIAL_REF_SYS
1268
-------------------------------------------------------------------
1269
CREATE TABLE spatial_ref_sys (
1270
         srid integer not null primary key,
1271
         auth_name varchar(256), 
1272
         auth_srid integer, 
1273
         srtext varchar(2048),
1274
         proj4text varchar(2048) 
1275
);
1276

    
1277
-------------------------------------------------------------------
1278
-- GEOMETRY_COLUMNS
1279
-------------------------------------------------------------------
1280
CREATE TABLE geometry_columns (
1281
        f_table_catalog varchar(256) not null,
1282
        f_table_schema varchar(256) not null,
1283
        f_table_name varchar(256) not null,
1284
        f_geometry_column varchar(256) not null,
1285
        coord_dimension integer not null,
1286
        srid integer not null,
1287
        type varchar(30) not null,
1288
        CONSTRAINT geometry_columns_pk primary key ( 
1289
                f_table_catalog, 
1290
                f_table_schema, 
1291
                f_table_name, 
1292
                f_geometry_column )
1293
) WITH OIDS;
1294

    
1295
-----------------------------------------------------------------------
1296
-- RENAME_GEOMETRY_TABLE_CONSTRAINTS()
1297
-----------------------------------------------------------------------
1298
-- This function has been obsoleted for the difficulty in
1299
-- finding attribute on which the constraint is applied.
1300
-- AddGeometryColumn will name the constraints in a meaningful
1301
-- way, but nobody can rely on it since old postgis versions did
1302
-- not do that.
1303
-----------------------------------------------------------------------
1304
CREATE OR REPLACE FUNCTION rename_geometry_table_constraints() RETURNS text
1305
AS 
1306
'
1307
SELECT ''rename_geometry_table_constraint() is obsoleted''::text
1308
'
1309
LANGUAGE 'SQL' IMMUTABLE;
1310

    
1311
-----------------------------------------------------------------------
1312
-- FIX_GEOMETRY_COLUMNS() 
1313
-----------------------------------------------------------------------
1314
-- This function will:
1315
--
1316
--        o try to fix the schema of records with an invalid one
1317
--                (for PG>=73)
1318
--
1319
--        o link records to system tables through attrelid and varattnum
1320
--                (for PG<75)
1321
--
1322
--        o delete all records for which no linking was possible
1323
--                (for PG<75)
1324
--        
1325
-- 
1326
-----------------------------------------------------------------------
1327
CREATE OR REPLACE FUNCTION fix_geometry_columns() RETURNS text
1328
AS 
1329
'
1330
DECLARE
1331
        mislinked record;
1332
        result text;
1333
        linked integer;
1334
        deleted integer;
1335
        foundschema integer;
1336
BEGIN
1337

1338
        -- Since 7.3 schema support has been added.
1339
        -- Previous postgis versions used to put the database name in
1340
        -- the schema column. This needs to be fixed, so we try to 
1341
        -- set the correct schema for each geometry_colums record
1342
        -- looking at table, column, type and srid.
1343
        UPDATE geometry_columns SET f_table_schema = n.nspname
1344
                FROM pg_namespace n, pg_class c, pg_attribute a,
1345
                        pg_constraint sridcheck, pg_constraint typecheck
1346
                WHERE ( f_table_schema is NULL
1347
                OR f_table_schema = ''''
1348
                OR f_table_schema NOT IN (
1349
                        SELECT nspname::varchar
1350
                        FROM pg_namespace nn, pg_class cc, pg_attribute aa
1351
                        WHERE cc.relnamespace = nn.oid
1352
                        AND cc.relname = f_table_name::name
1353
                        AND aa.attrelid = cc.oid
1354
                        AND aa.attname = f_geometry_column::name))
1355
                AND f_table_name::name = c.relname
1356
                AND c.oid = a.attrelid
1357
                AND c.relnamespace = n.oid
1358
                AND f_geometry_column::name = a.attname
1359

1360
                AND sridcheck.conrelid = c.oid
1361
                AND sridcheck.consrc LIKE ''(srid(% = %)''
1362
                AND sridcheck.consrc ~ textcat('' = '', srid::text)
1363

1364
                AND typecheck.conrelid = c.oid
1365
                AND typecheck.consrc LIKE
1366
        ''((geometrytype(%) = ''''%''''::text) OR (% IS NULL))''
1367
                AND typecheck.consrc ~ textcat('' = '''''', type::text)
1368

1369
                AND NOT EXISTS (
1370
                        SELECT oid FROM geometry_columns gc
1371
                        WHERE c.relname::varchar = gc.f_table_name
1372
                        AND n.nspname::varchar = gc.f_table_schema
1373
                        AND a.attname::varchar = gc.f_geometry_column
1374
                );
1375

1376
        GET DIAGNOSTICS foundschema = ROW_COUNT;
1377

1378
        -- no linkage to system table needed
1379
        return ''fixed:''||foundschema::text;
1380

1381
        -- fix linking to system tables
1382
        SELECT 0 INTO linked;
1383
        FOR mislinked in
1384
                SELECT gc.oid as gcrec,
1385
                        a.attrelid as attrelid, a.attnum as attnum
1386
                FROM geometry_columns gc, pg_class c,
1387
                pg_namespace n, pg_attribute a
1388
                WHERE ( gc.attrelid IS NULL OR gc.attrelid != a.attrelid 
1389
                        OR gc.varattnum IS NULL OR gc.varattnum != a.attnum)
1390
                AND n.nspname = gc.f_table_schema::name
1391
                AND c.relnamespace = n.oid
1392
                AND c.relname = gc.f_table_name::name
1393
                AND a.attname = f_geometry_column::name
1394
                AND a.attrelid = c.oid
1395
        LOOP
1396
                UPDATE geometry_columns SET
1397
                        attrelid = mislinked.attrelid,
1398
                        varattnum = mislinked.attnum,
1399
                        stats = NULL
1400
                        WHERE geometry_columns.oid = mislinked.gcrec;
1401
                SELECT linked+1 INTO linked;
1402
        END LOOP; 
1403

1404
        -- remove stale records
1405
        DELETE FROM geometry_columns WHERE attrelid IS NULL;
1406

1407
        GET DIAGNOSTICS deleted = ROW_COUNT;
1408

1409
        result = 
1410
                ''fixed:'' || foundschema::text ||
1411
                '' linked:'' || linked::text || 
1412
                '' deleted:'' || deleted::text;
1413

1414
        return result;
1415

1416
END;
1417
'
1418
LANGUAGE 'plpgsql' VOLATILE;
1419

    
1420
-----------------------------------------------------------------------
1421
-- PROBE_GEOMETRY_COLUMNS() 
1422
-----------------------------------------------------------------------
1423
-- Fill the geometry_columns table with values probed from the system
1424
-- catalogues. 3d flag cannot be probed, it defaults to 2
1425
--
1426
-- Note that bogus records already in geometry_columns are not
1427
-- overridden (a check for schema.table.column is performed), so
1428
-- to have a fresh probe backup your geometry_column, delete from
1429
-- it and probe.
1430
-----------------------------------------------------------------------
1431
CREATE OR REPLACE FUNCTION probe_geometry_columns() RETURNS text AS
1432
'
1433
DECLARE
1434
        inserted integer;
1435
        oldcount integer;
1436
        probed integer;
1437
        stale integer;
1438
BEGIN
1439

1440
        SELECT count(*) INTO oldcount FROM geometry_columns;
1441

1442
        SELECT count(*) INTO probed
1443
                FROM pg_class c, pg_attribute a, pg_type t, 
1444
                        pg_namespace n,
1445
                        pg_constraint sridcheck, pg_constraint typecheck
1446

1447
                WHERE t.typname = ''geometry''
1448
                AND a.atttypid = t.oid
1449
                AND a.attrelid = c.oid
1450
                AND c.relnamespace = n.oid
1451
                AND sridcheck.connamespace = n.oid
1452
                AND typecheck.connamespace = n.oid
1453

1454
                AND sridcheck.conrelid = c.oid
1455
                AND sridcheck.consrc LIKE ''(srid(''||a.attname||'') = %)''
1456
                AND typecheck.conrelid = c.oid
1457
                AND typecheck.consrc LIKE
1458
        ''((geometrytype(''||a.attname||'') = ''''%''''::text) OR (% IS NULL))''
1459
                ;
1460

1461
        INSERT INTO geometry_columns SELECT
1462
                ''''::varchar as f_table_catalogue,
1463
                n.nspname::varchar as f_table_schema,
1464
                c.relname::varchar as f_table_name,
1465
                a.attname::varchar as f_geometry_column,
1466
                2 as coord_dimension,
1467
                trim(both  '' =)'' from substr(sridcheck.consrc,
1468
                        strpos(sridcheck.consrc, ''='')))::integer as srid,
1469
                trim(both '' =)'''''' from substr(typecheck.consrc, 
1470
                        strpos(typecheck.consrc, ''=''),
1471
                        strpos(typecheck.consrc, ''::'')-
1472
                        strpos(typecheck.consrc, ''='')
1473
                        ))::varchar as type
1474

1475
                FROM pg_class c, pg_attribute a, pg_type t, 
1476
                        pg_namespace n,
1477
                        pg_constraint sridcheck, pg_constraint typecheck
1478
                WHERE t.typname = ''geometry''
1479
                AND a.atttypid = t.oid
1480
                AND a.attrelid = c.oid
1481
                AND c.relnamespace = n.oid
1482
                AND sridcheck.connamespace = n.oid
1483
                AND typecheck.connamespace = n.oid
1484
                AND sridcheck.conrelid = c.oid
1485
                AND sridcheck.consrc LIKE ''(srid(''||a.attname||'') = %)''
1486
                AND typecheck.conrelid = c.oid
1487
                AND typecheck.consrc LIKE
1488
        ''((geometrytype(''||a.attname||'') = ''''%''''::text) OR (% IS NULL))''
1489

1490
                AND NOT EXISTS (
1491
                        SELECT oid FROM geometry_columns gc
1492
                        WHERE c.relname::varchar = gc.f_table_name
1493
                        AND n.nspname::varchar = gc.f_table_schema
1494
                        AND a.attname::varchar = gc.f_geometry_column
1495
                );
1496

1497
        GET DIAGNOSTICS inserted = ROW_COUNT;
1498

1499
        IF oldcount > probed THEN
1500
                stale = oldcount-probed;
1501
        ELSE
1502
                stale = 0;
1503
        END IF;
1504

1505
        RETURN ''probed:''||probed||
1506
                '' inserted:''||inserted||
1507
                '' conflicts:''||probed-inserted||
1508
                '' stale:''||stale;
1509
END
1510

1511
'
1512
LANGUAGE 'plpgsql' VOLATILE;
1513

    
1514
-----------------------------------------------------------------------
1515
-- ADDGEOMETRYCOLUMN
1516
--   <catalogue>, <schema>, <table>, <column>, <srid>, <type>, <dim>
1517
-----------------------------------------------------------------------
1518
--
1519
-- Type can be one of geometry, GEOMETRYCOLLECTION, POINT, MULTIPOINT, POLYGON,
1520
-- MULTIPOLYGON, LINESTRING, or MULTILINESTRING.
1521
--
1522
-- Types (except geometry) are checked for consistency using a CHECK constraint
1523
-- uses SQL ALTER TABLE command to add the geometry column to the table.
1524
-- Addes a row to geometry_columns.
1525
-- Addes a constraint on the table that all the geometries MUST have the same 
1526
-- SRID. Checks the coord_dimension to make sure its between 0 and 3.
1527
-- Should also check the precision grid (future expansion).
1528
-- Calls fix_geometry_columns() at the end.
1529
--
1530
-----------------------------------------------------------------------
1531
CREATE OR REPLACE FUNCTION AddGeometryColumn(varchar,varchar,varchar,varchar,integer,varchar,integer)
1532
        RETURNS text
1533
        AS 
1534
'
1535
DECLARE
1536
        catalog_name alias for $1;
1537
        schema_name alias for $2;
1538
        table_name alias for $3;
1539
        column_name alias for $4;
1540
        new_srid alias for $5;
1541
        new_type alias for $6;
1542
        new_dim alias for $7;
1543
        rec RECORD;
1544
        schema_ok bool;
1545
        real_schema name;
1546

1547
BEGIN
1548

1549
        IF ( not ( (new_type =''GEOMETRY'') or
1550
                   (new_type =''GEOMETRYCOLLECTION'') or
1551
                   (new_type =''POINT'') or 
1552
                   (new_type =''MULTIPOINT'') or
1553
                   (new_type =''POLYGON'') or
1554
                   (new_type =''MULTIPOLYGON'') or
1555
                   (new_type =''LINESTRING'') or
1556
                   (new_type =''MULTILINESTRING'') or
1557
                   (new_type =''GEOMETRYCOLLECTIONM'') or
1558
                   (new_type =''POINTM'') or 
1559
                   (new_type =''MULTIPOINTM'') or
1560
                   (new_type =''POLYGONM'') or
1561
                   (new_type =''MULTIPOLYGONM'') or
1562
                   (new_type =''LINESTRINGM'') or
1563
                   (new_type =''MULTILINESTRINGM'')) )
1564
        THEN
1565
                RAISE EXCEPTION ''Invalid type name - valid ones are: 
1566
                        GEOMETRY, GEOMETRYCOLLECTION, POINT, 
1567
                        MULTIPOINT, POLYGON, MULTIPOLYGON, 
1568
                        LINESTRING, MULTILINESTRING,
1569
                        GEOMETRYCOLLECTIONM, POINTM, 
1570
                        MULTIPOINTM, POLYGONM, MULTIPOLYGONM, 
1571
                        LINESTRINGM, or MULTILINESTRINGM '';
1572
                return ''fail'';
1573
        END IF;
1574

1575
        IF ( (new_dim >4) or (new_dim <0) ) THEN
1576
                RAISE EXCEPTION ''invalid dimension'';
1577
                return ''fail'';
1578
        END IF;
1579

1580
        IF ( (new_type LIKE ''%M'') and (new_dim!=3) ) THEN
1581

1582
                RAISE EXCEPTION ''TypeM needs 3 dimensions'';
1583
                return ''fail'';
1584
        END IF;
1585

1586
        IF ( schema_name != '''' ) THEN
1587
                schema_ok = ''f'';
1588
                FOR rec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP
1589
                        schema_ok := ''t'';
1590
                END LOOP;
1591

1592
                if ( schema_ok <> ''t'' ) THEN
1593
                        RAISE NOTICE ''Invalid schema name - using current_schema()'';
1594
                        SELECT current_schema() into real_schema;
1595
                ELSE
1596
                        real_schema = schema_name;
1597
                END IF;
1598

1599
        ELSE
1600
                SELECT current_schema() into real_schema;
1601
        END IF;
1602

1603

1604
        -- Add geometry column
1605

1606
        EXECUTE ''ALTER TABLE '' ||
1607
                quote_ident(real_schema) || ''.'' || quote_ident(table_name)
1608
                || '' ADD COLUMN '' || quote_ident(column_name) || 
1609
                '' geometry '';
1610

1611

1612
        -- Delete stale record in geometry_column (if any)
1613

1614
        EXECUTE ''DELETE FROM geometry_columns WHERE
1615
                f_table_catalog = '' || quote_literal('''') || 
1616
                '' AND f_table_schema = '' ||
1617
                quote_literal(real_schema) || 
1618
                '' AND f_table_name = '' || quote_literal(table_name) ||
1619
                '' AND f_geometry_column = '' || quote_literal(column_name);
1620

1621

1622
        -- Add record in geometry_column 
1623

1624
        EXECUTE ''INSERT INTO geometry_columns VALUES ('' ||
1625
                quote_literal('''') || '','' ||
1626
                quote_literal(real_schema) || '','' ||
1627
                quote_literal(table_name) || '','' ||
1628
                quote_literal(column_name) || '','' ||
1629
                new_dim || '','' || new_srid || '','' ||
1630
                quote_literal(new_type) || '')'';
1631

1632
        -- Add table checks
1633

1634
        EXECUTE ''ALTER TABLE '' || 
1635
                quote_ident(real_schema) || ''.'' || quote_ident(table_name)
1636
                || '' ADD CONSTRAINT '' 
1637
                || quote_ident(''enforce_srid_'' || column_name)
1638
                || '' CHECK (SRID('' || quote_ident(column_name) ||
1639
                '') = '' || new_srid || '')'' ;
1640

1641
        EXECUTE ''ALTER TABLE '' || 
1642
                quote_ident(real_schema) || ''.'' || quote_ident(table_name)
1643
                || '' ADD CONSTRAINT ''
1644
                || quote_ident(''enforce_dims_'' || column_name)
1645
                || '' CHECK (ndims('' || quote_ident(column_name) ||
1646
                '') = '' || new_dim || '')'' ;
1647

1648
        IF (not(new_type = ''GEOMETRY'')) THEN
1649
                EXECUTE ''ALTER TABLE '' || 
1650
                quote_ident(real_schema) || ''.'' || quote_ident(table_name)
1651
                || '' ADD CONSTRAINT ''
1652
                || quote_ident(''enforce_geotype_'' || column_name)
1653
                || '' CHECK (geometrytype('' ||
1654
                quote_ident(column_name) || '')='' ||
1655
                quote_literal(new_type) || '' OR ('' ||
1656
                quote_ident(column_name) || '') is null)'';
1657
        END IF;
1658

1659
        return 
1660
                real_schema || ''.'' || 
1661
                table_name || ''.'' || column_name ||
1662
                '' SRID:'' || new_srid ||
1663
                '' TYPE:'' || new_type || 
1664
                '' DIMS:'' || new_dim || chr(10) || '' ''; 
1665
END;
1666
'
1667
LANGUAGE 'plpgsql' VOLATILE STRICT; -- WITH (isstrict);
1668

    
1669
----------------------------------------------------------------------------
1670
-- ADDGEOMETRYCOLUMN ( <schema>, <table>, <column>, <srid>, <type>, <dim> )
1671
----------------------------------------------------------------------------
1672
--
1673
-- This is a wrapper to the real AddGeometryColumn, for use
1674
-- when catalogue is undefined
1675
--
1676
----------------------------------------------------------------------------
1677
CREATE OR REPLACE FUNCTION AddGeometryColumn(varchar,varchar,varchar,integer,varchar,integer) RETURNS text AS '
1678
DECLARE
1679
        ret  text;
1680
BEGIN
1681
        SELECT AddGeometryColumn('''',$1,$2,$3,$4,$5,$6) into ret;
1682
        RETURN ret;
1683
END;
1684
'
1685
LANGUAGE 'plpgsql' STABLE STRICT; -- WITH (isstrict);
1686

    
1687
----------------------------------------------------------------------------
1688
-- ADDGEOMETRYCOLUMN ( <table>, <column>, <srid>, <type>, <dim> )
1689
----------------------------------------------------------------------------
1690
--
1691
-- This is a wrapper to the real AddGeometryColumn, for use
1692
-- when catalogue and schema are undefined
1693
--
1694
----------------------------------------------------------------------------
1695
CREATE OR REPLACE FUNCTION AddGeometryColumn(varchar,varchar,integer,varchar,integer) RETURNS text AS '
1696
DECLARE
1697
        ret  text;
1698
BEGIN
1699
        SELECT AddGeometryColumn('''','''',$1,$2,$3,$4,$5) into ret;
1700
        RETURN ret;
1701
END;
1702
'
1703
LANGUAGE 'plpgsql' VOLATILE STRICT; -- WITH (isstrict);
1704

    
1705
-----------------------------------------------------------------------
1706
-- DROPGEOMETRYCOLUMN
1707
--   <catalogue>, <schema>, <table>, <column>
1708
-----------------------------------------------------------------------
1709
--
1710
-- Removes geometry column reference from geometry_columns table.
1711
-- Drops the column with pgsql >= 73.
1712
-- Make some silly enforcements on it for pgsql < 73
1713
--
1714
-----------------------------------------------------------------------
1715
CREATE OR REPLACE FUNCTION DropGeometryColumn(varchar, varchar,varchar,varchar)
1716
        RETURNS text
1717
        AS 
1718
'
1719
DECLARE
1720
        catalog_name alias for $1; 
1721
        schema_name alias for $2;
1722
        table_name alias for $3;
1723
        column_name alias for $4;
1724
        myrec RECORD;
1725
        okay boolean;
1726
        real_schema name;
1727

1728
BEGIN
1729

1730

1731
        -- Find, check or fix schema_name
1732
        IF ( schema_name != '''' ) THEN
1733
                okay = ''f'';
1734

1735
                FOR myrec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP
1736
                        okay := ''t'';
1737
                END LOOP;
1738

1739
                IF ( okay <> ''t'' ) THEN
1740
                        RAISE NOTICE ''Invalid schema name - using current_schema()'';
1741
                        SELECT current_schema() into real_schema;
1742
                ELSE
1743
                        real_schema = schema_name;
1744
                END IF;
1745
        ELSE
1746
                SELECT current_schema() into real_schema;
1747
        END IF;
1748

1749
         -- Find out if the column is in the geometry_columns table
1750
        okay = ''f'';
1751
        FOR myrec IN SELECT * from geometry_columns where f_table_schema = text(real_schema) and f_table_name = table_name and f_geometry_column = column_name LOOP
1752
                okay := ''t'';
1753
        END LOOP; 
1754
        IF (okay <> ''t'') THEN 
1755
                RAISE EXCEPTION ''column not found in geometry_columns table'';
1756
                RETURN ''f'';
1757
        END IF;
1758

1759
        -- Remove ref from geometry_columns table
1760
        EXECUTE ''delete from geometry_columns where f_table_schema = '' ||
1761
                quote_literal(real_schema) || '' and f_table_name = '' ||
1762
                quote_literal(table_name)  || '' and f_geometry_column = '' ||
1763
                quote_literal(column_name);
1764
        
1765
        -- Remove table column
1766
        EXECUTE ''ALTER TABLE '' || quote_ident(real_schema) || ''.'' ||
1767
                quote_ident(table_name) || '' DROP COLUMN '' ||
1768
                quote_ident(column_name);
1769

1770

1771
        RETURN real_schema || ''.'' || table_name || ''.'' || column_name ||'' effectively removed.'';
1772
        
1773
END;
1774
'
1775
LANGUAGE 'plpgsql' VOLATILE STRICT; -- WITH (isstrict);
1776

    
1777
-----------------------------------------------------------------------
1778
-- DROPGEOMETRYCOLUMN
1779
--   <schema>, <table>, <column>
1780
-----------------------------------------------------------------------
1781
--
1782
-- This is a wrapper to the real DropGeometryColumn, for use
1783
-- when catalogue is undefined
1784
--
1785
-----------------------------------------------------------------------
1786
CREATE OR REPLACE FUNCTION DropGeometryColumn(varchar,varchar,varchar)
1787
        RETURNS text
1788
        AS 
1789
'
1790
DECLARE
1791
        ret text;
1792
BEGIN
1793
        SELECT DropGeometryColumn('''',$1,$2,$3) into ret;
1794
        RETURN ret;
1795
END;
1796
'
1797
LANGUAGE 'plpgsql' VOLATILE STRICT; -- WITH (isstrict);
1798

    
1799
-----------------------------------------------------------------------
1800
-- DROPGEOMETRYCOLUMN
1801
--   <table>, <column>
1802
-----------------------------------------------------------------------
1803
--
1804
-- This is a wrapper to the real DropGeometryColumn, for use
1805
-- when catalogue and schema is undefined. 
1806
--
1807
-----------------------------------------------------------------------
1808
CREATE OR REPLACE FUNCTION DropGeometryColumn(varchar,varchar)
1809
        RETURNS text
1810
        AS 
1811
'
1812
DECLARE
1813
        ret text;
1814
BEGIN
1815
        SELECT DropGeometryColumn('''','''',$1,$2) into ret;
1816
        RETURN ret;
1817
END;
1818
'
1819
LANGUAGE 'plpgsql' VOLATILE STRICT; -- WITH (isstrict);
1820

    
1821
-----------------------------------------------------------------------
1822
-- DROPGEOMETRYTABLE
1823
--   <catalogue>, <schema>, <table>
1824
-----------------------------------------------------------------------
1825
--
1826
-- Drop a table and all its references in geometry_columns
1827
--
1828
-----------------------------------------------------------------------
1829
CREATE OR REPLACE FUNCTION DropGeometryTable(varchar, varchar,varchar)
1830
        RETURNS text
1831
        AS 
1832
'
1833
DECLARE
1834
        catalog_name alias for $1; 
1835
        schema_name alias for $2;
1836
        table_name alias for $3;
1837
        real_schema name;
1838

1839
BEGIN
1840

1841
        IF ( schema_name = '''' ) THEN
1842
                SELECT current_schema() into real_schema;
1843
        ELSE
1844
                real_schema = schema_name;
1845
        END IF;
1846

1847
        -- Remove refs from geometry_columns table
1848
        EXECUTE ''DELETE FROM geometry_columns WHERE '' ||
1849
                ''f_table_schema = '' || quote_literal(real_schema) ||
1850
                '' AND '' ||
1851
                '' f_table_name = '' || quote_literal(table_name);
1852
        
1853
        -- Remove table 
1854
        EXECUTE ''DROP TABLE ''
1855
                || quote_ident(real_schema) || ''.'' ||
1856
                quote_ident(table_name);
1857

1858
        RETURN
1859
                real_schema || ''.'' ||
1860
                table_name ||'' dropped.'';
1861
        
1862
END;
1863
'
1864
LANGUAGE 'plpgsql' VOLATILE STRICT; -- WITH (isstrict);
1865

    
1866
-----------------------------------------------------------------------
1867
-- DROPGEOMETRYTABLE
1868
--   <schema>, <table>
1869
-----------------------------------------------------------------------
1870
--
1871
-- Drop a table and all its references in geometry_columns
1872
--
1873
-----------------------------------------------------------------------
1874
CREATE OR REPLACE FUNCTION DropGeometryTable(varchar,varchar) RETURNS text AS 
1875
'SELECT DropGeometryTable('''',$1,$2)'
1876
LANGUAGE 'sql' WITH (isstrict);
1877

    
1878
-----------------------------------------------------------------------
1879
-- DROPGEOMETRYTABLE
1880
--   <table>
1881
-----------------------------------------------------------------------
1882
--
1883
-- Drop a table and all its references in geometry_columns
1884
-- For PG>=73 use current_schema()
1885
--
1886
-----------------------------------------------------------------------
1887
CREATE OR REPLACE FUNCTION DropGeometryTable(varchar) RETURNS text AS 
1888
'SELECT DropGeometryTable('''','''',$1)'
1889
LANGUAGE 'sql' VOLATILE STRICT; -- WITH (isstrict);
1890

    
1891
-----------------------------------------------------------------------
1892
-- UPDATEGEOMETRYSRID
1893
--   <catalogue>, <schema>, <table>, <column>, <srid>
1894
-----------------------------------------------------------------------
1895
--
1896
-- Change SRID of all features in a spatially-enabled table
1897
--
1898
-----------------------------------------------------------------------
1899
CREATE OR REPLACE FUNCTION UpdateGeometrySRID(varchar,varchar,varchar,varchar,integer)
1900
        RETURNS text
1901
        AS 
1902
'
1903
DECLARE
1904
        catalog_name alias for $1; 
1905
        schema_name alias for $2;
1906
        table_name alias for $3;
1907
        column_name alias for $4;
1908
        new_srid alias for $5;
1909
        myrec RECORD;
1910
        okay boolean;
1911
        cname varchar;
1912
        real_schema name;
1913

1914
BEGIN
1915

1916

1917
        -- Find, check or fix schema_name
1918
        IF ( schema_name != '''' ) THEN
1919
                okay = ''f'';
1920

1921
                FOR myrec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP
1922
                        okay := ''t'';
1923
                END LOOP;
1924

1925
                IF ( okay <> ''t'' ) THEN
1926
                        RAISE EXCEPTION ''Invalid schema name'';
1927
                ELSE
1928
                        real_schema = schema_name;
1929
                END IF;
1930
        ELSE
1931
                SELECT INTO real_schema current_schema()::text;
1932
        END IF;
1933

1934
         -- Find out if the column is in the geometry_columns table
1935
        okay = ''f'';
1936
        FOR myrec IN SELECT * from geometry_columns where f_table_schema = text(real_schema) and f_table_name = table_name and f_geometry_column = column_name LOOP
1937
                okay := ''t'';
1938
        END LOOP; 
1939
        IF (okay <> ''t'') THEN 
1940
                RAISE EXCEPTION ''column not found in geometry_columns table'';
1941
                RETURN ''f'';
1942
        END IF;
1943

1944
        -- Update ref from geometry_columns table
1945
        EXECUTE ''UPDATE geometry_columns SET SRID = '' || new_srid || 
1946
                '' where f_table_schema = '' ||
1947
                quote_literal(real_schema) || '' and f_table_name = '' ||
1948
                quote_literal(table_name)  || '' and f_geometry_column = '' ||
1949
                quote_literal(column_name);
1950
        
1951
        -- Make up constraint name
1952
        cname = ''enforce_srid_''  || column_name;
1953

1954
        -- Drop enforce_srid constraint
1955
        EXECUTE ''ALTER TABLE '' || quote_ident(real_schema) ||
1956
                ''.'' || quote_ident(table_name) ||
1957
                '' DROP constraint '' || quote_ident(cname);
1958

1959
        -- Update geometries SRID
1960
        EXECUTE ''UPDATE '' || quote_ident(real_schema) ||
1961
                ''.'' || quote_ident(table_name) ||
1962
                '' SET '' || quote_ident(column_name) ||
1963
                '' = setSRID('' || quote_ident(column_name) ||
1964
                '', '' || new_srid || '')'';
1965

1966
        -- Reset enforce_srid constraint
1967
        EXECUTE ''ALTER TABLE '' || quote_ident(real_schema) ||
1968
                ''.'' || quote_ident(table_name) ||
1969
                '' ADD constraint '' || quote_ident(cname) ||
1970
                '' CHECK (srid('' || quote_ident(column_name) ||
1971
                '') = '' || new_srid || '')'';
1972

1973
        RETURN real_schema || ''.'' || table_name || ''.'' || column_name ||'' SRID changed to '' || new_srid;
1974
        
1975
END;
1976
'
1977
LANGUAGE 'plpgsql' VOLATILE STRICT; -- WITH (isstrict);
1978

    
1979
-----------------------------------------------------------------------
1980
-- UPDATEGEOMETRYSRID
1981
--   <schema>, <table>, <column>, <srid>
1982
-----------------------------------------------------------------------
1983
CREATE OR REPLACE FUNCTION UpdateGeometrySRID(varchar,varchar,varchar,integer)
1984
        RETURNS text
1985
        AS '
1986
DECLARE
1987
        ret  text;
1988
BEGIN
1989
        SELECT UpdateGeometrySRID('''',$1,$2,$3,$4) into ret;
1990
        RETURN ret;
1991
END;
1992
'
1993
LANGUAGE 'plpgsql' VOLATILE STRICT; -- WITH (isstrict);
1994

    
1995
-----------------------------------------------------------------------
1996
-- UPDATEGEOMETRYSRID
1997
--   <table>, <column>, <srid>
1998
-----------------------------------------------------------------------
1999
CREATE OR REPLACE FUNCTION UpdateGeometrySRID(varchar,varchar,integer)
2000
        RETURNS text
2001
        AS '
2002
DECLARE
2003
        ret  text;
2004
BEGIN
2005
        SELECT UpdateGeometrySRID('''','''',$1,$2,$3) into ret;
2006
        RETURN ret;
2007
END;
2008
'
2009
LANGUAGE 'plpgsql' VOLATILE STRICT; -- WITH (isstrict);
2010

    
2011
-----------------------------------------------------------------------
2012
-- UPDATE_GEOMETRY_STATS()
2013
-----------------------------------------------------------------------
2014
--
2015
-- Only meaningful for PG<75.
2016
-- Gather statisticts about geometry columns for use
2017
-- with cost estimator.
2018
--
2019
-- It is defined also for PG>=75 for back-compatibility
2020
--
2021
-----------------------------------------------------------------------
2022
CREATE OR REPLACE FUNCTION update_geometry_stats() RETURNS text
2023
AS ' SELECT ''update_geometry_stats() has been obsoleted. Statistics are automatically built running the ANALYZE command''::text' LANGUAGE 'sql';
2024

    
2025
-----------------------------------------------------------------------
2026
-- UPDATE_GEOMETRY_STATS( <table>, <column> )
2027
-----------------------------------------------------------------------
2028
--
2029
-- Only meaningful for PG<75.
2030
-- Gather statisticts about a geometry column for use
2031
-- with cost estimator.
2032
--
2033
-- It is defined also for PG>=75 for back-compatibility
2034
--
2035
-----------------------------------------------------------------------
2036
CREATE OR REPLACE FUNCTION update_geometry_stats(varchar,varchar) RETURNS text
2037
AS 'SELECT update_geometry_stats();' LANGUAGE 'sql' ;
2038

    
2039
-----------------------------------------------------------------------
2040
-- FIND_SRID( <schema>, <table>, <geom col> )
2041
-----------------------------------------------------------------------
2042
CREATE OR REPLACE FUNCTION find_srid(varchar,varchar,varchar) RETURNS int4 AS
2043
'DECLARE
2044
   schem text;
2045
   tabl text;
2046
   sr int4;
2047
BEGIN
2048
   IF $1 IS NULL THEN
2049
      RAISE EXCEPTION ''find_srid() - schema is NULL!'';
2050
   END IF;
2051
   IF $2 IS NULL THEN
2052
      RAISE EXCEPTION ''find_srid() - table name is NULL!'';
2053
   END IF;
2054
   IF $3 IS NULL THEN
2055
      RAISE EXCEPTION ''find_srid() - column name is NULL!'';
2056
   END IF;
2057
   schem = $1;
2058
   tabl = $2;
2059
-- if the table contains a . and the schema is empty
2060
-- split the table into a schema and a table
2061
-- otherwise drop through to default behavior
2062
   IF ( schem = '''' and tabl LIKE ''%.%'' ) THEN
2063
     schem = substr(tabl,1,strpos(tabl,''.'')-1);
2064
     tabl = substr(tabl,length(schem)+2);
2065
   ELSE
2066
     schem = schem || ''%'';
2067
   END IF;
2068

2069
   select SRID into sr from geometry_columns where f_table_schema like schem and f_table_name = tabl and f_geometry_column = $3;
2070
   IF NOT FOUND THEN
2071
       RAISE EXCEPTION ''find_srid() - couldnt find the corresponding SRID - is the geometry registered in the GEOMETRY_COLUMNS table?  Is there an uppercase/lowercase missmatch?'';
2072
   END IF;
2073
  return sr;
2074
END;
2075
'
2076
LANGUAGE 'plpgsql' IMMUTABLE STRICT; -- WITH (iscachable); 
2077

    
2078

    
2079
---------------------------------------------------------------
2080
-- PROJ support
2081
---------------------------------------------------------------
2082

    
2083
CREATE OR REPLACE FUNCTION get_proj4_from_srid(integer) RETURNS text AS
2084
'
2085
BEGIN
2086
        RETURN proj4text::text FROM spatial_ref_sys WHERE srid= $1;
2087
END;
2088
'
2089
LANGUAGE 'plpgsql' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
2090

    
2091

    
2092

    
2093
CREATE OR REPLACE FUNCTION transform_geometry(geometry,text,text,int)
2094
        RETURNS geometry
2095
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','transform_geom'
2096
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2097

    
2098
CREATE OR REPLACE FUNCTION transform(geometry,integer)
2099
        RETURNS geometry
2100
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','transform'
2101
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2102

    
2103

    
2104
-----------------------------------------------------------------------
2105
-- POSTGIS_VERSION()
2106
-----------------------------------------------------------------------
2107

    
2108
CREATE OR REPLACE FUNCTION postgis_version() RETURNS text
2109
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2110
        LANGUAGE 'C' IMMUTABLE;
2111

    
2112
CREATE OR REPLACE FUNCTION postgis_proj_version() RETURNS text
2113
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2114
        LANGUAGE 'C' IMMUTABLE;
2115

    
2116
--
2117
-- IMPORTANT:
2118
-- Starting at 1.1.0 this function is used by postgis_proc_upgrade.pl
2119
-- to extract version of postgis being installed.
2120
-- Do not modify this w/out also changing postgis_proc_upgrade.pl
2121
--
2122
CREATE OR REPLACE FUNCTION postgis_scripts_installed() RETURNS text
2123
        AS 'SELECT ''1.1.6''::text AS version'
2124
        LANGUAGE 'sql' IMMUTABLE;
2125

    
2126
CREATE OR REPLACE FUNCTION postgis_lib_version() RETURNS text
2127
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2128
        LANGUAGE 'C' IMMUTABLE; -- a new lib will require a new session
2129

    
2130
-- NOTE: starting at 1.1.0 this is the same of postgis_lib_version()
2131
CREATE OR REPLACE FUNCTION postgis_scripts_released() RETURNS text
2132
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2133
        LANGUAGE 'C' IMMUTABLE;
2134

    
2135
CREATE OR REPLACE FUNCTION postgis_uses_stats() RETURNS bool
2136
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2137
        LANGUAGE 'C' IMMUTABLE;
2138

    
2139
CREATE OR REPLACE FUNCTION postgis_geos_version() RETURNS text
2140
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2141
        LANGUAGE 'C' IMMUTABLE;
2142

    
2143
CREATE OR REPLACE FUNCTION postgis_jts_version() RETURNS text
2144
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2145
        LANGUAGE 'C' IMMUTABLE;
2146

    
2147
CREATE OR REPLACE FUNCTION postgis_scripts_build_date() RETURNS text
2148
        AS 'SELECT ''2006-12-20 17:24:57''::text AS version'
2149
        LANGUAGE 'sql' IMMUTABLE;
2150

    
2151
CREATE OR REPLACE FUNCTION postgis_lib_build_date() RETURNS text
2152
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2153
        LANGUAGE 'C' IMMUTABLE;
2154

    
2155

    
2156

    
2157
CREATE OR REPLACE FUNCTION postgis_full_version() RETURNS text
2158
AS '
2159
DECLARE
2160
        libver text;
2161
        projver text;
2162
        geosver text;
2163
        jtsver text;
2164
        usestats bool;
2165
        dbproc text;
2166
        relproc text;
2167
        fullver text;
2168
BEGIN
2169
        SELECT postgis_lib_version() INTO libver;
2170
        SELECT postgis_proj_version() INTO projver;
2171
        SELECT postgis_geos_version() INTO geosver;
2172
        SELECT postgis_jts_version() INTO jtsver;
2173
        SELECT postgis_uses_stats() INTO usestats;
2174
        SELECT postgis_scripts_installed() INTO dbproc;
2175
        SELECT postgis_scripts_released() INTO relproc;
2176

2177
        fullver = ''POSTGIS="'' || libver || ''"'';
2178

2179
        IF  geosver IS NOT NULL THEN
2180
                fullver = fullver || '' GEOS="'' || geosver || ''"'';
2181
        END IF;
2182

2183
        IF  jtsver IS NOT NULL THEN
2184
                fullver = fullver || '' JTS="'' || jtsver || ''"'';
2185
        END IF;
2186

2187
        IF  projver IS NOT NULL THEN
2188
                fullver = fullver || '' PROJ="'' || projver || ''"'';
2189
        END IF;
2190

2191
        IF usestats THEN
2192
                fullver = fullver || '' USE_STATS'';
2193
        END IF;
2194

2195
        -- fullver = fullver || '' DBPROC="'' || dbproc || ''"'';
2196
        -- fullver = fullver || '' RELPROC="'' || relproc || ''"'';
2197

2198
        IF dbproc != relproc THEN
2199
                fullver = fullver || '' (procs from '' || dbproc || '' need upgrade)'';
2200
        END IF;
2201

2202
        RETURN fullver;
2203
END
2204
'
2205
LANGUAGE 'plpgsql' IMMUTABLE;
2206

    
2207
---------------------------------------------------------------
2208
-- CASTS
2209
---------------------------------------------------------------
2210

    
2211
CREATE OR REPLACE FUNCTION box2d(geometry)
2212
        RETURNS box2d
2213
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_to_BOX2DFLOAT4'
2214
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2215

    
2216
CREATE OR REPLACE FUNCTION box3d(geometry)
2217
        RETURNS box3d
2218
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_to_BOX3D'
2219
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2220

    
2221
CREATE OR REPLACE FUNCTION box(geometry)
2222
        RETURNS box
2223
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_to_BOX'
2224
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2225

    
2226
CREATE OR REPLACE FUNCTION box2d(box3d)
2227
        RETURNS box2d
2228
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','BOX3D_to_BOX2DFLOAT4'
2229
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2230

    
2231
CREATE OR REPLACE FUNCTION box3d(box2d)
2232
        RETURNS box3d
2233
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','BOX2DFLOAT4_to_BOX3D'
2234
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2235

    
2236
CREATE OR REPLACE FUNCTION box(box3d)
2237
        RETURNS box
2238
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','BOX3D_to_BOX'
2239
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2240

    
2241
CREATE OR REPLACE FUNCTION text(geometry)
2242
        RETURNS text
2243
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_to_text'
2244
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2245

    
2246
-- this is kept for backward-compatibility
2247
CREATE OR REPLACE FUNCTION box3dtobox(box3d)
2248
        RETURNS box
2249
        AS 'SELECT box($1)'
2250
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2251

    
2252
CREATE OR REPLACE FUNCTION geometry(box2d)
2253
        RETURNS geometry
2254
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','BOX2DFLOAT4_to_LWGEOM'
2255
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2256

    
2257
CREATE OR REPLACE FUNCTION geometry(box3d)
2258
        RETURNS geometry
2259
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','BOX3D_to_LWGEOM'
2260
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2261

    
2262
CREATE OR REPLACE FUNCTION geometry(text)
2263
        RETURNS geometry
2264
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','parse_WKT_lwgeom'
2265
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2266

    
2267
CREATE OR REPLACE FUNCTION geometry(chip)
2268
        RETURNS geometry
2269
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','CHIP_to_LWGEOM'
2270
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2271

    
2272
CREATE OR REPLACE FUNCTION geometry(bytea)
2273
        RETURNS geometry
2274
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_from_bytea'
2275
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2276

    
2277
CREATE OR REPLACE FUNCTION bytea(geometry)
2278
        RETURNS bytea
2279
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_to_bytea'
2280
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2281

    
2282
CREATE OR REPLACE FUNCTION text(bool)
2283
        RETURNS text
2284
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','BOOL_to_text'
2285
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2286

    
2287
-- 7.3+ explicit casting definitions
2288
CREATE CAST (geometry AS box2d) WITH FUNCTION box2d(geometry) AS IMPLICIT;
2289
CREATE CAST (geometry AS box3d) WITH FUNCTION box3d(geometry) AS IMPLICIT;
2290
CREATE CAST (geometry AS box) WITH FUNCTION box(geometry) AS IMPLICIT;
2291
CREATE CAST (box3d AS box2d) WITH FUNCTION box2d(box3d) AS IMPLICIT;
2292
CREATE CAST (box2d AS box3d) WITH FUNCTION box3d(box2d) AS IMPLICIT;
2293
CREATE CAST (box2d AS geometry) WITH FUNCTION geometry(box2d) AS IMPLICIT;
2294
CREATE CAST (box3d AS box) WITH FUNCTION box(box3d) AS IMPLICIT;
2295
CREATE CAST (box3d AS geometry) WITH FUNCTION geometry(box3d) AS IMPLICIT;
2296
CREATE CAST (text AS geometry) WITH FUNCTION geometry(text) AS IMPLICIT;
2297
CREATE CAST (geometry AS text) WITH FUNCTION text(geometry) AS IMPLICIT;
2298
CREATE CAST (chip AS geometry) WITH FUNCTION geometry(chip) AS IMPLICIT;
2299
CREATE CAST (bytea AS geometry) WITH FUNCTION geometry(bytea) AS IMPLICIT;
2300
CREATE CAST (geometry AS bytea) WITH FUNCTION bytea(geometry) AS IMPLICIT;
2301
CREATE CAST (bool AS text) WITH FUNCTION text(bool) AS IMPLICIT;
2302

    
2303
---------------------------------------------------------------
2304
-- Algorithms
2305
---------------------------------------------------------------
2306

    
2307
CREATE OR REPLACE FUNCTION simplify(geometry, float8)
2308
   RETURNS geometry
2309
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_simplify2d'
2310
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2311

    
2312
-- SnapToGrid(input, xoff, yoff, xsize, ysize)
2313
CREATE OR REPLACE FUNCTION SnapToGrid(geometry, float8, float8, float8, float8)
2314
   RETURNS geometry
2315
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_snaptogrid'
2316
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2317

    
2318
-- SnapToGrid(input, xsize, ysize) # offsets=0
2319
CREATE OR REPLACE FUNCTION SnapToGrid(geometry, float8, float8)
2320
   RETURNS geometry
2321
   AS 'SELECT SnapToGrid($1, 0, 0, $2, $3)'
2322
   LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2323

    
2324
-- SnapToGrid(input, size) # xsize=ysize=size, offsets=0
2325
CREATE OR REPLACE FUNCTION SnapToGrid(geometry, float8)
2326
   RETURNS geometry
2327
   AS 'SELECT SnapToGrid($1, 0, 0, $2, $2)'
2328
   LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2329

    
2330
-- SnapToGrid(input, point_offsets, xsize, ysize, zsize, msize)
2331
CREATE OR REPLACE FUNCTION SnapToGrid(geometry, geometry, float8, float8, float8, float8)
2332
   RETURNS geometry
2333
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_snaptogrid_pointoff'
2334
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2335

    
2336
CREATE OR REPLACE FUNCTION segmentize(geometry, float8)
2337
        RETURNS geometry
2338
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_segmentize2d'
2339
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2340

    
2341
---------------------------------------------------------------
2342
-- LRS
2343
---------------------------------------------------------------
2344

    
2345
CREATE OR REPLACE FUNCTION line_interpolate_point(geometry, float8)
2346
   RETURNS geometry
2347
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_line_interpolate_point'
2348
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2349

    
2350
CREATE OR REPLACE FUNCTION line_substring(geometry, float8, float8)
2351
   RETURNS geometry
2352
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_line_substring'
2353
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2354

    
2355
CREATE OR REPLACE FUNCTION line_locate_point(geometry, geometry)
2356
   RETURNS float8
2357
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_line_locate_point'
2358
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2359

    
2360
CREATE OR REPLACE FUNCTION locate_between_measures(geometry, float8, float8)
2361
        RETURNS geometry
2362
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_locate_between_m'
2363
        LANGUAGE 'C' IMMUTABLE STRICT;
2364

    
2365
CREATE OR REPLACE FUNCTION locate_along_measure(geometry, float8)
2366
        RETURNS geometry
2367
        AS 'SELECT locate_between_measures($1, $2, $2)'
2368
        LANGUAGE 'sql' IMMUTABLE STRICT;
2369

    
2370
---------------------------------------------------------------
2371
-- GEOS
2372
---------------------------------------------------------------
2373

    
2374
CREATE OR REPLACE FUNCTION intersection(geometry,geometry)
2375
   RETURNS geometry
2376
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','intersection'
2377
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2378

    
2379
CREATE OR REPLACE FUNCTION buffer(geometry,float8)
2380
   RETURNS geometry
2381
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','buffer'
2382
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2383

    
2384
CREATE OR REPLACE FUNCTION buffer(geometry,float8,integer)
2385
   RETURNS geometry
2386
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','buffer'
2387
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2388
   
2389
CREATE OR REPLACE FUNCTION convexhull(geometry)
2390
        RETURNS geometry
2391
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','convexhull'
2392
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2393
  
2394
  
2395
CREATE OR REPLACE FUNCTION difference(geometry,geometry)
2396
        RETURNS geometry
2397
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','difference'
2398
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2399
   
2400
CREATE OR REPLACE FUNCTION boundary(geometry)
2401
        RETURNS geometry
2402
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','boundary'
2403
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2404

    
2405
CREATE OR REPLACE FUNCTION symdifference(geometry,geometry)
2406
        RETURNS geometry
2407
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','symdifference'
2408
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2409

    
2410

    
2411
CREATE OR REPLACE FUNCTION symmetricdifference(geometry,geometry)
2412
        RETURNS geometry
2413
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','symdifference'
2414
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2415

    
2416

    
2417
CREATE OR REPLACE FUNCTION GeomUnion(geometry,geometry)
2418
        RETURNS geometry
2419
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','geomunion'
2420
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2421

    
2422
CREATE AGGREGATE MemGeomUnion (
2423
        basetype = geometry,
2424
        sfunc = geomunion,
2425
        stype = geometry
2426
        );
2427

    
2428
CREATE OR REPLACE FUNCTION unite_garray (geometry[])
2429
        RETURNS geometry
2430
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2431
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable); 
2432

    
2433
CREATE AGGREGATE GeomUnion (
2434
        sfunc = geom_accum,
2435
        basetype = geometry,
2436
        stype = geometry[],
2437
        finalfunc = unite_garray
2438
        );
2439

    
2440

    
2441
CREATE OR REPLACE FUNCTION relate(geometry,geometry)
2442
   RETURNS text
2443
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','relate_full'
2444
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2445

    
2446
CREATE OR REPLACE FUNCTION relate(geometry,geometry,text)
2447
   RETURNS boolean
2448
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','relate_pattern'
2449
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2450

    
2451
CREATE OR REPLACE FUNCTION disjoint(geometry,geometry)
2452
   RETURNS boolean
2453
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2454
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2455

    
2456
CREATE OR REPLACE FUNCTION touches(geometry,geometry)
2457
   RETURNS boolean
2458
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2459
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2460

    
2461
CREATE OR REPLACE FUNCTION intersects(geometry,geometry)
2462
   RETURNS boolean
2463
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2464
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2465

    
2466
CREATE OR REPLACE FUNCTION crosses(geometry,geometry)
2467
   RETURNS boolean
2468
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2469
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2470

    
2471
CREATE OR REPLACE FUNCTION within(geometry,geometry)
2472
   RETURNS boolean
2473
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2474
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2475

    
2476
CREATE OR REPLACE FUNCTION contains(geometry,geometry)
2477
   RETURNS boolean
2478
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2479
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2480

    
2481
CREATE OR REPLACE FUNCTION overlaps(geometry,geometry)
2482
   RETURNS boolean
2483
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2484
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2485

    
2486
CREATE OR REPLACE FUNCTION IsValid(geometry)
2487
   RETURNS boolean
2488
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'isvalid'
2489
   LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2490

    
2491
CREATE OR REPLACE FUNCTION GEOSnoop(geometry)
2492
   RETURNS geometry
2493
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'GEOSnoop'
2494
   LANGUAGE 'C' VOLATILE STRICT; -- WITH (isstrict,iscachable);
2495

    
2496
CREATE OR REPLACE FUNCTION JTSnoop(geometry)
2497
   RETURNS geometry
2498
   AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'JTSnoop'
2499
   LANGUAGE 'C' VOLATILE STRICT; -- WITH (isstrict,iscachable);
2500

    
2501
-- This is also available w/out GEOS 
2502
CREATE OR REPLACE FUNCTION Centroid(geometry)
2503
        RETURNS geometry
2504
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2505
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2506

    
2507
CREATE OR REPLACE FUNCTION IsRing(geometry)
2508
        RETURNS boolean
2509
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2510
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2511

    
2512
CREATE OR REPLACE FUNCTION PointOnSurface(geometry)
2513
        RETURNS geometry
2514
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2515
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2516
        
2517
CREATE OR REPLACE FUNCTION IsSimple(geometry)
2518
        RETURNS boolean
2519
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'issimple'
2520
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2521

    
2522
CREATE OR REPLACE FUNCTION Equals(geometry,geometry)
2523
        RETURNS boolean
2524
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','geomequals'
2525
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2526

    
2527
-----------------------------------------------------------------------
2528
-- SVG OUTPUT
2529
-----------------------------------------------------------------------
2530
CREATE OR REPLACE FUNCTION AsSVG(geometry,int4,int4)
2531
        RETURNS TEXT
2532
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','assvg_geometry'
2533
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2534

    
2535
CREATE OR REPLACE FUNCTION AsSVG(geometry,int4)
2536
        RETURNS TEXT
2537
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','assvg_geometry'
2538
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2539

    
2540
CREATE OR REPLACE FUNCTION AsSVG(geometry)
2541
        RETURNS TEXT
2542
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','assvg_geometry'
2543
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2544

    
2545
-----------------------------------------------------------------------
2546
-- GML OUTPUT
2547
-----------------------------------------------------------------------
2548
-- AsGML(geom, precision, version)
2549
CREATE OR REPLACE FUNCTION AsGML(geometry, int4, int4)
2550
        RETURNS TEXT
2551
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_asGML'
2552
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2553

    
2554
-- AsGML(geom, precision) / version=2
2555
CREATE OR REPLACE FUNCTION AsGML(geometry, int4)
2556
        RETURNS TEXT
2557
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_asGML'
2558
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2559

    
2560
-- AsGML(geom) / precision=15 version=2
2561
CREATE OR REPLACE FUNCTION AsGML(geometry)
2562
        RETURNS TEXT
2563
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_asGML'
2564
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2565

    
2566
------------------------------------------------------------------------
2567
-- OGC defined
2568
------------------------------------------------------------------------
2569

    
2570
CREATE OR REPLACE FUNCTION NumPoints(geometry)
2571
        RETURNS int4
2572
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_numpoints_linestring'
2573
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2574

    
2575
CREATE OR REPLACE FUNCTION NumGeometries(geometry)
2576
        RETURNS int4
2577
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_numgeometries_collection'
2578
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2579

    
2580
CREATE OR REPLACE FUNCTION GeometryN(geometry,integer)
2581
        RETURNS geometry
2582
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_geometryn_collection'
2583
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2584

    
2585
CREATE OR REPLACE FUNCTION Dimension(geometry)
2586
        RETURNS int4
2587
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_dimension'
2588
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2589

    
2590
CREATE OR REPLACE FUNCTION ExterioRring(geometry)
2591
        RETURNS geometry
2592
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_exteriorring_polygon'
2593
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2594

    
2595
CREATE OR REPLACE FUNCTION NumInteriorRings(geometry)
2596
        RETURNS integer
2597
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_numinteriorrings_polygon'
2598
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2599

    
2600
CREATE OR REPLACE FUNCTION NumInteriorRing(geometry)
2601
        RETURNS integer
2602
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_numinteriorrings_polygon'
2603
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2604

    
2605
CREATE OR REPLACE FUNCTION InteriorRingN(geometry,integer)
2606
        RETURNS geometry
2607
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_interiorringn_polygon'
2608
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2609

    
2610
CREATE OR REPLACE FUNCTION GeometryType(geometry)
2611
        RETURNS text
2612
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_getTYPE'
2613
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2614

    
2615
CREATE OR REPLACE FUNCTION PointN(geometry,integer)
2616
        RETURNS geometry
2617
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_pointn_linestring'
2618
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2619

    
2620
CREATE OR REPLACE FUNCTION X(geometry)
2621
        RETURNS float8
2622
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_x_point'
2623
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2624

    
2625
CREATE OR REPLACE FUNCTION Y(geometry)
2626
        RETURNS float8
2627
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_y_point'
2628
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2629

    
2630
CREATE OR REPLACE FUNCTION Z(geometry)
2631
        RETURNS float8
2632
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_z_point'
2633
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2634

    
2635
CREATE OR REPLACE FUNCTION M(geometry)
2636
        RETURNS float8
2637
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_m_point'
2638
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2639

    
2640
CREATE OR REPLACE FUNCTION StartPoint(geometry)
2641
        RETURNS geometry
2642
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_startpoint_linestring'
2643
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2644

    
2645
CREATE OR REPLACE FUNCTION EndPoint(geometry)
2646
        RETURNS geometry
2647
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_endpoint_linestring'
2648
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2649

    
2650
CREATE OR REPLACE FUNCTION IsClosed(geometry)
2651
        RETURNS boolean
2652
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_isclosed_linestring'
2653
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2654

    
2655
CREATE OR REPLACE FUNCTION IsEmpty(geometry)
2656
        RETURNS boolean
2657
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'LWGEOM_isempty'
2658
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict);
2659

    
2660
CREATE OR REPLACE FUNCTION SRID(geometry) 
2661
        RETURNS int4
2662
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_getSRID'
2663
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2664
        
2665
CREATE OR REPLACE FUNCTION SetSRID(geometry,int4) 
2666
        RETURNS geometry
2667
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_setSRID'
2668
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);        
2669
        
2670
CREATE OR REPLACE FUNCTION AsBinary(geometry)
2671
        RETURNS bytea
2672
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_asBinary'
2673
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2674

    
2675
CREATE OR REPLACE FUNCTION AsBinary(geometry,text)
2676
        RETURNS bytea
2677
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_asBinary'
2678
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2679

    
2680
CREATE OR REPLACE FUNCTION AsText(geometry)
2681
        RETURNS TEXT
2682
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_asText'
2683
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2684

    
2685
CREATE OR REPLACE FUNCTION GeometryFromText(text)
2686
        RETURNS geometry
2687
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_from_text'
2688
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2689

    
2690
CREATE OR REPLACE FUNCTION GeometryFromText(text, int4)
2691
        RETURNS geometry
2692
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_from_text'
2693
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2694

    
2695
CREATE OR REPLACE FUNCTION GeomFromText(text)
2696
        RETURNS geometry AS 'SELECT geometryfromtext($1)'
2697
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2698

    
2699
CREATE OR REPLACE FUNCTION GeomFromText(text, int4)
2700
        RETURNS geometry AS 'SELECT geometryfromtext($1, $2)'
2701
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2702

    
2703
CREATE OR REPLACE FUNCTION PointFromText(text)
2704
        RETURNS geometry
2705
        AS '
2706
        SELECT CASE WHEN geometrytype(GeomFromText($1)) = ''POINT''
2707
        THEN GeomFromText($1)
2708
        ELSE NULL END
2709
        '
2710
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2711

    
2712
CREATE OR REPLACE FUNCTION PointFromText(text, int4)
2713
        RETURNS geometry
2714
        AS '
2715
        SELECT CASE WHEN geometrytype(GeomFromText($1, $2)) = ''POINT''
2716
        THEN GeomFromText($1,$2)
2717
        ELSE NULL END
2718
        '
2719
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2720

    
2721
CREATE OR REPLACE FUNCTION LineFromText(text)
2722
        RETURNS geometry
2723
        AS '
2724
        SELECT CASE WHEN geometrytype(GeomFromText($1)) = ''LINESTRING''
2725
        THEN GeomFromText($1)
2726
        ELSE NULL END
2727
        '
2728
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2729

    
2730
CREATE OR REPLACE FUNCTION LineFromText(text, int4)
2731
        RETURNS geometry
2732
        AS '
2733
        SELECT CASE WHEN geometrytype(GeomFromText($1, $2)) = ''LINESTRING''
2734
        THEN GeomFromText($1,$2)
2735
        ELSE NULL END
2736
        '
2737
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2738

    
2739
CREATE OR REPLACE FUNCTION LineStringFromText(text)
2740
        RETURNS geometry
2741
        AS 'SELECT LineFromText($1)'
2742
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2743

    
2744
CREATE OR REPLACE FUNCTION LineStringFromText(text, int4)
2745
        RETURNS geometry
2746
        AS 'SELECT LineFromText($1, $2)'
2747
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2748

    
2749
CREATE OR REPLACE FUNCTION PolyFromText(text)
2750
        RETURNS geometry
2751
        AS '
2752
        SELECT CASE WHEN geometrytype(GeomFromText($1)) = ''POLYGON''
2753
        THEN GeomFromText($1)
2754
        ELSE NULL END
2755
        '
2756
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2757

    
2758
CREATE OR REPLACE FUNCTION PolyFromText(text, int4)
2759
        RETURNS geometry
2760
        AS '
2761
        SELECT CASE WHEN geometrytype(GeomFromText($1, $2)) = ''POLYGON''
2762
        THEN GeomFromText($1,$2)
2763
        ELSE NULL END
2764
        '
2765
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2766

    
2767
CREATE OR REPLACE FUNCTION PolygonFromText(text, int4)
2768
        RETURNS geometry
2769
        AS 'SELECT PolyFromText($1, $2)'
2770
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2771

    
2772
CREATE OR REPLACE FUNCTION PolygonFromText(text)
2773
        RETURNS geometry
2774
        AS 'SELECT PolyFromText($1)'
2775
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2776

    
2777
CREATE OR REPLACE FUNCTION MLineFromText(text, int4)
2778
        RETURNS geometry
2779
        AS '
2780
        SELECT CASE
2781
        WHEN geometrytype(GeomFromText($1, $2)) = ''MULTILINESTRING''
2782
        THEN GeomFromText($1,$2)
2783
        ELSE NULL END
2784
        '
2785
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2786

    
2787
CREATE OR REPLACE FUNCTION MLineFromText(text)
2788
        RETURNS geometry
2789
        AS '
2790
        SELECT CASE WHEN geometrytype(GeomFromText($1)) = ''MULTILINESTRING''
2791
        THEN GeomFromText($1)
2792
        ELSE NULL END
2793
        '
2794
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2795

    
2796
CREATE OR REPLACE FUNCTION MultiLineStringFromText(text)
2797
        RETURNS geometry
2798
        AS 'SELECT MLineFromText($1)'
2799
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2800

    
2801
CREATE OR REPLACE FUNCTION MultiLineStringFromText(text, int4)
2802
        RETURNS geometry
2803
        AS 'SELECT MLineFromText($1, $2)'
2804
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2805

    
2806
CREATE OR REPLACE FUNCTION MPointFromText(text, int4)
2807
        RETURNS geometry
2808
        AS '
2809
        SELECT CASE WHEN geometrytype(GeomFromText($1,$2)) = ''MULTIPOINT''
2810
        THEN GeomFromText($1,$2)
2811
        ELSE NULL END
2812
        '
2813
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2814

    
2815
CREATE OR REPLACE FUNCTION MPointFromText(text)
2816
        RETURNS geometry
2817
        AS '
2818
        SELECT CASE WHEN geometrytype(GeomFromText($1)) = ''MULTIPOINT''
2819
        THEN GeomFromText($1)
2820
        ELSE NULL END
2821
        '
2822
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2823

    
2824
CREATE OR REPLACE FUNCTION MultiPointFromText(text, int4)
2825
        RETURNS geometry
2826
        AS 'SELECT MPointFromText($1, $2)'
2827
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2828

    
2829
CREATE OR REPLACE FUNCTION MultiPointFromText(text)
2830
        RETURNS geometry
2831
        AS 'SELECT MPointFromText($1)'
2832
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2833

    
2834
CREATE OR REPLACE FUNCTION MPolyFromText(text, int4)
2835
        RETURNS geometry
2836
        AS '
2837
        SELECT CASE WHEN geometrytype(GeomFromText($1, $2)) = ''MULTIPOLYGON''
2838
        THEN GeomFromText($1,$2)
2839
        ELSE NULL END
2840
        '
2841
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2842

    
2843
CREATE OR REPLACE FUNCTION MPolyFromText(text)
2844
        RETURNS geometry
2845
        AS '
2846
        SELECT CASE WHEN geometrytype(GeomFromText($1)) = ''MULTIPOLYGON''
2847
        THEN GeomFromText($1)
2848
        ELSE NULL END
2849
        '
2850
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2851

    
2852
CREATE OR REPLACE FUNCTION MultiPolygonFromText(text, int4)
2853
        RETURNS geometry
2854
        AS 'SELECT MPolyFromText($1, $2)'
2855
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2856

    
2857
CREATE OR REPLACE FUNCTION MultiPolygonFromText(text)
2858
        RETURNS geometry
2859
        AS 'SELECT MPolyFromText($1)'
2860
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2861

    
2862
CREATE OR REPLACE FUNCTION GeomCollFromText(text, int4)
2863
        RETURNS geometry
2864
        AS '
2865
        SELECT CASE
2866
        WHEN geometrytype(GeomFromText($1, $2)) = ''GEOMETRYCOLLECTION''
2867
        THEN GeomFromText($1,$2)
2868
        ELSE NULL END
2869
        '
2870
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2871

    
2872
CREATE OR REPLACE FUNCTION GeomCollFromText(text)
2873
        RETURNS geometry
2874
        AS '
2875
        SELECT CASE
2876
        WHEN geometrytype(GeomFromText($1)) = ''GEOMETRYCOLLECTION''
2877
        THEN GeomFromText($1)
2878
        ELSE NULL END
2879
        '
2880
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2881

    
2882
CREATE OR REPLACE FUNCTION GeomFromWKB(bytea)
2883
        RETURNS geometry
2884
        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1','LWGEOM_from_WKB'
2885
        LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2886

    
2887
CREATE OR REPLACE FUNCTION GeomFromWKB(bytea, int)
2888
        RETURNS geometry
2889
        AS 'SELECT setSRID(GeomFromWKB($1), $2)'
2890
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2891

    
2892
CREATE OR REPLACE FUNCTION PointFromWKB(bytea, int)
2893
        RETURNS geometry
2894
        AS '
2895
        SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''POINT''
2896
        THEN GeomFromWKB($1, $2)
2897
        ELSE NULL END
2898
        '
2899
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2900

    
2901
CREATE OR REPLACE FUNCTION PointFromWKB(bytea)
2902
        RETURNS geometry
2903
        AS '
2904
        SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''POINT''
2905
        THEN GeomFromWKB($1)
2906
        ELSE NULL END
2907
        '
2908
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2909

    
2910
CREATE OR REPLACE FUNCTION LineFromWKB(bytea, int)
2911
        RETURNS geometry
2912
        AS '
2913
        SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''LINESTRING''
2914
        THEN GeomFromWKB($1, $2)
2915
        ELSE NULL END
2916
        '
2917
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2918

    
2919
CREATE OR REPLACE FUNCTION LineFromWKB(bytea)
2920
        RETURNS geometry
2921
        AS '
2922
        SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''LINESTRING''
2923
        THEN GeomFromWKB($1)
2924
        ELSE NULL END
2925
        '
2926
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2927

    
2928
CREATE OR REPLACE FUNCTION LinestringFromWKB(bytea, int)
2929
        RETURNS geometry
2930
        AS '
2931
        SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''LINESTRING''
2932
        THEN GeomFromWKB($1, $2)
2933
        ELSE NULL END
2934
        '
2935
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2936

    
2937
CREATE OR REPLACE FUNCTION LinestringFromWKB(bytea)
2938
        RETURNS geometry
2939
        AS '
2940
        SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''LINESTRING''
2941
        THEN GeomFromWKB($1)
2942
        ELSE NULL END
2943
        '
2944
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2945

    
2946
CREATE OR REPLACE FUNCTION PolyFromWKB(bytea, int)
2947
        RETURNS geometry
2948
        AS '
2949
        SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''POLYGON''
2950
        THEN GeomFromWKB($1, $2)
2951
        ELSE NULL END
2952
        '
2953
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2954

    
2955
CREATE OR REPLACE FUNCTION PolyFromWKB(bytea)
2956
        RETURNS geometry
2957
        AS '
2958
        SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''POLYGON''
2959
        THEN GeomFromWKB($1)
2960
        ELSE NULL END
2961
        '
2962
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2963

    
2964
CREATE OR REPLACE FUNCTION PolygonFromWKB(bytea, int)
2965
        RETURNS geometry
2966
        AS '
2967
        SELECT CASE WHEN geometrytype(GeomFromWKB($1,$2)) = ''POLYGON''
2968
        THEN GeomFromWKB($1, $2)
2969
        ELSE NULL END
2970
        '
2971
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2972

    
2973
CREATE OR REPLACE FUNCTION PolygonFromWKB(bytea)
2974
        RETURNS geometry
2975
        AS '
2976
        SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''POLYGON''
2977
        THEN GeomFromWKB($1)
2978
        ELSE NULL END
2979
        '
2980
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2981

    
2982
CREATE OR REPLACE FUNCTION MPointFromWKB(bytea, int)
2983
        RETURNS geometry
2984
        AS '
2985
        SELECT CASE WHEN geometrytype(GeomFromWKB($1,$2)) = ''MULTIPOINT''
2986
        THEN GeomFromWKB($1, $2)
2987
        ELSE NULL END
2988
        '
2989
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2990

    
2991
CREATE OR REPLACE FUNCTION MPointFromWKB(bytea)
2992
        RETURNS geometry
2993
        AS '
2994
        SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''MULTIPOINT''
2995
        THEN GeomFromWKB($1)
2996
        ELSE NULL END
2997
        '
2998
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2999

    
3000
CREATE OR REPLACE FUNCTION MultiPointFromWKB(bytea, int)
3001
        RETURNS geometry
3002
        AS '
3003
        SELECT CASE WHEN geometrytype(GeomFromWKB($1,$2)) = ''MULTIPOINT''
3004
        THEN GeomFromWKB($1, $2)
3005
        ELSE NULL END
3006
        '
3007
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
3008

    
3009
CREATE OR REPLACE FUNCTION MultiPointFromWKB(bytea)
3010
        RETURNS geometry
3011
        AS '
3012
        SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''MULTIPOINT''
3013
        THEN GeomFromWKB($1)
3014
        ELSE NULL END
3015
        '
3016
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
3017

    
3018
CREATE OR REPLACE FUNCTION MultiLineFromWKB(bytea, int)
3019
        RETURNS geometry
3020
        AS '
3021
        SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''MULTILINESTRING''
3022
        THEN GeomFromWKB($1, $2)
3023
        ELSE NULL END
3024
        '
3025
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
3026

    
3027
CREATE OR REPLACE FUNCTION MultiLineFromWKB(bytea)
3028
        RETURNS geometry
3029
        AS '
3030
        SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''MULTILINESTRING''
3031
        THEN GeomFromWKB($1)
3032
        ELSE NULL END
3033
        '
3034
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
3035

    
3036
CREATE OR REPLACE FUNCTION MLineFromWKB(bytea, int)
3037
        RETURNS geometry
3038
        AS '
3039
        SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''MULTILINESTRING''
3040
        THEN GeomFromWKB($1, $2)
3041
        ELSE NULL END
3042
        '
3043
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
3044

    
3045
CREATE OR REPLACE FUNCTION MLineFromWKB(bytea)
3046
        RETURNS geometry
3047
        AS '
3048
        SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''MULTILINESTRING''
3049
        THEN GeomFromWKB($1)
3050
        ELSE NULL END
3051
        '
3052
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
3053

    
3054
CREATE OR REPLACE FUNCTION MPolyFromWKB(bytea, int)
3055
        RETURNS geometry
3056
        AS '
3057
        SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''MULTIPOLYGON''
3058
        THEN GeomFromWKB($1, $2)
3059
        ELSE NULL END
3060
        '
3061
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
3062

    
3063
CREATE OR REPLACE FUNCTION MPolyFromWKB(bytea)
3064
        RETURNS geometry
3065
        AS '
3066
        SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''MULTIPOLYGON''
3067
        THEN GeomFromWKB($1)
3068
        ELSE NULL END
3069
        '
3070
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
3071

    
3072
CREATE OR REPLACE FUNCTION MultiPolyFromWKB(bytea, int)
3073
        RETURNS geometry
3074
        AS '
3075
        SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''MULTIPOLYGON''
3076
        THEN GeomFromWKB($1, $2)
3077
        ELSE NULL END
3078
        '
3079
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
3080

    
3081
CREATE OR REPLACE FUNCTION MultiPolyFromWKB(bytea)
3082
        RETURNS geometry
3083
        AS '
3084
        SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''MULTIPOLYGON''
3085
        THEN GeomFromWKB($1)
3086
        ELSE NULL END
3087
        '
3088
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
3089

    
3090
CREATE OR REPLACE FUNCTION GeomCollFromWKB(bytea, int)
3091
        RETURNS geometry
3092
        AS '
3093
        SELECT CASE
3094
        WHEN geometrytype(GeomFromWKB($1, $2)) = ''GEOMETRYCOLLECTION''
3095
        THEN GeomFromWKB($1, $2)
3096
        ELSE NULL END
3097
        '
3098
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
3099

    
3100
CREATE OR REPLACE FUNCTION GeomCollFromWKB(bytea)
3101
        RETURNS geometry
3102
        AS '
3103
        SELECT CASE
3104
        WHEN geometrytype(GeomFromWKB($1)) = ''GEOMETRYCOLLECTION''
3105
        THEN GeomFromWKB($1)
3106
        ELSE NULL END
3107
        '
3108
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
3109

    
3110
--
3111
-- SFSQL 1.1
3112
--
3113
-- BdPolyFromText(multiLineStringTaggedText String, SRID Integer): Polygon
3114
--
3115
--  Construct a Polygon given an arbitrary
3116
--  collection of closed linestrings as a
3117
--  MultiLineString text representation.
3118
--
3119
-- This is a PLPGSQL function rather then an SQL function
3120
-- To avoid double call of BuildArea (one to get GeometryType
3121
-- and another to actual return, in a CASE WHEN construct).
3122
-- Also, we profit from plpgsql to RAISE exceptions.
3123
--
3124
CREATE OR REPLACE FUNCTION BdPolyFromText(text, integer)
3125
RETURNS geometry
3126
AS '
3127
DECLARE
3128
        geomtext alias for $1;
3129
        srid alias for $2;
3130
        mline geometry;
3131
        geom geometry;
3132
BEGIN
3133
        mline := MultiLineStringFromText(geomtext, srid);
3134

3135
        IF mline IS NULL
3136
        THEN
3137
                RAISE EXCEPTION ''Input is not a MultiLinestring'';
3138
        END IF;
3139

3140
        geom := BuildArea(mline);
3141

3142
        IF GeometryType(geom) != ''POLYGON''
3143
        THEN
3144
                RAISE EXCEPTION ''Input returns more then a single polygon, try using BdMPolyFromText instead'';
3145
        END IF;
3146

3147
        RETURN geom;
3148
END;
3149
'
3150
LANGUAGE 'plpgsql' IMMUTABLE STRICT; 
3151

    
3152
--
3153
-- SFSQL 1.1
3154
--
3155
-- BdMPolyFromText(multiLineStringTaggedText String, SRID Integer): MultiPolygon
3156
--
3157
--  Construct a MultiPolygon given an arbitrary
3158
--  collection of closed linestrings as a
3159
--  MultiLineString text representation.
3160
--
3161
-- This is a PLPGSQL function rather then an SQL function
3162
-- To raise an exception in case of invalid input.
3163
--
3164
CREATE OR REPLACE FUNCTION BdMPolyFromText(text, integer)
3165
RETURNS geometry
3166
AS '
3167
DECLARE
3168
        geomtext alias for $1;
3169
        srid alias for $2;
3170
        mline geometry;
3171
        geom geometry;
3172
BEGIN
3173
        mline := MultiLineStringFromText(geomtext, srid);
3174

3175
        IF mline IS NULL
3176
        THEN
3177
                RAISE EXCEPTION ''Input is not a MultiLinestring'';
3178
        END IF;
3179

3180
        geom := multi(BuildArea(mline));
3181

3182
        RETURN geom;
3183
END;
3184
'
3185
LANGUAGE 'plpgsql' IMMUTABLE STRICT; 
3186

    
3187
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3188
-- 
3189
-- $Id: lwpostgis.sql 13570 2007-09-06 15:40:28Z jvhigon $
3190
--
3191
-- PostGIS - Spatial Types for PostgreSQL
3192
-- http://postgis.refractions.net
3193
-- Copyright 2001-2003 Refractions Research Inc.
3194
--
3195
-- This is free software; you can redistribute and/or modify it under
3196
-- the terms of the GNU General Public Licence. See the COPYING file.
3197
--  
3198
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3199

    
3200

    
3201

    
3202

    
3203

    
3204
-----------------------------------------------------------------------
3205
-- LONG TERM LOCKING
3206
-----------------------------------------------------------------------
3207

    
3208
-- UnlockRows(authid)
3209
-- removes all locks held by the given auth
3210
-- returns the number of locks released
3211
CREATE OR REPLACE FUNCTION UnlockRows(text)
3212
        RETURNS int
3213
        AS '
3214
DECLARE
3215
        ret int;
3216
BEGIN
3217

3218
        IF NOT LongTransactionsEnabled() THEN
3219
                RAISE EXCEPTION ''Long transaction support disabled, use EnableLongTransaction() to enable.'';
3220
        END IF;
3221

3222
        EXECUTE ''DELETE FROM authorization_table where authid = '' ||
3223
                quote_literal($1);
3224

3225
        GET DIAGNOSTICS ret = ROW_COUNT;
3226

3227
        RETURN ret;
3228
END;
3229
'
3230
LANGUAGE 'plpgsql' VOLATILE STRICT;
3231

    
3232
-- LockRow([schema], table, rowid, auth, [expires]) 
3233
-- Returns 1 if successfully obtained the lock, 0 otherwise
3234
CREATE OR REPLACE FUNCTION LockRow(text, text, text, text, timestamp)
3235
        RETURNS int
3236
        AS '
3237
DECLARE
3238
        myschema alias for $1;
3239
        mytable alias for $2;
3240
        myrid   alias for $3;
3241
        authid alias for $4;
3242
        expires alias for $5;
3243
        ret int;
3244
        mytoid oid;
3245
        myrec RECORD;
3246
        
3247
BEGIN
3248

3249
        IF NOT LongTransactionsEnabled() THEN
3250
                RAISE EXCEPTION ''Long transaction support disabled, use EnableLongTransaction() to enable.'';
3251
        END IF;
3252

3253
        EXECUTE ''DELETE FROM authorization_table WHERE expires < now()''; 
3254

3255
        SELECT c.oid INTO mytoid FROM pg_class c, pg_namespace n
3256
                WHERE c.relname = mytable
3257
                AND c.relnamespace = n.oid
3258
                AND n.nspname = myschema;
3259

3260
        -- RAISE NOTICE ''toid: %'', mytoid;
3261

3262
        FOR myrec IN SELECT * FROM authorization_table WHERE 
3263
                toid = mytoid AND rid = myrid
3264
        LOOP
3265
                IF myrec.authid != authid THEN
3266
                        RETURN 0;
3267
                ELSE
3268
                        RETURN 1;
3269
                END IF;
3270
        END LOOP;
3271

3272
        EXECUTE ''INSERT INTO authorization_table VALUES (''||
3273
                quote_literal(mytoid)||'',''||quote_literal(myrid)||
3274
                '',''||quote_literal(expires)||
3275
                '',''||quote_literal(authid) ||'')'';
3276

3277
        GET DIAGNOSTICS ret = ROW_COUNT;
3278

3279
        RETURN ret;
3280
END;'
3281
LANGUAGE 'plpgsql' VOLATILE STRICT;
3282

    
3283
-- LockRow(schema, table, rid, authid);
3284
CREATE OR REPLACE FUNCTION LockRow(text, text, text, text)
3285
        RETURNS int
3286
        AS
3287
'SELECT LockRow($1, $2, $3, $4, now()::timestamp+''1:00'');'
3288
        LANGUAGE 'sql' VOLATILE STRICT;
3289

    
3290
-- LockRow(table, rid, authid);
3291
CREATE OR REPLACE FUNCTION LockRow(text, text, text)
3292
        RETURNS int
3293
        AS
3294
'SELECT LockRow(current_schema(), $1, $2, $3, now()::timestamp+''1:00'');'
3295
        LANGUAGE 'sql' VOLATILE STRICT;
3296

    
3297
-- LockRow(schema, table, rid, expires);
3298
CREATE OR REPLACE FUNCTION LockRow(text, text, text, timestamp)
3299
        RETURNS int
3300
        AS
3301
'SELECT LockRow(current_schema(), $1, $2, $3, $4);'
3302
        LANGUAGE 'sql' VOLATILE STRICT;
3303

    
3304

    
3305
CREATE OR REPLACE FUNCTION AddAuth(text)
3306
        RETURNS BOOLEAN
3307
        AS '
3308
DECLARE
3309
        lockid alias for $1;
3310
        okay boolean;
3311
        myrec record;
3312
BEGIN
3313
        -- check to see if table exists
3314
        --  if not, CREATE TEMP TABLE mylock (transid xid, lockcode text)
3315
        okay := ''f'';
3316
        FOR myrec IN SELECT * FROM pg_class WHERE relname = ''temp_lock_have_table'' LOOP
3317
                okay := ''t'';
3318
        END LOOP; 
3319
        IF (okay <> ''t'') THEN 
3320
                CREATE TEMP TABLE temp_lock_have_table (transid xid, lockcode text);
3321
                        -- this will only work from pgsql7.4 up
3322
                        -- ON COMMIT DELETE ROWS;
3323
        END IF;
3324

3325
        --  INSERT INTO mylock VALUES ( $1)
3326
--        EXECUTE ''INSERT INTO temp_lock_have_table VALUES ( ''||
3327
--                quote_literal(getTransactionID()) || '','' ||
3328
--                quote_literal(lockid) ||'')'';
3329

3330
        INSERT INTO temp_lock_have_table VALUES (getTransactionID(), lockid);
3331

3332
        RETURN true::boolean;
3333
END;
3334
'
3335
LANGUAGE PLPGSQL;
3336
 
3337

    
3338
-- CheckAuth( <schema>, <table>, <ridcolumn> )
3339
--
3340
-- Returns 0
3341
--
3342
CREATE OR REPLACE FUNCTION CheckAuth(text, text, text)
3343
        RETURNS INT
3344
        AS '
3345
DECLARE
3346
        schema text;
3347
BEGIN
3348
        IF NOT LongTransactionsEnabled() THEN
3349
                RAISE EXCEPTION ''Long transaction support disabled, use EnableLongTransaction() to enable.'';
3350
        END IF;
3351

3352
        if ( $1 != '''' ) THEN
3353
                schema = $1;
3354
        ELSE
3355
                SELECT current_schema() into schema;
3356
        END IF;
3357

3358
        -- TODO: check for an already existing trigger ?
3359

3360
        EXECUTE ''CREATE TRIGGER check_auth BEFORE UPDATE OR DELETE ON '' 
3361
                || quote_ident(schema) || ''.'' || quote_ident($2)
3362
                ||'' FOR EACH ROW EXECUTE PROCEDURE CheckAuthTrigger(''
3363
                || quote_literal($3) || '')'';
3364

3365
        RETURN 0;
3366
END;
3367
'
3368
LANGUAGE 'plpgsql';
3369

    
3370
-- CheckAuth(<table>, <ridcolumn>)
3371
CREATE OR REPLACE FUNCTION CheckAuth(text, text)
3372
        RETURNS INT
3373
        AS
3374
        'SELECT CheckAuth('''', $1, $2)'
3375
        LANGUAGE 'SQL';
3376

    
3377
CREATE OR REPLACE FUNCTION CheckAuthTrigger()
3378
        RETURNS trigger AS 
3379
        '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'check_authorization'
3380
        LANGUAGE C;
3381

    
3382
CREATE OR REPLACE FUNCTION GetTransactionID()
3383
        RETURNS xid AS 
3384
        '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1', 'getTransactionID'
3385
        LANGUAGE C;
3386

    
3387

    
3388
--
3389
-- Enable Long transactions support
3390
--
3391
--  Creates the authorization_table if not already existing
3392
--
3393
CREATE OR REPLACE FUNCTION EnableLongTransactions()
3394
        RETURNS TEXT
3395
        AS '
3396
DECLARE
3397
        query text;
3398
        exists bool;
3399
        rec RECORD;
3400

3401
BEGIN
3402

3403
        exists = ''f'';
3404
        FOR rec IN SELECT * FROM pg_class WHERE relname = ''authorization_table''
3405
        LOOP
3406
                exists = ''t'';
3407
        END LOOP;
3408

3409
        IF NOT exists
3410
        THEN
3411
                query = ''CREATE TABLE authorization_table (
3412
                        toid oid, -- table oid
3413
                        rid text, -- row id
3414
                        expires timestamp,
3415
                        authid text
3416
                )'';
3417
                EXECUTE query;
3418
        END IF;
3419

3420
        exists = ''f'';
3421
        FOR rec IN SELECT * FROM pg_class WHERE relname = ''authorized_tables''
3422
        LOOP
3423
                exists = ''t'';
3424
        END LOOP;
3425

3426
        IF NOT exists THEN
3427
                query = ''CREATE VIEW authorized_tables AS '' ||
3428
                        ''SELECT '' ||
3429
                        ''n.nspname as schema, '' ||
3430
                        ''c.relname as table, trim('' ||
3431
                        quote_literal(chr(92) || ''000'') ||
3432
                        '' from t.tgargs) as id_column '' ||
3433
                        ''FROM pg_trigger t, pg_class c, pg_proc p '' ||
3434
                        '', pg_namespace n '' ||
3435
                        ''WHERE p.proname = '' || quote_literal(''checkauthtrigger'') ||
3436
                        '' AND c.relnamespace = n.oid'' ||
3437
                        '' AND t.tgfoid = p.oid and t.tgrelid = c.oid'';
3438
                EXECUTE query;
3439
        END IF;
3440

3441
        RETURN ''Long transactions support enabled'';
3442
END;
3443
'
3444
LANGUAGE 'plpgsql';
3445

    
3446
--
3447
-- Check if Long transactions support is enabled
3448
--
3449
CREATE OR REPLACE FUNCTION LongTransactionsEnabled()
3450
        RETURNS bool
3451
AS '
3452
DECLARE
3453
        rec RECORD;
3454
BEGIN
3455
        FOR rec IN SELECT oid FROM pg_class WHERE relname = ''authorized_tables''
3456
        LOOP
3457
                return ''t'';
3458
        END LOOP;
3459
        return ''f'';
3460
END;
3461
'
3462
LANGUAGE 'plpgsql';
3463

    
3464
--
3465
-- Disable Long transactions support
3466
--
3467
--  (1) Drop any long_xact trigger 
3468
--  (2) Drop the authorization_table
3469
--  (3) KEEP the authorized_tables view
3470
--
3471
CREATE OR REPLACE FUNCTION DisableLongTransactions()
3472
        RETURNS TEXT
3473
        AS '
3474
DECLARE
3475
        query text;
3476
        exists bool;
3477
        rec RECORD;
3478

3479
BEGIN
3480

3481
        --
3482
        -- Drop all triggers applied by CheckAuth()
3483
        --
3484
        FOR rec IN
3485
                SELECT c.relname, t.tgname, t.tgargs FROM pg_trigger t, pg_class c, pg_proc p
3486
                WHERE p.proname = ''checkauthtrigger'' and t.tgfoid = p.oid and t.tgrelid = c.oid
3487
        LOOP
3488
                EXECUTE ''DROP TRIGGER '' || quote_ident(rec.tgname) ||
3489
                        '' ON '' || quote_ident(rec.relname);
3490
        END LOOP;
3491

3492
        --
3493
        -- Drop the authorization_table table
3494
        --
3495
        FOR rec IN SELECT * FROM pg_class WHERE relname = ''authorization_table'' LOOP
3496
                DROP TABLE authorization_table;
3497
        END LOOP;
3498

3499
        --
3500
        -- Drop the authorized_tables view
3501
        --
3502
        FOR rec IN SELECT * FROM pg_class WHERE relname = ''authorized_tables'' LOOP
3503
                DROP VIEW authorized_tables;
3504
        END LOOP;
3505

3506
        RETURN ''Long transactions support disabled'';
3507
END;
3508
'
3509
LANGUAGE 'plpgsql';
3510

    
3511
---------------------------------------------------------------
3512
-- END
3513
---------------------------------------------------------------
3514

    
3515

    
3516
---------------------------------------------------------------
3517
-- END
3518
---------------------------------------------------------------
3519

    
3520
COMMIT;
3521

    
3522