Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

guide:postgis_su_centos6:postgis.sql [2013/08/01 23:05] (versione attuale)
alelorenzi creata
Linea 1: Linea 1:
 + -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 + --
 + -- $Id: postgis.sql.in.c 7360 2011-06-10 16:55:53Z robe $
 + --
 + -- PostGIS - Spatial Types for PostgreSQL
 + -- http://postgis.refractions.net
 + -- Copyright 2001-2003 Refractions Research Inc.
 + --
 + -- This is free software; you can redistribute and/or modify it under
 + -- the terms of the GNU General Public Licence. See the COPYING file.
 + --
 + -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 + --
 + -- WARNING: Any change in this file must be evaluated for compatibility.
 + --          Changes cleanly handled by postgis_upgrade.sql are fine,
 + --     other changes will require a bump in Major version.
 + --     Currently only function replaceble by CREATE OR REPLACE
 + --     are cleanly handled.
 + --
 + -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 + -- INSTALL VERSION: 1.5.3
 +
 + SET client_min_messages TO warning;
 +
 + BEGIN;
 +
 + -------------------------------------------------------------------
 + --  SPHEROID TYPE
 + -------------------------------------------------------------------
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_spheroid_in(cstring)
 + RETURNS spheroid
 + AS '$libdir/postgis-1.5','ellipsoid_in'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_spheroid_out(spheroid)
 + RETURNS cstring
 + AS '$libdir/postgis-1.5','ellipsoid_out'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION spheroid_in(cstring)
 + RETURNS spheroid
 + AS '$libdir/postgis-1.5','ellipsoid_in'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION spheroid_out(spheroid)
 + RETURNS cstring
 + AS '$libdir/postgis-1.5','ellipsoid_out'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE TYPE spheroid (
 + alignment = double,
 + internallength = 65,
 + input = spheroid_in,
 + output = spheroid_out
 + );
 +
 + -------------------------------------------------------------------
 + --  GEOMETRY TYPE (lwgeom)
 + -------------------------------------------------------------------
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_in(cstring)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_in'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_out(geometry)
 + RETURNS cstring
 + AS '$libdir/postgis-1.5','LWGEOM_out'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_analyze(internal)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_analyze'
 + LANGUAGE 'C' VOLATILE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_recv(internal)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_recv'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_send(geometry)
 + RETURNS bytea
 + AS '$libdir/postgis-1.5','LWGEOM_send'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_in(cstring)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_in'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_out(geometry)
 + RETURNS cstring
 + AS '$libdir/postgis-1.5','LWGEOM_out'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_analyze(internal)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_analyze'
 + LANGUAGE 'C' VOLATILE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_recv(internal)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_recv'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_send(geometry)
 + RETURNS bytea
 + AS '$libdir/postgis-1.5','LWGEOM_send'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE TYPE geometry (
 + internallength = variable,
 + input = geometry_in,
 + output = geometry_out,
 + send = geometry_send,
 + receive = geometry_recv,
 + delimiter = ':',
 + analyze = geometry_analyze,
 + storage = main
 + );
 +
 + -------------------------------------------
 + -- Affine transforms
 + -------------------------------------------
 +
 + -- Availability: 1.1.2
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION Affine(geometry,float8,float8,float8,float8,float8,float8,float8,float8,float8,float8,float8,float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_affine'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_Affine(geometry,float8,float8,float8,float8,float8,float8,float8,float8,float8,float8,float8,float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_affine'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.1.2
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION Affine(geometry,float8,float8,float8,float8,float8,float8)
 + RETURNS geometry
 + AS 'SELECT affine($1,  $2, $3, 0,  $4, $5, 0,  0, 0, 1,  $6, $7, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_Affine(geometry,float8,float8,float8,float8,float8,float8)
 + RETURNS geometry
 + AS 'SELECT affine($1,  $2, $3, 0,  $4, $5, 0,  0, 0, 1,  $6, $7, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.1.2
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION RotateZ(geometry,float8)
 + RETURNS geometry
 + AS 'SELECT affine($1,  cos($2), -sin($2), 0,  sin($2), cos($2), 0,  0, 0, 1,  0, 0, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_RotateZ(geometry,float8)
 + RETURNS geometry
 + AS 'SELECT affine($1,  cos($2), -sin($2), 0,  sin($2), cos($2), 0,  0, 0, 1,  0, 0, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.1.2
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION Rotate(geometry,float8)
 + RETURNS geometry
 + AS 'SELECT rotateZ($1, $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_Rotate(geometry,float8)
 + RETURNS geometry
 + AS 'SELECT rotateZ($1, $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.1.2
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION RotateX(geometry,float8)
 + RETURNS geometry
 + AS 'SELECT affine($1, 1, 0, 0, 0, cos($2), -sin($2), 0, sin($2), cos($2), 0, 0, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_RotateX(geometry,float8)
 + RETURNS geometry
 + AS 'SELECT affine($1, 1, 0, 0, 0, cos($2), -sin($2), 0, sin($2), cos($2), 0, 0, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.1.2
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION RotateY(geometry,float8)
 + RETURNS geometry
 + AS 'SELECT affine($1,  cos($2), 0, sin($2),  0, 1, 0,  -sin($2), 0, cos($2), 0,  0, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_RotateY(geometry,float8)
 + RETURNS geometry
 + AS 'SELECT affine($1,  cos($2), 0, sin($2),  0, 1, 0,  -sin($2), 0, cos($2), 0,  0, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION Translate(geometry,float8,float8,float8)
 + RETURNS geometry
 + AS 'SELECT affine($1, 1, 0, 0, 0, 1, 0, 0, 0, 1, $2, $3, $4)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_Translate(geometry,float8,float8,float8)
 + RETURNS geometry
 + AS 'SELECT affine($1, 1, 0, 0, 0, 1, 0, 0, 0, 1, $2, $3, $4)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION Translate(geometry,float8,float8)
 + RETURNS geometry
 + AS 'SELECT translate($1, $2, $3, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_Translate(geometry,float8,float8)
 + RETURNS geometry
 + AS 'SELECT translate($1, $2, $3, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.1.0
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION Scale(geometry,float8,float8,float8)
 + RETURNS geometry
 + AS 'SELECT affine($1,  $2, 0, 0,  0, $3, 0,  0, 0, $4,  0, 0, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_Scale(geometry,float8,float8,float8)
 + RETURNS geometry
 + AS 'SELECT affine($1,  $2, 0, 0,  0, $3, 0,  0, 0, $4,  0, 0, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.1.0
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION Scale(geometry,float8,float8)
 + RETURNS geometry
 + AS 'SELECT scale($1, $2, $3, 1)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_Scale(geometry,float8,float8)
 + RETURNS geometry
 + AS 'SELECT scale($1, $2, $3, 1)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.1.0
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION transscale(geometry,float8,float8,float8,float8)
 + RETURNS geometry
 + AS 'SELECT affine($1,  $4, 0, 0,  0, $5, 0,
 + 0, 0, 1,  $2 * $4, $3 * $5, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_transscale(geometry,float8,float8,float8,float8)
 + RETURNS geometry
 + AS 'SELECT affine($1,  $4, 0, 0,  0, $5, 0,
 + 0, 0, 1,  $2 * $4, $3 * $5, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.1.0
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION shift_longitude(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_longitude_shift'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_shift_longitude(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_longitude_shift'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -------------------------------------------------------------------
 + --  BOX3D TYPE
 + -------------------------------------------------------------------
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_box3d_in(cstring)
 + RETURNS box3d
 + AS '$libdir/postgis-1.5', 'BOX3D_in'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_box3d_out(box3d)
 + RETURNS cstring
 + AS '$libdir/postgis-1.5', 'BOX3D_out'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION box3d_in(cstring)
 + RETURNS box3d
 + AS '$libdir/postgis-1.5', 'BOX3D_in'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION box3d_out(box3d)
 + RETURNS cstring
 + AS '$libdir/postgis-1.5', 'BOX3D_out'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE TYPE box3d (
 + alignment = double,
 + internallength = 48,
 + input = box3d_in,
 + output = box3d_out
 + );
 +
 + -- Temporary box3d aggregate type to retain full double precision
 + -- for ST_Extent(). Should be removed when we change the output
 + -- type of ST_Extent() to return something other than BOX2DFLOAT4.
 + CREATE OR REPLACE FUNCTION box3d_extent_in(cstring)
 + RETURNS box3d_extent
 + AS '$libdir/postgis-1.5', 'BOX3D_in'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION box3d_extent_out(box3d_extent)
 + RETURNS cstring
 + AS '$libdir/postgis-1.5', 'BOX3D_extent_out'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE TYPE box3d_extent (
 + alignment = double,
 + internallength = 48,
 + input = box3d_extent_in,
 + output = box3d_extent_out
 + );
 +
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION box3d_extent(box3d_extent)
 + RETURNS box3d
 + AS '$libdir/postgis-1.5', 'BOX3D_extent_to_BOX3D'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION box2d(box3d_extent)
 + RETURNS box2d
 + AS '$libdir/postgis-1.5', 'BOX3D_to_BOX2DFLOAT4'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry(box3d_extent)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','BOX3D_to_LWGEOM'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- End of temporary hack
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION xmin(box3d)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','BOX3D_xmin'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_XMin(box3d)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','BOX3D_xmin'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION ymin(box3d)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','BOX3D_ymin'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_YMin(box3d)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','BOX3D_ymin'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION zmin(box3d)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','BOX3D_zmin'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_ZMin(box3d)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','BOX3D_zmin'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION xmax(box3d)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','BOX3D_xmax'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_XMax(box3d)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','BOX3D_xmax'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION ymax(box3d)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','BOX3D_ymax'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_YMax(box3d)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','BOX3D_ymax'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION zmax(box3d)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','BOX3D_zmax'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_ZMax(box3d)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','BOX3D_zmax'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -------------------------------------------------------------------
 + --  CHIP TYPE
 + -------------------------------------------------------------------
 +
 + CREATE OR REPLACE FUNCTION chip_in(cstring)
 + RETURNS chip
 + AS '$libdir/postgis-1.5','CHIP_in'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION chip_out(chip)
 + RETURNS cstring
 + AS '$libdir/postgis-1.5','CHIP_out'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION ST_chip_in(cstring)
 + RETURNS chip
 + AS '$libdir/postgis-1.5','CHIP_in'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION ST_chip_out(chip)
 + RETURNS cstring
 + AS '$libdir/postgis-1.5','CHIP_out'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE TYPE chip (
 + alignment = double,
 + internallength = variable,
 + input = chip_in,
 + output = chip_out,
 + storage = extended
 + );
 +
 + -----------------------------------------------------------------------
 + -- BOX2D
 + -----------------------------------------------------------------------
 +
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_box2d_in(cstring)
 + RETURNS box2d
 + AS '$libdir/postgis-1.5','BOX2DFLOAT4_in'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_box2d_out(box2d)
 + RETURNS cstring
 + AS '$libdir/postgis-1.5','BOX2DFLOAT4_out'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION box2d_in(cstring)
 + RETURNS box2d
 + AS '$libdir/postgis-1.5','BOX2DFLOAT4_in'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION box2d_out(box2d)
 + RETURNS cstring
 + AS '$libdir/postgis-1.5','BOX2DFLOAT4_out'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE TYPE box2d (
 + internallength = 16,
 + input = box2d_in,
 + output = box2d_out,
 + storage = plain
 + );
 +
 +
 + -------------------------------------------------------------------
 + -- BTREE indexes
 + -------------------------------------------------------------------
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_lt(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'lwgeom_lt'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_le(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'lwgeom_le'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_gt(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'lwgeom_gt'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_ge(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'lwgeom_ge'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_eq(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'lwgeom_eq'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_cmp(geometry, geometry)
 + RETURNS integer
 + AS '$libdir/postgis-1.5', 'lwgeom_cmp'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_lt(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'lwgeom_lt'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_le(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'lwgeom_le'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_gt(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'lwgeom_gt'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_ge(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'lwgeom_ge'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_eq(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'lwgeom_eq'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_cmp(geometry, geometry)
 + RETURNS integer
 + AS '$libdir/postgis-1.5', 'lwgeom_cmp'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + --
 + -- Sorting operators for Btree
 + --
 +
 + CREATE OPERATOR < (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_lt,
 + COMMUTATOR = '>', NEGATOR = '>=',
 + RESTRICT = contsel, JOIN = contjoinsel
 + );
 +
 + CREATE OPERATOR <= (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_le,
 + COMMUTATOR = '>=', NEGATOR = '>',
 + RESTRICT = contsel, JOIN = contjoinsel
 + );
 +
 + CREATE OPERATOR = (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_eq,
 + COMMUTATOR = '=', -- we might implement a faster negator here
 + RESTRICT = contsel, JOIN = contjoinsel
 + );
 +
 + CREATE OPERATOR >= (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_ge,
 + COMMUTATOR = '<=', NEGATOR = '<',
 + RESTRICT = contsel, JOIN = contjoinsel
 + );
 + CREATE OPERATOR > (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_gt,
 + COMMUTATOR = '<', NEGATOR = '<=',
 + RESTRICT = contsel, JOIN = contjoinsel
 + );
 +
 +
 + CREATE OPERATOR CLASS btree_geometry_ops
 + DEFAULT FOR TYPE geometry USING btree AS
 + OPERATOR 1 < ,
 + OPERATOR 2 <= ,
 + OPERATOR 3 = ,
 + OPERATOR 4 >= ,
 + OPERATOR 5 > ,
 + FUNCTION 1 geometry_cmp (geometry, geometry);
 +
 +
 +
 + -------------------------------------------------------------------
 + -- GiST indexes
 + -------------------------------------------------------------------
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION postgis_gist_sel (internal, oid, internal, int4)
 + RETURNS float8
 + AS '$libdir/postgis-1.5', 'LWGEOM_gist_sel'
 + LANGUAGE 'C';
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION postgis_gist_joinsel(internal, oid, internal, smallint)
 + RETURNS float8
 + AS '$libdir/postgis-1.5', 'LWGEOM_gist_joinsel'
 + LANGUAGE 'C';
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_postgis_gist_sel (internal, oid, internal, int4)
 + RETURNS float8
 + AS '$libdir/postgis-1.5', 'LWGEOM_gist_sel'
 + LANGUAGE 'C';
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_postgis_gist_joinsel(internal, oid, internal, smallint)
 + RETURNS float8
 + AS '$libdir/postgis-1.5', 'LWGEOM_gist_joinsel'
 + LANGUAGE 'C';
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_overleft(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_overleft'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_overright(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_overright'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_overabove(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_overabove'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_overbelow(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_overbelow'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_left(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_left'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_right(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_right'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_above(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_above'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_below(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_below'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_contain(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_contain'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_contained(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_contained'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_overlap(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_overlap'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry_same(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_samebox'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION geometry_same(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_samebox'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_gist_sel (internal, oid, internal, int4)
 + RETURNS float8
 + AS '$libdir/postgis-1.5', 'LWGEOM_gist_sel'
 + LANGUAGE 'C';
 +
 + CREATE OR REPLACE FUNCTION geometry_gist_joinsel(internal, oid, internal, smallint)
 + RETURNS float8
 + AS '$libdir/postgis-1.5', 'LWGEOM_gist_joinsel'
 + LANGUAGE 'C';
 +
 + CREATE OR REPLACE FUNCTION geometry_overleft(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_overleft'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_overright(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_overright'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_overabove(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_overabove'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_overbelow(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_overbelow'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_left(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_left'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_right(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_right'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_above(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_above'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_below(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_below'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_contain(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_contain'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_contained(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_contained'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_overlap(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_overlap'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry_samebox(geometry, geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_samebox'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OPERATOR << (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_left,
 + COMMUTATOR = '>>',
 + RESTRICT = positionsel, JOIN = positionjoinsel
 + );
 +
 + CREATE OPERATOR &< (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overleft,
 + COMMUTATOR = '&>',
 + RESTRICT = positionsel, JOIN = positionjoinsel
 + );
 +
 + CREATE OPERATOR <<| (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_below,
 + COMMUTATOR = '|>>',
 + RESTRICT = positionsel, JOIN = positionjoinsel
 + );
 +
 + CREATE OPERATOR &<| (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overbelow,
 + COMMUTATOR = '|&>',
 + RESTRICT = positionsel, JOIN = positionjoinsel
 + );
 +
 + CREATE OPERATOR && (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overlap,
 + COMMUTATOR = '&&',
 + RESTRICT = geometry_gist_sel, JOIN = geometry_gist_joinsel
 + );
 +
 + CREATE OPERATOR &> (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overright,
 + COMMUTATOR = '&<',
 + RESTRICT = positionsel, JOIN = positionjoinsel
 + );
 +
 + CREATE OPERATOR >> (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_right,
 + COMMUTATOR = '<<',
 + RESTRICT = positionsel, JOIN = positionjoinsel
 + );
 +
 + CREATE OPERATOR |&> (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overabove,
 + COMMUTATOR = '&<|',
 + RESTRICT = positionsel, JOIN = positionjoinsel
 + );
 +
 + CREATE OPERATOR |>> (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_above,
 + COMMUTATOR = '<<|',
 + RESTRICT = positionsel, JOIN = positionjoinsel
 + );
 +
 + CREATE OPERATOR ~= (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_samebox,
 + COMMUTATOR = '~=',
 + RESTRICT = eqsel, JOIN = eqjoinsel
 + );
 +
 + CREATE OPERATOR @ (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_contained,
 + COMMUTATOR = '~',
 + RESTRICT = contsel, JOIN = contjoinsel
 + );
 +
 + CREATE OPERATOR ~ (
 + LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_contain,
 + COMMUTATOR = '@',
 + RESTRICT = contsel, JOIN = contjoinsel
 + );
 +
 + -- gist support functions
 +
 + CREATE OR REPLACE FUNCTION LWGEOM_gist_consistent(internal,geometry,int4)
 + RETURNS bool
 + AS '$libdir/postgis-1.5' ,'LWGEOM_gist_consistent'
 + LANGUAGE 'C';
 +
 + CREATE OR REPLACE FUNCTION LWGEOM_gist_compress(internal)
 + RETURNS internal
 + AS '$libdir/postgis-1.5','LWGEOM_gist_compress'
 + LANGUAGE 'C';
 +
 + CREATE OR REPLACE FUNCTION LWGEOM_gist_penalty(internal,internal,internal)
 + RETURNS internal
 + AS '$libdir/postgis-1.5' ,'LWGEOM_gist_penalty'
 + LANGUAGE 'C';
 +
 + CREATE OR REPLACE FUNCTION LWGEOM_gist_picksplit(internal, internal)
 + RETURNS internal
 + AS '$libdir/postgis-1.5' ,'LWGEOM_gist_picksplit'
 + LANGUAGE 'C';
 +
 + CREATE OR REPLACE FUNCTION LWGEOM_gist_union(bytea, internal)
 + RETURNS internal
 + AS '$libdir/postgis-1.5' ,'LWGEOM_gist_union'
 + LANGUAGE 'C';
 +
 + CREATE OR REPLACE FUNCTION LWGEOM_gist_same(box2d, box2d, internal)
 + RETURNS internal
 + AS '$libdir/postgis-1.5' ,'LWGEOM_gist_same'
 + LANGUAGE 'C';
 +
 + CREATE OR REPLACE FUNCTION LWGEOM_gist_decompress(internal)
 + RETURNS internal
 + AS '$libdir/postgis-1.5' ,'LWGEOM_gist_decompress'
 + LANGUAGE 'C';
 +
 + -------------------------------------------
 + -- GIST opclass index binding entries.
 + -------------------------------------------
 + --
 + -- Create opclass index bindings for PG>=73
 + --
 +
 + CREATE OPERATOR CLASS gist_geometry_ops
 + DEFAULT FOR TYPE geometry USING gist AS
 + STORAGE box2d,
 + OPERATOR        1        << ,
 + OPERATOR        2        &< ,
 + OPERATOR        3        && ,
 + OPERATOR        4        &> ,
 + OPERATOR        5        >> ,
 + OPERATOR        6        ~= ,
 + OPERATOR        7        ~ ,
 + OPERATOR        8        @ ,
 + OPERATOR 9 &<| ,
 + OPERATOR 10 <<| ,
 + OPERATOR 11 |>> ,
 + OPERATOR 12 |&> ,
 + FUNCTION        1        LWGEOM_gist_consistent (internal, geometry, int4),
 + FUNCTION        2        LWGEOM_gist_union (bytea, internal),
 + FUNCTION        3        LWGEOM_gist_compress (internal),
 + FUNCTION        4        LWGEOM_gist_decompress (internal),
 + FUNCTION        5        LWGEOM_gist_penalty (internal, internal, internal),
 + FUNCTION        6        LWGEOM_gist_picksplit (internal, internal),
 + FUNCTION        7        LWGEOM_gist_same (box2d, box2d, internal);
 +
 + -------------------------------------------
 + -- other lwgeom functions
 + -------------------------------------------
 +
 + CREATE OR REPLACE FUNCTION addbbox(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_addBBOX'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION postgis_addbbox(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_addBBOX'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION dropbbox(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_dropBBOX'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION postgis_dropbbox(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_dropBBOX'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION getsrid(geometry)
 + RETURNS int4
 + AS '$libdir/postgis-1.5','LWGEOM_getSRID'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION getbbox(geometry)
 + RETURNS box2d
 + AS '$libdir/postgis-1.5','LWGEOM_to_BOX2DFLOAT4'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION postgis_getbbox(geometry)
 + RETURNS box2d
 + AS '$libdir/postgis-1.5','LWGEOM_to_BOX2DFLOAT4'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION hasbbox(geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_hasBBOX'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION postgis_hasbbox(geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_hasBBOX'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -------------------------------------------
 + --- CHIP functions
 + -------------------------------------------
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION srid(chip)
 + RETURNS int4
 + AS '$libdir/postgis-1.5','CHIP_getSRID'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_srid(chip)
 + RETURNS int4
 + AS '$libdir/postgis-1.5','CHIP_getSRID'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION height(chip)
 + RETURNS int4
 + AS '$libdir/postgis-1.5','CHIP_getHeight'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_height(chip)
 + RETURNS int4
 + AS '$libdir/postgis-1.5','CHIP_getHeight'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION factor(chip)
 + RETURNS FLOAT4
 + AS '$libdir/postgis-1.5','CHIP_getFactor'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_factor(chip)
 + RETURNS FLOAT4
 + AS '$libdir/postgis-1.5','CHIP_getFactor'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION width(chip)
 + RETURNS int4
 + AS '$libdir/postgis-1.5','CHIP_getWidth'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_width(chip)
 + RETURNS int4
 + AS '$libdir/postgis-1.5','CHIP_getWidth'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION datatype(chip)
 + RETURNS int4
 + AS '$libdir/postgis-1.5','CHIP_getDatatype'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_datatype(chip)
 + RETURNS int4
 + AS '$libdir/postgis-1.5','CHIP_getDatatype'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION compression(chip)
 + RETURNS int4
 + AS '$libdir/postgis-1.5','CHIP_getCompression'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_compression(chip)
 + RETURNS int4
 + AS '$libdir/postgis-1.5','CHIP_getCompression'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION setSRID(chip,int4)
 + RETURNS chip
 + AS '$libdir/postgis-1.5','CHIP_setSRID'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION setFactor(chip,float4)
 + RETURNS chip
 + AS '$libdir/postgis-1.5','CHIP_setFactor'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_setFactor(chip,float4)
 + RETURNS chip
 + AS '$libdir/postgis-1.5','CHIP_setFactor'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + ------------------------------------------------------------------------
 + -- DEBUG
 + ------------------------------------------------------------------------
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION mem_size(geometry)
 + RETURNS int4
 + AS '$libdir/postgis-1.5', 'LWGEOM_mem_size'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_mem_size(geometry)
 + RETURNS int4
 + AS '$libdir/postgis-1.5', 'LWGEOM_mem_size'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION summary(geometry)
 + RETURNS text
 + AS '$libdir/postgis-1.5', 'LWGEOM_summary'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_summary(geometry)
 + RETURNS text
 + AS '$libdir/postgis-1.5', 'LWGEOM_summary'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION npoints(geometry)
 + RETURNS int4
 + AS '$libdir/postgis-1.5', 'LWGEOM_npoints'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_npoints(geometry)
 + RETURNS int4
 + AS '$libdir/postgis-1.5', 'LWGEOM_npoints'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION nrings(geometry)
 + RETURNS int4
 + AS '$libdir/postgis-1.5', 'LWGEOM_nrings'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_nrings(geometry)
 + RETURNS int4
 + AS '$libdir/postgis-1.5', 'LWGEOM_nrings'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + ------------------------------------------------------------------------
 + -- Misures
 + ------------------------------------------------------------------------
 +
 + -- this is a fake (for back-compatibility)
 + -- uses 3d if 3d is available, 2d otherwise
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION length3d(geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5', 'LWGEOM_length_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_length3d(geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5', 'LWGEOM_length_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION length2d(geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5', 'LWGEOM_length2d_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_length2d(geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5', 'LWGEOM_length2d_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION length(geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5', 'LWGEOM_length_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: length2d(geometry)
 + CREATE OR REPLACE FUNCTION ST_Length(geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5', 'LWGEOM_length2d_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- this is a fake (for back-compatibility)
 + -- uses 3d if 3d is available, 2d otherwise
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION length3d_spheroid(geometry, spheroid)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','LWGEOM_length_ellipsoid_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_length3d_spheroid(geometry, spheroid)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','LWGEOM_length_ellipsoid_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION length_spheroid(geometry, spheroid)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','LWGEOM_length_ellipsoid_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_length_spheroid(geometry, spheroid)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','LWGEOM_length_ellipsoid_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION length2d_spheroid(geometry, spheroid)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','LWGEOM_length2d_ellipsoid'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_length2d_spheroid(geometry, spheroid)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','LWGEOM_length2d_ellipsoid'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- this is a fake (for back-compatibility)
 + -- uses 3d if 3d is available, 2d otherwise
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION perimeter3d(geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5', 'LWGEOM_perimeter_poly'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_perimeter3d(geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5', 'LWGEOM_perimeter_poly'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION perimeter2d(geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5', 'LWGEOM_perimeter2d_poly'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_perimeter2d(geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5', 'LWGEOM_perimeter2d_poly'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION perimeter(geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5', 'LWGEOM_perimeter_poly'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: perimeter2d(geometry)
 + CREATE OR REPLACE FUNCTION ST_Perimeter(geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5', 'LWGEOM_perimeter2d_poly'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- this is an alias for 'area(geometry)'
 + -- there is nothing such an 'area3d'...
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION area2d(geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5', 'LWGEOM_area_polygon'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + -- Deprecation in 1.3.4
 + CREATE OR REPLACE FUNCTION ST_area2d(geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5', 'LWGEOM_area_polygon'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION area(geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','LWGEOM_area_polygon'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: area(geometry)
 + CREATE OR REPLACE FUNCTION ST_Area(geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','LWGEOM_area_polygon'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION distance_spheroid(geometry,geometry,spheroid)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','LWGEOM_distance_ellipsoid'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_distance_spheroid(geometry,geometry,spheroid)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','LWGEOM_distance_ellipsoid'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION distance_sphere(geometry,geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','LWGEOM_distance_sphere'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_distance_sphere(geometry,geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5','LWGEOM_distance_sphere'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Minimum distance. 2d only.
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION distance(geometry,geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5', 'LWGEOM_mindistance2d'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- PostGIS equivalent function: distance(geometry,geometry)
 + CREATE OR REPLACE FUNCTION ST_Distance(geometry,geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5', 'LWGEOM_mindistance2d'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION point_inside_circle(geometry,float8,float8,float8)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_inside_circle_point'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_point_inside_circle(geometry,float8,float8,float8)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_inside_circle_point'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION azimuth(geometry,geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5', 'LWGEOM_azimuth'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_azimuth(geometry,geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5', 'LWGEOM_azimuth'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + ------------------------------------------------------------------------
 + -- MISC
 + ------------------------------------------------------------------------
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION force_2d(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_force_2d'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_force_2d(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_force_2d'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION force_3dz(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_force_3dz'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_force_3dz(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_force_3dz'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- an alias for force_3dz
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION force_3d(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_force_3dz'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_force_3d(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_force_3dz'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION force_3dm(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_force_3dm'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_force_3dm(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_force_3dm'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION force_4d(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_force_4d'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_force_4d(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_force_4d'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION force_collection(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_force_collection'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_force_collection(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_force_collection'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_CollectionExtract(geometry, integer)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'ST_CollectionExtract'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION multi(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_force_multi'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_multi(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_force_multi'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION expand(box3d,float8)
 + RETURNS box3d
 + AS '$libdir/postgis-1.5', 'BOX3D_expand'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_Expand(box3d,float8)
 + RETURNS box3d
 + AS '$libdir/postgis-1.5', 'BOX3D_expand'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION expand(box2d,float8)
 + RETURNS box2d
 + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_expand'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_expand(box2d,float8)
 + RETURNS box2d
 + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_expand'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION expand(geometry,float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_expand'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_expand(geometry,float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_expand'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION envelope(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_envelope'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: envelope(geometry)
 + CREATE OR REPLACE FUNCTION ST_Envelope(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_envelope'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION reverse(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_reverse'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_Reverse(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_reverse'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION ForceRHR(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_forceRHR_poly'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_ForceRHR(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_forceRHR_poly'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION noop(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_noop'
 + LANGUAGE 'C' VOLATILE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION postgis_noop(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_noop'
 + LANGUAGE 'C' VOLATILE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION zmflag(geometry)
 + RETURNS smallint
 + AS '$libdir/postgis-1.5', 'LWGEOM_zmflag'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION ST_zmflag(geometry)
 + RETURNS smallint
 + AS '$libdir/postgis-1.5', 'LWGEOM_zmflag'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION ndims(geometry)
 + RETURNS smallint
 + AS '$libdir/postgis-1.5', 'LWGEOM_ndims'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_NDims(geometry)
 + RETURNS smallint
 + AS '$libdir/postgis-1.5', 'LWGEOM_ndims'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AsEWKT(geometry)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','LWGEOM_asEWKT'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_AsEWKT(geometry)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','LWGEOM_asEWKT'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AsEWKB(geometry)
 + RETURNS BYTEA
 + AS '$libdir/postgis-1.5','WKBFromLWGEOM'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_AsEWKB(geometry)
 + RETURNS BYTEA
 + AS '$libdir/postgis-1.5','WKBFromLWGEOM'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AsHEXEWKB(geometry)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','LWGEOM_asHEXEWKB'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_AsHEXEWKB(geometry)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','LWGEOM_asHEXEWKB'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AsHEXEWKB(geometry, text)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','LWGEOM_asHEXEWKB'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_AsHEXEWKB(geometry, text)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','LWGEOM_asHEXEWKB'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AsEWKB(geometry,text)
 + RETURNS bytea
 + AS '$libdir/postgis-1.5','WKBFromLWGEOM'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_AsEWKB(geometry,text)
 + RETURNS bytea
 + AS '$libdir/postgis-1.5','WKBFromLWGEOM'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION GeomFromEWKB(bytea)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOMFromWKB'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_GeomFromEWKB(bytea)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOMFromWKB'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION GeomFromEWKT(text)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','parse_WKT_lwgeom'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_GeomFromEWKT(text)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','parse_WKT_lwgeom'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION postgis_cache_bbox()
 + RETURNS trigger
 + AS '$libdir/postgis-1.5', 'cache_bbox'
 + LANGUAGE 'C';
 +
 + ------------------------------------------------------------------------
 + -- CONSTRUCTORS
 + ------------------------------------------------------------------------
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MakePoint(float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MakePoint(float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MakePoint(float8, float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MakePoint(float8, float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MakePoint(float8, float8, float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MakePoint(float8, float8, float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MakePointM(float8, float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint3dm'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.3.4
 + CREATE OR REPLACE FUNCTION ST_MakePointM(float8, float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint3dm'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MakeBox2d(geometry, geometry)
 + RETURNS box2d
 + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_construct'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MakeBox2d(geometry, geometry)
 + RETURNS box2d
 + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_construct'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MakeBox3d(geometry, geometry)
 + RETURNS box3d
 + AS '$libdir/postgis-1.5', 'BOX3D_construct'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MakeBox3d(geometry, geometry)
 + RETURNS box3d
 + AS '$libdir/postgis-1.5', 'BOX3D_construct'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION makeline_garray (geometry[])
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makeline_garray'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MakeLine_GArray (geometry[])
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makeline_garray'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION ST_MakeLine (geometry[])
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makeline_garray'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION LineFromMultiPoint(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_line_from_mpoint'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_LineFromMultiPoint(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_line_from_mpoint'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MakeLine(geometry, geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makeline'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MakeLine(geometry, geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makeline'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AddPoint(geometry, geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_addpoint'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_AddPoint(geometry, geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_addpoint'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AddPoint(geometry, geometry, integer)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_addpoint'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_AddPoint(geometry, geometry, integer)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_addpoint'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION RemovePoint(geometry, integer)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_removepoint'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_RemovePoint(geometry, integer)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_removepoint'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION SetPoint(geometry, integer, geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_setpoint_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_SetPoint(geometry, integer, geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_setpoint_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_MakeEnvelope(float8, float8, float8, float8, integer)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'ST_MakeEnvelope'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MakePolygon(geometry, geometry[])
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makepoly'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MakePolygon(geometry, geometry[])
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makepoly'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MakePolygon(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makepoly'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MakePolygon(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makepoly'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION BuildArea(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_buildarea'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_BuildArea(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_buildarea'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION Polygonize_GArray (geometry[])
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'polygonize_garray'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION ST_Polygonize_GArray (geometry[])
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'polygonize_garray'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION ST_Polygonize (geometry[])
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'polygonize_garray'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION LineMerge(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'linemerge'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_LineMerge(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'linemerge'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 +
 + CREATE TYPE geometry_dump AS (path integer[], geom geometry);
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION Dump(geometry)
 + RETURNS SETOF geometry_dump
 + AS '$libdir/postgis-1.5', 'LWGEOM_dump'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_Dump(geometry)
 + RETURNS SETOF geometry_dump
 + AS '$libdir/postgis-1.5', 'LWGEOM_dump'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION DumpRings(geometry)
 + RETURNS SETOF geometry_dump
 + AS '$libdir/postgis-1.5', 'LWGEOM_dump_rings'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_DumpRings(geometry)
 + RETURNS SETOF geometry_dump
 + AS '$libdir/postgis-1.5', 'LWGEOM_dump_rings'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -----------------------------------------------------------------------
 + -- _ST_DumpPoints()
 + -----------------------------------------------------------------------
 + -- A helper function for ST_DumpPoints(geom)
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION _ST_DumpPoints(the_geom geometry, cur_path integer[]) RETURNS SETOF geometry_dump AS $$
 + DECLARE
 +   tmp geometry_dump;
 +   tmp2 geometry_dump;
 +   nb_points integer;
 +   nb_geom integer;
 +   i integer;
 +   j integer;
 +   g geometry;
 +   
 + BEGIN
 +   
 +   RAISE DEBUG '%,%', cur_path, ST_GeometryType(the_geom);
 +
 +   -- Special case (MULTI* OR GEOMETRYCOLLECTION) : iterate and return the DumpPoints of the geometries
 +   SELECT ST_NumGeometries(the_geom) INTO nb_geom;
 +
 +   IF (nb_geom IS NOT NULL) THEN
 +     
 +     i = 1;
 +     FOR tmp2 IN SELECT (ST_Dump(the_geom)).* LOOP
 +
 +       FOR tmp IN SELECT * FROM _ST_DumpPoints(tmp2.geom, cur_path || tmp2.path) LOOP
 +     RETURN NEXT tmp;
 +       END LOOP;
 +       i = i + 1;
 +       
 +     END LOOP;
 +
 +     RETURN;
 +   END IF;
 +   
 +
 +   -- Special case (POLYGON) : return the points of the rings of a polygon
 +   IF (ST_GeometryType(the_geom) = 'ST_Polygon') THEN
 +
 +     FOR tmp IN SELECT * FROM _ST_DumpPoints(ST_ExteriorRing(the_geom), cur_path || ARRAY[1]) LOOP
 +       RETURN NEXT tmp;
 +     END LOOP;
 +     
 +     j := ST_NumInteriorRings(the_geom);
 +     FOR i IN 1..j LOOP
 +         FOR tmp IN SELECT * FROM _ST_DumpPoints(ST_InteriorRingN(the_geom, i), cur_path || ARRAY[i+1]) LOOP
 +           RETURN NEXT tmp;
 +         END LOOP;
 +     END LOOP;
 +     
 +     RETURN;
 +   END IF;
 +
 +     
 +   -- Special case (POINT) : return the point
 +   IF (ST_GeometryType(the_geom) = 'ST_Point') THEN
 +
 +     tmp.path = cur_path || ARRAY[1];
 +     tmp.geom = the_geom;
 +
 +     RETURN NEXT tmp;
 +     RETURN;
 +
 +   END IF;
 +
 +
 +   -- Use ST_NumPoints rather than ST_NPoints to have a NULL value if the_geom isn't
 +   -- a LINESTRING or CIRCULARSTRING.
 +   SELECT ST_NumPoints(the_geom) INTO nb_points;
 +
 +   -- This should never happen
 +   IF (nb_points IS NULL) THEN
 +     RAISE EXCEPTION 'Unexpected error while dumping geometry %', ST_AsText(the_geom);
 +   END IF;
 +
 +   FOR i IN 1..nb_points LOOP
 +     tmp.path = cur_path || ARRAY[i];
 +     tmp.geom := ST_PointN(the_geom, i);
 +     RETURN NEXT tmp;
 +   END LOOP;
 +    
 + END
 + $$ LANGUAGE plpgsql;
 +
 + -----------------------------------------------------------------------
 + -- ST_DumpPoints()
 + -----------------------------------------------------------------------
 + -- This function mimicks that of ST_Dump for collections, but this function 
 + -- that returns a path and all the points that make up a particular geometry.
 + -- This current implementation in plpgsql does not scale very well at all.
 + -- and should be ported to C at some point.
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_DumpPoints(geometry) RETURNS SETOF geometry_dump AS $$
 +   SELECT * FROM _ST_DumpPoints($1, NULL);
 + $$ LANGUAGE SQL  STRICT;
 +
 +
 + ------------------------------------------------------------------------
 +
 + --
 + -- Aggregate functions
 + --
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION combine_bbox(box2d,geometry)
 + RETURNS box2d
 + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_combine'
 + LANGUAGE 'C' IMMUTABLE;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_Combine_BBox(box2d,geometry)
 + RETURNS box2d
 + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_combine'
 + LANGUAGE 'C' IMMUTABLE;
 +
 + -- Temporary hack function
 + CREATE OR REPLACE FUNCTION combine_bbox(box3d_extent,geometry)
 + RETURNS box3d_extent
 + AS '$libdir/postgis-1.5', 'BOX3D_combine'
 + LANGUAGE 'C' IMMUTABLE;
 +
 + -- Temporary hack function
 + CREATE OR REPLACE FUNCTION ST_Combine_BBox(box3d_extent,geometry)
 + RETURNS box3d_extent
 + AS '$libdir/postgis-1.5', 'BOX3D_combine'
 + LANGUAGE 'C' IMMUTABLE;
 +
 + -- Deprecation in 1.2.3
 + CREATE AGGREGATE Extent(
 + sfunc = ST_combine_bbox,
 + basetype = geometry,
 + stype = box3d_extent
 + );
 +
 + -- Availability: 1.2.2
 + CREATE AGGREGATE ST_Extent(
 + sfunc = ST_combine_bbox,
 + basetype = geometry,
 + stype = box3d_extent
 + );
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION combine_bbox(box3d,geometry)
 + RETURNS box3d
 + AS '$libdir/postgis-1.5', 'BOX3D_combine'
 + LANGUAGE 'C' IMMUTABLE;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_Combine_BBox(box3d,geometry)
 + RETURNS box3d
 + AS '$libdir/postgis-1.5', 'BOX3D_combine'
 + LANGUAGE 'C' IMMUTABLE;
 +
 + -- Deprecation in 1.2.3
 + CREATE AGGREGATE Extent3d(
 + sfunc = combine_bbox,
 + basetype = geometry,
 + stype = box3d
 + );
 +
 + -- Availability: 1.2.2
 + CREATE AGGREGATE ST_Extent3d(
 + sfunc = ST_combine_bbox,
 + basetype = geometry,
 + stype = box3d
 + );
 +
 + -----------------------------------------------------------------------
 + -- ESTIMATED_EXTENT( <schema name>, <table name>, <column name> )
 + -----------------------------------------------------------------------
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION estimated_extent(text,text,text) RETURNS box2d AS
 + '$libdir/postgis-1.5', 'LWGEOM_estimated_extent'
 + LANGUAGE 'C' IMMUTABLE STRICT SECURITY DEFINER;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_estimated_extent(text,text,text) RETURNS box2d AS
 + '$libdir/postgis-1.5', 'LWGEOM_estimated_extent'
 + LANGUAGE 'C' IMMUTABLE STRICT SECURITY DEFINER;
 +
 + -----------------------------------------------------------------------
 + -- ESTIMATED_EXTENT( <table name>, <column name> )
 + -----------------------------------------------------------------------
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION estimated_extent(text,text) RETURNS box2d AS
 + '$libdir/postgis-1.5', 'LWGEOM_estimated_extent'
 + LANGUAGE 'C' IMMUTABLE STRICT SECURITY DEFINER;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_estimated_extent(text,text) RETURNS box2d AS
 + '$libdir/postgis-1.5', 'LWGEOM_estimated_extent'
 + LANGUAGE 'C' IMMUTABLE STRICT SECURITY DEFINER;
 +
 + -----------------------------------------------------------------------
 + -- FIND_EXTENT( <schema name>, <table name>, <column name> )
 + -----------------------------------------------------------------------
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION find_extent(text,text,text) RETURNS box2d AS
 + $$
 + DECLARE
 + schemaname alias for $1;
 + tablename alias for $2;
 + columnname alias for $3;
 + myrec RECORD;
 +
 + BEGIN
 + FOR myrec IN EXECUTE 'SELECT extent("' || columnname || '") FROM "' || schemaname || '"."' || tablename || '"' LOOP
 + return myrec.extent;
 + END LOOP;
 + END;
 + $$
 + LANGUAGE 'plpgsql' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_find_extent(text,text,text) RETURNS box2d AS
 + $$
 + DECLARE
 + schemaname alias for $1;
 + tablename alias for $2;
 + columnname alias for $3;
 + myrec RECORD;
 +
 + BEGIN
 + FOR myrec IN EXECUTE 'SELECT extent("' || columnname || '") FROM "' || schemaname || '"."' || tablename || '"' LOOP
 + return myrec.extent;
 + END LOOP;
 + END;
 + $$
 + LANGUAGE 'plpgsql' IMMUTABLE STRICT;
 +
 +
 + -----------------------------------------------------------------------
 + -- FIND_EXTENT( <table name>, <column name> )
 + -----------------------------------------------------------------------
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION find_extent(text,text) RETURNS box2d AS
 + $$
 + DECLARE
 + tablename alias for $1;
 + columnname alias for $2;
 + myrec RECORD;
 +
 + BEGIN
 + FOR myrec IN EXECUTE 'SELECT extent("' || columnname || '") FROM "' || tablename || '"' LOOP
 + return myrec.extent;
 + END LOOP;
 + END;
 + $$
 + LANGUAGE 'plpgsql' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_find_extent(text,text) RETURNS box2d AS
 + $$
 + DECLARE
 + tablename alias for $1;
 + columnname alias for $2;
 + myrec RECORD;
 +
 + BEGIN
 + FOR myrec IN EXECUTE 'SELECT extent("' || columnname || '") FROM "' || tablename || '"' LOOP
 + return myrec.extent;
 + END LOOP;
 + END;
 + $$
 + LANGUAGE 'plpgsql' IMMUTABLE STRICT;
 +
 + -------------------------------------------------------------------
 + -- SPATIAL_REF_SYS
 + -------------------------------------------------------------------
 + CREATE TABLE spatial_ref_sys (
 + srid integer not null primary key,
 + auth_name varchar(256),
 + auth_srid integer,
 + srtext varchar(2048),
 + proj4text varchar(2048)
 + );
 +
 + -------------------------------------------------------------------
 + -- GEOMETRY_COLUMNS
 + -------------------------------------------------------------------
 + CREATE TABLE geometry_columns (
 + f_table_catalog varchar(256) not null,
 + f_table_schema varchar(256) not null,
 + f_table_name varchar(256) not null,
 + f_geometry_column varchar(256) not null,
 + coord_dimension integer not null,
 + srid integer not null,
 + type varchar(30) not null,
 + CONSTRAINT geometry_columns_pk primary key (
 + f_table_catalog,
 + f_table_schema,
 + f_table_name,
 + f_geometry_column )
 + ) WITH OIDS;
 +
 + -----------------------------------------------------------------------
 + -- RENAME_GEOMETRY_TABLE_CONSTRAINTS()
 + -----------------------------------------------------------------------
 + -- This function has been obsoleted for the difficulty in
 + -- finding attribute on which the constraint is applied.
 + -- AddGeometryColumn will name the constraints in a meaningful
 + -- way, but nobody can rely on it since old postgis versions did
 + -- not do that.
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION rename_geometry_table_constraints() RETURNS text
 + AS
 + $$
 + SELECT 'rename_geometry_table_constraint() is obsoleted'::text
 + $$
 + LANGUAGE 'SQL' IMMUTABLE;
 +
 + -----------------------------------------------------------------------
 + -- FIX_GEOMETRY_COLUMNS()
 + -----------------------------------------------------------------------
 + -- This function will:
 + --
 + -- o try to fix the schema of records with an integer one
 + -- (for PG>=73)
 + --
 + -- o link records to system tables through attrelid and varattnum
 + -- (for PG<75)
 + --
 + -- o delete all records for which no linking was possible
 + -- (for PG<75)
 + --
 + --
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION fix_geometry_columns() RETURNS text
 + AS
 + $$
 + DECLARE
 + mislinked record;
 + result text;
 + linked integer;
 + deleted integer;
 + foundschema integer;
 + BEGIN
 +
 + -- Since 7.3 schema support has been added.
 + -- Previous postgis versions used to put the database name in
 + -- the schema column. This needs to be fixed, so we try to
 + -- set the correct schema for each geometry_colums record
 + -- looking at table, column, type and srid.
 + UPDATE geometry_columns SET f_table_schema = n.nspname
 + FROM pg_namespace n, pg_class c, pg_attribute a,
 + pg_constraint sridcheck, pg_constraint typecheck
 + WHERE ( f_table_schema is NULL
 + OR f_table_schema = ''
 + OR f_table_schema NOT IN (
 + SELECT nspname::varchar
 + FROM pg_namespace nn, pg_class cc, pg_attribute aa
 + WHERE cc.relnamespace = nn.oid
 + AND cc.relname = f_table_name::name
 + AND aa.attrelid = cc.oid
 + AND aa.attname = f_geometry_column::name))
 + AND f_table_name::name = c.relname
 + AND c.oid = a.attrelid
 + AND c.relnamespace = n.oid
 + AND f_geometry_column::name = a.attname
 +
 + AND sridcheck.conrelid = c.oid
 + AND sridcheck.consrc LIKE '(srid(% = %)'
 + AND sridcheck.consrc ~ textcat(' = ', srid::text)
 +
 + AND typecheck.conrelid = c.oid
 + AND typecheck.consrc LIKE
 + '((geometrytype(%) = ''%''::text) OR (% IS NULL))'
 + AND typecheck.consrc ~ textcat(' = ''', type::text)
 +
 + AND NOT EXISTS (
 + SELECT oid FROM geometry_columns gc
 + WHERE c.relname::varchar = gc.f_table_name
 + AND n.nspname::varchar = gc.f_table_schema
 + AND a.attname::varchar = gc.f_geometry_column
 + );
 +
 + GET DIAGNOSTICS foundschema = ROW_COUNT;
 +
 + -- no linkage to system table needed
 + return 'fixed:'||foundschema::text;
 +
 + END;
 + $$
 + LANGUAGE 'plpgsql' VOLATILE;
 +
 + -----------------------------------------------------------------------
 + -- POPULATE_GEOMETRY_COLUMNS()
 + -----------------------------------------------------------------------
 + -- Truncates and refills the geometry_columns table from all tables and
 + -- views in the database that contain geometry columns. This function
 + -- is a simple wrapper for populate_geometry_columns(oid).  In essence,
 + -- this function ensures every geometry column in the database has the
 + -- appropriate spatial contraints (for tables) and exists in the
 + -- geometry_columns table.
 + -- Availability: 1.4.0
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION populate_geometry_columns()
 + RETURNS text AS
 + $$
 + DECLARE
 + inserted    integer;
 + oldcount    integer;
 + probed      integer;
 + stale       integer;
 + gcs         RECORD;
 + gc          RECORD;
 + gsrid       integer;
 + gndims      integer;
 + gtype       text;
 + query       text;
 + gc_is_valid boolean;
 +
 + BEGIN
 + SELECT count(*) INTO oldcount FROM geometry_columns;
 + inserted := 0;
 +
 + EXECUTE 'TRUNCATE geometry_columns';
 +
 + -- Count the number of geometry columns in all tables and views
 + SELECT count(DISTINCT c.oid) INTO probed
 + FROM pg_class c,
 + pg_attribute a,
 + pg_type t,
 + pg_namespace n
 + WHERE (c.relkind = 'r' OR c.relkind = 'v')
 + AND t.typname = 'geometry'
 + AND a.attisdropped = false
 + AND a.atttypid = t.oid
 + AND a.attrelid = c.oid
 + AND c.relnamespace = n.oid
 + AND n.nspname NOT ILIKE 'pg_temp%';
 +
 + -- Iterate through all non-dropped geometry columns
 + RAISE DEBUG 'Processing Tables.....';
 +
 + FOR gcs IN
 + SELECT DISTINCT ON (c.oid) c.oid, n.nspname, c.relname
 + FROM pg_class c,
 + pg_attribute a,
 + pg_type t,
 + pg_namespace n
 + WHERE c.relkind = 'r'
 + AND t.typname = 'geometry'
 + AND a.attisdropped = false
 + AND a.atttypid = t.oid
 + AND a.attrelid = c.oid
 + AND c.relnamespace = n.oid
 + AND n.nspname NOT ILIKE 'pg_temp%'
 + LOOP
 +
 + inserted := inserted + populate_geometry_columns(gcs.oid);
 + END LOOP;
 +
 + -- Add views to geometry columns table
 + RAISE DEBUG 'Processing Views.....';
 + FOR gcs IN
 + SELECT DISTINCT ON (c.oid) c.oid, n.nspname, c.relname
 + FROM pg_class c,
 + pg_attribute a,
 + pg_type t,
 + pg_namespace n
 + WHERE c.relkind = 'v'
 + AND t.typname = 'geometry'
 + AND a.attisdropped = false
 + AND a.atttypid = t.oid
 + AND a.attrelid = c.oid
 + AND c.relnamespace = n.oid
 + LOOP
 +
 + inserted := inserted + populate_geometry_columns(gcs.oid);
 + END LOOP;
 +
 + IF oldcount > inserted THEN
 + stale = oldcount-inserted;
 + ELSE
 + stale = 0;
 + END IF;
 +
 + RETURN 'probed:' ||probed|| ' inserted:'||inserted|| ' conflicts:'||probed-inserted|| ' deleted:'||stale;
 + END
 +
 + $$
 + LANGUAGE 'plpgsql' VOLATILE;
 +
 + -----------------------------------------------------------------------
 + -- POPULATE_GEOMETRY_COLUMNS(tbl_oid oid)
 + -----------------------------------------------------------------------
 + -- DELETEs from and reINSERTs into the geometry_columns table all entries
 + -- associated with the oid of a particular table or view.
 + --
 + -- If the provided oid is for a table, this function tries to determine
 + -- the srid, dimension, and geometry type of the all geometries
 + -- in the table, adding contraints as necessary to the table.  If
 + -- successful, an appropriate row is inserted into the geometry_columns
 + -- table, otherwise, the exception is caught and an error notice is
 + -- raised describing the problem. (This is so the wrapper function
 + -- populate_geometry_columns() can apply spatial constraints to all
 + -- geometry columns across an entire database at once without erroring
 + -- out)
 + --
 + -- If the provided oid is for a view, as with a table oid, this function
 + -- tries to determine the srid, dimension, and type of all the geometries
 + -- in the view, inserting appropriate entries into the geometry_columns
 + -- table.
 + -- Availability: 1.4.0
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION populate_geometry_columns(tbl_oid oid)
 + RETURNS integer AS
 + $$
 + DECLARE
 + gcs         RECORD;
 + gc          RECORD;
 + gsrid       integer;
 + gndims      integer;
 + gtype       text;
 + query       text;
 + gc_is_valid boolean;
 + inserted    integer;
 +
 + BEGIN
 + inserted := 0;
 +
 + -- Iterate through all geometry columns in this table
 + FOR gcs IN
 + SELECT n.nspname, c.relname, a.attname
 + FROM pg_class c,
 + pg_attribute a,
 + pg_type t,
 + pg_namespace n
 + WHERE c.relkind = 'r'
 + AND t.typname = 'geometry'
 + AND a.attisdropped = false
 + AND a.atttypid = t.oid
 + AND a.attrelid = c.oid
 + AND c.relnamespace = n.oid
 + AND n.nspname NOT ILIKE 'pg_temp%'
 + AND c.oid = tbl_oid
 + LOOP
 +
 + RAISE DEBUG 'Processing table %.%.%', gcs.nspname, gcs.relname, gcs.attname;
 +
 + DELETE FROM geometry_columns
 +   WHERE f_table_schema = gcs.nspname
 +   AND f_table_name = gcs.relname
 +   AND f_geometry_column = gcs.attname;
 +
 + gc_is_valid := true;
 +
 + -- Try to find srid check from system tables (pg_constraint)
 + gsrid :=
 + (SELECT replace(replace(split_part(s.consrc, ' = ', 2), ')', ''), '(', '')
 + FROM pg_class c, pg_namespace n, pg_attribute a, pg_constraint s
 + WHERE n.nspname = gcs.nspname
 + AND c.relname = gcs.relname
 + AND a.attname = gcs.attname
 + AND a.attrelid = c.oid
 + AND s.connamespace = n.oid
 + AND s.conrelid = c.oid
 + AND a.attnum = ANY (s.conkey)
 + AND s.consrc LIKE '%srid(% = %');
 + IF (gsrid IS NULL) THEN
 + -- Try to find srid from the geometry itself
 + EXECUTE 'SELECT srid(' || quote_ident(gcs.attname) || ')
 + FROM ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || '
 + WHERE ' || quote_ident(gcs.attname) || ' IS NOT NULL LIMIT 1'
 + INTO gc;
 + gsrid := gc.srid;
 +
 + -- Try to apply srid check to column
 + IF (gsrid IS NOT NULL) THEN
 + BEGIN
 + EXECUTE 'ALTER TABLE ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || '
 + ADD CONSTRAINT ' || quote_ident('enforce_srid_' || gcs.attname) || '
 + CHECK (srid(' || quote_ident(gcs.attname) || ') = ' || gsrid || ')';
 + EXCEPTION
 + WHEN check_violation THEN
 + RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not apply constraint CHECK (srid(%) = %)', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname), quote_ident(gcs.attname), gsrid;
 + gc_is_valid := false;
 + END;
 + END IF;
 + END IF;
 +
 + -- Try to find ndims check from system tables (pg_constraint)
 + gndims :=
 + (SELECT replace(split_part(s.consrc, ' = ', 2), ')', '')
 + FROM pg_class c, pg_namespace n, pg_attribute a, pg_constraint s
 + WHERE n.nspname = gcs.nspname
 + AND c.relname = gcs.relname
 + AND a.attname = gcs.attname
 + AND a.attrelid = c.oid
 + AND s.connamespace = n.oid
 + AND s.conrelid = c.oid
 + AND a.attnum = ANY (s.conkey)
 + AND s.consrc LIKE '%ndims(% = %');
 + IF (gndims IS NULL) THEN
 + -- Try to find ndims from the geometry itself
 + EXECUTE 'SELECT ndims(' || quote_ident(gcs.attname) || ')
 + FROM ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || '
 + WHERE ' || quote_ident(gcs.attname) || ' IS NOT NULL LIMIT 1'
 + INTO gc;
 + gndims := gc.ndims;
 +
 + -- Try to apply ndims check to column
 + IF (gndims IS NOT NULL) THEN
 + BEGIN
 + EXECUTE 'ALTER TABLE ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || '
 + ADD CONSTRAINT ' || quote_ident('enforce_dims_' || gcs.attname) || '
 + CHECK (ndims(' || quote_ident(gcs.attname) || ') = '||gndims||')';
 + EXCEPTION
 + WHEN check_violation THEN
 + RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not apply constraint CHECK (ndims(%) = %)', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname), quote_ident(gcs.attname), gndims;
 + gc_is_valid := false;
 + END;
 + END IF;
 + END IF;
 +
 + -- Try to find geotype check from system tables (pg_constraint)
 + gtype :=
 + (SELECT replace(split_part(s.consrc, '''', 2), ')', '')
 + FROM pg_class c, pg_namespace n, pg_attribute a, pg_constraint s
 + WHERE n.nspname = gcs.nspname
 + AND c.relname = gcs.relname
 + AND a.attname = gcs.attname
 + AND a.attrelid = c.oid
 + AND s.connamespace = n.oid
 + AND s.conrelid = c.oid
 + AND a.attnum = ANY (s.conkey)
 + AND s.consrc LIKE '%geometrytype(% = %');
 + IF (gtype IS NULL) THEN
 + -- Try to find geotype from the geometry itself
 + EXECUTE 'SELECT geometrytype(' || quote_ident(gcs.attname) || ')
 + FROM ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || '
 + WHERE ' || quote_ident(gcs.attname) || ' IS NOT NULL LIMIT 1'
 + INTO gc;
 + gtype := gc.geometrytype;
 + --IF (gtype IS NULL) THEN
 + --    gtype := 'GEOMETRY';
 + --END IF;
 +
 + -- Try to apply geometrytype check to column
 + IF (gtype IS NOT NULL) THEN
 + BEGIN
 + EXECUTE 'ALTER TABLE ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || '
 + ADD CONSTRAINT ' || quote_ident('enforce_geotype_' || gcs.attname) || '
 + CHECK ((geometrytype(' || quote_ident(gcs.attname) || ') = ' || quote_literal(gtype) || ') OR (' || quote_ident(gcs.attname) || ' IS NULL))';
 + EXCEPTION
 + WHEN check_violation THEN
 + -- No geometry check can be applied. This column contains a number of geometry types.
 + RAISE WARNING 'Could not add geometry type check (%) to table column: %.%.%', gtype, quote_ident(gcs.nspname),quote_ident(gcs.relname),quote_ident(gcs.attname);
 + END;
 + END IF;
 + END IF;
 +
 + IF (gsrid IS NULL) THEN
 + RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not determine the srid', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname);
 + ELSIF (gndims IS NULL) THEN
 + RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not determine the number of dimensions', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname);
 + ELSIF (gtype IS NULL) THEN
 + RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not determine the geometry type', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname);
 + ELSE
 + -- Only insert into geometry_columns if table constraints could be applied.
 + IF (gc_is_valid) THEN
 + INSERT INTO geometry_columns (f_table_catalog,f_table_schema, f_table_name, f_geometry_column, coord_dimension, srid, type)
 + VALUES ('', gcs.nspname, gcs.relname, gcs.attname, gndims, gsrid, gtype);
 + inserted := inserted + 1;
 + END IF;
 + END IF;
 + END LOOP;
 +
 + -- Add views to geometry columns table
 + FOR gcs IN
 + SELECT n.nspname, c.relname, a.attname
 + FROM pg_class c,
 + pg_attribute a,
 + pg_type t,
 + pg_namespace n
 + WHERE c.relkind = 'v'
 + AND t.typname = 'geometry'
 + AND a.attisdropped = false
 + AND a.atttypid = t.oid
 + AND a.attrelid = c.oid
 + AND c.relnamespace = n.oid
 + AND n.nspname NOT ILIKE 'pg_temp%'
 + AND c.oid = tbl_oid
 + LOOP
 + RAISE DEBUG 'Processing view %.%.%', gcs.nspname, gcs.relname, gcs.attname;
 +
 + DELETE FROM geometry_columns
 +   WHERE f_table_schema = gcs.nspname
 +   AND f_table_name = gcs.relname
 +   AND f_geometry_column = gcs.attname;
 +   
 + EXECUTE 'SELECT ndims(' || quote_ident(gcs.attname) || ')
 + FROM ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || '
 + WHERE ' || quote_ident(gcs.attname) || ' IS NOT NULL LIMIT 1'
 + INTO gc;
 + gndims := gc.ndims;
 +
 + EXECUTE 'SELECT srid(' || quote_ident(gcs.attname) || ')
 + FROM ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || '
 + WHERE ' || quote_ident(gcs.attname) || ' IS NOT NULL LIMIT 1'
 + INTO gc;
 + gsrid := gc.srid;
 +
 + EXECUTE 'SELECT geometrytype(' || quote_ident(gcs.attname) || ')
 + FROM ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || '
 + WHERE ' || quote_ident(gcs.attname) || ' IS NOT NULL LIMIT 1'
 + INTO gc;
 + gtype := gc.geometrytype;
 +
 + IF (gndims IS NULL) THEN
 + RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not determine ndims', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname);
 + ELSIF (gsrid IS NULL) THEN
 + RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not determine srid', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname);
 + ELSIF (gtype IS NULL) THEN
 + RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not determine gtype', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname);
 + ELSE
 + query := 'INSERT INTO geometry_columns (f_table_catalog,f_table_schema, f_table_name, f_geometry_column, coord_dimension, srid, type) ' ||
 + 'VALUES ('''', ' || quote_literal(gcs.nspname) || ',' || quote_literal(gcs.relname) || ',' || quote_literal(gcs.attname) || ',' || gndims || ',' || gsrid || ',' || quote_literal(gtype) || ')';
 + EXECUTE query;
 + inserted := inserted + 1;
 + END IF;
 + END LOOP;
 +
 + RETURN inserted;
 + END
 +
 + $$
 + LANGUAGE 'plpgsql' VOLATILE;
 +
 +
 + -----------------------------------------------------------------------
 + -- PROBE_GEOMETRY_COLUMNS()
 + -----------------------------------------------------------------------
 + -- Fill the geometry_columns table with values probed from the system
 + -- catalogues. This is done by simply looking up constraints previously
 + -- added to a geometry column. If geometry constraints are missing, no
 + -- attempt is made to add the necessary constraints to the geometry
 + -- column, nor is it recorded in the geometry_columns table.
 + -- 3d flag cannot be probed, it defaults to 2
 + --
 + -- Note that bogus records already in geometry_columns are not
 + -- overridden (a check for schema.table.column is performed), so
 + -- to have a fresh probe backup your geometry_columns, delete from
 + -- it and probe.
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION probe_geometry_columns() RETURNS text AS
 + $$
 + DECLARE
 + inserted integer;
 + oldcount integer;
 + probed integer;
 + stale integer;
 + BEGIN
 +
 + SELECT count(*) INTO oldcount FROM geometry_columns;
 +
 + SELECT count(*) INTO probed
 + FROM pg_class c, pg_attribute a, pg_type t,
 + pg_namespace n,
 + pg_constraint sridcheck, pg_constraint typecheck
 +
 + WHERE t.typname = 'geometry'
 + AND a.atttypid = t.oid
 + AND a.attrelid = c.oid
 + AND c.relnamespace = n.oid
 + AND sridcheck.connamespace = n.oid
 + AND typecheck.connamespace = n.oid
 + AND sridcheck.conrelid = c.oid
 + AND sridcheck.consrc LIKE '(srid('||a.attname||') = %)'
 + AND typecheck.conrelid = c.oid
 + AND typecheck.consrc LIKE
 + '((geometrytype('||a.attname||') = ''%''::text) OR (% IS NULL))'
 + ;
 +
 + INSERT INTO geometry_columns SELECT
 + ''::varchar as f_table_catalogue,
 + n.nspname::varchar as f_table_schema,
 + c.relname::varchar as f_table_name,
 + a.attname::varchar as f_geometry_column,
 + 2 as coord_dimension,
 + trim(both  ' =)' from
 + replace(replace(split_part(
 + sridcheck.consrc, ' = ', 2), ')', ''), '(', ''))::integer AS srid,
 + trim(both ' =)''' from substr(typecheck.consrc,
 + strpos(typecheck.consrc, '='),
 + strpos(typecheck.consrc, '::')-
 + strpos(typecheck.consrc, '=')
 + ))::varchar as type
 + FROM pg_class c, pg_attribute a, pg_type t,
 + pg_namespace n,
 + pg_constraint sridcheck, pg_constraint typecheck
 + WHERE t.typname = 'geometry'
 + AND a.atttypid = t.oid
 + AND a.attrelid = c.oid
 + AND c.relnamespace = n.oid
 + AND sridcheck.connamespace = n.oid
 + AND typecheck.connamespace = n.oid
 + AND sridcheck.conrelid = c.oid
 + AND sridcheck.consrc LIKE '(st_srid('||a.attname||') = %)'
 + AND typecheck.conrelid = c.oid
 + AND typecheck.consrc LIKE
 + '((geometrytype('||a.attname||') = ''%''::text) OR (% IS NULL))'
 +
 + AND NOT EXISTS (
 + SELECT oid FROM geometry_columns gc
 + WHERE c.relname::varchar = gc.f_table_name
 + AND n.nspname::varchar = gc.f_table_schema
 + AND a.attname::varchar = gc.f_geometry_column
 + );
 +
 + GET DIAGNOSTICS inserted = ROW_COUNT;
 +
 + IF oldcount > probed THEN
 + stale = oldcount-probed;
 + ELSE
 + stale = 0;
 + END IF;
 +
 + RETURN 'probed:'||probed::text||
 + ' inserted:'||inserted::text||
 + ' conflicts:'||(probed-inserted)::text||
 + ' stale:'||stale::text;
 + END
 +
 + $$
 + LANGUAGE 'plpgsql' VOLATILE;
 +
 + -----------------------------------------------------------------------
 + -- ADDGEOMETRYCOLUMN
 + --   <catalogue>, <schema>, <table>, <column>, <srid>, <type>, <dim>
 + -----------------------------------------------------------------------
 + --
 + -- Type can be one of GEOMETRY, GEOMETRYCOLLECTION, POINT, MULTIPOINT, POLYGON,
 + -- MULTIPOLYGON, LINESTRING, or MULTILINESTRING.
 + --
 + -- Geometry types (except GEOMETRY) are checked for consistency using a CHECK constraint.
 + -- Uses an ALTER TABLE command to add the geometry column to the table.
 + -- Addes a row to geometry_columns.
 + -- Addes a constraint on the table that all the geometries MUST have the same
 + -- SRID. Checks the coord_dimension to make sure its between 0 and 3.
 + -- Should also check the precision grid (future expansion).
 + --
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION AddGeometryColumn(varchar,varchar,varchar,varchar,integer,varchar,integer)
 + RETURNS text
 + AS
 + $$
 + DECLARE
 + catalog_name alias for $1;
 + schema_name alias for $2;
 + table_name alias for $3;
 + column_name alias for $4;
 + new_srid alias for $5;
 + new_type alias for $6;
 + new_dim alias for $7;
 + rec RECORD;
 + sr varchar;
 + real_schema name;
 + sql text;
 +
 + BEGIN
 +
 + -- Verify geometry type
 + IF ( NOT ( (new_type = 'GEOMETRY') OR
 +    (new_type = 'GEOMETRYCOLLECTION') OR
 +    (new_type = 'POINT') OR
 +    (new_type = 'MULTIPOINT') OR
 +    (new_type = 'POLYGON') OR
 +    (new_type = 'MULTIPOLYGON') OR
 +    (new_type = 'LINESTRING') OR
 +    (new_type = 'MULTILINESTRING') OR
 +    (new_type = 'GEOMETRYCOLLECTIONM') OR
 +    (new_type = 'POINTM') OR
 +    (new_type = 'MULTIPOINTM') OR
 +    (new_type = 'POLYGONM') OR
 +    (new_type = 'MULTIPOLYGONM') OR
 +    (new_type = 'LINESTRINGM') OR
 +    (new_type = 'MULTILINESTRINGM') OR
 +    (new_type = 'CIRCULARSTRING') OR
 +    (new_type = 'CIRCULARSTRINGM') OR
 +    (new_type = 'COMPOUNDCURVE') OR
 +    (new_type = 'COMPOUNDCURVEM') OR
 +    (new_type = 'CURVEPOLYGON') OR
 +    (new_type = 'CURVEPOLYGONM') OR
 +    (new_type = 'MULTICURVE') OR
 +    (new_type = 'MULTICURVEM') OR
 +    (new_type = 'MULTISURFACE') OR
 +    (new_type = 'MULTISURFACEM')) )
 + THEN
 + RAISE EXCEPTION 'Invalid type name - valid ones are:
 + POINT, MULTIPOINT,
 + LINESTRING, MULTILINESTRING,
 + POLYGON, MULTIPOLYGON,
 + CIRCULARSTRING, COMPOUNDCURVE, MULTICURVE,
 + CURVEPOLYGON, MULTISURFACE,
 + GEOMETRY, GEOMETRYCOLLECTION,
 + POINTM, MULTIPOINTM,
 + LINESTRINGM, MULTILINESTRINGM,
 + POLYGONM, MULTIPOLYGONM,
 + CIRCULARSTRINGM, COMPOUNDCURVEM, MULTICURVEM
 + CURVEPOLYGONM, MULTISURFACEM,
 + or GEOMETRYCOLLECTIONM';
 + RETURN 'fail';
 + END IF;
 +
 +
 + -- Verify dimension
 + IF ( (new_dim >4) OR (new_dim <0) ) THEN
 + RAISE EXCEPTION 'invalid dimension';
 + RETURN 'fail';
 + END IF;
 +
 + IF ( (new_type LIKE '%M') AND (new_dim!=3) ) THEN
 + RAISE EXCEPTION 'TypeM needs 3 dimensions';
 + RETURN 'fail';
 + END IF;
 +
 +
 + -- Verify SRID
 + IF ( new_srid != -1 ) THEN
 + SELECT SRID INTO sr FROM spatial_ref_sys WHERE SRID = new_srid;
 + IF NOT FOUND THEN
 + RAISE EXCEPTION 'AddGeometryColumns() - invalid SRID';
 + RETURN 'fail';
 + END IF;
 + END IF;
 +
 +
 + -- Verify schema
 + IF ( schema_name IS NOT NULL AND schema_name != '' ) THEN
 + sql := 'SELECT nspname FROM pg_namespace ' ||
 + 'WHERE text(nspname) = ' || quote_literal(schema_name) ||
 + 'LIMIT 1';
 + RAISE DEBUG '%', sql;
 + EXECUTE sql INTO real_schema;
 +
 + IF ( real_schema IS NULL ) THEN
 + RAISE EXCEPTION 'Schema % is not a valid schemaname', quote_literal(schema_name);
 + RETURN 'fail';
 + END IF;
 + END IF;
 +
 + IF ( real_schema IS NULL ) THEN
 + RAISE DEBUG 'Detecting schema';
 + sql := 'SELECT n.nspname AS schemaname ' ||
 + 'FROM pg_catalog.pg_class c ' ||
 +   'JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace ' ||
 + 'WHERE c.relkind = ' || quote_literal('r') ||
 + ' AND n.nspname NOT IN (' || quote_literal('pg_catalog') || ', ' || quote_literal('pg_toast') || ')' ||
 + ' AND pg_catalog.pg_table_is_visible(c.oid)' ||
 + ' AND c.relname = ' || quote_literal(table_name);
 + RAISE DEBUG '%', sql;
 + EXECUTE sql INTO real_schema;
 +
 + IF ( real_schema IS NULL ) THEN
 + RAISE EXCEPTION 'Table % does not occur in the search_path', quote_literal(table_name);
 + RETURN 'fail';
 + END IF;
 + END IF;
 +
 +
 + -- Add geometry column to table
 + sql := 'ALTER TABLE ' ||
 + quote_ident(real_schema) || '.' || quote_ident(table_name)
 + || ' ADD COLUMN ' || quote_ident(column_name) ||
 + ' geometry ';
 + RAISE DEBUG '%', sql;
 + EXECUTE sql;
 +
 +
 + -- Delete stale record in geometry_columns (if any)
 + sql := 'DELETE FROM geometry_columns WHERE
 + f_table_catalog = ' || quote_literal('') ||
 + ' AND f_table_schema = ' ||
 + quote_literal(real_schema) ||
 + ' AND f_table_name = ' || quote_literal(table_name) ||
 + ' AND f_geometry_column = ' || quote_literal(column_name);
 + RAISE DEBUG '%', sql;
 + EXECUTE sql;
 +
 +
 + -- Add record in geometry_columns
 + sql := 'INSERT INTO geometry_columns (f_table_catalog,f_table_schema,f_table_name,' ||
 +   'f_geometry_column,coord_dimension,srid,type)' ||
 + ' VALUES (' ||
 + quote_literal('') || ',' ||
 + quote_literal(real_schema) || ',' ||
 + quote_literal(table_name) || ',' ||
 + quote_literal(column_name) || ',' ||
 + new_dim::text || ',' ||
 + new_srid::text || ',' ||
 + quote_literal(new_type) || ')';
 + RAISE DEBUG '%', sql;
 + EXECUTE sql;
 +
 +
 + -- Add table CHECKs
 + sql := 'ALTER TABLE ' ||
 + quote_ident(real_schema) || '.' || quote_ident(table_name)
 + || ' ADD CONSTRAINT '
 + || quote_ident('enforce_srid_' || column_name)
 + || ' CHECK (ST_SRID(' || quote_ident(column_name) ||
 + ') = ' || new_srid::text || ')' ;
 + RAISE DEBUG '%', sql;
 + EXECUTE sql;
 +
 + sql := 'ALTER TABLE ' ||
 + quote_ident(real_schema) || '.' || quote_ident(table_name)
 + || ' ADD CONSTRAINT '
 + || quote_ident('enforce_dims_' || column_name)
 + || ' CHECK (ST_NDims(' || quote_ident(column_name) ||
 + ') = ' || new_dim::text || ')' ;
 + RAISE DEBUG '%', sql;
 + EXECUTE sql;
 +
 + IF ( NOT (new_type = 'GEOMETRY')) THEN
 + sql := 'ALTER TABLE ' ||
 + quote_ident(real_schema) || '.' || quote_ident(table_name) || ' ADD CONSTRAINT ' ||
 + quote_ident('enforce_geotype_' || column_name) ||
 + ' CHECK (GeometryType(' ||
 + quote_ident(column_name) || ')=' ||
 + quote_literal(new_type) || ' OR (' ||
 + quote_ident(column_name) || ') is null)';
 + RAISE DEBUG '%', sql;
 + EXECUTE sql;
 + END IF;
 +
 + RETURN
 + real_schema || '.' ||
 + table_name || '.' || column_name ||
 + ' SRID:' || new_srid::text ||
 + ' TYPE:' || new_type ||
 + ' DIMS:' || new_dim::text || ' ';
 + END;
 + $$
 + LANGUAGE 'plpgsql' VOLATILE STRICT;
 +
 + ----------------------------------------------------------------------------
 + -- ADDGEOMETRYCOLUMN ( <schema>, <table>, <column>, <srid>, <type>, <dim> )
 + ----------------------------------------------------------------------------
 + --
 + -- This is a wrapper to the real AddGeometryColumn, for use
 + -- when catalogue is undefined
 + --
 + ----------------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION AddGeometryColumn(varchar,varchar,varchar,integer,varchar,integer) RETURNS text AS $$
 + DECLARE
 + ret  text;
 + BEGIN
 + SELECT AddGeometryColumn('',$1,$2,$3,$4,$5,$6) into ret;
 + RETURN ret;
 + END;
 + $$
 + LANGUAGE 'plpgsql' STABLE STRICT;
 +
 + ----------------------------------------------------------------------------
 + -- ADDGEOMETRYCOLUMN ( <table>, <column>, <srid>, <type>, <dim> )
 + ----------------------------------------------------------------------------
 + --
 + -- This is a wrapper to the real AddGeometryColumn, for use
 + -- when catalogue and schema are undefined
 + --
 + ----------------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION AddGeometryColumn(varchar,varchar,integer,varchar,integer) RETURNS text AS $$
 + DECLARE
 + ret  text;
 + BEGIN
 + SELECT AddGeometryColumn('','',$1,$2,$3,$4,$5) into ret;
 + RETURN ret;
 + END;
 + $$
 + LANGUAGE 'plpgsql' VOLATILE STRICT;
 +
 + -----------------------------------------------------------------------
 + -- DROPGEOMETRYCOLUMN
 + --   <catalogue>, <schema>, <table>, <column>
 + -----------------------------------------------------------------------
 + --
 + -- Removes geometry column reference from geometry_columns table.
 + -- Drops the column with pgsql >= 73.
 + -- Make some silly enforcements on it for pgsql < 73
 + --
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION DropGeometryColumn(varchar, varchar,varchar,varchar)
 + RETURNS text
 + AS
 + $$
 + DECLARE
 + catalog_name alias for $1;
 + schema_name alias for $2;
 + table_name alias for $3;
 + column_name alias for $4;
 + myrec RECORD;
 + okay boolean;
 + real_schema name;
 +
 + BEGIN
 +
 +
 + -- Find, check or fix schema_name
 + IF ( schema_name != '' ) THEN
 + okay = 'f';
 +
 + FOR myrec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP
 + okay := 't';
 + END LOOP;
 +
 + IF ( okay <> 't' ) THEN
 + RAISE NOTICE 'Invalid schema name - using current_schema()';
 + SELECT current_schema() into real_schema;
 + ELSE
 + real_schema = schema_name;
 + END IF;
 + ELSE
 + SELECT current_schema() into real_schema;
 + END IF;
 +
 + -- Find out if the column is in the geometry_columns table
 + okay = 'f';
 + 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
 + okay := 't';
 + END LOOP;
 + IF (okay <> 't') THEN
 + RAISE EXCEPTION 'column not found in geometry_columns table';
 + RETURN 'f';
 + END IF;
 +
 + -- Remove ref from geometry_columns table
 + EXECUTE 'delete from geometry_columns where f_table_schema = ' ||
 + quote_literal(real_schema) || ' and f_table_name = ' ||
 + quote_literal(table_name)  || ' and f_geometry_column = ' ||
 + quote_literal(column_name);
 +
 + -- Remove table column
 + EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) || '.' ||
 + quote_ident(table_name) || ' DROP COLUMN ' ||
 + quote_ident(column_name);
 +
 + RETURN real_schema || '.' || table_name || '.' || column_name ||' effectively removed.';
 +
 + END;
 + $$
 + LANGUAGE 'plpgsql' VOLATILE STRICT;
 +
 + -----------------------------------------------------------------------
 + -- DROPGEOMETRYCOLUMN
 + --   <schema>, <table>, <column>
 + -----------------------------------------------------------------------
 + --
 + -- This is a wrapper to the real DropGeometryColumn, for use
 + -- when catalogue is undefined
 + --
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION DropGeometryColumn(varchar,varchar,varchar)
 + RETURNS text
 + AS
 + $$
 + DECLARE
 + ret text;
 + BEGIN
 + SELECT DropGeometryColumn('',$1,$2,$3) into ret;
 + RETURN ret;
 + END;
 + $$
 + LANGUAGE 'plpgsql' VOLATILE STRICT;
 +
 + -----------------------------------------------------------------------
 + -- DROPGEOMETRYCOLUMN
 + --   <table>, <column>
 + -----------------------------------------------------------------------
 + --
 + -- This is a wrapper to the real DropGeometryColumn, for use
 + -- when catalogue and schema is undefined.
 + --
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION DropGeometryColumn(varchar,varchar)
 + RETURNS text
 + AS
 + $$
 + DECLARE
 + ret text;
 + BEGIN
 + SELECT DropGeometryColumn('','',$1,$2) into ret;
 + RETURN ret;
 + END;
 + $$
 + LANGUAGE 'plpgsql' VOLATILE STRICT;
 +
 + -----------------------------------------------------------------------
 + -- DROPGEOMETRYTABLE
 + --   <catalogue>, <schema>, <table>
 + -----------------------------------------------------------------------
 + --
 + -- Drop a table and all its references in geometry_columns
 + --
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION DropGeometryTable(varchar, varchar,varchar)
 + RETURNS text
 + AS
 + $$
 + DECLARE
 + catalog_name alias for $1;
 + schema_name alias for $2;
 + table_name alias for $3;
 + real_schema name;
 +
 + BEGIN
 +
 + IF ( schema_name = '' ) THEN
 + SELECT current_schema() into real_schema;
 + ELSE
 + real_schema = schema_name;
 + END IF;
 +
 + -- Remove refs from geometry_columns table
 + EXECUTE 'DELETE FROM geometry_columns WHERE ' ||
 + 'f_table_schema = ' || quote_literal(real_schema) ||
 + ' AND ' ||
 + ' f_table_name = ' || quote_literal(table_name);
 +
 + -- Remove table
 + EXECUTE 'DROP TABLE '
 + || quote_ident(real_schema) || '.' ||
 + quote_ident(table_name);
 +
 + RETURN
 + real_schema || '.' ||
 + table_name ||' dropped.';
 +
 + END;
 + $$
 + LANGUAGE 'plpgsql' VOLATILE STRICT;
 +
 + -----------------------------------------------------------------------
 + -- DROPGEOMETRYTABLE
 + --   <schema>, <table>
 + -----------------------------------------------------------------------
 + --
 + -- Drop a table and all its references in geometry_columns
 + --
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION DropGeometryTable(varchar,varchar) RETURNS text AS
 + $$ SELECT DropGeometryTable('',$1,$2) $$
 + LANGUAGE 'sql' WITH (isstrict);
 +
 + -----------------------------------------------------------------------
 + -- DROPGEOMETRYTABLE
 + --   <table>
 + -----------------------------------------------------------------------
 + --
 + -- Drop a table and all its references in geometry_columns
 + -- For PG>=73 use current_schema()
 + --
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION DropGeometryTable(varchar) RETURNS text AS
 + $$ SELECT DropGeometryTable('','',$1) $$
 + LANGUAGE 'sql' VOLATILE STRICT;
 +
 + -----------------------------------------------------------------------
 + -- UPDATEGEOMETRYSRID
 + --   <catalogue>, <schema>, <table>, <column>, <srid>
 + -----------------------------------------------------------------------
 + --
 + -- Change SRID of all features in a spatially-enabled table
 + --
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION UpdateGeometrySRID(varchar,varchar,varchar,varchar,integer)
 + RETURNS text
 + AS
 + $$
 + DECLARE
 + catalog_name alias for $1;
 + schema_name alias for $2;
 + table_name alias for $3;
 + column_name alias for $4;
 + new_srid alias for $5;
 + myrec RECORD;
 + okay boolean;
 + cname varchar;
 + real_schema name;
 +
 + BEGIN
 +
 +
 + -- Find, check or fix schema_name
 + IF ( schema_name != '' ) THEN
 + okay = 'f';
 +
 + FOR myrec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP
 + okay := 't';
 + END LOOP;
 +
 + IF ( okay <> 't' ) THEN
 + RAISE EXCEPTION 'Invalid schema name';
 + ELSE
 + real_schema = schema_name;
 + END IF;
 + ELSE
 + SELECT INTO real_schema current_schema()::text;
 + END IF;
 +
 + -- Find out if the column is in the geometry_columns table
 + okay = 'f';
 + 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
 + okay := 't';
 + END LOOP;
 + IF (okay <> 't') THEN
 + RAISE EXCEPTION 'column not found in geometry_columns table';
 + RETURN 'f';
 + END IF;
 +
 + -- Update ref from geometry_columns table
 + EXECUTE 'UPDATE geometry_columns SET SRID = ' || new_srid::text ||
 + ' where f_table_schema = ' ||
 + quote_literal(real_schema) || ' and f_table_name = ' ||
 + quote_literal(table_name)  || ' and f_geometry_column = ' ||
 + quote_literal(column_name);
 +
 + -- Make up constraint name
 + cname = 'enforce_srid_'  || column_name;
 +
 + -- Drop enforce_srid constraint
 + EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) ||
 + '.' || quote_ident(table_name) ||
 + ' DROP constraint ' || quote_ident(cname);
 +
 + -- Update geometries SRID
 + EXECUTE 'UPDATE ' || quote_ident(real_schema) ||
 + '.' || quote_ident(table_name) ||
 + ' SET ' || quote_ident(column_name) ||
 + ' = setSRID(' || quote_ident(column_name) ||
 + ', ' || new_srid::text || ')';
 +
 + -- Reset enforce_srid constraint
 + EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) ||
 + '.' || quote_ident(table_name) ||
 + ' ADD constraint ' || quote_ident(cname) ||
 + ' CHECK (srid(' || quote_ident(column_name) ||
 + ') = ' || new_srid::text || ')';
 +
 + RETURN real_schema || '.' || table_name || '.' || column_name ||' SRID changed to ' || new_srid::text;
 +
 + END;
 + $$
 + LANGUAGE 'plpgsql' VOLATILE STRICT;
 +
 + -----------------------------------------------------------------------
 + -- UPDATEGEOMETRYSRID
 + --   <schema>, <table>, <column>, <srid>
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION UpdateGeometrySRID(varchar,varchar,varchar,integer)
 + RETURNS text
 + AS $$
 + DECLARE
 + ret  text;
 + BEGIN
 + SELECT UpdateGeometrySRID('',$1,$2,$3,$4) into ret;
 + RETURN ret;
 + END;
 + $$
 + LANGUAGE 'plpgsql' VOLATILE STRICT;
 +
 + -----------------------------------------------------------------------
 + -- UPDATEGEOMETRYSRID
 + --   <table>, <column>, <srid>
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION UpdateGeometrySRID(varchar,varchar,integer)
 + RETURNS text
 + AS $$
 + DECLARE
 + ret  text;
 + BEGIN
 + SELECT UpdateGeometrySRID('','',$1,$2,$3) into ret;
 + RETURN ret;
 + END;
 + $$
 + LANGUAGE 'plpgsql' VOLATILE STRICT;
 +
 + -----------------------------------------------------------------------
 + -- FIND_SRID( <schema>, <table>, <geom col> )
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION find_srid(varchar,varchar,varchar) RETURNS int4 AS
 + $$
 + DECLARE
 + schem text;
 + tabl text;
 + sr int4;
 + BEGIN
 + IF $1 IS NULL THEN
 +   RAISE EXCEPTION 'find_srid() - schema is NULL!';
 + END IF;
 + IF $2 IS NULL THEN
 +   RAISE EXCEPTION 'find_srid() - table name is NULL!';
 + END IF;
 + IF $3 IS NULL THEN
 +   RAISE EXCEPTION 'find_srid() - column name is NULL!';
 + END IF;
 + schem = $1;
 + tabl = $2;
 + -- if the table contains a . and the schema is empty
 + -- split the table into a schema and a table
 + -- otherwise drop through to default behavior
 + IF ( schem = '' and tabl LIKE '%.%' ) THEN
 + schem = substr(tabl,1,strpos(tabl,'.')-1);
 + tabl = substr(tabl,length(schem)+2);
 + ELSE
 + schem = schem || '%';
 + END IF;
 +
 + select SRID into sr from geometry_columns where f_table_schema like schem and f_table_name = tabl and f_geometry_column = $3;
 + IF NOT FOUND THEN
 +    RAISE EXCEPTION 'find_srid() - couldnt find the corresponding SRID - is the geometry registered in the GEOMETRY_COLUMNS table?  Is there an uppercase/lowercase missmatch?';
 + END IF;
 + return sr;
 + END;
 + $$
 + LANGUAGE 'plpgsql' IMMUTABLE STRICT;
 +
 +
 + ---------------------------------------------------------------
 + -- PROJ support
 + ---------------------------------------------------------------
 +
 + CREATE OR REPLACE FUNCTION get_proj4_from_srid(integer) RETURNS text AS
 + $$
 + BEGIN
 + RETURN proj4text::text FROM spatial_ref_sys WHERE srid= $1;
 + END;
 + $$
 + LANGUAGE 'plpgsql' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION postgis_transform_geometry(geometry,text,text,int)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','transform_geom'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION transform(geometry,integer)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','transform'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: transform(geometry,integer)
 + CREATE OR REPLACE FUNCTION ST_Transform(geometry,integer)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','transform'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 +
 + -----------------------------------------------------------------------
 + -- POSTGIS_VERSION()
 + -----------------------------------------------------------------------
 +
 + CREATE OR REPLACE FUNCTION postgis_version() RETURNS text
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE;
 +
 + CREATE OR REPLACE FUNCTION postgis_proj_version() RETURNS text
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE;
 +
 + --
 + -- IMPORTANT:
 + -- Starting at 1.1.0 this function is used by postgis_proc_upgrade.pl
 + -- to extract version of postgis being installed.
 + -- Do not modify this w/out also changing postgis_proc_upgrade.pl
 + --
 + CREATE OR REPLACE FUNCTION postgis_scripts_installed() RETURNS text
 + AS 'SELECT ''1.5 r7360''::text AS version'
 + LANGUAGE 'sql' IMMUTABLE;
 +
 + CREATE OR REPLACE FUNCTION postgis_lib_version() RETURNS text
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE; -- a new lib will require a new session
 +
 + -- NOTE: starting at 1.1.0 this is the same of postgis_lib_version()
 + CREATE OR REPLACE FUNCTION postgis_scripts_released() RETURNS text
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE;
 +
 + CREATE OR REPLACE FUNCTION postgis_uses_stats() RETURNS bool
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE;
 +
 + CREATE OR REPLACE FUNCTION postgis_geos_version() RETURNS text
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE;
 +
 + CREATE OR REPLACE FUNCTION postgis_libxml_version() RETURNS text
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE;
 +
 + CREATE OR REPLACE FUNCTION postgis_scripts_build_date() RETURNS text
 + AS 'SELECT ''2012-07-21 19:51:14''::text AS version'
 + LANGUAGE 'sql' IMMUTABLE;
 +
 + CREATE OR REPLACE FUNCTION postgis_lib_build_date() RETURNS text
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE;
 +
 +
 +
 + CREATE OR REPLACE FUNCTION postgis_full_version() RETURNS text
 + AS $$
 + DECLARE
 + libver text;
 + projver text;
 + geosver text;
 + libxmlver text;
 + usestats bool;
 + dbproc text;
 + relproc text;
 + fullver text;
 + BEGIN
 + SELECT postgis_lib_version() INTO libver;
 + SELECT postgis_proj_version() INTO projver;
 + SELECT postgis_geos_version() INTO geosver;
 + SELECT postgis_libxml_version() INTO libxmlver;
 + SELECT postgis_uses_stats() INTO usestats;
 + SELECT postgis_scripts_installed() INTO dbproc;
 + SELECT postgis_scripts_released() INTO relproc;
 +
 + fullver = 'POSTGIS="' || libver || '"';
 +
 + IF  geosver IS NOT NULL THEN
 + fullver = fullver || ' GEOS="' || geosver || '"';
 + END IF;
 +
 + IF  projver IS NOT NULL THEN
 + fullver = fullver || ' PROJ="' || projver || '"';
 + END IF;
 +
 + IF  libxmlver IS NOT NULL THEN
 + fullver = fullver || ' LIBXML="' || libxmlver || '"';
 + END IF;
 +
 + IF usestats THEN
 + fullver = fullver || ' USE_STATS';
 + END IF;
 +
 + -- fullver = fullver || ' DBPROC="' || dbproc || '"';
 + -- fullver = fullver || ' RELPROC="' || relproc || '"';
 +
 + IF dbproc != relproc THEN
 + fullver = fullver || ' (procs from ' || dbproc || ' need upgrade)';
 + END IF;
 +
 + RETURN fullver;
 + END
 + $$
 + LANGUAGE 'plpgsql' IMMUTABLE;
 +
 + ---------------------------------------------------------------
 + -- CASTS
 + ---------------------------------------------------------------
 +
 + -- Legacy ST_ variants of casts, to be removed in 2.0
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_box2d(geometry)
 + RETURNS box2d
 + AS '$libdir/postgis-1.5','LWGEOM_to_BOX2DFLOAT4'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_box3d(geometry)
 + RETURNS box3d
 + AS '$libdir/postgis-1.5','LWGEOM_to_BOX3D'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_box(geometry)
 + RETURNS box
 + AS '$libdir/postgis-1.5','LWGEOM_to_BOX'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_box2d(box3d)
 + RETURNS box2d
 + AS '$libdir/postgis-1.5','BOX3D_to_BOX2DFLOAT4'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_box3d(box2d)
 + RETURNS box3d
 + AS '$libdir/postgis-1.5','BOX2DFLOAT4_to_BOX3D'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_box(box3d)
 + RETURNS box
 + AS '$libdir/postgis-1.5','BOX3D_to_BOX'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_text(geometry)
 + RETURNS text
 + AS '$libdir/postgis-1.5','LWGEOM_to_text'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry(box2d)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','BOX2DFLOAT4_to_LWGEOM'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry(box3d)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','BOX3D_to_LWGEOM'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry(text)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','parse_WKT_lwgeom'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry(chip)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','CHIP_to_LWGEOM'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry(bytea)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_from_bytea'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_bytea(geometry)
 + RETURNS bytea
 + AS '$libdir/postgis-1.5','LWGEOM_to_bytea'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_box3d_extent(box3d_extent)
 + RETURNS box3d
 + AS '$libdir/postgis-1.5', 'BOX3D_extent_to_BOX3D'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_box2d(box3d_extent)
 + RETURNS box2d
 + AS '$libdir/postgis-1.5', 'BOX3D_to_BOX2DFLOAT4'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.5.0
 + CREATE OR REPLACE FUNCTION st_geometry(box3d_extent)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','BOX3D_to_LWGEOM'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 +
 + CREATE OR REPLACE FUNCTION box2d(geometry)
 + RETURNS box2d
 + AS '$libdir/postgis-1.5','LWGEOM_to_BOX2DFLOAT4'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION box3d(geometry)
 + RETURNS box3d
 + AS '$libdir/postgis-1.5','LWGEOM_to_BOX3D'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION box(geometry)
 + RETURNS box
 + AS '$libdir/postgis-1.5','LWGEOM_to_BOX'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION box2d(box3d)
 + RETURNS box2d
 + AS '$libdir/postgis-1.5','BOX3D_to_BOX2DFLOAT4'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION box3d(box2d)
 + RETURNS box3d
 + AS '$libdir/postgis-1.5','BOX2DFLOAT4_to_BOX3D'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION box(box3d)
 + RETURNS box
 + AS '$libdir/postgis-1.5','BOX3D_to_BOX'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION text(geometry)
 + RETURNS text
 + AS '$libdir/postgis-1.5','LWGEOM_to_text'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- this is kept for backward-compatibility
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION box3dtobox(box3d)
 + RETURNS box
 + AS 'SELECT box($1)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry(box2d)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','BOX2DFLOAT4_to_LWGEOM'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry(box3d)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','BOX3D_to_LWGEOM'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry(text)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','parse_WKT_lwgeom'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry(chip)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','CHIP_to_LWGEOM'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geometry(bytea)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_from_bytea'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION bytea(geometry)
 + RETURNS bytea
 + AS '$libdir/postgis-1.5','LWGEOM_to_bytea'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- 7.3+ explicit casting definitions
 + CREATE CAST (geometry AS box2d) WITH FUNCTION box2d(geometry) AS IMPLICIT;
 + CREATE CAST (geometry AS box3d) WITH FUNCTION box3d(geometry) AS IMPLICIT;
 + CREATE CAST (geometry AS box) WITH FUNCTION box(geometry) AS IMPLICIT;
 + CREATE CAST (box3d AS box2d) WITH FUNCTION box2d(box3d) AS IMPLICIT;
 + CREATE CAST (box2d AS box3d) WITH FUNCTION box3d(box2d) AS IMPLICIT;
 + CREATE CAST (box2d AS geometry) WITH FUNCTION geometry(box2d) AS IMPLICIT;
 + CREATE CAST (box3d AS box) WITH FUNCTION box(box3d) AS IMPLICIT;
 + CREATE CAST (box3d AS geometry) WITH FUNCTION geometry(box3d) AS IMPLICIT;
 + CREATE CAST (text AS geometry) WITH FUNCTION geometry(text) AS IMPLICIT;
 + CREATE CAST (geometry AS text) WITH FUNCTION text(geometry) AS IMPLICIT;
 + CREATE CAST (chip AS geometry) WITH FUNCTION geometry(chip) AS IMPLICIT;
 + CREATE CAST (bytea AS geometry) WITH FUNCTION geometry(bytea) AS IMPLICIT;
 + CREATE CAST (geometry AS bytea) WITH FUNCTION bytea(geometry) AS IMPLICIT;
 +
 + -- Casts to allow the box3d_extent type to automatically cast to box3d/box2d in queries
 + CREATE CAST (box3d_extent AS box3d) WITH FUNCTION box3d_extent(box3d_extent) AS IMPLICIT;
 + CREATE CAST (box3d_extent AS box2d) WITH FUNCTION box2d(box3d_extent) AS IMPLICIT;
 + CREATE CAST (box3d_extent AS geometry) WITH FUNCTION geometry(box3d_extent) AS IMPLICIT;
 +
 + ---------------------------------------------------------------
 + -- Algorithms
 + ---------------------------------------------------------------
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION Simplify(geometry, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_simplify2d'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_Simplify(geometry, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_simplify2d'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- SnapToGrid(input, xoff, yoff, xsize, ysize)
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION SnapToGrid(geometry, float8, float8, float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_snaptogrid'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_SnapToGrid(geometry, float8, float8, float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_snaptogrid'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- SnapToGrid(input, xsize, ysize) # offsets=0
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION SnapToGrid(geometry, float8, float8)
 + RETURNS geometry
 + AS 'SELECT SnapToGrid($1, 0, 0, $2, $3)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_SnapToGrid(geometry, float8, float8)
 + RETURNS geometry
 + AS 'SELECT ST_SnapToGrid($1, 0, 0, $2, $3)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- SnapToGrid(input, size) # xsize=ysize=size, offsets=0
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION SnapToGrid(geometry, float8)
 + RETURNS geometry
 + AS 'SELECT SnapToGrid($1, 0, 0, $2, $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_SnapToGrid(geometry, float8)
 + RETURNS geometry
 + AS 'SELECT ST_SnapToGrid($1, 0, 0, $2, $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- SnapToGrid(input, point_offsets, xsize, ysize, zsize, msize)
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION SnapToGrid(geometry, geometry, float8, float8, float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_snaptogrid_pointoff'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_SnapToGrid(geometry, geometry, float8, float8, float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_snaptogrid_pointoff'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION Segmentize(geometry, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_segmentize2d'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_Segmentize(geometry, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_segmentize2d'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + ---------------------------------------------------------------
 + -- LRS
 + ---------------------------------------------------------------
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION line_interpolate_point(geometry, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_line_interpolate_point'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_line_interpolate_point(geometry, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_line_interpolate_point'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION line_substring(geometry, float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_line_substring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_line_substring(geometry, float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_line_substring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION line_locate_point(geometry, geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5', 'LWGEOM_line_locate_point'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_line_locate_point(geometry, geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5', 'LWGEOM_line_locate_point'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION locate_between_measures(geometry, float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_locate_between_m'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_locate_between_measures(geometry, float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_locate_between_m'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION locate_along_measure(geometry, float8)
 + RETURNS geometry
 + AS $$ SELECT locate_between_measures($1, $2, $2) $$
 + LANGUAGE 'sql' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_locate_along_measure(geometry, float8)
 + RETURNS geometry
 + AS $$ SELECT locate_between_measures($1, $2, $2) $$
 + LANGUAGE 'sql' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_AddMeasure(geometry, float8, float8) 
 + RETURNS geometry 
 + AS '$libdir/postgis-1.5', 'ST_AddMeasure' 
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +     
 + ---------------------------------------------------------------
 + -- GEOS
 + ---------------------------------------------------------------
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION intersection(geometry,geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','intersection'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: intersection(geometry,geometry)
 + CREATE OR REPLACE FUNCTION ST_Intersection(geometry,geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','intersection'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION buffer(geometry,float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','buffer'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- PostGIS equivalent function: buffer(geometry,float8)
 + CREATE OR REPLACE FUNCTION ST_Buffer(geometry,float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','buffer'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.5.0 - requires GEOS-3.2 or higher
 + CREATE OR REPLACE FUNCTION _ST_Buffer(geometry,float8,cstring)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','buffer'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_Buffer(geometry,float8,integer)
 + RETURNS geometry
 + AS $$ SELECT _ST_Buffer($1, $2,
 + CAST('quad_segs='||CAST($3 AS text) as cstring))
 +    $$
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_buffer(geometry,float8,text)
 + RETURNS geometry
 + AS $$ SELECT _ST_Buffer($1, $2,
 + CAST( regexp_replace($3, '^[0123456789]+$',
 + 'quad_segs='||$3) AS cstring)
 + )
 +    $$
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION buffer(geometry,float8,integer)
 + RETURNS geometry
 + AS 'SELECT ST_Buffer($1, $2, $3)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION convexhull(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','convexhull'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- PostGIS equivalent function: convexhull(geometry)
 + CREATE OR REPLACE FUNCTION ST_ConvexHull(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','convexhull'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Only accepts LINESTRING as parameters.
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION _ST_LineCrossingDirection(geometry, geometry)
 + RETURNS integer
 + AS '$libdir/postgis-1.5', 'ST_LineCrossingDirection'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION ST_LineCrossingDirection(geometry, geometry)
 + RETURNS integer AS
 + $$ SELECT CASE WHEN NOT $1 && $2 THEN 0 ELSE _ST_LineCrossingDirection($1,$2) END $$
 + LANGUAGE 'sql' IMMUTABLE;
 +
 +
 + -- Only accepts LINESTRING as parameters.
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION ST_LocateBetweenElevations(geometry, float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'ST_LocateBetweenElevations'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Requires GEOS >= 3.0.0
 + -- Availability: 1.3.3
 + CREATE OR REPLACE FUNCTION ST_SimplifyPreserveTopology(geometry, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','topologypreservesimplify'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Requires GEOS >= 3.1.0
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION ST_IsValidReason(geometry)
 + RETURNS text
 + AS '$libdir/postgis-1.5', 'isvalidreason'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 +
 + -- Requires GEOS >= 3.2.0
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_HausdorffDistance(geometry, geometry)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5', 'hausdorffdistance'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 +
 +
 + -- Requires GEOS >= 3.2.0
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_HausdorffDistance(geometry, geometry, float8)
 + RETURNS FLOAT8
 + AS '$libdir/postgis-1.5', 'hausdorffdistancedensify'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION difference(geometry,geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','difference'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: difference(geometry,geometry)
 + CREATE OR REPLACE FUNCTION ST_Difference(geometry,geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','difference'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION boundary(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','boundary'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: boundary(geometry)
 + CREATE OR REPLACE FUNCTION ST_Boundary(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','boundary'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION symdifference(geometry,geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','symdifference'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: symdifference(geometry,geometry)
 + CREATE OR REPLACE FUNCTION ST_SymDifference(geometry,geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','symdifference'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION symmetricdifference(geometry,geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','symdifference'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_symmetricdifference(geometry,geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','symdifference'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION GeomUnion(geometry,geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','geomunion'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: GeomUnion(geometry,geometry)
 + CREATE OR REPLACE FUNCTION ST_Union(geometry,geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','geomunion'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + --------------------------------------------------------------------------------
 + -- Aggregates and their supporting functions
 + --------------------------------------------------------------------------------
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION collect(geometry, geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_collect'
 + LANGUAGE 'C' IMMUTABLE;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_collect(geometry, geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_collect'
 + LANGUAGE 'C' IMMUTABLE;
 +
 + -- Deprecation in 1.2.3
 + CREATE AGGREGATE memcollect(
 + sfunc = ST_collect,
 + basetype = geometry,
 + stype = geometry
 + );
 +
 + -- Availability: 1.2.2
 + CREATE AGGREGATE ST_memcollect(
 + sfunc = ST_collect,
 + basetype = geometry,
 + stype = geometry
 + );
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_collect (geometry[])
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_collect_garray'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE AGGREGATE MemGeomUnion (
 + basetype = geometry,
 + sfunc = geomunion,
 + stype = geometry
 + );
 +
 + -- Availability: 1.2.2
 + CREATE AGGREGATE ST_MemUnion (
 + basetype = geometry,
 + sfunc = ST_Union,
 + stype = geometry
 + );
 +
 + --
 + -- pgis_abs
 + -- Container type to hold the ArrayBuildState pointer as it passes through
 + -- the geometry array accumulation aggregate.
 + --
 + CREATE OR REPLACE FUNCTION pgis_abs_in(cstring)
 + RETURNS pgis_abs
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION pgis_abs_out(pgis_abs)
 + RETURNS cstring
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE TYPE pgis_abs (
 + internallength = 8,
 + input = pgis_abs_in,
 + output = pgis_abs_out,
 + alignment = double
 + );
 +
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION pgis_geometry_accum_transfn(pgis_abs, geometry)
 + RETURNS pgis_abs
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C';
 +
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION pgis_geometry_accum_finalfn(pgis_abs)
 + RETURNS geometry[]
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C';
 +
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION pgis_geometry_union_finalfn(pgis_abs)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C';
 +
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION pgis_geometry_collect_finalfn(pgis_abs)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C';
 +
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION pgis_geometry_polygonize_finalfn(pgis_abs)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C';
 +
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION pgis_geometry_makeline_finalfn(pgis_abs)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C';
 +
 + -- Deprecation in: 1.2.3
 + CREATE AGGREGATE accum (
 + sfunc = pgis_geometry_accum_transfn,
 + basetype = geometry,
 + stype = pgis_abs,
 + finalfunc = pgis_geometry_accum_finalfn
 + );
 +
 + -- Availability: 1.2.2
 + CREATE AGGREGATE ST_Accum (
 + sfunc = pgis_geometry_accum_transfn,
 + basetype = geometry,
 + stype = pgis_abs,
 + finalfunc = pgis_geometry_accum_finalfn
 + );
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION unite_garray (geometry[])
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'pgis_union_geometry_array'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.4.0
 + CREATE OR REPLACE FUNCTION ST_unite_garray (geometry[])
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','pgis_union_geometry_array'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION ST_Union (geometry[])
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','pgis_union_geometry_array'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE AGGREGATE ST_Union (
 + basetype = geometry,
 + sfunc = pgis_geometry_accum_transfn,
 + stype = pgis_abs,
 + finalfunc = pgis_geometry_union_finalfn
 + );
 +
 + -- Deprecation in 1.2.3
 + CREATE AGGREGATE collect (
 + basetype = geometry,
 + sfunc = pgis_geometry_accum_transfn,
 + stype = pgis_abs,
 + finalfunc = pgis_geometry_collect_finalfn
 + );
 +
 + -- Availability: 1.2.2
 + CREATE AGGREGATE ST_Collect (
 + BASETYPE = geometry,
 + SFUNC = pgis_geometry_accum_transfn,
 + STYPE = pgis_abs,
 + FINALFUNC = pgis_geometry_collect_finalfn
 + );
 +
 + -- Deprecation in 1.2.3
 + CREATE AGGREGATE Polygonize (
 + BASETYPE = geometry,
 + SFUNC = pgis_geometry_accum_transfn,
 + STYPE = pgis_abs,
 + FINALFUNC = pgis_geometry_polygonize_finalfn
 + );
 +
 + -- Availability: 1.2.2
 + CREATE AGGREGATE ST_Polygonize (
 + BASETYPE = geometry,
 + SFUNC = pgis_geometry_accum_transfn,
 + STYPE = pgis_abs,
 + FINALFUNC = pgis_geometry_polygonize_finalfn
 + );
 +
 + -- Deprecation in 1.2.3
 + CREATE AGGREGATE makeline (
 + BASETYPE = geometry,
 + SFUNC = pgis_geometry_accum_transfn,
 + STYPE = pgis_abs,
 + FINALFUNC = pgis_geometry_makeline_finalfn
 + );
 +
 + -- Availability: 1.2.2
 + CREATE AGGREGATE ST_MakeLine (
 + BASETYPE = geometry,
 + SFUNC = pgis_geometry_accum_transfn,
 + STYPE = pgis_abs,
 + FINALFUNC = pgis_geometry_makeline_finalfn
 + );
 +
 +
 +
 + --------------------------------------------------------------------------------
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION relate(geometry,geometry)
 + RETURNS text
 + AS '$libdir/postgis-1.5','relate_full'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_relate(geometry,geometry)
 + RETURNS text
 + AS '$libdir/postgis-1.5','relate_full'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION relate(geometry,geometry,text)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5','relate_pattern'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: relate(geometry,geometry,text)
 + CREATE OR REPLACE FUNCTION ST_Relate(geometry,geometry,text)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5','relate_pattern'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION disjoint(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: disjoint(geometry,geometry)
 + CREATE OR REPLACE FUNCTION ST_Disjoint(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5','disjoint'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION touches(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: touches(geometry,geometry)
 + CREATE OR REPLACE FUNCTION _ST_Touches(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5','touches'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.2
 + -- Inlines index magic
 + CREATE OR REPLACE FUNCTION ST_Touches(geometry,geometry)
 + RETURNS boolean
 + AS 'SELECT $1 && $2 AND _ST_Touches($1,$2)'
 + LANGUAGE 'SQL' IMMUTABLE;
 +
 + -- Availability: 1.3.4
 + CREATE OR REPLACE FUNCTION _ST_DWithin(geometry,geometry,float8)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5', 'LWGEOM_dwithin'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_DWithin(geometry, geometry, float8)
 + RETURNS boolean
 + AS 'SELECT $1 && ST_Expand($2,$3) AND $2 && ST_Expand($1,$3) AND _ST_DWithin($1, $2, $3)'
 + LANGUAGE 'SQL' IMMUTABLE;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION intersects(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: intersects(geometry,geometry)
 + CREATE OR REPLACE FUNCTION _ST_Intersects(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5','intersects'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.2
 + -- Inlines index magic
 + CREATE OR REPLACE FUNCTION ST_Intersects(geometry,geometry)
 + RETURNS boolean
 + AS 'SELECT $1 && $2 AND _ST_Intersects($1,$2)'
 + LANGUAGE 'SQL' IMMUTABLE;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION crosses(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: crosses(geometry,geometry)
 + CREATE OR REPLACE FUNCTION _ST_Crosses(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5','crosses'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.2
 + -- Inlines index magic
 + CREATE OR REPLACE FUNCTION ST_Crosses(geometry,geometry)
 + RETURNS boolean
 + AS 'SELECT $1 && $2 AND _ST_Crosses($1,$2)'
 + LANGUAGE 'SQL' IMMUTABLE;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION within(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: within(geometry,geometry)
 + CREATE OR REPLACE FUNCTION _ST_Within(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5','within'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.2
 + -- Inlines index magic
 + CREATE OR REPLACE FUNCTION ST_Within(geometry,geometry)
 + RETURNS boolean
 + AS 'SELECT $1 && $2 AND _ST_Within($1,$2)'
 + LANGUAGE 'SQL' IMMUTABLE;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION Contains(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: contains(geometry,geometry)
 + CREATE OR REPLACE FUNCTION _ST_Contains(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5','contains'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.2
 + -- Inlines index magic
 + CREATE OR REPLACE FUNCTION ST_Contains(geometry,geometry)
 + RETURNS boolean
 + AS 'SELECT $1 && $2 AND _ST_Contains($1,$2)'
 + LANGUAGE 'SQL' IMMUTABLE;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION _ST_CoveredBy(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5', 'coveredby'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_CoveredBy(geometry,geometry)
 + RETURNS boolean
 + AS 'SELECT $1 && $2 AND _ST_CoveredBy($1,$2)'
 + LANGUAGE 'SQL' IMMUTABLE;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION _ST_Covers(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5', 'covers'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.2
 + -- Inlines index magic
 + CREATE OR REPLACE FUNCTION ST_Covers(geometry,geometry)
 + RETURNS boolean
 + AS 'SELECT $1 && $2 AND _ST_Covers($1,$2)'
 + LANGUAGE 'SQL' IMMUTABLE;
 +
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION _ST_ContainsProperly(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5','containsproperly'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.4.0
 + -- Inlines index magic
 + CREATE OR REPLACE FUNCTION ST_ContainsProperly(geometry,geometry)
 + RETURNS boolean
 + AS 'SELECT $1 && $2 AND _ST_ContainsProperly($1,$2)'
 + LANGUAGE 'SQL' IMMUTABLE;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION overlaps(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: overlaps(geometry,geometry)
 + CREATE OR REPLACE FUNCTION _ST_Overlaps(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5','overlaps'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.2
 + -- Inlines index magic
 + CREATE OR REPLACE FUNCTION ST_Overlaps(geometry,geometry)
 + RETURNS boolean
 + AS 'SELECT $1 && $2 AND _ST_Overlaps($1,$2)'
 + LANGUAGE 'SQL' IMMUTABLE;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION IsValid(geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5', 'isvalid'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- PostGIS equivalent function: IsValid(geometry)
 + -- TODO: change null returns to true
 + CREATE OR REPLACE FUNCTION ST_IsValid(geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5', 'isvalid'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- This is also available w/out GEOS
 + CREATE OR REPLACE FUNCTION Centroid(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: Centroid(geometry)
 + CREATE OR REPLACE FUNCTION ST_Centroid(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'centroid'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION IsRing(geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: IsRing(geometry)
 + CREATE OR REPLACE FUNCTION ST_IsRing(geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5', 'isring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION PointOnSurface(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: PointOnSurface(geometry)
 + CREATE OR REPLACE FUNCTION ST_PointOnSurface(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'pointonsurface'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION IsSimple(geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5', 'issimple'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: IsSimple(geometry)
 + CREATE OR REPLACE FUNCTION ST_IsSimple(geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5', 'issimple'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION Equals(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5','geomequals'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION _ST_Equals(geometry,geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5','geomequals'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.2.1
 + CREATE OR REPLACE FUNCTION ST_Equals(geometry,geometry)
 + RETURNS boolean
 + AS 'SELECT $1 && $2 AND _ST_Equals($1,$2)'
 + LANGUAGE 'SQL' IMMUTABLE;
 +
 +
 + -----------------------------------------------------------------------
 + -- GML & KML INPUT
 + -- Availability: 1.5.0
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION ST_GeomFromGML(text)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','geom_from_gml'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION ST_GMLToSQL(text)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','geom_from_gml'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION ST_GeomFromKML(text)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','geom_from_kml'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -----------------------------------------------------------------------
 + -- SVG OUTPUT
 + -----------------------------------------------------------------------
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AsSVG(geometry,int4,int4)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','assvg_geometry'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_AsSVG(geometry,int4,int4)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','assvg_geometry'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AsSVG(geometry,int4)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','assvg_geometry'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_AsSVG(geometry,int4)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','assvg_geometry'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AsSVG(geometry)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','assvg_geometry'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_AsSVG(geometry)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','assvg_geometry'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -----------------------------------------------------------------------
 + -- GML OUTPUT
 + -----------------------------------------------------------------------
 + -- _ST_AsGML(version, geom, precision, option)
 + CREATE OR REPLACE FUNCTION _ST_AsGML(int4, geometry, int4, int4)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','LWGEOM_asGML'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- AsGML(geom, precision) / version=2
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AsGML(geometry, int4)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsGML(2, $1, $2, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_AsGML(geometry, int4)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsGML(2, $1, $2, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- AsGML(geom) / precision=15 version=2
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AsGML(geometry)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsGML(2, $1, 15, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_AsGML(geometry)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsGML(2, $1, 15, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGML(version, geom) / precision=15 version=2
 + -- Availability: 1.3.2
 + CREATE OR REPLACE FUNCTION ST_AsGML(int4, geometry)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsGML($1, $2, 15, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGML(version, geom, precision)
 + -- Availability: 1.3.2
 + CREATE OR REPLACE FUNCTION ST_AsGML(int4, geometry, int4)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsGML($1, $2, $3, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGML (geom, precision, option) / version=2
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION ST_AsGML(geometry, int4, int4)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsGML(2, $1, $2, $3)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGML(version, geom, precision, option)
 + -- Availability: 1.4.0
 + CREATE OR REPLACE FUNCTION ST_AsGML(int4, geometry, int4, int4)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsGML($1, $2, $3, $4)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -----------------------------------------------------------------------
 + -- KML OUTPUT
 + -----------------------------------------------------------------------
 + -- _ST_AsKML(version, geom, precision)
 + CREATE OR REPLACE FUNCTION _ST_AsKML(int4, geometry, int4)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','LWGEOM_asKML'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- AsKML(geom, precision) / version=2
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AsKML(geometry, int4)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsKML(2, transform($1,4326), $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_AsKML(geometry, int4)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsKML(2, ST_Transform($1,4326), $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- AsKML(geom) / precision=15 version=2
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AsKML(geometry)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsKML(2, transform($1,4326), 15)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- AsKML(version, geom, precision)
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AsKML(int4, geometry, int4)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsKML($1, transform($2,4326), $3)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_AsKML(geometry)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsKML(2, ST_Transform($1,4326), 15)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsKML(version, geom) / precision=15 version=2
 + -- Availability: 1.3.2
 + CREATE OR REPLACE FUNCTION ST_AsKML(int4, geometry)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsKML($1, ST_Transform($2,4326), 15)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsKML(version, geom, precision)
 + -- Availability: 1.3.2
 + CREATE OR REPLACE FUNCTION ST_AsKML(int4, geometry, int4)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsKML($1, ST_Transform($2,4326), $3)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -----------------------------------------------------------------------
 + -- GEOJSON OUTPUT
 + -- Availability: 1.3.4
 + -----------------------------------------------------------------------
 + -- _ST_AsGeoJson(version, geom, precision, options)
 + CREATE OR REPLACE FUNCTION _ST_AsGeoJson(int4, geometry, int4, int4)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','LWGEOM_asGeoJson'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- ST_AsGeoJson(geom, precision) / version=1 options=0
 + CREATE OR REPLACE FUNCTION ST_AsGeoJson(geometry, int4)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsGeoJson(1, $1, $2, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGeoJson(geom) / precision=15 version=1 options=0
 + CREATE OR REPLACE FUNCTION ST_AsGeoJson(geometry)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsGeoJson(1, $1, 15, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGeoJson(version, geom) / precision=15 options=0
 + CREATE OR REPLACE FUNCTION ST_AsGeoJson(int4, geometry)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsGeoJson($1, $2, 15, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGeoJson(version, geom, precision) / options=0
 + CREATE OR REPLACE FUNCTION ST_AsGeoJson(int4, geometry, int4)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsGeoJson($1, $2, $3, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGeoJson(geom, precision, options) / version=1
 + CREATE OR REPLACE FUNCTION ST_AsGeoJson(geometry, int4, int4)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsGeoJson(1, $1, $2, $3)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGeoJson(version, geom, precision,options)
 + CREATE OR REPLACE FUNCTION ST_AsGeoJson(int4, geometry, int4, int4)
 + RETURNS TEXT
 + AS 'SELECT _ST_AsGeoJson($1, $2, $3, $4)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + ------------------------------------------------------------------------
 + -- GeoHash (geohash.org)
 + ------------------------------------------------------------------------
 +
 + -- Availability 1.4.0
 + CREATE OR REPLACE FUNCTION ST_GeoHash(geometry, int4)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5', 'ST_GeoHash'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability 1.4.0
 + CREATE OR REPLACE FUNCTION ST_GeoHash(geometry)
 + RETURNS TEXT
 + AS 'SELECT ST_GeoHash($1, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + ------------------------------------------------------------------------
 + -- OGC defined
 + ------------------------------------------------------------------------
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION NumPoints(geometry)
 + RETURNS int4
 + AS '$libdir/postgis-1.5', 'LWGEOM_numpoints_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: NumPoints(geometry)
 + CREATE OR REPLACE FUNCTION ST_NumPoints(geometry)
 + RETURNS int4
 + AS '$libdir/postgis-1.5', 'LWGEOM_numpoints_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION NumGeometries(geometry)
 + RETURNS int4
 + AS '$libdir/postgis-1.5', 'LWGEOM_numgeometries_collection'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: NumGeometries(geometry)
 + CREATE OR REPLACE FUNCTION ST_NumGeometries(geometry)
 + RETURNS int4
 + AS '$libdir/postgis-1.5', 'LWGEOM_numgeometries_collection'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION GeometryN(geometry,integer)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_geometryn_collection'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: GeometryN(geometry)
 + CREATE OR REPLACE FUNCTION ST_GeometryN(geometry,integer)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_geometryn_collection'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION Dimension(geometry)
 + RETURNS int4
 + AS '$libdir/postgis-1.5', 'LWGEOM_dimension'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: Dimension(geometry)
 + CREATE OR REPLACE FUNCTION ST_Dimension(geometry)
 + RETURNS int4
 + AS '$libdir/postgis-1.5', 'LWGEOM_dimension'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION ExteriorRing(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_exteriorring_polygon'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: ExteriorRing(geometry)
 + CREATE OR REPLACE FUNCTION ST_ExteriorRing(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_exteriorring_polygon'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION NumInteriorRings(geometry)
 + RETURNS integer
 + AS '$libdir/postgis-1.5','LWGEOM_numinteriorrings_polygon'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: NumInteriorRings(geometry)
 + CREATE OR REPLACE FUNCTION ST_NumInteriorRings(geometry)
 + RETURNS integer
 + AS '$libdir/postgis-1.5','LWGEOM_numinteriorrings_polygon'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION NumInteriorRing(geometry)
 + RETURNS integer
 + AS '$libdir/postgis-1.5','LWGEOM_numinteriorrings_polygon'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_NumInteriorRing(geometry)
 + RETURNS integer
 + AS '$libdir/postgis-1.5','LWGEOM_numinteriorrings_polygon'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION InteriorRingN(geometry,integer)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_interiorringn_polygon'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: InteriorRingN(geometry)
 + CREATE OR REPLACE FUNCTION ST_InteriorRingN(geometry,integer)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_interiorringn_polygon'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION GeometryType(geometry)
 + RETURNS text
 + AS '$libdir/postgis-1.5', 'LWGEOM_getTYPE'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Not quite equivalent to GeometryType
 + CREATE OR REPLACE FUNCTION ST_GeometryType(geometry)
 + RETURNS text
 + AS '$libdir/postgis-1.5', 'geometry_geometrytype'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION PointN(geometry,integer)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_pointn_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: PointN(geometry,integer)
 + CREATE OR REPLACE FUNCTION ST_PointN(geometry,integer)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_pointn_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION X(geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5','LWGEOM_x_point'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: X(geometry)
 + CREATE OR REPLACE FUNCTION ST_X(geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5','LWGEOM_x_point'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION Y(geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5','LWGEOM_y_point'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: Y(geometry)
 + CREATE OR REPLACE FUNCTION ST_Y(geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5','LWGEOM_y_point'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION Z(geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5','LWGEOM_z_point'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_Z(geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5','LWGEOM_z_point'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION M(geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5','LWGEOM_m_point'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_M(geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5','LWGEOM_m_point'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION StartPoint(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_startpoint_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: StartPoint(geometry))
 + CREATE OR REPLACE FUNCTION ST_StartPoint(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_startpoint_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION EndPoint(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_endpoint_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: EndPoint(geometry))
 + CREATE OR REPLACE FUNCTION ST_EndPoint(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_endpoint_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION IsClosed(geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5', 'LWGEOM_isclosed_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: IsClosed(geometry)
 + CREATE OR REPLACE FUNCTION ST_IsClosed(geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5', 'LWGEOM_isclosed_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION IsEmpty(geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5', 'LWGEOM_isempty'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: IsEmpty(geometry)
 + CREATE OR REPLACE FUNCTION ST_IsEmpty(geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5', 'LWGEOM_isempty'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION SRID(geometry)
 + RETURNS int4
 + AS '$libdir/postgis-1.5','LWGEOM_getSRID'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: getSRID(geometry)
 + CREATE OR REPLACE FUNCTION ST_SRID(geometry)
 + RETURNS int4
 + AS '$libdir/postgis-1.5','LWGEOM_getSRID'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION SetSRID(geometry,int4)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_setSRID'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_SetSRID(geometry,int4)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_setSRID'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AsBinary(geometry)
 + RETURNS bytea
 + AS '$libdir/postgis-1.5','LWGEOM_asBinary'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: AsBinary(geometry)
 + CREATE OR REPLACE FUNCTION ST_AsBinary(geometry)
 + RETURNS bytea
 + AS '$libdir/postgis-1.5','LWGEOM_asBinary'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AsBinary(geometry,text)
 + RETURNS bytea
 + AS '$libdir/postgis-1.5','LWGEOM_asBinary'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_AsBinary(geometry,text)
 + RETURNS bytea
 + AS '$libdir/postgis-1.5','LWGEOM_asBinary'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION AsText(geometry)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','LWGEOM_asText'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: AsText(geometry)
 + CREATE OR REPLACE FUNCTION ST_AsText(geometry)
 + RETURNS TEXT
 + AS '$libdir/postgis-1.5','LWGEOM_asText'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION GeometryFromText(text)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_from_text'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_GeometryFromText(text)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_from_text'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION GeometryFromText(text, int4)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_from_text'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_GeometryFromText(text, int4)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_from_text'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION GeomFromText(text)
 + RETURNS geometry AS 'SELECT geometryfromtext($1)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_GeomFromText(text)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_from_text'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION GeomFromText(text, int4)
 + RETURNS geometry AS 'SELECT geometryfromtext($1, $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: ST_GeometryFromText(text, int4)
 + CREATE OR REPLACE FUNCTION ST_GeomFromText(text, int4)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_from_text'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION PointFromText(text)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromText($1)) = ''POINT''
 + THEN GeomFromText($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_PointFromText(text)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromText($1)) = ''POINT''
 + THEN ST_GeomFromText($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION PointFromText(text, int4)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromText($1, $2)) = ''POINT''
 + THEN GeomFromText($1,$2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: PointFromText(text, int4)
 + -- TODO: improve this ... by not duplicating constructor time.
 + CREATE OR REPLACE FUNCTION ST_PointFromText(text, int4)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromText($1, $2)) = ''POINT''
 + THEN ST_GeomFromText($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION LineFromText(text)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromText($1)) = ''LINESTRING''
 + THEN GeomFromText($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_LineFromText(text)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromText($1)) = ''LINESTRING''
 + THEN ST_GeomFromText($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION LineFromText(text, int4)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromText($1, $2)) = ''LINESTRING''
 + THEN GeomFromText($1,$2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: LineFromText(text, int4)
 + CREATE OR REPLACE FUNCTION ST_LineFromText(text, int4)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromText($1, $2)) = ''LINESTRING''
 + THEN GeomFromText($1,$2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION LineStringFromText(text)
 + RETURNS geometry
 + AS 'SELECT LineFromText($1)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION LineStringFromText(text, int4)
 + RETURNS geometry
 + AS 'SELECT LineFromText($1, $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION PolyFromText(text)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromText($1)) = ''POLYGON''
 + THEN GeomFromText($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_PolyFromText(text)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromText($1)) = ''POLYGON''
 + THEN ST_GeomFromText($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION PolyFromText(text, int4)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromText($1, $2)) = ''POLYGON''
 + THEN GeomFromText($1,$2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: ST_PolygonFromText(text, int4)
 + CREATE OR REPLACE FUNCTION ST_PolyFromText(text, int4)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromText($1, $2)) = ''POLYGON''
 + THEN ST_GeomFromText($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION PolygonFromText(text, int4)
 + RETURNS geometry
 + AS 'SELECT PolyFromText($1, $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_PolygonFromText(text, int4)
 + RETURNS geometry
 + AS 'SELECT PolyFromText($1, $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION PolygonFromText(text)
 + RETURNS geometry
 + AS 'SELECT PolyFromText($1)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_PolygonFromText(text)
 + RETURNS geometry
 + AS 'SELECT ST_PolyFromText($1)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MLineFromText(text, int4)
 + RETURNS geometry
 + AS '
 + SELECT CASE
 + WHEN geometrytype(GeomFromText($1, $2)) = ''MULTILINESTRING''
 + THEN GeomFromText($1,$2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: MLineFromText(text, int4)
 + CREATE OR REPLACE FUNCTION ST_MLineFromText(text, int4)
 + RETURNS geometry
 + AS '
 + SELECT CASE
 + WHEN geometrytype(GeomFromText($1, $2)) = ''MULTILINESTRING''
 + THEN GeomFromText($1,$2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MLineFromText(text)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromText($1)) = ''MULTILINESTRING''
 + THEN GeomFromText($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MLineFromText(text)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromText($1)) = ''MULTILINESTRING''
 + THEN ST_GeomFromText($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MultiLineStringFromText(text)
 + RETURNS geometry
 + AS 'SELECT ST_MLineFromText($1)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MultiLineStringFromText(text)
 + RETURNS geometry
 + AS 'SELECT ST_MLineFromText($1)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MultiLineStringFromText(text, int4)
 + RETURNS geometry
 + AS 'SELECT MLineFromText($1, $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MultiLineStringFromText(text, int4)
 + RETURNS geometry
 + AS 'SELECT MLineFromText($1, $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MPointFromText(text, int4)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromText($1,$2)) = ''MULTIPOINT''
 + THEN GeomFromText($1,$2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: MPointFromText(text, int4)
 + CREATE OR REPLACE FUNCTION ST_MPointFromText(text, int4)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromText($1, $2)) = ''MULTIPOINT''
 + THEN GeomFromText($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MPointFromText(text)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromText($1)) = ''MULTIPOINT''
 + THEN GeomFromText($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MPointFromText(text)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromText($1)) = ''MULTIPOINT''
 + THEN ST_GeomFromText($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MultiPointFromText(text, int4)
 + RETURNS geometry
 + AS 'SELECT MPointFromText($1, $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MultiPointFromText(text)
 + RETURNS geometry
 + AS 'SELECT MPointFromText($1)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MultiPointFromText(text)
 + RETURNS geometry
 + AS 'SELECT ST_MPointFromText($1)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MultiPointFromText(text)
 + RETURNS geometry
 + AS 'SELECT MPointFromText($1)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MultiPointFromText(text)
 + RETURNS geometry
 + AS 'SELECT MPointFromText($1)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MPolyFromText(text, int4)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromText($1, $2)) = ''MULTIPOLYGON''
 + THEN GeomFromText($1,$2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: MPolyFromText(text, int4)
 + CREATE OR REPLACE FUNCTION ST_MPolyFromText(text, int4)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromText($1, $2)) = ''MULTIPOLYGON''
 + THEN ST_GeomFromText($1,$2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MPolyFromText(text)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromText($1)) = ''MULTIPOLYGON''
 + THEN GeomFromText($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + --Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MPolyFromText(text)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromText($1)) = ''MULTIPOLYGON''
 + THEN ST_GeomFromText($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MultiPolygonFromText(text, int4)
 + RETURNS geometry
 + AS 'SELECT MPolyFromText($1, $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MultiPolygonFromText(text, int4)
 + RETURNS geometry
 + AS 'SELECT MPolyFromText($1, $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MultiPolygonFromText(text)
 + RETURNS geometry
 + AS 'SELECT MPolyFromText($1)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MultiPolygonFromText(text)
 + RETURNS geometry
 + AS 'SELECT MPolyFromText($1)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION GeomCollFromText(text, int4)
 + RETURNS geometry
 + AS '
 + SELECT CASE
 + WHEN geometrytype(GeomFromText($1, $2)) = ''GEOMETRYCOLLECTION''
 + THEN GeomFromText($1,$2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_GeomCollFromText(text, int4)
 + RETURNS geometry
 + AS '
 + SELECT CASE
 + WHEN geometrytype(ST_GeomFromText($1, $2)) = ''GEOMETRYCOLLECTION''
 + THEN ST_GeomFromText($1,$2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION GeomCollFromText(text)
 + RETURNS geometry
 + AS '
 + SELECT CASE
 + WHEN geometrytype(GeomFromText($1)) = ''GEOMETRYCOLLECTION''
 + THEN GeomFromText($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_GeomCollFromText(text)
 + RETURNS geometry
 + AS '
 + SELECT CASE
 + WHEN geometrytype(ST_GeomFromText($1)) = ''GEOMETRYCOLLECTION''
 + THEN ST_GeomFromText($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION GeomFromWKB(bytea)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_from_WKB'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_GeomFromWKB(bytea)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_from_WKB'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION GeomFromWKB(bytea, int)
 + RETURNS geometry
 + AS 'SELECT setSRID(GeomFromWKB($1), $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: GeomFromWKB(bytea, int)
 + CREATE OR REPLACE FUNCTION ST_GeomFromWKB(bytea, int)
 + RETURNS geometry
 + AS 'SELECT ST_SetSRID(ST_GeomFromWKB($1), $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION PointFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''POINT''
 + THEN GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: PointFromWKB(bytea, int)
 + CREATE OR REPLACE FUNCTION ST_PointFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1, $2)) = ''POINT''
 + THEN ST_GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION PointFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''POINT''
 + THEN GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_PointFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = ''POINT''
 + THEN ST_GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION LineFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''LINESTRING''
 + THEN GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: LineFromWKB(bytea, int)
 + CREATE OR REPLACE FUNCTION ST_LineFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1, $2)) = ''LINESTRING''
 + THEN ST_GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION LineFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''LINESTRING''
 + THEN GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_LineFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = ''LINESTRING''
 + THEN ST_GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION LinestringFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''LINESTRING''
 + THEN GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_LinestringFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1, $2)) = ''LINESTRING''
 + THEN ST_GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION LinestringFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''LINESTRING''
 + THEN GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_LinestringFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''LINESTRING''
 + THEN GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION PolyFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''POLYGON''
 + THEN GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: PolyFromWKB(text, int)
 + CREATE OR REPLACE FUNCTION ST_PolyFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1, $2)) = ''POLYGON''
 + THEN ST_GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION PolyFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''POLYGON''
 + THEN GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_PolyFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = ''POLYGON''
 + THEN ST_GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION PolygonFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1,$2)) = ''POLYGON''
 + THEN GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_PolygonFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1,$2)) = ''POLYGON''
 + THEN ST_GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION PolygonFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''POLYGON''
 + THEN GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_PolygonFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''POLYGON''
 + THEN GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MPointFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1,$2)) = ''MULTIPOINT''
 + THEN GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: MPointFromWKB(text, int)
 + CREATE OR REPLACE FUNCTION ST_MPointFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''MULTIPOINT''
 + THEN GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MPointFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''MULTIPOINT''
 + THEN GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MPointFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = ''MULTIPOINT''
 + THEN ST_GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MultiPointFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1,$2)) = ''MULTIPOINT''
 + THEN GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MultiPointFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1,$2)) = ''MULTIPOINT''
 + THEN ST_GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MultiPointFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''MULTIPOINT''
 + THEN GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MultiPointFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = ''MULTIPOINT''
 + THEN ST_GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MultiLineFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''MULTILINESTRING''
 + THEN GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION MultiLineFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''MULTILINESTRING''
 + THEN GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MultiLineFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''MULTILINESTRING''
 + THEN GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MultiLineFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = ''MULTILINESTRING''
 + THEN ST_GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MLineFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''MULTILINESTRING''
 + THEN GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: MLineFromWKB(text, int)
 + CREATE OR REPLACE FUNCTION ST_MLineFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1, $2)) = ''MULTILINESTRING''
 + THEN ST_GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MLineFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''MULTILINESTRING''
 + THEN GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MLineFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = ''MULTILINESTRING''
 + THEN ST_GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MPolyFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''MULTIPOLYGON''
 + THEN GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: MPolyFromWKB(bytea, int)
 + CREATE OR REPLACE FUNCTION ST_MPolyFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1, $2)) = ''MULTIPOLYGON''
 + THEN ST_GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MPolyFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''MULTIPOLYGON''
 + THEN GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MPolyFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = ''MULTIPOLYGON''
 + THEN ST_GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MultiPolyFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = ''MULTIPOLYGON''
 + THEN GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MultiPolyFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1, $2)) = ''MULTIPOLYGON''
 + THEN ST_GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION MultiPolyFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = ''MULTIPOLYGON''
 + THEN GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_MultiPolyFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = ''MULTIPOLYGON''
 + THEN ST_GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION GeomCollFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE
 + WHEN geometrytype(GeomFromWKB($1, $2)) = ''GEOMETRYCOLLECTION''
 + THEN GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_GeomCollFromWKB(bytea, int)
 + RETURNS geometry
 + AS '
 + SELECT CASE
 + WHEN geometrytype(GeomFromWKB($1, $2)) = ''GEOMETRYCOLLECTION''
 + THEN GeomFromWKB($1, $2)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION GeomCollFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE
 + WHEN geometrytype(GeomFromWKB($1)) = ''GEOMETRYCOLLECTION''
 + THEN GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_GeomCollFromWKB(bytea)
 + RETURNS geometry
 + AS '
 + SELECT CASE
 + WHEN geometrytype(ST_GeomFromWKB($1)) = ''GEOMETRYCOLLECTION''
 + THEN ST_GeomFromWKB($1)
 + ELSE NULL END
 + '
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + --New functions
 +
 + -- Maximum distance between linestrings.
 +
 + CREATE OR REPLACE FUNCTION max_distance(geometry,geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5', 'LWGEOM_maxdistance2d_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION _ST_MaxDistance(geometry,geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5', 'LWGEOM_maxdistance2d_linestring'
 + LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_MaxDistance(geometry,geometry)
 + RETURNS float8
 + AS 'SELECT _ST_MaxDistance(ST_ConvexHull($1), ST_ConvexHull($2))'
 + LANGUAGE 'SQL' IMMUTABLE STRICT; 
 +
 + CREATE OR REPLACE FUNCTION ST_ClosestPoint(geometry,geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_closestpoint'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION ST_ShortestLine(geometry,geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_shortestline2d'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION _ST_LongestLine(geometry,geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_longestline2d'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION ST_LongestLine(geometry,geometry)
 + RETURNS geometry
 + AS 'SELECT _ST_LongestLine(ST_ConvexHull($1), ST_ConvexHull($2))'
 + LANGUAGE 'SQL' IMMUTABLE STRICT; 
 +
 + CREATE OR REPLACE FUNCTION _ST_DFullyWithin(geometry,geometry,float8)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5', 'LWGEOM_dfullywithin'
 + LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + CREATE OR REPLACE FUNCTION ST_DFullyWithin(geometry, geometry, float8)
 + RETURNS boolean
 + AS 'SELECT $1 && ST_Expand($2,$3) AND $2 && ST_Expand($1,$3) AND _ST_DFullyWithin(ST_ConvexHull($1), ST_ConvexHull($2), $3)'
 + LANGUAGE 'SQL' IMMUTABLE; 
 +
 +
 + --
 + -- SFSQL 1.1
 + --
 + -- BdPolyFromText(multiLineStringTaggedText String, SRID Integer): Polygon
 + --
 + --  Construct a Polygon given an arbitrary
 + --  collection of closed linestrings as a
 + --  MultiLineString text representation.
 + --
 + -- This is a PLPGSQL function rather then an SQL function
 + -- To avoid double call of BuildArea (one to get GeometryType
 + -- and another to actual return, in a CASE WHEN construct).
 + -- Also, we profit from plpgsql to RAISE exceptions.
 + --
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION BdPolyFromText(text, integer)
 + RETURNS geometry
 + AS $$
 + DECLARE
 + geomtext alias for $1;
 + srid alias for $2;
 + mline geometry;
 + geom geometry;
 + BEGIN
 + mline := MultiLineStringFromText(geomtext, srid);
 +
 + IF mline IS NULL
 + THEN
 + RAISE EXCEPTION 'Input is not a MultiLinestring';
 + END IF;
 +
 + geom := BuildArea(mline);
 +
 + IF GeometryType(geom) != 'POLYGON'
 + THEN
 + RAISE EXCEPTION 'Input returns more then a single polygon, try using BdMPolyFromText instead';
 + END IF;
 +
 + RETURN geom;
 + END;
 + $$
 + LANGUAGE 'plpgsql' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_BdPolyFromText(text, integer)
 + RETURNS geometry
 + AS $$
 + DECLARE
 + geomtext alias for $1;
 + srid alias for $2;
 + mline geometry;
 + geom geometry;
 + BEGIN
 + mline := ST_MultiLineStringFromText(geomtext, srid);
 +
 + IF mline IS NULL
 + THEN
 + RAISE EXCEPTION 'Input is not a MultiLinestring';
 + END IF;
 +
 + geom := ST_BuildArea(mline);
 +
 + IF GeometryType(geom) != 'POLYGON'
 + THEN
 + RAISE EXCEPTION 'Input returns more then a single polygon, try using BdMPolyFromText instead';
 + END IF;
 +
 + RETURN geom;
 + END;
 + $$
 + LANGUAGE 'plpgsql' IMMUTABLE STRICT;
 +
 + --
 + -- SFSQL 1.1
 + --
 + -- BdMPolyFromText(multiLineStringTaggedText String, SRID Integer): MultiPolygon
 + --
 + --  Construct a MultiPolygon given an arbitrary
 + --  collection of closed linestrings as a
 + --  MultiLineString text representation.
 + --
 + -- This is a PLPGSQL function rather then an SQL function
 + -- To raise an exception in case of invalid input.
 + --
 + -- Deprecation in 1.2.3
 + CREATE OR REPLACE FUNCTION BdMPolyFromText(text, integer)
 + RETURNS geometry
 + AS $$
 + DECLARE
 + geomtext alias for $1;
 + srid alias for $2;
 + mline geometry;
 + geom geometry;
 + BEGIN
 + mline := MultiLineStringFromText(geomtext, srid);
 +
 + IF mline IS NULL
 + THEN
 + RAISE EXCEPTION 'Input is not a MultiLinestring';
 + END IF;
 +
 + geom := multi(BuildArea(mline));
 +
 + RETURN geom;
 + END;
 + $$
 + LANGUAGE 'plpgsql' IMMUTABLE STRICT;
 +
 + -- Availability: 1.2.2
 + CREATE OR REPLACE FUNCTION ST_BdMPolyFromText(text, integer)
 + RETURNS geometry
 + AS $$
 + DECLARE
 + geomtext alias for $1;
 + srid alias for $2;
 + mline geometry;
 + geom geometry;
 + BEGIN
 + mline := ST_MultiLineStringFromText(geomtext, srid);
 +
 + IF mline IS NULL
 + THEN
 + RAISE EXCEPTION 'Input is not a MultiLinestring';
 + END IF;
 +
 + geom := multi(ST_BuildArea(mline));
 +
 + RETURN geom;
 + END;
 + $$
 + LANGUAGE 'plpgsql' IMMUTABLE STRICT;
 +
 +
 + -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 + -- 
 + -- $Id: long_xact.sql.in.c 4894 2009-11-25 19:15:57Z pramsey $
 + --
 + -- PostGIS - Spatial Types for PostgreSQL
 + -- http://postgis.refractions.net
 + -- Copyright 2001-2003 Refractions Research Inc.
 + --
 + -- This is free software; you can redistribute and/or modify it under
 + -- the terms of the GNU General Public Licence. See the COPYING file.
 + --  
 + -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 +
 +
 +
 +
 +
 + -----------------------------------------------------------------------
 + -- LONG TERM LOCKING
 + -----------------------------------------------------------------------
 +
 + -- UnlockRows(authid)
 + -- removes all locks held by the given auth
 + -- returns the number of locks released
 + CREATE OR REPLACE FUNCTION UnlockRows(text)
 + RETURNS int
 + AS $$ 
 + DECLARE
 + ret int;
 + BEGIN
 +
 + IF NOT LongTransactionsEnabled() THEN
 + RAISE EXCEPTION 'Long transaction support disabled, use EnableLongTransaction() to enable.';
 + END IF;
 +
 + EXECUTE 'DELETE FROM authorization_table where authid = ' ||
 + quote_literal($1);
 +
 + GET DIAGNOSTICS ret = ROW_COUNT;
 +
 + RETURN ret;
 + END;
 + $$
 + LANGUAGE 'plpgsql'  VOLATILE STRICT;
 +
 + -- LockRow([schema], table, rowid, auth, [expires]) 
 + -- Returns 1 if successfully obtained the lock, 0 otherwise
 + CREATE OR REPLACE FUNCTION LockRow(text, text, text, text, timestamp)
 + RETURNS int
 + AS $$ 
 + DECLARE
 + myschema alias for $1;
 + mytable alias for $2;
 + myrid   alias for $3;
 + authid alias for $4;
 + expires alias for $5;
 + ret int;
 + mytoid oid;
 + myrec RECORD;
 +
 + BEGIN
 +
 + IF NOT LongTransactionsEnabled() THEN
 + RAISE EXCEPTION 'Long transaction support disabled, use EnableLongTransaction() to enable.';
 + END IF;
 +
 + EXECUTE 'DELETE FROM authorization_table WHERE expires < now()'; 
 +
 + SELECT c.oid INTO mytoid FROM pg_class c, pg_namespace n
 + WHERE c.relname = mytable
 + AND c.relnamespace = n.oid
 + AND n.nspname = myschema;
 +
 + -- RAISE NOTICE 'toid: %', mytoid;
 +
 + FOR myrec IN SELECT * FROM authorization_table WHERE 
 + toid = mytoid AND rid = myrid
 + LOOP
 + IF myrec.authid != authid THEN
 + RETURN 0;
 + ELSE
 + RETURN 1;
 + END IF;
 + END LOOP;
 +
 + EXECUTE 'INSERT INTO authorization_table VALUES ('||
 + quote_literal(mytoid::text)||','||quote_literal(myrid)||
 + ','||quote_literal(expires::text)||
 + ','||quote_literal(authid) ||')';
 +
 + GET DIAGNOSTICS ret = ROW_COUNT;
 +
 + RETURN ret;
 + END;
 + $$
 + LANGUAGE 'plpgsql'  VOLATILE STRICT;
 +
 + -- LockRow(schema, table, rid, authid);
 + CREATE OR REPLACE FUNCTION LockRow(text, text, text, text)
 + RETURNS int
 + AS
 + $$ SELECT LockRow($1, $2, $3, $4, now()::timestamp+'1:00'); $$
 + LANGUAGE 'sql'  VOLATILE STRICT;
 +
 + -- LockRow(table, rid, authid);
 + CREATE OR REPLACE FUNCTION LockRow(text, text, text)
 + RETURNS int
 + AS
 + $$ SELECT LockRow(current_schema(), $1, $2, $3, now()::timestamp+'1:00'); $$
 + LANGUAGE 'sql'  VOLATILE STRICT;
 +
 + -- LockRow(schema, table, rid, expires);
 + CREATE OR REPLACE FUNCTION LockRow(text, text, text, timestamp)
 + RETURNS int
 + AS
 + $$ SELECT LockRow(current_schema(), $1, $2, $3, $4); $$
 + LANGUAGE 'sql'  VOLATILE STRICT;
 +
 +
 + CREATE OR REPLACE FUNCTION AddAuth(text)
 + RETURNS BOOLEAN
 + AS $$ 
 + DECLARE
 + lockid alias for $1;
 + okay boolean;
 + myrec record;
 + BEGIN
 + -- check to see if table exists
 + --  if not, CREATE TEMP TABLE mylock (transid xid, lockcode text)
 + okay := 'f';
 + FOR myrec IN SELECT * FROM pg_class WHERE relname = 'temp_lock_have_table' LOOP
 + okay := 't';
 + END LOOP; 
 + IF (okay <> 't') THEN 
 + CREATE TEMP TABLE temp_lock_have_table (transid xid, lockcode text);
 + -- this will only work from pgsql7.4 up
 + -- ON COMMIT DELETE ROWS;
 + END IF;
 +
 + --  INSERT INTO mylock VALUES ( $1)
 + -- EXECUTE 'INSERT INTO temp_lock_have_table VALUES ( '||
 + -- quote_literal(getTransactionID()) || ',' ||
 + -- quote_literal(lockid) ||')';
 +
 + INSERT INTO temp_lock_have_table VALUES (getTransactionID(), lockid);
 +
 + RETURN true::boolean;
 + END;
 + $$
 + LANGUAGE PLPGSQL;
 +  
 +
 + -- CheckAuth( <schema>, <table>, <ridcolumn> )
 + --
 + -- Returns 0
 + --
 + CREATE OR REPLACE FUNCTION CheckAuth(text, text, text)
 + RETURNS INT
 + AS $$ 
 + DECLARE
 + schema text;
 + BEGIN
 + IF NOT LongTransactionsEnabled() THEN
 + RAISE EXCEPTION 'Long transaction support disabled, use EnableLongTransaction() to enable.';
 + END IF;
 +
 + if ( $1 != '' ) THEN
 + schema = $1;
 + ELSE
 + SELECT current_schema() into schema;
 + END IF;
 +
 + -- TODO: check for an already existing trigger ?
 +
 + EXECUTE 'CREATE TRIGGER check_auth BEFORE UPDATE OR DELETE ON ' 
 + || quote_ident(schema) || '.' || quote_ident($2)
 + ||' FOR EACH ROW EXECUTE PROCEDURE CheckAuthTrigger('
 + || quote_literal($3) || ')';
 +
 + RETURN 0;
 + END;
 + $$
 + LANGUAGE 'plpgsql';
 +
 + -- CheckAuth(<table>, <ridcolumn>)
 + CREATE OR REPLACE FUNCTION CheckAuth(text, text)
 + RETURNS INT
 + AS
 + $$ SELECT CheckAuth('', $1, $2) $$
 + LANGUAGE 'SQL';
 +
 + CREATE OR REPLACE FUNCTION CheckAuthTrigger()
 + RETURNS trigger AS 
 + '$libdir/postgis-1.5', 'check_authorization'
 + LANGUAGE C;
 +
 + CREATE OR REPLACE FUNCTION GetTransactionID()
 + RETURNS xid AS 
 + '$libdir/postgis-1.5', 'getTransactionID'
 + LANGUAGE C;
 +
 +
 + --
 + -- Enable Long transactions support
 + --
 + --  Creates the authorization_table if not already existing
 + --
 + CREATE OR REPLACE FUNCTION EnableLongTransactions()
 + RETURNS TEXT
 + AS $$ 
 + DECLARE
 + "query" text;
 + exists bool;
 + rec RECORD;
 +
 + BEGIN
 +
 + exists = 'f';
 + FOR rec IN SELECT * FROM pg_class WHERE relname = 'authorization_table'
 + LOOP
 + exists = 't';
 + END LOOP;
 +
 + IF NOT exists
 + THEN
 + "query" = 'CREATE TABLE authorization_table (
 + toid oid, -- table oid
 + rid text, -- row id
 + expires timestamp,
 + authid text
 + )';
 + EXECUTE "query";
 + END IF;
 +
 + exists = 'f';
 + FOR rec IN SELECT * FROM pg_class WHERE relname = 'authorized_tables'
 + LOOP
 + exists = 't';
 + END LOOP;
 +
 + IF NOT exists THEN
 + "query" = 'CREATE VIEW authorized_tables AS ' ||
 + 'SELECT ' ||
 + 'n.nspname as schema, ' ||
 + 'c.relname as table, trim(' ||
 + quote_literal(chr(92) || '000') ||
 + ' from t.tgargs) as id_column ' ||
 + 'FROM pg_trigger t, pg_class c, pg_proc p ' ||
 + ', pg_namespace n ' ||
 + 'WHERE p.proname = ' || quote_literal('checkauthtrigger') ||
 + ' AND c.relnamespace = n.oid' ||
 + ' AND t.tgfoid = p.oid and t.tgrelid = c.oid';
 + EXECUTE "query";
 + END IF;
 +
 + RETURN 'Long transactions support enabled';
 + END;
 + $$
 + LANGUAGE 'plpgsql';
 +
 + --
 + -- Check if Long transactions support is enabled
 + --
 + CREATE OR REPLACE FUNCTION LongTransactionsEnabled()
 + RETURNS bool
 + AS $$ 
 + DECLARE
 + rec RECORD;
 + BEGIN
 + FOR rec IN SELECT oid FROM pg_class WHERE relname = 'authorized_tables'
 + LOOP
 + return 't';
 + END LOOP;
 + return 'f';
 + END;
 + $$
 + LANGUAGE 'plpgsql';
 +
 + --
 + -- Disable Long transactions support
 + --
 + --  (1) Drop any long_xact trigger 
 + --  (2) Drop the authorization_table
 + --  (3) KEEP the authorized_tables view
 + --
 + CREATE OR REPLACE FUNCTION DisableLongTransactions()
 + RETURNS TEXT
 + AS $$ 
 + DECLARE
 + rec RECORD;
 +
 + BEGIN
 +
 + --
 + -- Drop all triggers applied by CheckAuth()
 + --
 + FOR rec IN
 + SELECT c.relname, t.tgname, t.tgargs FROM pg_trigger t, pg_class c, pg_proc p
 + WHERE p.proname = 'checkauthtrigger' and t.tgfoid = p.oid and t.tgrelid = c.oid
 + LOOP
 + EXECUTE 'DROP TRIGGER ' || quote_ident(rec.tgname) ||
 + ' ON ' || quote_ident(rec.relname);
 + END LOOP;
 +
 + --
 + -- Drop the authorization_table table
 + --
 + FOR rec IN SELECT * FROM pg_class WHERE relname = 'authorization_table' LOOP
 + DROP TABLE authorization_table;
 + END LOOP;
 +
 + --
 + -- Drop the authorized_tables view
 + --
 + FOR rec IN SELECT * FROM pg_class WHERE relname = 'authorized_tables' LOOP
 + DROP VIEW authorized_tables;
 + END LOOP;
 +
 + RETURN 'Long transactions support disabled';
 + END;
 + $$
 + LANGUAGE 'plpgsql';
 +
 + ---------------------------------------------------------------
 + -- END
 + ---------------------------------------------------------------
 +
 +
 + -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 + -- 
 + -- $Id: sqlmm.sql.in.c 4894 2009-11-25 19:15:57Z pramsey $
 + --
 + -- PostGIS - Spatial Types for PostgreSQL
 + -- http://postgis.refractions.net
 + -- Copyright 2001-2003 Refractions Research Inc.
 + --
 + -- This is free software; you can redistribute and/or modify it under
 + -- the terms of the GNU General Public Licence. See the COPYING file.
 + --  
 + -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 + -- This file defines a subset of SQL/MM functions (that is, only those
 + -- currently defined by ESRI's ArcSDE). Since these functions already exist
 + -- in PostGIS (for the most part), these functions simply expose the current
 + -- functions. Although mostly complying with SQL/MM standards, these prototypes
 + -- follow ESRI's ArcSDE SQL Specifications and not SQL/MM standards where 
 + -- disparities exist.
 + --
 + -- Specification Disparity Notes:
 + --   * ST_OrderingEquals(geometry, geometry) is implemented as per
 + --     ESRI's ArcSDE SQL specifications, not SQL/MM specifications.
 + --     (http://edndoc.esri.com/arcsde/9.1/sql_api/sqlapi3.htm#ST_OrderingEquals)
 + --   * Geometry constructors default to an SRID of -1, not 0 as per SQL/MM specs.
 + --   * Boolean return type methods (ie. ST_IsValid, ST_IsEmpty, ...)
 + --      * SQL/MM           : RETURNS 1 if TRUE, 0 if (FALSE, NULL)
 + --      * ESRI in Informix : RETURNS 1 if (TRUE, NULL), 0 if FALSE
 + --      * ESRI in DB2      : RETURNS 1 if TRUE, 0 if FALSE, NULL if NULL 
 + --      * PostGIS          : RETURNS 1 if TRUE, 0 if FALSE, NULL if NULL 
 + --
 + -- TODO: Implement ESRI's Shape constructors
 + --   * SE_AsShape(geometry)
 + --   * SE_ShapeToSQL
 + --   * SE_GeomFromShape
 + --   * SE_PointFromShape
 + --   * SE_LineFromShape
 + --   * SE_PolyFromShape
 + --   * SE_MPointFromShape
 + --   * SE_MLineFromShape
 + --   * SE_MPolyFromShape
 + -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 +
 +
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions for constructing an ST_Geometry
 + --     value given its WTK representation
 + -- (http://edndoc.esri.com/arcsde/9.1/general_topics/storing_geo_in_rdbms.html)
 + -------------------------------------------------------------------------------
 +
 + -- PostGIS equivalent function: ST_GeometryFromText(text)
 + -- Note: Defaults to an SRID=-1, not 0 as per SQL/MM specs.
 + CREATE OR REPLACE FUNCTION ST_WKTToSQL(text)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_from_text'
 + LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + -- ST_GeomFromText(text, int4) - already defined
 + -- ST_PointFromText(text, int4) - already defined
 + -- ST_LineFromText(text, int4) - already defined
 + -- ST_PolyFromText(text, int4) - already defined
 + -- ST_MPointFromText(text, int4) - already defined
 + -- ST_MLineFromText(text, int4) - already defined
 + -- ST_MPolyFromText(text, int4) - already defined
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions for constructing an ST_Geometry
 + --     value given its WKB representation
 + -------------------------------------------------------------------------------
 +
 + -- PostGIS equivalent function: GeomFromWKB(bytea))
 + -- Note: Defaults to an SRID=-1, not 0 as per SQL/MM specs.
 +
 + CREATE OR REPLACE FUNCTION ST_WKBToSQL(bytea)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','LWGEOM_from_WKB'
 + LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + -- ST_GeomFromWKB(bytea, int) - already defined
 + -- ST_PointFromWKB(bytea, int) - already defined
 + -- ST_LineFromWKB(bytea, int) - already defined
 + -- ST_PolyFromWKB(bytea, int) - already defined
 + -- ST_MPointFromWKB(bytea, int) - already defined
 + -- ST_MLineFromWKB(bytea, int) - already defined
 + -- ST_MPolyFromWKB(bytea, int) - already defined
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions for constructing an ST_Geometry
 + --     value given an ESRI Shape representation
 + -------------------------------------------------------------------------------
 +
 + -- TODO: SE_ShapeToSQL
 + -- TODO: SE_GeomFromShape
 + -- TODO: SE_PointFromShape
 + -- TODO: SE_LineFromShape
 + -- TODO: SE_PolyFromShape
 + -- TODO: SE_MPointFromShape
 + -- TODO: SE_MLineFromShape
 + -- TODO: SE_MPolyFromShape
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions for obtaining the WKT representation
 + --     of an ST_Geometry
 + -------------------------------------------------------------------------------
 +
 + -- ST_AsText(geometry) - already defined
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions for obtaining the WKB representation
 + --     of an ST_Geometry
 + -------------------------------------------------------------------------------
 +
 + -- ST_AsBinary(geometry) - already defined
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions for obtaining the ESRI Shape 
 + -- representation of an ST_Geometry
 + -------------------------------------------------------------------------------
 +
 + -- TODO: SE_AsShape(geometry)
 + --CREATE OR REPLACE FUNCTION SE_AsShape(geometry)
 + --    RETURNS bytea
 + --    AS '$libdir/postgis-1.5','LWGEOM_AsShape'
 + --    LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions on type ST_Geometry
 + -------------------------------------------------------------------------------
 +
 + -- PostGIS equivalent function: ndims(geometry)
 + CREATE OR REPLACE FUNCTION ST_CoordDim(geometry)
 + RETURNS smallint
 + AS '$libdir/postgis-1.5', 'LWGEOM_ndims'
 + LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + -- ST_Dimension(geometry) - already defined.
 + -- ST_GeometryType(geometry) - already defined.
 + -- ST_SRID(geometry) - already defined.
 + -- ST_IsEmpty(geometry) - already defined.
 + -- ST_IsSimple(geometry) - already defined.
 + -- ST_IsValid(geometry) - already defined.
 + -- ST_Boundary(geometry) - already defined.
 + -- ST_Envelope(geometry) - already defined.
 + -- ST_Transform(geometry) - already defined.
 + -- ST_AsText(geometry) - already defined.
 + -- ST_AsBinary(geometry) - already defined.
 + -- SE_AsShape(geometry) - already defined.
 + -- ST_X(geometry) - already defined.
 + -- ST_Y(geometry) - already defined.
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION _ST_OrderingEquals(geometry, geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5', 'LWGEOM_same'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.3.0
 + CREATE OR REPLACE FUNCTION ST_OrderingEquals(geometry, geometry)
 + RETURNS boolean
 + AS $$ 
 + SELECT $1 ~= $2 AND _ST_OrderingEquals($1, $2)
 + $$
 + LANGUAGE 'SQL' IMMUTABLE STRICT; 
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION SE_Is3D(geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_hasz'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION SE_IsMeasured(geometry)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'LWGEOM_hasm'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions on type ST_Point
 + -------------------------------------------------------------------------------
 +
 + -- PostGIS equivalent function: makePoint(float8,float8)
 + CREATE OR REPLACE FUNCTION ST_Point(float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint'
 + LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + -- PostGIS equivalent function: Z(geometry)
 + CREATE OR REPLACE FUNCTION SE_Z(geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5','LWGEOM_z_point'
 + LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + -- PostGIS equivalent function: M(geometry)
 + CREATE OR REPLACE FUNCTION SE_M(geometry)
 + RETURNS float8
 + AS '$libdir/postgis-1.5','LWGEOM_m_point'
 + LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions on type ST_Curve
 + -------------------------------------------------------------------------------
 +
 + -- ST_StartPoint(geometry) - already defined.
 + -- ST_EndPoint(geometry) - already defined.
 + -- ST_IsClosed(geometry) - already defined.
 + -- ST_IsRing(geometry) - already defined.
 + -- ST_Length(geometry) - already defined.
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions on type ST_LineString
 + -------------------------------------------------------------------------------
 +
 + -- ST_NumPoints(geometry) - already defined.
 + -- ST_PointN(geometry) - already defined.
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions on type ST_Surface
 + -------------------------------------------------------------------------------
 +
 + -- ST_Centroid(geometry) - already defined.
 + -- ST_PointOnSurface(geometry) - already defined.
 + -- ST_Area(geometry) - already defined.
 + -- ST_Perimeter(geometry) - already defined.
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions on type ST_Polygon
 + -------------------------------------------------------------------------------
 +
 + -- PostGIS equivalent function: MakePolygon(geometry)
 + CREATE OR REPLACE FUNCTION ST_Polygon(geometry, int)
 + RETURNS geometry
 + AS $$ 
 + SELECT setSRID(makepolygon($1), $2)
 + $$
 + LANGUAGE 'SQL' IMMUTABLE STRICT; 
 +
 + -- ST_ExteriorRing(geometry) - already defined.
 + -- ST_NumInteriorRing(geometry) - already defined.
 + -- ST_InteriorRingN(geometry, integer) - already defined.
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions on type ST_GeomCollection
 + -------------------------------------------------------------------------------
 +
 + -- ST_NumGeometries(geometry) - already defined.
 + -- ST_GeometryN(geometry, integer) - already defined.
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions on type ST_MultiCurve
 + -------------------------------------------------------------------------------
 +
 + -- ST_IsClosed(geometry) - already defined.
 + -- ST_Length(geometry) - already defined.
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions on type ST_MultiSurface
 + -------------------------------------------------------------------------------
 +
 + -- ST_Centroid(geometry) - already defined.
 + -- ST_PointOnSurface(geometry) - already defined.
 + -- ST_Area(geometry) - already defined.
 + -- ST_Perimeter(geometry) - already defined.
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions that test spatial relationships
 + -------------------------------------------------------------------------------
 +
 + -- ST_Equals(geometry, geometry) - already defined.
 + -- ST_Disjoint(geometry, geometry) - already defined.
 + -- ST_Touches(geometry, geometry) - already defined.
 + -- ST_Within(geometry, geometry) - already defined.
 + -- ST_Overlaps(geometry, geometry) - already defined.
 + -- ST_Crosses(geometry, geometry) - already defined.
 + -- ST_Intersects(geometry, geometry) - already defined.
 + -- ST_Contains(geometry, geometry) - already defined.
 + -- ST_Relate(geometry, geometry, text) - already defined.
 +
 + -- PostGIS equivalent function: none
 + CREATE OR REPLACE FUNCTION SE_EnvelopesIntersect(geometry,geometry)
 + RETURNS boolean
 + AS $$ 
 + SELECT $1 && $2
 + $$
 + LANGUAGE 'SQL' IMMUTABLE STRICT; 
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions for distance relationships
 + -------------------------------------------------------------------------------
 +
 + -- ST_Distance(geometry, geometry) - already defined.
 +
 + -------------------------------------------------------------------------------
 + -- SQL/MM (ArcSDE subset) - SQL Functions that implement spatial operators
 + -------------------------------------------------------------------------------
 +
 + -- ST_Intersection(geometry, geometry) - already defined.
 + -- ST_Difference(geometry, geometry) - already defined.
 + -- ST_Union(geometry, geometry) - already defined.
 + -- ST_SymDifference(geometry, geometry) - already defined.
 + -- ST_Buffer(geometry, float8) - already defined.
 + -- ST_ConvexHull(geometry) already defined.
 +
 + -- PostGIS equivalent function: locate_along_measure(geometry, float8)
 + CREATE OR REPLACE FUNCTION SE_LocateAlong(geometry, float8)
 + RETURNS geometry
 + AS $$ SELECT locate_between_measures($1, $2, $2) $$
 + LANGUAGE 'sql' IMMUTABLE STRICT;
 +
 + -- PostGIS equivalent function: locate_between_measures(geometry, float8, float8)
 + CREATE OR REPLACE FUNCTION SE_LocateBetween(geometry, float8, float8)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_locate_between_m'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 +
 +
 + -------------------------------------------------------------------------------
 + -- END
 + -------------------------------------------------------------------------------
 +
 +
 + ---------------------------------------------------------------------------
 + -- $Id: geography.sql.in.c 5976 2010-09-18 18:01:17Z pramsey $
 + --
 + -- PostGIS - Spatial Types for PostgreSQL
 + -- Copyright 2009 Paul Ramsey <pramsey@cleverelephant.ca>
 + --
 + -- This is free software; you can redistribute and/or modify it under
 + -- the terms of the GNU General Public Licence. See the COPYING file.
 + --
 + ---------------------------------------------------------------------------
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_typmod_in(cstring[])
 + RETURNS integer
 + AS '$libdir/postgis-1.5','geography_typmod_in'
 + LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_typmod_out(integer)
 + RETURNS cstring
 + AS '$libdir/postgis-1.5','geography_typmod_out'
 + LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_in(cstring, oid, integer)
 + RETURNS geography
 + AS '$libdir/postgis-1.5','geography_in'
 + LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_out(geography)
 + RETURNS cstring
 + AS '$libdir/postgis-1.5','geography_out'
 + LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_analyze(internal)
 + RETURNS bool
 + AS '$libdir/postgis-1.5','geography_analyze'
 + LANGUAGE 'C' VOLATILE STRICT; 
 +
 + -- Availability: 1.5.0
 + CREATE TYPE geography (
 + internallength = variable,
 + input = geography_in,
 + output = geography_out,
 + typmod_in = geography_typmod_in,
 + typmod_out = geography_typmod_out,
 + analyze = geography_analyze,
 + storage = main,
 + alignment = double
 + );
 +
 + --
 + -- GIDX type is used by the GiST index bindings. 
 + -- In/out functions are stubs, as all access should be internal.
 + ---
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION gidx_in(cstring)
 + RETURNS gidx
 + AS '$libdir/postgis-1.5','gidx_in'
 + LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION gidx_out(gidx)
 + RETURNS cstring
 + AS '$libdir/postgis-1.5','gidx_out'
 + LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + -- Availability: 1.5.0
 + CREATE TYPE gidx (
 + internallength = variable,
 + input = gidx_in,
 + output = gidx_out,
 + storage = plain,
 + alignment = double
 + );
 +
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography(geography, integer, boolean)
 + RETURNS geography
 + AS '$libdir/postgis-1.5','geography_enforce_typmod'
 + LANGUAGE 'C' IMMUTABLE STRICT; 
 +
 + -- Availability: 1.5.0
 + CREATE CAST (geography AS geography) WITH FUNCTION geography(geography, integer, boolean) AS IMPLICIT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_AsText(geography)
 + RETURNS text
 + AS '$libdir/postgis-1.5','geography_as_text'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
 + -- TODO Remove in 2.0
 + CREATE OR REPLACE FUNCTION ST_AsText(text)
 + RETURNS text AS
 + $$ SELECT ST_AsText($1::geometry);  $$
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_GeographyFromText(text)
 + RETURNS geography
 + AS '$libdir/postgis-1.5','geography_from_text'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_GeogFromText(text)
 + RETURNS geography
 + AS '$libdir/postgis-1.5','geography_from_text'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_AsBinary(geography)
 + RETURNS bytea
 + AS '$libdir/postgis-1.5','geography_as_binary'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
 + -- TODO Remove in 2.0
 + CREATE OR REPLACE FUNCTION ST_AsBinary(text)
 + RETURNS bytea AS
 + $$ SELECT ST_AsBinary($1::geometry);  $$
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_GeogFromWKB(bytea)
 + RETURNS geography
 + AS '$libdir/postgis-1.5','geography_from_binary'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_typmod_dims(integer)
 + RETURNS integer
 + AS '$libdir/postgis-1.5','geography_typmod_dims'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_typmod_srid(integer)
 + RETURNS integer
 + AS '$libdir/postgis-1.5','geography_typmod_srid'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_typmod_type(integer)
 + RETURNS text
 + AS '$libdir/postgis-1.5','geography_typmod_type'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE VIEW geography_columns AS
 + SELECT
 + current_database() AS f_table_catalog, 
 + n.nspname AS f_table_schema, 
 + c.relname AS f_table_name, 
 + a.attname AS f_geography_column,
 + geography_typmod_dims(a.atttypmod) AS coord_dimension,
 + geography_typmod_srid(a.atttypmod) AS srid,
 + geography_typmod_type(a.atttypmod) AS type
 + FROM 
 + pg_class c, 
 + pg_attribute a, 
 + pg_type t, 
 + pg_namespace n
 + WHERE t.typname = 'geography'
 +         AND a.attisdropped = false
 +         AND a.atttypid = t.oid
 +         AND a.attrelid = c.oid
 +         AND c.relnamespace = n.oid
 +         AND NOT pg_is_other_temp_schema(c.relnamespace);
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography(geometry)
 + RETURNS geography
 + AS '$libdir/postgis-1.5','geography_from_geometry'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE CAST (geometry AS geography) WITH FUNCTION geography(geometry) AS IMPLICIT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geometry(geography)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5','geometry_from_geography'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE CAST (geography AS geometry) WITH FUNCTION geometry(geography) ;
 +
 + -- ---------- ---------- ---------- ---------- ---------- ---------- ----------
 + -- GiST Support Functions
 + -- ---------- ---------- ---------- ---------- ---------- ---------- ----------
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_gist_consistent(internal,geometry,int4) 
 + RETURNS bool 
 + AS '$libdir/postgis-1.5' ,'geography_gist_consistent'
 + LANGUAGE 'C';
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_gist_compress(internal) 
 + RETURNS internal 
 + AS '$libdir/postgis-1.5','geography_gist_compress'
 + LANGUAGE 'C';
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_gist_penalty(internal,internal,internal) 
 + RETURNS internal 
 + AS '$libdir/postgis-1.5' ,'geography_gist_penalty'
 + LANGUAGE 'C';
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_gist_picksplit(internal, internal) 
 + RETURNS internal 
 + AS '$libdir/postgis-1.5' ,'geography_gist_picksplit'
 + LANGUAGE 'C';
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_gist_union(bytea, internal) 
 + RETURNS internal 
 + AS '$libdir/postgis-1.5' ,'geography_gist_union'
 + LANGUAGE 'C';
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_gist_same(box2d, box2d, internal) 
 + RETURNS internal 
 + AS '$libdir/postgis-1.5' ,'geography_gist_same'
 + LANGUAGE 'C';
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_gist_decompress(internal) 
 + RETURNS internal 
 + AS '$libdir/postgis-1.5' ,'geography_gist_decompress'
 + LANGUAGE 'C';
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_gist_selectivity (internal, oid, internal, int4)
 + RETURNS float8
 + AS '$libdir/postgis-1.5', 'geography_gist_selectivity'
 + LANGUAGE 'C';
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_gist_join_selectivity(internal, oid, internal, smallint)
 + RETURNS float8
 + AS '$libdir/postgis-1.5', 'geography_gist_join_selectivity'
 + LANGUAGE 'C';
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION geography_overlaps(geography, geography) 
 + RETURNS boolean 
 + AS '$libdir/postgis-1.5' ,'geography_overlaps'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OPERATOR && (
 + LEFTARG = geography, RIGHTARG = geography, PROCEDURE = geography_overlaps,
 + COMMUTATOR = '&&',
 + RESTRICT = geography_gist_selectivity, 
 + JOIN = geography_gist_join_selectivity
 + );
 +
 +
 + -- Availability: 1.5.0
 + CREATE OPERATOR CLASS gist_geography_ops
 + DEFAULT FOR TYPE geography USING GIST AS
 + STORAGE gidx,
 + OPERATOR        3        && ,
 + -- OPERATOR        6        ~= ,
 + -- OPERATOR        7        ~ ,
 + -- OPERATOR        8        @ ,
 + FUNCTION        1        geography_gist_consistent (internal, geometry, int4),
 + FUNCTION        2        geography_gist_union (bytea, internal),
 + FUNCTION        3        geography_gist_compress (internal),
 + FUNCTION        4        geography_gist_decompress (internal),
 + FUNCTION        5        geography_gist_penalty (internal, internal, internal),
 + FUNCTION        6        geography_gist_picksplit (internal, internal),
 + FUNCTION        7        geography_gist_same (box2d, box2d, internal);
 +
 +
 + -- ---------- ---------- ---------- ---------- ---------- ---------- ----------
 + -- B-Tree Functions
 + -- For sorting and grouping
 + -- Availability: 1.5.0
 + -- ---------- ---------- ---------- ---------- ---------- ---------- ----------
 +
 + CREATE OR REPLACE FUNCTION geography_lt(geography, geography)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'geography_lt'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geography_le(geography, geography)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'geography_le'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geography_gt(geography, geography)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'geography_gt'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geography_ge(geography, geography)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'geography_ge'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geography_eq(geography, geography)
 + RETURNS bool
 + AS '$libdir/postgis-1.5', 'geography_eq'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION geography_cmp(geography, geography)
 + RETURNS integer
 + AS '$libdir/postgis-1.5', 'geography_cmp'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + --
 + -- Sorting operators for Btree
 + --
 +
 + CREATE OPERATOR < (
 + LEFTARG = geography, RIGHTARG = geography, PROCEDURE = geography_lt,
 + COMMUTATOR = '>', NEGATOR = '>=',
 + RESTRICT = contsel, JOIN = contjoinsel
 + );
 +
 + CREATE OPERATOR <= (
 + LEFTARG = geography, RIGHTARG = geography, PROCEDURE = geography_le,
 + COMMUTATOR = '>=', NEGATOR = '>',
 + RESTRICT = contsel, JOIN = contjoinsel
 + );
 +
 + CREATE OPERATOR = (
 + LEFTARG = geography, RIGHTARG = geography, PROCEDURE = geography_eq,
 + COMMUTATOR = '=', -- we might implement a faster negator here
 + RESTRICT = contsel, JOIN = contjoinsel
 + );
 +
 + CREATE OPERATOR >= (
 + LEFTARG = geography, RIGHTARG = geography, PROCEDURE = geography_ge,
 + COMMUTATOR = '<=', NEGATOR = '<',
 + RESTRICT = contsel, JOIN = contjoinsel
 + );
 + CREATE OPERATOR > (
 + LEFTARG = geography, RIGHTARG = geography, PROCEDURE = geography_gt,
 + COMMUTATOR = '<', NEGATOR = '<=',
 + RESTRICT = contsel, JOIN = contjoinsel
 + );
 +
 + CREATE OPERATOR CLASS btree_geography_ops
 + DEFAULT FOR TYPE geography USING btree AS
 + OPERATOR 1 < ,
 + OPERATOR 2 <= ,
 + OPERATOR 3 = ,
 + OPERATOR 4 >= ,
 + OPERATOR 5 > ,
 + FUNCTION 1 geography_cmp (geography, geography);
 +
 +
 + -- ---------- ---------- ---------- ---------- ---------- ---------- ----------
 + -- Export Functions
 + -- Availability: 1.5.0
 + -- ---------- ---------- ---------- ---------- ---------- ---------- ----------
 +
 + --
 + -- SVG OUTPUT
 + --
 +
 + -- ST_AsSVG(geography, precision, rel)
 + CREATE OR REPLACE FUNCTION ST_AsSVG(geography,int4,int4)
 + RETURNS text
 + AS '$libdir/postgis-1.5','geography_as_svg'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- ST_AsSVG(geography, precision) / rel=0
 + CREATE OR REPLACE FUNCTION ST_AsSVG(geography,int4)
 + RETURNS text
 + AS '$libdir/postgis-1.5','geography_as_svg'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- ST_AsSVG(geography) / precision=15, rel=0
 + CREATE OR REPLACE FUNCTION ST_AsSVG(geography)
 + RETURNS text
 + AS '$libdir/postgis-1.5','geography_as_svg'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
 + -- TODO Remove in 2.0
 + CREATE OR REPLACE FUNCTION ST_AsSVG(text)
 + RETURNS text AS
 + $$ SELECT ST_AsSVG($1::geometry);  $$
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 +
 + --
 + -- GML OUTPUT
 + --
 +
 + -- _ST_AsGML(version, geography, precision, option)
 + CREATE OR REPLACE FUNCTION _ST_AsGML(int4, geography, int4, int4)
 + RETURNS text
 + AS '$libdir/postgis-1.5','geography_as_gml'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- ST_AsGML(geography, precision) / version=2 options=0
 + CREATE OR REPLACE FUNCTION ST_AsGML(geography, int4)
 + RETURNS text
 + AS 'SELECT _ST_AsGML(2, $1, $2, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGML(geography) / precision=15 version=2 options=0
 + CREATE OR REPLACE FUNCTION ST_AsGML(geography)
 + RETURNS text
 + AS 'SELECT _ST_AsGML(2, $1, 15, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
 + -- TODO Remove in 2.0
 + CREATE OR REPLACE FUNCTION ST_AsGML(text)
 + RETURNS text AS
 + $$ SELECT ST_AsGML($1::geometry);  $$
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGML(version, geography) / precision=15 version=2 options=0
 + CREATE OR REPLACE FUNCTION ST_AsGML(int4, geography)
 + RETURNS text
 + AS 'SELECT _ST_AsGML($1, $2, 15, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGML(version, geography, precision) / options = 0
 + CREATE OR REPLACE FUNCTION ST_AsGML(int4, geography, int4)
 + RETURNS text
 + AS 'SELECT _ST_AsGML($1, $2, $3, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGML (geography, precision, option) / version=2
 + CREATE OR REPLACE FUNCTION ST_AsGML(geography, int4, int4)
 + RETURNS text
 + AS 'SELECT _ST_AsGML(2, $1, $2, $3)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGML(version, geography, precision, option)
 + CREATE OR REPLACE FUNCTION ST_AsGML(int4, geography, int4, int4)
 + RETURNS text
 + AS 'SELECT _ST_AsGML($1, $2, $3, $4)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 +
 +
 + --
 + -- KML OUTPUT
 + --
 +
 + -- _ST_AsKML(version, geography, precision)
 + CREATE OR REPLACE FUNCTION _ST_AsKML(int4, geography, int4)
 + RETURNS text
 + AS '$libdir/postgis-1.5','geography_as_kml'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- AsKML(geography,precision) / version=2
 + CREATE OR REPLACE FUNCTION ST_AsKML(geography, int4)
 + RETURNS text
 + AS 'SELECT _ST_AsKML(2, $1, $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- AsKML(geography) / precision=15 version=2
 + CREATE OR REPLACE FUNCTION ST_AsKML(geography)
 + RETURNS text
 + AS 'SELECT _ST_AsKML(2, $1, 15)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
 + -- TODO Remove in 2.0
 + CREATE OR REPLACE FUNCTION ST_AsKML(text)
 + RETURNS text AS
 + $$ SELECT ST_AsKML($1::geometry);  $$
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsKML(version, geography) / precision=15 
 + CREATE OR REPLACE FUNCTION ST_AsKML(int4, geography)
 + RETURNS text
 + AS 'SELECT _ST_AsKML($1, $2, 15)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsKML(version, geography, precision)
 + CREATE OR REPLACE FUNCTION ST_AsKML(int4, geography, int4)
 + RETURNS text
 + AS 'SELECT _ST_AsKML($1, $2, $3)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 +
 +
 + --
 + -- GeoJson Output
 + --
 +
 + CREATE OR REPLACE FUNCTION _ST_AsGeoJson(int4, geography, int4, int4)
 + RETURNS text
 + AS '$libdir/postgis-1.5','geography_as_geojson'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- ST_AsGeoJson(geography, precision) / version=1 options=0
 + CREATE OR REPLACE FUNCTION ST_AsGeoJson(geography, int4)
 + RETURNS text
 + AS 'SELECT _ST_AsGeoJson(1, $1, $2, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGeoJson(geography) / precision=15 version=1 options=0
 + CREATE OR REPLACE FUNCTION ST_AsGeoJson(geography)
 + RETURNS text
 + AS 'SELECT _ST_AsGeoJson(1, $1, 15, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
 + -- TODO Remove in 2.0
 + CREATE OR REPLACE FUNCTION ST_AsGeoJson(text)
 + RETURNS text AS
 + $$ SELECT ST_AsGeoJson($1::geometry);  $$
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGeoJson(version, geography) / precision=15 options=0
 + CREATE OR REPLACE FUNCTION ST_AsGeoJson(int4, geography)
 + RETURNS text
 + AS 'SELECT _ST_AsGeoJson($1, $2, 15, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGeoJson(version, geography, precision) / options=0
 + CREATE OR REPLACE FUNCTION ST_AsGeoJson(int4, geography, int4)
 + RETURNS text
 + AS 'SELECT _ST_AsGeoJson($1, $2, $3, 0)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGeoJson(geography, precision, options) / version=1
 + CREATE OR REPLACE FUNCTION ST_AsGeoJson(geography, int4, int4)
 + RETURNS text
 + AS 'SELECT _ST_AsGeoJson(1, $1, $2, $3)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ST_AsGeoJson(version, geography, precision,options)
 + CREATE OR REPLACE FUNCTION ST_AsGeoJson(int4, geography, int4, int4)
 + RETURNS text
 + AS 'SELECT _ST_AsGeoJson($1, $2, $3, $4)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ---------- ---------- ---------- ---------- ---------- ---------- ----------
 + -- Measurement Functions
 + -- Availability: 1.5.0
 + -- ---------- ---------- ---------- ---------- ---------- ---------- ----------
 +
 + -- Stop calculation and return immediately once distance is less than tolerance
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION _ST_Distance(geography, geography, float8, boolean)
 + RETURNS float8
 + AS '$libdir/postgis-1.5','geography_distance'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Stop calculation and return immediately once distance is less than tolerance
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION _ST_DWithin(geography, geography, float8, boolean)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5','geography_dwithin'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_Distance(geography, geography, boolean)
 + RETURNS float8
 + AS 'SELECT _ST_Distance($1, $2, 0.0, $3)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Currently defaulting to spheroid calculations
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_Distance(geography, geography)
 + RETURNS float8
 + AS 'SELECT _ST_Distance($1, $2, 0.0, true)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
 + -- TODO Remove in 2.0
 + CREATE OR REPLACE FUNCTION ST_Distance(text, text)
 + RETURNS float8 AS
 + $$ SELECT ST_Distance($1::geometry, $2::geometry);  $$
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Only expands the bounding box, the actual geometry will remain unchanged, use with care.
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION _ST_Expand(geography, float8)
 + RETURNS geography
 + AS '$libdir/postgis-1.5','geography_expand'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_DWithin(geography, geography, float8, boolean)
 + RETURNS boolean
 + AS 'SELECT $1 && _ST_Expand($2,$3) AND $2 && _ST_Expand($1,$3) AND _ST_DWithin($1, $2, $3, $4)'
 + LANGUAGE 'SQL' IMMUTABLE;
 +
 + -- Currently defaulting to spheroid calculations
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_DWithin(geography, geography, float8)
 + RETURNS boolean
 + AS 'SELECT $1 && _ST_Expand($2,$3) AND $2 && _ST_Expand($1,$3) AND _ST_DWithin($1, $2, $3, true)'
 + LANGUAGE 'SQL' IMMUTABLE;
 +
 + -- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
 + -- TODO Remove in 2.0
 + CREATE OR REPLACE FUNCTION ST_DWithin(text, text, float8)
 + RETURNS boolean AS
 + $$ SELECT ST_DWithin($1::geometry, $2::geometry, $3);  $$
 + LANGUAGE 'SQL' IMMUTABLE ;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_Area(geography, boolean)
 + RETURNS float8
 + AS '$libdir/postgis-1.5','geography_area'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Currently defaulting to spheroid calculations
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_Area(geography)
 + RETURNS float8
 + AS 'SELECT ST_Area($1, true)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
 + -- TODO Remove in 2.0
 + CREATE OR REPLACE FUNCTION ST_Area(text)
 + RETURNS float8 AS
 + $$ SELECT ST_Area($1::geometry);  $$
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_Length(geography, boolean)
 + RETURNS float8
 + AS '$libdir/postgis-1.5','geography_length'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_Length(geography)
 + RETURNS float8
 + AS 'SELECT ST_Length($1, true)'
 + LANGUAGE 'SQL' IMMUTABLE;
 +
 + -- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
 + -- TODO Remove in 2.0
 + CREATE OR REPLACE FUNCTION ST_Length(text)
 + RETURNS float8 AS
 + $$ SELECT ST_Length($1::geometry);  $$
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION _ST_PointOutside(geography)
 + RETURNS geography
 + AS '$libdir/postgis-1.5','geography_point_outside'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Only implemented for polygon-over-point
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION _ST_Covers(geography, geography)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5','geography_covers'
 + LANGUAGE 'C' IMMUTABLE STRICT
 + COST 100;
 +
 + -- Only implemented for polygon-over-point
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_Covers(geography, geography)
 + RETURNS boolean
 + AS 'SELECT $1 && $2 AND _ST_Covers($1, $2)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
 + -- TODO Remove in 2.0
 + CREATE OR REPLACE FUNCTION ST_Covers(text, text)
 + RETURNS boolean AS
 + $$ SELECT ST_Covers($1::geometry, $2::geometry);  $$
 + LANGUAGE 'SQL' IMMUTABLE ;
 +
 + -- Only implemented for polygon-over-point
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_CoveredBy(geography, geography)
 + RETURNS boolean
 + AS 'SELECT $1 && $2 AND _ST_Covers($2, $1)'
 + LANGUAGE 'SQL' IMMUTABLE ;
 +
 + -- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
 + -- TODO Remove in 2.0
 + CREATE OR REPLACE FUNCTION ST_CoveredBy(text, text)
 + RETURNS boolean AS
 + $$ SELECT ST_CoveredBy($1::geometry, $2::geometry);  $$
 + LANGUAGE 'SQL' IMMUTABLE ;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_Intersects(geography, geography)
 + RETURNS boolean
 + AS 'SELECT $1 && $2 AND _ST_Distance($1, $2, 0.0, false) < 0.00001'
 + LANGUAGE 'SQL' IMMUTABLE;
 +
 + -- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
 + -- TODO Remove in 2.0
 + CREATE OR REPLACE FUNCTION ST_Intersects(text, text)
 + RETURNS boolean AS
 + $$ SELECT ST_Intersects($1::geometry, $2::geometry);  $$
 + LANGUAGE 'SQL' IMMUTABLE ;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION _ST_BestSRID(geography, geography)
 + RETURNS integer
 + AS '$libdir/postgis-1.5','geography_bestsrid'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION _ST_BestSRID(geography)
 + RETURNS integer
 + AS 'SELECT _ST_BestSRID($1,$1)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_Buffer(geography, float8)
 + RETURNS geography
 + AS 'SELECT geography(ST_Transform(ST_Buffer(ST_Transform(geometry($1), _ST_BestSRID($1)), $2), 4326))'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
 + -- TODO Remove in 2.0
 + CREATE OR REPLACE FUNCTION ST_Buffer(text, float8)
 + RETURNS geometry AS
 + $$ SELECT ST_Buffer($1::geometry, $2);  $$
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0
 + CREATE OR REPLACE FUNCTION ST_Intersection(geography, geography)
 + RETURNS geography
 + AS 'SELECT geography(ST_Transform(ST_Intersection(ST_Transform(geometry($1), _ST_BestSRID($1, $2)), ST_Transform(geometry($2), _ST_BestSRID($1, $2))), 4326))'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- Availability: 1.5.0 - this is just a hack to prevent unknown from causing ambiguous name because of geography
 + -- TODO Remove in 2.0
 + CREATE OR REPLACE FUNCTION ST_Intersection(text, text)
 + RETURNS geometry AS
 + $$ SELECT ST_Intersection($1::geometry, $2::geometry);  $$
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + -- ---------- ---------- ---------- ---------- ---------- ---------- ----------
 +
 + ---------------------------------------------------------------
 + -- SQL-MM
 + ---------------------------------------------------------------
 +
 + --
 + -- SQL-MM
 + --
 + -- ST_CurveToLine(Geometry geometry, SegmentsPerQuarter integer)
 + --
 + -- Converts a given geometry to a linear geometry.  Each curveed
 + -- geometry or segment is converted into a linear approximation using
 + -- the given number of segments per quarter circle.
 + CREATE OR REPLACE FUNCTION ST_CurveToLine(geometry, integer)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_curve_segmentize'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 + --
 + -- SQL-MM
 + --
 + -- ST_CurveToLine(Geometry geometry, SegmentsPerQuarter integer)
 + --
 + -- Converts a given geometry to a linear geometry.  Each curveed
 + -- geometry or segment is converted into a linear approximation using
 + -- the default value of 32 segments per quarter circle
 + CREATE OR REPLACE FUNCTION ST_CurveToLine(geometry)
 + RETURNS geometry AS 'SELECT ST_CurveToLine($1, 32)'
 + LANGUAGE 'SQL' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION ST_HasArc(geometry)
 + RETURNS boolean
 + AS '$libdir/postgis-1.5', 'LWGEOM_has_arc'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION ST_LineToCurve(geometry)
 + RETURNS geometry
 + AS '$libdir/postgis-1.5', 'LWGEOM_line_desegmentize'
 + LANGUAGE 'C' IMMUTABLE STRICT;
 + ---------------------------------------------------------------
 + -- END
 + ---------------------------------------------------------------
 +
 +
 + ---------------------------------------------------------------
 + -- USER CONTRIUBUTED
 + ---------------------------------------------------------------
 +
 + -----------------------------------------------------------------------
 + -- ST_MinimumBoundingCircle(inputgeom geometry, segs_per_quarter integer)
 + -----------------------------------------------------------------------
 + -- Returns the smallest circle polygon that can fully contain a geometry
 + -- Defaults to 48 segs per quarter to approximate a circle
 + -- Contributed by Bruce Rindahl
 + -- Availability: 1.4.0
 + -----------------------------------------------------------------------
 + CREATE OR REPLACE FUNCTION ST_MinimumBoundingCircle(inputgeom geometry, segs_per_quarter integer)
 + RETURNS geometry AS
 + $BODY$
 + DECLARE
 + hull GEOMETRY;
 + ring GEOMETRY;
 + center GEOMETRY;
 + radius DOUBLE PRECISION;
 + dist DOUBLE PRECISION;
 + d DOUBLE PRECISION;
 + idx1 integer;
 + idx2 integer;
 + l1 GEOMETRY;
 + l2 GEOMETRY;
 + p1 GEOMETRY;
 + p2 GEOMETRY;
 + a1 DOUBLE PRECISION;
 + a2 DOUBLE PRECISION;
 +
 +
 + BEGIN
 +
 + -- First compute the ConvexHull of the geometry
 + hull = ST_ConvexHull(inputgeom);
 + --A point really has no MBC
 + IF ST_GeometryType(hull) = 'ST_Point' THEN
 + RETURN hull;
 + END IF;
 + -- convert the hull perimeter to a linestring so we can manipulate individual points
 + --If its already a linestring force it to a closed linestring
 + ring = CASE WHEN ST_GeometryType(hull) = 'ST_LineString' THEN ST_AddPoint(hull, ST_StartPoint(hull)) ELSE ST_ExteriorRing(hull) END;
 +
 + dist = 0;
 + -- Brute Force - check every pair
 + FOR i in 1 .. (ST_NumPoints(ring)-2)
 + LOOP
 + FOR j in i .. (ST_NumPoints(ring)-1)
 + LOOP
 + d = ST_Distance(ST_PointN(ring,i),ST_PointN(ring,j));
 + -- Check the distance and update if larger
 + IF (d > dist) THEN
 + dist = d;
 + idx1 = i;
 + idx2 = j;
 + END IF;
 + END LOOP;
 + END LOOP;
 +
 + -- We now have the diameter of the convex hull.  The following line returns it if desired.
 + -- RETURN MakeLine(PointN(ring,idx1),PointN(ring,idx2));
 +
 + -- Now for the Minimum Bounding Circle.  Since we know the two points furthest from each
 + -- other, the MBC must go through those two points. Start with those points as a diameter of a circle.
 +
 + -- The radius is half the distance between them and the center is midway between them
 + radius = ST_Distance(ST_PointN(ring,idx1),ST_PointN(ring,idx2)) / 2.0;
 + center = ST_Line_interpolate_point(ST_MakeLine(ST_PointN(ring,idx1),ST_PointN(ring,idx2)),0.5);
 +
 + -- Loop through each vertex and check if the distance from the center to the point
 + -- is greater than the current radius.
 + FOR k in 1 .. (ST_NumPoints(ring)-1)
 + LOOP
 + IF(k <> idx1 and k <> idx2) THEN
 + dist = ST_Distance(center,ST_PointN(ring,k));
 + IF (dist > radius) THEN
 + -- We have to expand the circle.  The new circle must pass trhough
 + -- three points - the two original diameters and this point.
 +
 + -- Draw a line from the first diameter to this point
 + l1 = ST_Makeline(ST_PointN(ring,idx1),ST_PointN(ring,k));
 + -- Compute the midpoint
 + p1 = ST_line_interpolate_point(l1,0.5);
 + -- Rotate the line 90 degrees around the midpoint (perpendicular bisector)
 + l1 = ST_Translate(ST_Rotate(ST_Translate(l1,-X(p1),-Y(p1)),pi()/2),X(p1),Y(p1));
 + --  Compute the azimuth of the bisector
 + a1 = ST_Azimuth(ST_PointN(l1,1),ST_PointN(l1,2));
 + --  Extend the line in each direction the new computed distance to insure they will intersect
 + l1 = ST_AddPoint(l1,ST_Makepoint(X(ST_PointN(l1,2))+sin(a1)*dist,Y(ST_PointN(l1,2))+cos(a1)*dist),-1);
 + l1 = ST_AddPoint(l1,ST_Makepoint(X(ST_PointN(l1,1))-sin(a1)*dist,Y(ST_PointN(l1,1))-cos(a1)*dist),0);
 +
 + -- Repeat for the line from the point to the other diameter point
 + l2 = ST_Makeline(ST_PointN(ring,idx2),ST_PointN(ring,k));
 + p2 = ST_Line_interpolate_point(l2,0.5);
 + l2 = ST_Translate(ST_Rotate(ST_Translate(l2,-X(p2),-Y(p2)),pi()/2),X(p2),Y(p2));
 + a2 = ST_Azimuth(ST_PointN(l2,1),ST_PointN(l2,2));
 + l2 = ST_AddPoint(l2,ST_Makepoint(X(ST_PointN(l2,2))+sin(a2)*dist,Y(ST_PointN(l2,2))+cos(a2)*dist),-1);
 + l2 = ST_AddPoint(l2,ST_Makepoint(X(ST_PointN(l2,1))-sin(a2)*dist,Y(ST_PointN(l2,1))-cos(a2)*dist),0);
 +
 + -- The new center is the intersection of the two bisectors
 + center = ST_Intersection(l1,l2);
 + -- The new radius is the distance to any of the three points
 + radius = ST_Distance(center,ST_PointN(ring,idx1));
 + END IF;
 + END IF;
 + END LOOP;
 + --DONE!!  Return the MBC via the buffer command
 + RETURN ST_Buffer(center,radius,segs_per_quarter);
 +
 + END;
 + $BODY$
 + LANGUAGE 'plpgsql' IMMUTABLE STRICT;
 +
 + CREATE OR REPLACE FUNCTION ST_MinimumBoundingCircle(geometry)
 + RETURNS geometry AS
 + 'SELECT ST_MinimumBoundingCircle($1, 48)'
 + LANGUAGE 'sql' IMMUTABLE STRICT;
 + COMMIT;
 +
 +
 + -- First drop old aggregates
 + DROP AGGREGATE IF EXISTS geomunion(geometry);
 + DROP AGGREGATE IF EXISTS st_geomunion(geometry);
 + DROP AGGREGATE IF EXISTS accum_old(geometry);
 + DROP AGGREGATE IF EXISTS st_accum_old(geometry);
 +
 + -- Then drop old functions
 + DROP FUNCTION IF EXISTS box2d_overleft(box2d, box2d);
 + DROP FUNCTION IF EXISTS box2d_overright(box2d, box2d);
 + DROP FUNCTION IF EXISTS box2d_left(box2d, box2d);
 + DROP FUNCTION IF EXISTS box2d_right(box2d, box2d);
 + DROP FUNCTION IF EXISTS box2d_contain(box2d, box2d);
 + DROP FUNCTION IF EXISTS box2d_contained(box2d, box2d);
 + DROP FUNCTION IF EXISTS box2d_overlap(box2d, box2d);
 + DROP FUNCTION IF EXISTS box2d_same(box2d, box2d);
 + DROP FUNCTION IF EXISTS box2d_intersects(box2d, box2d);
 + DROP FUNCTION IF EXISTS st_box2d_overleft(box2d, box2d);
 + DROP FUNCTION IF EXISTS st_box2d_overright(box2d, box2d);
 + DROP FUNCTION IF EXISTS st_box2d_left(box2d, box2d);
 + DROP FUNCTION IF EXISTS st_box2d_right(box2d, box2d);
 + DROP FUNCTION IF EXISTS st_box2d_contain(box2d, box2d);
 + DROP FUNCTION IF EXISTS st_box2d_contained(box2d, box2d);
 + DROP FUNCTION IF EXISTS st_box2d_overlap(box2d, box2d);
 + DROP FUNCTION IF EXISTS st_box2d_same(box2d, box2d);
 + DROP FUNCTION IF EXISTS st_box2d_intersects(box2d, box2d);
 + DROP FUNCTION IF EXISTS st_addbbox(geometry);
 + DROP FUNCTION IF EXISTS st_dropbbox(geometry); 
 + DROP FUNCTION IF EXISTS st_hasbbox(geometry); 
 + DROP FUNCTION IF EXISTS cache_bbox();
 + DROP FUNCTION IF EXISTS st_cache_bbox();
 + DROP FUNCTION IF EXISTS transform_geometry(geometry,text,text,int);
 + DROP FUNCTION IF EXISTS collector(geometry, geometry);
 + DROP FUNCTION IF EXISTS st_collector(geometry, geometry);
 + DROP FUNCTION IF EXISTS geom_accum (geometry[],geometry);
 + DROP FUNCTION IF EXISTS st_geom_accum (geometry[],geometry);
 + DROP FUNCTION IF EXISTS collect_garray (geometry[]);
 + DROP FUNCTION IF EXISTS st_collect_garray (geometry[]);
 + DROP FUNCTION IF EXISTS geosnoop(geometry);
 + DROP FUNCTION IF EXISTS jtsnoop(geometry);
 + DROP FUNCTION IF EXISTS st_noop(geometry);
 + DROP FUNCTION IF EXISTS st_max_distance(geometry, geometry);
 +
 +