source: subversion/applications/rendering/mapnik/lwpostgis.sql @ 4083

Last change on this file since 4083 was 1620, checked in by steve, 14 years ago

add sql

File size: 113.3 KB
Line 
1
2
3-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4--
5-- $Id: lwpostgis.sql.in 2406 2006-07-07 13:56:52Z strk $
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
29BEGIN;
30
31-------------------------------------------------------------------
32--  HISTOGRAM2D TYPE (lwhistogram2d)
33-------------------------------------------------------------------
34
35
36CREATE 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
41CREATE 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
46CREATE 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
59CREATE 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
64CREATE 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
69CREATE 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
81CREATE 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
86CREATE 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
91CREATE 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
96CREATE 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
101CREATE 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
107CREATE 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
123CREATE 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
129CREATE 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
135CREATE 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
141CREATE 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
147CREATE 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
153CREATE 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
158CREATE 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
163CREATE 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
169CREATE 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
175CREATE 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
181CREATE 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
188CREATE 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
200CREATE 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
205CREATE 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
210CREATE TYPE box3d (
211        alignment = double,
212        internallength = 48,
213        input = box3d_in,
214        output = box3d_out
215);
216
217CREATE 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
222CREATE 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
227CREATE 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
232CREATE 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
237CREATE 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
242CREATE 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
252CREATE 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
257CREATE 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
262CREATE 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
276CREATE 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
281CREATE 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
286CREATE TYPE box2d (
287        internallength = 16,
288        input = box2d_in,
289        output = box2d_out,
290        storage = plain
291);
292
293---- BOX2D  support functions
294
295
296CREATE 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
301CREATE 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
306CREATE 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
311CREATE 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
316CREATE 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
321CREATE 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
326CREATE 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
331CREATE 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
336CREATE 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
347CREATE 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
352CREATE 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
357CREATE 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
362CREATE 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
367CREATE 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
372CREATE 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
381CREATE OPERATOR < (
382   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_lt,
383   COMMUTATOR = '>', NEGATOR = '>=',
384   RESTRICT = contsel, JOIN = contjoinsel
385);
386
387CREATE OPERATOR <= (
388   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_le,
389   COMMUTATOR = '>=', NEGATOR = '>',
390   RESTRICT = contsel, JOIN = contjoinsel
391);
392
393CREATE 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
399CREATE OPERATOR >= (
400   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_ge,
401   COMMUTATOR = '<=', NEGATOR = '<',
402   RESTRICT = contsel, JOIN = contjoinsel
403);
404CREATE OPERATOR > (
405   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_gt,
406   COMMUTATOR = '<', NEGATOR = '<=',
407   RESTRICT = contsel, JOIN = contjoinsel
408);
409
410
411CREATE 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-------------------------------------------------------------------
425CREATE 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
430CREATE 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
435CREATE 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
440CREATE 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
445CREATE 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
450CREATE 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
455CREATE 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
460CREATE 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
465CREATE 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
470CREATE 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
475CREATE 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
480CREATE 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
485CREATE 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
490CREATE 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
497CREATE OPERATOR << (
498   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_left,
499   COMMUTATOR = '>>',
500   RESTRICT = positionsel, JOIN = positionjoinsel
501);
502
503CREATE OPERATOR &< (
504   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overleft,
505   COMMUTATOR = '&>',
506   RESTRICT = positionsel, JOIN = positionjoinsel
507);
508
509CREATE OPERATOR <<| (
510   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_below,
511   COMMUTATOR = '|>>',
512   RESTRICT = positionsel, JOIN = positionjoinsel
513);
514
515CREATE OPERATOR &<| (
516   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overbelow,
517   COMMUTATOR = '|&>',
518   RESTRICT = positionsel, JOIN = positionjoinsel
519);
520
521CREATE OPERATOR && (
522   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overlap,
523   COMMUTATOR = '&&',
524   RESTRICT = postgis_gist_sel, JOIN = postgis_gist_joinsel
525);
526
527CREATE OPERATOR &> (
528   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overright,
529   COMMUTATOR = '&<',
530   RESTRICT = positionsel, JOIN = positionjoinsel
531);
532
533CREATE OPERATOR >> (
534   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_right,
535   COMMUTATOR = '<<',
536   RESTRICT = positionsel, JOIN = positionjoinsel
537);
538
539CREATE OPERATOR |&> (
540   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overabove,
541   COMMUTATOR = '&<|',
542   RESTRICT = positionsel, JOIN = positionjoinsel
543);
544
545CREATE OPERATOR |>> (
546   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_above,
547   COMMUTATOR = '<<|',
548   RESTRICT = positionsel, JOIN = positionjoinsel
549);
550
551CREATE OPERATOR ~= (
552   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_same,
553   COMMUTATOR = '~=', 
554   RESTRICT = eqsel, JOIN = eqjoinsel
555);
556
557CREATE OPERATOR @ (
558   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_contained,
559   COMMUTATOR = '~',
560   RESTRICT = contsel, JOIN = contjoinsel
561);
562
563CREATE OPERATOR ~ (
564   LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_contain,
565   COMMUTATOR = '@',
566   RESTRICT = contsel, JOIN = contjoinsel
567);
568
569-- gist support functions
570
571
572CREATE 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
577CREATE 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
582CREATE 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
587CREATE 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
592CREATE 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
597CREATE 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
602CREATE 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
616CREATE 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
638UPDATE 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
654CREATE 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
659CREATE 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       
665CREATE 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
670CREATE 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
679CREATE 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
684CREATE 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
689CREATE 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
694CREATE 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
699CREATE 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
704CREATE 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
709CREATE 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
714CREATE 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
723CREATE 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
728CREATE 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
733CREATE 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
738CREATE 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
749CREATE 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
754CREATE 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
759CREATE 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
766CREATE 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
771CREATE 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
776CREATE 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
783CREATE 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
788CREATE 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
793CREATE 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'...
800CREATE 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
805CREATE 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
810CREATE 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
815CREATE 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.
821CREATE 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.
827CREATE 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
832CREATE 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
837CREATE 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
847CREATE 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
852CREATE 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
858CREATE 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
863CREATE 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
868CREATE 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
873CREATE 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
878CREATE 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
883CREATE 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
888CREATE 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
893CREATE AGGREGATE memcollect(
894        sfunc = collect,
895        basetype = geometry,
896        stype = geometry
897        );
898
899CREATE 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
904CREATE AGGREGATE accum (
905        sfunc = geom_accum,
906        basetype = geometry,
907        stype = geometry[]
908        );
909
910CREATE 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
915CREATE AGGREGATE collect (
916        sfunc = geom_accum,
917        basetype = geometry,
918        stype = geometry[],
919        finalfunc = collect_garray
920        );
921
922CREATE 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
927CREATE 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
932CREATE 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
937CREATE 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
942CREATE 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
947CREATE 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
952CREATE 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
957CREATE 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
962CREATE 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
967CREATE 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
972CREATE 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
977CREATE 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
982CREATE 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
987CREATE 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
992CREATE 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
997CREATE 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
1002CREATE 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
1007CREATE 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
1016CREATE 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
1021CREATE 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
1026CREATE 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
1031CREATE 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
1036CREATE 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
1041CREATE 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
1046CREATE 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
1051CREATE 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
1056CREATE 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
1061CREATE 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
1066CREATE 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
1071CREATE 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
1076CREATE 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
1081CREATE AGGREGATE makeline (
1082        sfunc = geom_accum,
1083        basetype = geometry,
1084        stype = geometry[],
1085        finalfunc = makeline_garray
1086        );
1087
1088CREATE 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
1093CREATE 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
1098CREATE 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
1103CREATE 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
1108CREATE 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
1113CREATE AGGREGATE polygonize (
1114        sfunc = geom_accum,
1115        basetype = geometry,
1116        stype = geometry[],
1117        finalfunc = polygonize_garray
1118        );
1119
1120
1121
1122CREATE TYPE geometry_dump AS (path integer[], geom geometry);
1123
1124CREATE 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
1129CREATE 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
1141CREATE 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
1146CREATE AGGREGATE extent(
1147        sfunc = combine_bbox,
1148        basetype = geometry,
1149        stype = box2d
1150        );
1151
1152CREATE 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
1157CREATE 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-----------------------------------------------------------------------
1170CREATE 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-----------------------------------------------------------------------
1178CREATE 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-----------------------------------------------------------------------
1189CREATE OR REPLACE FUNCTION build_histogram2d (histogram2d,text,text,text)
1190RETURNS histogram2d
1191AS '
1192BEGIN
1193        EXECUTE ''SET local search_path = ''||$2||'',public'';
1194        RETURN public.build_histogram2d($1,$3,$4);
1195END
1196'
1197LANGUAGE 'plpgsql' STABLE STRICT; -- WITH (isstrict);
1198
1199-----------------------------------------------------------------------
1200-- EXPLODE_HISTOGRAM2D( <histogram2d>, <tablename> )
1201-----------------------------------------------------------------------
1202CREATE 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-----------------------------------------------------------------------
1210CREATE 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-----------------------------------------------------------------------
1218CREATE 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-----------------------------------------------------------------------
1225CREATE 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-----------------------------------------------------------------------
1232CREATE OR REPLACE FUNCTION find_extent(text,text,text) RETURNS box2d AS
1233'
1234DECLARE
1235        schemaname alias for $1;
1236        tablename alias for $2;
1237        columnname alias for $3;
1238        myrec RECORD;
1239
1240BEGIN
1241        FOR myrec IN EXECUTE ''SELECT extent("''||columnname||''") FROM "''||schemaname||''"."''||tablename||''"'' LOOP
1242                return myrec.extent;
1243        END LOOP;
1244END;
1245'
1246LANGUAGE 'plpgsql' IMMUTABLE STRICT; -- WITH (isstrict);
1247
1248-----------------------------------------------------------------------
1249-- FIND_EXTENT( <table name>, <column name> )
1250-----------------------------------------------------------------------
1251CREATE OR REPLACE FUNCTION find_extent(text,text) RETURNS box2d AS
1252'
1253DECLARE
1254        tablename alias for $1;
1255        columnname alias for $2;
1256        myrec RECORD;
1257
1258BEGIN
1259        FOR myrec IN EXECUTE ''SELECT extent("''||columnname||''") FROM "''||tablename||''"'' LOOP
1260                return myrec.extent;
1261        END LOOP;
1262END;
1263'
1264LANGUAGE 'plpgsql' IMMUTABLE STRICT; -- WITH (isstrict);
1265
1266-------------------------------------------------------------------
1267-- SPATIAL_REF_SYS
1268-------------------------------------------------------------------
1269CREATE 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-------------------------------------------------------------------
1280CREATE 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-----------------------------------------------------------------------
1304CREATE OR REPLACE FUNCTION rename_geometry_table_constraints() RETURNS text
1305AS 
1306'
1307SELECT ''rename_geometry_table_constraint() is obsoleted''::text
1308'
1309LANGUAGE '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-----------------------------------------------------------------------
1327CREATE OR REPLACE FUNCTION fix_geometry_columns() RETURNS text
1328AS 
1329'
1330DECLARE
1331        mislinked record;
1332        result text;
1333        linked integer;
1334        deleted integer;
1335        foundschema integer;
1336BEGIN
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
1416END;
1417'
1418LANGUAGE '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-----------------------------------------------------------------------
1431CREATE OR REPLACE FUNCTION probe_geometry_columns() RETURNS text AS
1432'
1433DECLARE
1434        inserted integer;
1435        oldcount integer;
1436        probed integer;
1437        stale integer;
1438BEGIN
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;
1509END
1510
1511'
1512LANGUAGE '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-----------------------------------------------------------------------
1531CREATE OR REPLACE FUNCTION AddGeometryColumn(varchar,varchar,varchar,varchar,integer,varchar,integer)
1532        RETURNS text
1533        AS 
1534'
1535DECLARE
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
1547BEGIN
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) || '' '';
1665END;
1666'
1667LANGUAGE '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----------------------------------------------------------------------------
1677CREATE OR REPLACE FUNCTION AddGeometryColumn(varchar,varchar,varchar,integer,varchar,integer) RETURNS text AS '
1678DECLARE
1679        ret  text;
1680BEGIN
1681        SELECT AddGeometryColumn('''',$1,$2,$3,$4,$5,$6) into ret;
1682        RETURN ret;
1683END;
1684'
1685LANGUAGE '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----------------------------------------------------------------------------
1695CREATE OR REPLACE FUNCTION AddGeometryColumn(varchar,varchar,integer,varchar,integer) RETURNS text AS '
1696DECLARE
1697        ret  text;
1698BEGIN
1699        SELECT AddGeometryColumn('''','''',$1,$2,$3,$4,$5) into ret;
1700        RETURN ret;
1701END;
1702'
1703LANGUAGE '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-----------------------------------------------------------------------
1715CREATE OR REPLACE FUNCTION DropGeometryColumn(varchar, varchar,varchar,varchar)
1716        RETURNS text
1717        AS 
1718'
1719DECLARE
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
1728BEGIN
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       
1773END;
1774'
1775LANGUAGE '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-----------------------------------------------------------------------
1786CREATE OR REPLACE FUNCTION DropGeometryColumn(varchar,varchar,varchar)
1787        RETURNS text
1788        AS 
1789'
1790DECLARE
1791        ret text;
1792BEGIN
1793        SELECT DropGeometryColumn('''',$1,$2,$3) into ret;
1794        RETURN ret;
1795END;
1796'
1797LANGUAGE '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-----------------------------------------------------------------------
1808CREATE OR REPLACE FUNCTION DropGeometryColumn(varchar,varchar)
1809        RETURNS text
1810        AS 
1811'
1812DECLARE
1813        ret text;
1814BEGIN
1815        SELECT DropGeometryColumn('''','''',$1,$2) into ret;
1816        RETURN ret;
1817END;
1818'
1819LANGUAGE '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-----------------------------------------------------------------------
1829CREATE OR REPLACE FUNCTION DropGeometryTable(varchar, varchar,varchar)
1830        RETURNS text
1831        AS 
1832'
1833DECLARE
1834        catalog_name alias for $1;
1835        schema_name alias for $2;
1836        table_name alias for $3;
1837        real_schema name;
1838
1839BEGIN
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       
1862END;
1863'
1864LANGUAGE '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-----------------------------------------------------------------------
1874CREATE OR REPLACE FUNCTION DropGeometryTable(varchar,varchar) RETURNS text AS 
1875'SELECT DropGeometryTable('''',$1,$2)'
1876LANGUAGE '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-----------------------------------------------------------------------
1887CREATE OR REPLACE FUNCTION DropGeometryTable(varchar) RETURNS text AS 
1888'SELECT DropGeometryTable('''','''',$1)'
1889LANGUAGE '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-----------------------------------------------------------------------
1899CREATE OR REPLACE FUNCTION UpdateGeometrySRID(varchar,varchar,varchar,varchar,integer)
1900        RETURNS text
1901        AS 
1902'
1903DECLARE
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
1914BEGIN
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       
1975END;
1976'
1977LANGUAGE 'plpgsql' VOLATILE STRICT; -- WITH (isstrict);
1978
1979-----------------------------------------------------------------------
1980-- UPDATEGEOMETRYSRID
1981--   <schema>, <table>, <column>, <srid>
1982-----------------------------------------------------------------------
1983CREATE OR REPLACE FUNCTION UpdateGeometrySRID(varchar,varchar,varchar,integer)
1984        RETURNS text
1985        AS '
1986DECLARE
1987        ret  text;
1988BEGIN
1989        SELECT UpdateGeometrySRID('''',$1,$2,$3,$4) into ret;
1990        RETURN ret;
1991END;
1992'
1993LANGUAGE 'plpgsql' VOLATILE STRICT; -- WITH (isstrict);
1994
1995-----------------------------------------------------------------------
1996-- UPDATEGEOMETRYSRID
1997--   <table>, <column>, <srid>
1998-----------------------------------------------------------------------
1999CREATE OR REPLACE FUNCTION UpdateGeometrySRID(varchar,varchar,integer)
2000        RETURNS text
2001        AS '
2002DECLARE
2003        ret  text;
2004BEGIN
2005        SELECT UpdateGeometrySRID('''','''',$1,$2,$3) into ret;
2006        RETURN ret;
2007END;
2008'
2009LANGUAGE '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-----------------------------------------------------------------------
2022CREATE OR REPLACE FUNCTION update_geometry_stats() RETURNS text
2023AS ' 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-----------------------------------------------------------------------
2036CREATE OR REPLACE FUNCTION update_geometry_stats(varchar,varchar) RETURNS text
2037AS 'SELECT update_geometry_stats();' LANGUAGE 'sql' ;
2038
2039-----------------------------------------------------------------------
2040-- FIND_SRID( <schema>, <table>, <geom col> )
2041-----------------------------------------------------------------------
2042CREATE OR REPLACE FUNCTION find_srid(varchar,varchar,varchar) RETURNS int4 AS
2043'DECLARE
2044   schem text;
2045   tabl text;
2046   sr int4;
2047BEGIN
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;
2074END;
2075'
2076LANGUAGE 'plpgsql' IMMUTABLE STRICT; -- WITH (iscachable);
2077
2078
2079---------------------------------------------------------------
2080-- PROJ support
2081---------------------------------------------------------------
2082
2083CREATE OR REPLACE FUNCTION get_proj4_from_srid(integer) RETURNS text AS
2084'
2085BEGIN
2086        RETURN proj4text::text FROM spatial_ref_sys WHERE srid= $1;
2087END;
2088'
2089LANGUAGE 'plpgsql' IMMUTABLE STRICT; -- WITH (iscachable,isstrict);
2090
2091
2092
2093CREATE 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
2098CREATE 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
2108CREATE OR REPLACE FUNCTION postgis_version() RETURNS text
2109        AS '/usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1'
2110        LANGUAGE 'C' IMMUTABLE;
2111
2112CREATE 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--
2122CREATE OR REPLACE FUNCTION postgis_scripts_installed() RETURNS text
2123        AS 'SELECT ''1.1.4''::text AS version'
2124        LANGUAGE 'sql' IMMUTABLE;
2125
2126CREATE 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()
2131CREATE 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
2135CREATE 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
2139CREATE 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
2143CREATE 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
2147CREATE OR REPLACE FUNCTION postgis_scripts_build_date() RETURNS text
2148        AS 'SELECT ''2006-10-04 15:11:07''::text AS version'
2149        LANGUAGE 'sql' IMMUTABLE;
2150
2151CREATE 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
2157CREATE OR REPLACE FUNCTION postgis_full_version() RETURNS text
2158AS '
2159DECLARE
2160        libver text;
2161        projver text;
2162        geosver text;
2163        jtsver text;
2164        usestats bool;
2165        dbproc text;
2166        relproc text;
2167        fullver text;
2168BEGIN
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;
2203END
2204'
2205LANGUAGE 'plpgsql' IMMUTABLE;
2206
2207---------------------------------------------------------------
2208-- CASTS
2209---------------------------------------------------------------
2210
2211CREATE 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
2216CREATE 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
2221CREATE 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
2226CREATE 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
2231CREATE 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
2236CREATE 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
2241CREATE 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
2247CREATE OR REPLACE FUNCTION box3dtobox(box3d)
2248        RETURNS box
2249        AS 'SELECT box($1)'
2250        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2251
2252CREATE 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
2257CREATE 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
2262CREATE 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
2267CREATE 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
2272CREATE 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
2277CREATE 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
2282CREATE 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
2288CREATE CAST (geometry AS box2d) WITH FUNCTION box2d(geometry) AS IMPLICIT;
2289CREATE CAST (geometry AS box3d) WITH FUNCTION box3d(geometry) AS IMPLICIT;
2290CREATE CAST (geometry AS box) WITH FUNCTION box(geometry) AS IMPLICIT;
2291CREATE CAST (box3d AS box2d) WITH FUNCTION box2d(box3d) AS IMPLICIT;
2292CREATE CAST (box2d AS box3d) WITH FUNCTION box3d(box2d) AS IMPLICIT;
2293CREATE CAST (box2d AS geometry) WITH FUNCTION geometry(box2d) AS IMPLICIT;
2294CREATE CAST (box3d AS box) WITH FUNCTION box(box3d) AS IMPLICIT;
2295CREATE CAST (box3d AS geometry) WITH FUNCTION geometry(box3d) AS IMPLICIT;
2296CREATE CAST (text AS geometry) WITH FUNCTION geometry(text) AS IMPLICIT;
2297CREATE CAST (geometry AS text) WITH FUNCTION text(geometry) AS IMPLICIT;
2298CREATE CAST (chip AS geometry) WITH FUNCTION geometry(chip) AS IMPLICIT;
2299CREATE CAST (bytea AS geometry) WITH FUNCTION geometry(bytea) AS IMPLICIT;
2300CREATE CAST (geometry AS bytea) WITH FUNCTION bytea(geometry) AS IMPLICIT;
2301CREATE CAST (bool AS text) WITH FUNCTION text(bool) AS IMPLICIT;
2302
2303---------------------------------------------------------------
2304-- Algorithms
2305---------------------------------------------------------------
2306
2307CREATE 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)
2313CREATE 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
2319CREATE 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
2325CREATE 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)
2331CREATE 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
2336CREATE 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
2345CREATE 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
2350CREATE 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
2355CREATE 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
2360CREATE 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
2365CREATE 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
2374CREATE 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
2379CREATE 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
2384CREATE 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   
2389CREATE 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 
2395CREATE 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   
2400CREATE 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
2405CREATE 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
2411CREATE 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
2417CREATE 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
2422CREATE AGGREGATE MemGeomUnion (
2423        basetype = geometry,
2424        sfunc = geomunion,
2425        stype = geometry
2426        );
2427
2428CREATE 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
2433CREATE AGGREGATE GeomUnion (
2434        sfunc = geom_accum,
2435        basetype = geometry,
2436        stype = geometry[],
2437        finalfunc = unite_garray
2438        );
2439
2440
2441CREATE 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
2446CREATE 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
2451CREATE 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
2456CREATE 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
2461CREATE 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
2466CREATE 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
2471CREATE 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
2476CREATE 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
2481CREATE 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
2486CREATE 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
2491CREATE 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
2496CREATE 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
2502CREATE 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
2507CREATE 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
2512CREATE 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       
2517CREATE 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
2522CREATE 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-----------------------------------------------------------------------
2530CREATE 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
2535CREATE 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
2540CREATE 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)
2549CREATE 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
2555CREATE 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
2561CREATE 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
2570CREATE 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
2575CREATE 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
2580CREATE 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
2585CREATE 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
2590CREATE 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
2595CREATE 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
2600CREATE 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
2605CREATE 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
2610CREATE 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
2615CREATE 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
2620CREATE 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
2625CREATE 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
2630CREATE 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
2635CREATE 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
2640CREATE 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
2645CREATE 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
2650CREATE 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
2655CREATE 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
2660CREATE 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       
2665CREATE 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       
2670CREATE 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
2675CREATE 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
2680CREATE 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
2685CREATE 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
2690CREATE 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
2695CREATE OR REPLACE FUNCTION GeomFromText(text)
2696        RETURNS geometry AS 'SELECT geometryfromtext($1)'
2697        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2698
2699CREATE OR REPLACE FUNCTION GeomFromText(text, int4)
2700        RETURNS geometry AS 'SELECT geometryfromtext($1, $2)'
2701        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2702
2703CREATE 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
2712CREATE 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
2721CREATE 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
2730CREATE 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
2739CREATE OR REPLACE FUNCTION LineStringFromText(text)
2740        RETURNS geometry
2741        AS 'SELECT LineFromText($1)'
2742        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2743
2744CREATE OR REPLACE FUNCTION LineStringFromText(text, int4)
2745        RETURNS geometry
2746        AS 'SELECT LineFromText($1, $2)'
2747        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2748
2749CREATE 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
2758CREATE 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
2767CREATE OR REPLACE FUNCTION PolygonFromText(text, int4)
2768        RETURNS geometry
2769        AS 'SELECT PolyFromText($1, $2)'
2770        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2771
2772CREATE OR REPLACE FUNCTION PolygonFromText(text)
2773        RETURNS geometry
2774        AS 'SELECT PolyFromText($1)'
2775        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2776
2777CREATE 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
2787CREATE 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
2796CREATE OR REPLACE FUNCTION MultiLineStringFromText(text)
2797        RETURNS geometry
2798        AS 'SELECT MLineFromText($1)'
2799        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2800
2801CREATE OR REPLACE FUNCTION MultiLineStringFromText(text, int4)
2802        RETURNS geometry
2803        AS 'SELECT MLineFromText($1, $2)'
2804        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2805
2806CREATE 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
2815CREATE 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
2824CREATE OR REPLACE FUNCTION MultiPointFromText(text, int4)
2825        RETURNS geometry
2826        AS 'SELECT MPointFromText($1, $2)'
2827        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2828
2829CREATE OR REPLACE FUNCTION MultiPointFromText(text)
2830        RETURNS geometry
2831        AS 'SELECT MPointFromText($1)'
2832        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2833
2834CREATE 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
2843CREATE 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
2852CREATE OR REPLACE FUNCTION MultiPolygonFromText(text, int4)
2853        RETURNS geometry
2854        AS 'SELECT MPolyFromText($1, $2)'
2855        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2856
2857CREATE OR REPLACE FUNCTION MultiPolygonFromText(text)
2858        RETURNS geometry
2859        AS 'SELECT MPolyFromText($1)'
2860        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
2861
2862CREATE 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
2872CREATE 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
2882CREATE 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
2887CREATE 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
2892CREATE 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
2901CREATE 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
2910CREATE 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
2919CREATE 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
2928CREATE 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
2937CREATE 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
2946CREATE 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
2955CREATE 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
2964CREATE 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
2973CREATE 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
2982CREATE 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
2991CREATE 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
3000CREATE 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
3009CREATE 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
3018CREATE 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
3027CREATE 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
3036CREATE 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
3045CREATE 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
3054CREATE 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
3063CREATE 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
3072CREATE 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
3081CREATE 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
3090CREATE 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
3100CREATE 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--
3124CREATE OR REPLACE FUNCTION BdPolyFromText(text, integer)
3125RETURNS geometry
3126AS '
3127DECLARE
3128        geomtext alias for $1;
3129        srid alias for $2;
3130        mline geometry;
3131        geom geometry;
3132BEGIN
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;
3148END;
3149'
3150LANGUAGE '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--
3164CREATE OR REPLACE FUNCTION BdMPolyFromText(text, integer)
3165RETURNS geometry
3166AS '
3167DECLARE
3168        geomtext alias for $1;
3169        srid alias for $2;
3170        mline geometry;
3171        geom geometry;
3172BEGIN
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;
3183END;
3184'
3185LANGUAGE 'plpgsql' IMMUTABLE STRICT; 
3186
3187-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3188--
3189-- $Id: long_xact.sql 2406 2006-07-07 13:56:52Z strk $
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
3211CREATE OR REPLACE FUNCTION UnlockRows(text)
3212        RETURNS int
3213        AS '
3214DECLARE
3215        ret int;
3216BEGIN
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;
3228END;
3229'
3230LANGUAGE 'plpgsql' VOLATILE STRICT;
3231
3232-- LockRow([schema], table, rowid, auth, [expires])
3233-- Returns 1 if successfully obtained the lock, 0 otherwise
3234CREATE OR REPLACE FUNCTION LockRow(text, text, text, text, timestamp)
3235        RETURNS int
3236        AS '
3237DECLARE
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       
3247BEGIN
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;
3280END;'
3281LANGUAGE 'plpgsql' VOLATILE STRICT;
3282
3283-- LockRow(schema, table, rid, authid);
3284CREATE 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);
3291CREATE 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);
3298CREATE 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
3305CREATE OR REPLACE FUNCTION AddAuth(text)
3306        RETURNS BOOLEAN
3307        AS '
3308DECLARE
3309        lockid alias for $1;
3310        okay boolean;
3311        myrec record;
3312BEGIN
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;
3333END;
3334'
3335LANGUAGE PLPGSQL;
3336 
3337
3338-- CheckAuth( <schema>, <table>, <ridcolumn> )
3339--
3340-- Returns 0
3341--
3342CREATE OR REPLACE FUNCTION CheckAuth(text, text, text)
3343        RETURNS INT
3344        AS '
3345DECLARE
3346        schema text;
3347BEGIN
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;
3366END;
3367'
3368LANGUAGE 'plpgsql';
3369
3370-- CheckAuth(<table>, <ridcolumn>)
3371CREATE OR REPLACE FUNCTION CheckAuth(text, text)
3372        RETURNS INT
3373        AS
3374        'SELECT CheckAuth('''', $1, $2)'
3375        LANGUAGE 'SQL';
3376
3377CREATE 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
3382CREATE 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--
3393CREATE OR REPLACE FUNCTION EnableLongTransactions()
3394        RETURNS TEXT
3395        AS '
3396DECLARE
3397        query text;
3398        exists bool;
3399        rec RECORD;
3400
3401BEGIN
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'';
3442END;
3443'
3444LANGUAGE 'plpgsql';
3445
3446--
3447-- Check if Long transactions support is enabled
3448--
3449CREATE OR REPLACE FUNCTION LongTransactionsEnabled()
3450        RETURNS bool
3451AS '
3452DECLARE
3453        rec RECORD;
3454BEGIN
3455        FOR rec IN SELECT oid FROM pg_class WHERE relname = ''authorized_tables''
3456        LOOP
3457                return ''t'';
3458        END LOOP;
3459        return ''f'';
3460END;
3461'
3462LANGUAGE '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--
3471CREATE OR REPLACE FUNCTION DisableLongTransactions()
3472        RETURNS TEXT
3473        AS '
3474DECLARE
3475        query text;
3476        exists bool;
3477        rec RECORD;
3478
3479BEGIN
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'';
3507END;
3508'
3509LANGUAGE 'plpgsql';
3510
3511---------------------------------------------------------------
3512-- END
3513---------------------------------------------------------------
3514
3515
3516---------------------------------------------------------------
3517-- END
3518---------------------------------------------------------------
3519
3520COMMIT;
3521
Note: See TracBrowser for help on using the repository browser.