source: trunk/postgis/postgis.sql.in

Last change on this file was 17972, checked in by Raul Marin, 5 years ago

Fix PLPGSQL functions missing the schema qualification

References #4546
Closes https://github.com/postgis/postgis/pull/500

File size: 207.2 KB
Line 
1-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2--
3--
4-- PostGIS - Spatial Types for PostgreSQL
5-- http://postgis.net
6-- Copyright 2001-2003 Refractions Research Inc.
7--
8-- This is free software; you can redistribute and/or modify it under
9-- the terms of the GNU General Public Licence. See the COPYING file.
10--
11-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
12--
13-- WARNING: Any change in this file must be evaluated for compatibility.
14-- Changes cleanly handled by postgis_upgrade.sql are fine,
15-- other changes will require a bump in Major version.
16-- Currently only function replaceble by CREATE OR REPLACE
17-- are cleanly handled.
18--
19-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
20
21#include "sqldefines.h"
22
23-- INSTALL VERSION: POSTGIS_LIB_VERSION
24
25BEGIN;
26SET LOCAL client_min_messages TO warning;
27
28DO $$
29DECLARE
30 pgver text;
31BEGIN
32 SELECT substring(version(), 'PostgreSQL ([0-9\.]+)') INTO pgver;
33
34 IF POSTGIS_PGSQL_VERSION::text != ( SELECT CASE
35 WHEN split_part(s,'.',1)::integer > 9
36 THEN split_part(s,'.',1) || '0'
37 ELSE
38 split_part(s,'.', 1) || split_part(s,'.', 2)
39 END
40 FROM substring(version(), 'PostgreSQL ([0-9\.]+)') AS s )
41 THEN
42 RAISE EXCEPTION 'PostGIS built for PostgreSQL % cannot be loaded in PostgreSQL %',
43 POSTGIS_PGSQL_HR_VERSION, pgver;
44 END IF;
45END;
46$$;
47
48
49-- Check that no other postgis is installed
50DO $$
51DECLARE
52 rec RECORD;
53BEGIN
54 FOR rec IN
55 SELECT n.nspname, p.proname FROM pg_proc p, pg_namespace n
56 WHERE p.proname = 'postgis_version'
57 AND p.pronamespace = n.oid
58 LOOP
59 RAISE EXCEPTION 'PostGIS is already installed in schema ''%''', rec.nspname;
60 END LOOP;
61END
62$$ LANGUAGE 'plpgsql';
63
64-- Let the user know about a deprecated signature and its new name, if any
65CREATE OR REPLACE FUNCTION _postgis_deprecate(oldname text, newname text, version text)
66RETURNS void AS
67$$
68DECLARE
69 curver_text text;
70BEGIN
71 --
72 -- Raises a NOTICE if it was deprecated in this version,
73 -- a WARNING if in a previous version (only up to minor version checked)
74 --
75 curver_text := POSTGIS_LIB_VERSION;
76 IF split_part(curver_text,'.',1)::int > split_part(version,'.',1)::int OR
77 ( split_part(curver_text,'.',1) = split_part(version,'.',1) AND
78 split_part(curver_text,'.',2) != split_part(version,'.',2) )
79 THEN
80 RAISE WARNING '% signature was deprecated in %. Please use %', oldname, version, newname;
81 ELSE
82 RAISE DEBUG '% signature was deprecated in %. Please use %', oldname, version, newname;
83 END IF;
84END;
85$$ LANGUAGE 'plpgsql' IMMUTABLE STRICT _COST_MEDIUM;
86
87-------------------------------------------------------------------
88-- SPHEROID TYPE
89-------------------------------------------------------------------
90CREATE OR REPLACE FUNCTION spheroid_in(cstring)
91 RETURNS spheroid
92 AS 'MODULE_PATHNAME','ellipsoid_in'
93 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
94
95CREATE OR REPLACE FUNCTION spheroid_out(spheroid)
96 RETURNS cstring
97 AS 'MODULE_PATHNAME','ellipsoid_out'
98 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
99
100-- Availability: 0.5.0
101CREATE TYPE spheroid (
102 alignment = double,
103 internallength = 65,
104 input = spheroid_in,
105 output = spheroid_out
106);
107
108-------------------------------------------------------------------
109-- GEOMETRY TYPE (lwgeom)
110-------------------------------------------------------------------
111CREATE OR REPLACE FUNCTION geometry_in(cstring)
112 RETURNS geometry
113 AS 'MODULE_PATHNAME','LWGEOM_in'
114 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
115
116CREATE OR REPLACE FUNCTION geometry_out(geometry)
117 RETURNS cstring
118 AS 'MODULE_PATHNAME','LWGEOM_out'
119 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
120
121-- Availability: 2.0.0
122CREATE OR REPLACE FUNCTION geometry_typmod_in(cstring[])
123 RETURNS integer
124 AS 'MODULE_PATHNAME','geometry_typmod_in'
125 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
126
127-- Availability: 2.0.0
128CREATE OR REPLACE FUNCTION geometry_typmod_out(integer)
129 RETURNS cstring
130 AS 'MODULE_PATHNAME','postgis_typmod_out'
131 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
132
133CREATE OR REPLACE FUNCTION geometry_analyze(internal)
134 RETURNS bool
135 AS 'MODULE_PATHNAME', 'gserialized_analyze_nd'
136 LANGUAGE 'c' VOLATILE STRICT;
137
138CREATE OR REPLACE FUNCTION geometry_recv(internal)
139 RETURNS geometry
140 AS 'MODULE_PATHNAME','LWGEOM_recv'
141 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
142
143CREATE OR REPLACE FUNCTION geometry_send(geometry)
144 RETURNS bytea
145 AS 'MODULE_PATHNAME','LWGEOM_send'
146 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
147
148-- Availability: 0.1.0
149CREATE TYPE geometry (
150 internallength = variable,
151 input = geometry_in,
152 output = geometry_out,
153 send = geometry_send,
154 receive = geometry_recv,
155 typmod_in = geometry_typmod_in,
156 typmod_out = geometry_typmod_out,
157 delimiter = ':',
158 alignment = double,
159 analyze = geometry_analyze,
160 storage = main
161);
162
163-- Availability: 2.0.0
164-- Special cast for enforcing the typmod restrictions
165CREATE OR REPLACE FUNCTION geometry(geometry, integer, boolean)
166 RETURNS geometry
167 AS 'MODULE_PATHNAME','geometry_enforce_typmod'
168 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
169
170-- Availability: 2.0.0
171CREATE CAST (geometry AS geometry) WITH FUNCTION geometry(geometry, integer, boolean) AS IMPLICIT;
172
173-- Availability: 2.1.0
174CREATE OR REPLACE FUNCTION geometry(point)
175 RETURNS geometry
176 AS 'MODULE_PATHNAME','point_to_geometry'
177 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
178
179-- Availability: 2.1.0
180CREATE OR REPLACE FUNCTION point(geometry)
181 RETURNS point
182 AS 'MODULE_PATHNAME','geometry_to_point'
183 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
184
185-- Availability: 2.1.0
186CREATE OR REPLACE FUNCTION geometry(path)
187 RETURNS geometry
188 AS 'MODULE_PATHNAME','path_to_geometry'
189 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
190
191-- Availability: 2.1.0
192CREATE OR REPLACE FUNCTION path(geometry)
193 RETURNS path
194 AS 'MODULE_PATHNAME','geometry_to_path'
195 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
196
197-- Availability: 2.1.0
198CREATE OR REPLACE FUNCTION geometry(polygon)
199 RETURNS geometry
200 AS 'MODULE_PATHNAME','polygon_to_geometry'
201 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
202
203-- Availability: 2.1.0
204CREATE OR REPLACE FUNCTION polygon(geometry)
205 RETURNS polygon
206 AS 'MODULE_PATHNAME','geometry_to_polygon'
207 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
208
209CREATE CAST (geometry AS point) WITH FUNCTION point(geometry);
210CREATE CAST (point AS geometry) WITH FUNCTION geometry(point);
211CREATE CAST (geometry AS path) WITH FUNCTION path(geometry);
212CREATE CAST (path AS geometry) WITH FUNCTION geometry(path);
213CREATE CAST (geometry AS polygon) WITH FUNCTION polygon(geometry);
214CREATE CAST (polygon AS geometry) WITH FUNCTION geometry(polygon);
215
216-------------------------------------------------------------------
217-- BOX3D TYPE
218-- Point coordinate data access
219-------------------------------------------
220-- PostGIS equivalent function: X(geometry)
221CREATE OR REPLACE FUNCTION ST_X(geometry)
222 RETURNS float8
223 AS 'MODULE_PATHNAME','LWGEOM_x_point'
224 LANGUAGE 'c' IMMUTABLE STRICT
225 _PARALLEL _COST_DEFAULT;
226
227-- PostGIS equivalent function: Y(geometry)
228CREATE OR REPLACE FUNCTION ST_Y(geometry)
229 RETURNS float8
230 AS 'MODULE_PATHNAME','LWGEOM_y_point'
231 LANGUAGE 'c' IMMUTABLE STRICT
232 _PARALLEL _COST_DEFAULT;
233
234-- Availability: 1.2.2
235CREATE OR REPLACE FUNCTION ST_Z(geometry)
236 RETURNS float8
237 AS 'MODULE_PATHNAME','LWGEOM_z_point'
238 LANGUAGE 'c' IMMUTABLE STRICT
239 _PARALLEL _COST_DEFAULT;
240
241-- Availability: 1.2.2
242CREATE OR REPLACE FUNCTION ST_M(geometry)
243 RETURNS float8
244 AS 'MODULE_PATHNAME','LWGEOM_m_point'
245 LANGUAGE 'c' IMMUTABLE STRICT
246 _PARALLEL _COST_DEFAULT;
247
248-------------------------------------------------------------------
249
250CREATE OR REPLACE FUNCTION box3d_in(cstring)
251 RETURNS box3d
252 AS 'MODULE_PATHNAME', 'BOX3D_in'
253 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
254
255CREATE OR REPLACE FUNCTION box3d_out(box3d)
256 RETURNS cstring
257 AS 'MODULE_PATHNAME', 'BOX3D_out'
258 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
259
260-- Availability: 0.1.0
261CREATE TYPE box3d (
262 alignment = double,
263 internallength = 52,
264 input = box3d_in,
265 output = box3d_out
266);
267
268-----------------------------------------------------------------------
269-- BOX2D
270-----------------------------------------------------------------------
271
272CREATE OR REPLACE FUNCTION box2d_in(cstring)
273 RETURNS box2d
274 AS 'MODULE_PATHNAME','BOX2D_in'
275 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
276
277CREATE OR REPLACE FUNCTION box2d_out(box2d)
278 RETURNS cstring
279 AS 'MODULE_PATHNAME','BOX2D_out'
280 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
281
282-- Availability: 0.8.2
283CREATE TYPE box2d (
284 internallength = 65,
285 input = box2d_in,
286 output = box2d_out,
287 storage = plain
288);
289
290-------------------------------------------------------------------
291-- BOX2DF TYPE (INTERNAL ONLY)
292-------------------------------------------------------------------
293--
294-- Box2Df type is used by the GiST index bindings.
295-- In/out functions are stubs, as all access should be internal.
296---
297-- Availability: 2.0.0
298CREATE OR REPLACE FUNCTION box2df_in(cstring)
299 RETURNS box2df
300 AS 'MODULE_PATHNAME','box2df_in'
301 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
302
303-- Availability: 2.0.0
304CREATE OR REPLACE FUNCTION box2df_out(box2df)
305 RETURNS cstring
306 AS 'MODULE_PATHNAME','box2df_out'
307 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
308
309-- Availability: 2.0.0
310CREATE TYPE box2df (
311 internallength = 16,
312 input = box2df_in,
313 output = box2df_out,
314 storage = plain,
315 alignment = double
316);
317
318-------------------------------------------------------------------
319-- GIDX TYPE (INTERNAL ONLY)
320-------------------------------------------------------------------
321--
322-- GIDX type is used by the N-D and GEOGRAPHY GiST index bindings.
323-- In/out functions are stubs, as all access should be internal.
324---
325
326-- Availability: 1.5.0
327CREATE OR REPLACE FUNCTION gidx_in(cstring)
328 RETURNS gidx
329 AS 'MODULE_PATHNAME','gidx_in'
330 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
331
332-- Availability: 1.5.0
333CREATE OR REPLACE FUNCTION gidx_out(gidx)
334 RETURNS cstring
335 AS 'MODULE_PATHNAME','gidx_out'
336 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
337
338-- Availability: 1.5.0
339CREATE TYPE gidx (
340 internallength = variable,
341 input = gidx_in,
342 output = gidx_out,
343 storage = plain,
344 alignment = double
345);
346
347-------------------------------------------------------------------
348-- BTREE indexes
349-------------------------------------------------------------------
350CREATE OR REPLACE FUNCTION geometry_lt(geom1 geometry, geom2 geometry)
351 RETURNS bool
352 AS 'MODULE_PATHNAME', 'lwgeom_lt'
353 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
354
355CREATE OR REPLACE FUNCTION geometry_le(geom1 geometry, geom2 geometry)
356 RETURNS bool
357 AS 'MODULE_PATHNAME', 'lwgeom_le'
358 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
359
360CREATE OR REPLACE FUNCTION geometry_gt(geom1 geometry, geom2 geometry)
361 RETURNS bool
362 AS 'MODULE_PATHNAME', 'lwgeom_gt'
363 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
364
365CREATE OR REPLACE FUNCTION geometry_ge(geom1 geometry, geom2 geometry)
366 RETURNS bool
367 AS 'MODULE_PATHNAME', 'lwgeom_ge'
368 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
369
370CREATE OR REPLACE FUNCTION geometry_eq(geom1 geometry, geom2 geometry)
371 RETURNS bool
372 AS 'MODULE_PATHNAME', 'lwgeom_eq'
373 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
374
375CREATE OR REPLACE FUNCTION geometry_cmp(geom1 geometry, geom2 geometry)
376 RETURNS integer
377 AS 'MODULE_PATHNAME', 'lwgeom_cmp'
378 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
379
380-- Availability: 3.0.0
381CREATE OR REPLACE FUNCTION geometry_sortsupport(internal)
382 RETURNS void
383 AS 'MODULE_PATHNAME', 'lwgeom_sortsupport'
384 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
385
386--
387-- Sorting operators for Btree
388--
389
390-- Availability: 0.9.0
391CREATE OPERATOR < (
392 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_lt,
393 COMMUTATOR = '>', NEGATOR = '>=',
394 RESTRICT = contsel, JOIN = contjoinsel
395);
396
397-- Availability: 0.9.0
398CREATE OPERATOR <= (
399 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_le,
400 COMMUTATOR = '>=', NEGATOR = '>',
401 RESTRICT = contsel, JOIN = contjoinsel
402);
403
404-- Availability: 0.9.0
405CREATE OPERATOR = (
406 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_eq,
407 COMMUTATOR = '=', -- we might implement a faster negator here
408 RESTRICT = contsel, JOIN = contjoinsel, HASHES, MERGES
409);
410
411-- Availability: 0.9.0
412CREATE OPERATOR >= (
413 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_ge,
414 COMMUTATOR = '<=', NEGATOR = '<',
415 RESTRICT = contsel, JOIN = contjoinsel
416);
417
418-- Availability: 0.9.0
419CREATE OPERATOR > (
420 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_gt,
421 COMMUTATOR = '<', NEGATOR = '<=',
422 RESTRICT = contsel, JOIN = contjoinsel
423);
424
425-- Availability: 0.9.0
426CREATE OPERATOR CLASS btree_geometry_ops
427 DEFAULT FOR TYPE geometry USING btree AS
428 OPERATOR 1 < ,
429 OPERATOR 2 <= ,
430 OPERATOR 3 = ,
431 OPERATOR 4 >= ,
432 OPERATOR 5 > ,
433 FUNCTION 1 geometry_cmp (geom1 geometry, geom2 geometry),
434 -- Availability: 3.0.0
435 FUNCTION 2 geometry_sortsupport(internal);
436
437--
438-- Sorting operators for Btree
439--
440
441-- Availability: 2.5.0
442CREATE OR REPLACE FUNCTION geometry_hash(geometry)
443 RETURNS integer
444 AS 'MODULE_PATHNAME','lwgeom_hash'
445 LANGUAGE 'c' STRICT IMMUTABLE _PARALLEL;
446
447-- Availability: 2.5.0
448CREATE OPERATOR CLASS hash_geometry_ops
449 DEFAULT FOR TYPE geometry USING hash AS
450 OPERATOR 1 = ,
451 FUNCTION 1 geometry_hash(geometry);
452
453-----------------------------------------------------------------------------
454-- GiST 2D GEOMETRY-over-GSERIALIZED INDEX
455-----------------------------------------------------------------------------
456
457-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
458-- GiST Support Functions
459-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
460
461-- Availability: 2.0.0
462CREATE OR REPLACE FUNCTION geometry_gist_distance_2d(internal,geometry,int4)
463 RETURNS float8
464 AS 'MODULE_PATHNAME' ,'gserialized_gist_distance_2d'
465 LANGUAGE 'c' _PARALLEL;
466
467-- Availability: 2.0.0
468CREATE OR REPLACE FUNCTION geometry_gist_consistent_2d(internal,geometry,int4)
469 RETURNS bool
470 AS 'MODULE_PATHNAME' ,'gserialized_gist_consistent_2d'
471 LANGUAGE 'c' _PARALLEL;
472
473-- Availability: 2.0.0
474CREATE OR REPLACE FUNCTION geometry_gist_compress_2d(internal)
475 RETURNS internal
476 AS 'MODULE_PATHNAME','gserialized_gist_compress_2d'
477 LANGUAGE 'c' _PARALLEL;
478
479-- Availability: 2.0.0
480CREATE OR REPLACE FUNCTION geometry_gist_penalty_2d(internal,internal,internal)
481 RETURNS internal
482 AS 'MODULE_PATHNAME' ,'gserialized_gist_penalty_2d'
483 LANGUAGE 'c' _PARALLEL;
484
485-- Availability: 2.0.0
486CREATE OR REPLACE FUNCTION geometry_gist_picksplit_2d(internal, internal)
487 RETURNS internal
488 AS 'MODULE_PATHNAME' ,'gserialized_gist_picksplit_2d'
489 LANGUAGE 'c' _PARALLEL;
490
491-- Availability: 2.0.0
492CREATE OR REPLACE FUNCTION geometry_gist_union_2d(bytea, internal)
493 RETURNS internal
494 AS 'MODULE_PATHNAME' ,'gserialized_gist_union_2d'
495 LANGUAGE 'c' _PARALLEL;
496
497-- Availability: 2.0.0
498CREATE OR REPLACE FUNCTION geometry_gist_same_2d(geom1 geometry, geom2 geometry, internal)
499 RETURNS internal
500 AS 'MODULE_PATHNAME' ,'gserialized_gist_same_2d'
501 LANGUAGE 'c' _PARALLEL;
502
503-- Availability: 2.0.0
504CREATE OR REPLACE FUNCTION geometry_gist_decompress_2d(internal)
505 RETURNS internal
506 AS 'MODULE_PATHNAME' ,'gserialized_gist_decompress_2d'
507 LANGUAGE 'c' _PARALLEL;
508
509-----------------------------------------------------------------------------
510
511-- Availability: 2.1.0
512-- Given a table, column and query geometry, returns the estimate of what proportion
513-- of the table would be returned by a query using the &&/&&& operators. The mode
514-- changes whether the estimate is in x/y only or in all available dimensions.
515CREATE OR REPLACE FUNCTION _postgis_selectivity(tbl regclass, att_name text, geom geometry, mode text default '2')
516 RETURNS float8
517 AS 'MODULE_PATHNAME', '_postgis_gserialized_sel'
518 LANGUAGE 'c' STRICT _PARALLEL;
519
520-- Availability: 2.1.0
521-- Given a two tables and columns, returns estimate of the proportion of rows
522-- a &&/&&& join will return relative to the number of rows an unconstrained
523-- table join would return. Mode flips result between evaluation in x/y only
524-- and evaluation in all available dimensions.
525CREATE OR REPLACE FUNCTION _postgis_join_selectivity(regclass, text, regclass, text, text default '2')
526 RETURNS float8
527 AS 'MODULE_PATHNAME', '_postgis_gserialized_joinsel'
528 LANGUAGE 'c' STRICT _PARALLEL;
529
530-- Availability: 2.1.0
531-- Given a table and a column, returns the statistics information stored by
532-- PostgreSQL, in a JSON text form. Mode determines whether the 2D statistics
533-- or the ND statistics are returned.
534CREATE OR REPLACE FUNCTION _postgis_stats(tbl regclass, att_name text, text default '2')
535 RETURNS text
536 AS 'MODULE_PATHNAME', '_postgis_gserialized_stats'
537 LANGUAGE 'c' STRICT _PARALLEL;
538
539-- Availability: 2.5.0
540-- Given a table and a column, returns the extent of all boxes in the
541-- first page of the index (the head of the index)
542CREATE OR REPLACE FUNCTION _postgis_index_extent(tbl regclass, col text)
543 RETURNS box2d
544 AS 'MODULE_PATHNAME','_postgis_gserialized_index_extent'
545 LANGUAGE 'c' STABLE STRICT;
546
547-- Availability: 2.1.0
548CREATE OR REPLACE FUNCTION gserialized_gist_sel_2d (internal, oid, internal, int4)
549 RETURNS float8
550 AS 'MODULE_PATHNAME', 'gserialized_gist_sel_2d'
551 LANGUAGE 'c' _PARALLEL;
552
553-- Availability: 2.1.0
554CREATE OR REPLACE FUNCTION gserialized_gist_sel_nd (internal, oid, internal, int4)
555 RETURNS float8
556 AS 'MODULE_PATHNAME', 'gserialized_gist_sel_nd'
557 LANGUAGE 'c' _PARALLEL;
558
559-- Availability: 2.1.0
560CREATE OR REPLACE FUNCTION gserialized_gist_joinsel_2d (internal, oid, internal, smallint)
561 RETURNS float8
562 AS 'MODULE_PATHNAME', 'gserialized_gist_joinsel_2d'
563 LANGUAGE 'c' _PARALLEL;
564
565-- Availability: 2.1.0
566CREATE OR REPLACE FUNCTION gserialized_gist_joinsel_nd (internal, oid, internal, smallint)
567 RETURNS float8
568 AS 'MODULE_PATHNAME', 'gserialized_gist_joinsel_nd'
569 LANGUAGE 'c' _PARALLEL;
570
571
572-----------------------------------------------------------------------------
573-- GEOMETRY Operators
574-----------------------------------------------------------------------------
575
576-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
577-- 2D GEOMETRY Operators
578-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
579
580-- Availability: 2.0.0
581CREATE OR REPLACE FUNCTION geometry_overlaps(geom1 geometry, geom2 geometry)
582 RETURNS boolean
583 AS 'MODULE_PATHNAME' ,'gserialized_overlaps_2d'
584 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
585 _COST_LOW;
586
587-- Availability: 0.1.0
588-- Changed: 2.0.0 use gserialized selectivity estimators
589CREATE OPERATOR && (
590 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overlaps,
591 COMMUTATOR = '&&',
592 RESTRICT = gserialized_gist_sel_2d,
593 JOIN = gserialized_gist_joinsel_2d
594);
595
596-- Availability: 2.0.0
597CREATE OR REPLACE FUNCTION geometry_same(geom1 geometry, geom2 geometry)
598 RETURNS boolean
599 AS 'MODULE_PATHNAME' ,'gserialized_same_2d'
600 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
601 _COST_LOW;
602
603-- Availability: 0.1.0
604CREATE OPERATOR ~= (
605 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_same,
606 RESTRICT = contsel, JOIN = contjoinsel
607);
608
609-- As of 2.2.0 this no longer returns the centroid/centroid distance, it
610-- returns the actual distance, to support the 'recheck' functionality
611-- enabled in the KNN operator
612-- Availability: 2.0.0
613CREATE OR REPLACE FUNCTION geometry_distance_centroid(geom1 geometry, geom2 geometry)
614 RETURNS float8
615 AS 'MODULE_PATHNAME', 'ST_Distance'
616 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
617 _COST_MEDIUM;
618
619-- Availability: 2.0.0
620CREATE OR REPLACE FUNCTION geometry_distance_box(geom1 geometry, geom2 geometry)
621 RETURNS float8
622 AS 'MODULE_PATHNAME', 'gserialized_distance_box_2d'
623 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
624
625-- Availability: 2.0.0
626CREATE OPERATOR <-> (
627 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_distance_centroid,
628 COMMUTATOR = '<->'
629);
630
631-- Availability: 2.0.0
632CREATE OPERATOR <#> (
633 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_distance_box,
634 COMMUTATOR = '<#>'
635);
636
637-- Availability: 2.0.0
638CREATE OR REPLACE FUNCTION geometry_contains(geom1 geometry, geom2 geometry)
639 RETURNS bool
640 AS 'MODULE_PATHNAME', 'gserialized_contains_2d'
641 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
642
643-- Availability: 2.0.0
644CREATE OR REPLACE FUNCTION geometry_within(geom1 geometry, geom2 geometry)
645 RETURNS bool
646 AS 'MODULE_PATHNAME', 'gserialized_within_2d'
647 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
648
649-- Availability: 0.1.0
650CREATE OPERATOR @ (
651 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_within,
652 COMMUTATOR = '~',
653 RESTRICT = contsel, JOIN = contjoinsel
654);
655
656-- Availability: 0.1.0
657CREATE OPERATOR ~ (
658 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_contains,
659 COMMUTATOR = '@',
660 RESTRICT = contsel, JOIN = contjoinsel
661);
662
663-- Availability: 2.0.0
664CREATE OR REPLACE FUNCTION geometry_left(geom1 geometry, geom2 geometry)
665 RETURNS bool
666 AS 'MODULE_PATHNAME', 'gserialized_left_2d'
667 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
668
669-- Availability: 0.1.0
670CREATE OPERATOR << (
671 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_left,
672 COMMUTATOR = '>>',
673 RESTRICT = positionsel, JOIN = positionjoinsel
674);
675
676-- Availability: 2.0.0
677CREATE OR REPLACE FUNCTION geometry_overleft(geom1 geometry, geom2 geometry)
678 RETURNS bool
679 AS 'MODULE_PATHNAME', 'gserialized_overleft_2d'
680 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
681
682-- Availability: 0.1.0
683CREATE OPERATOR &< (
684 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overleft,
685 RESTRICT = positionsel, JOIN = positionjoinsel
686);
687
688-- Availability: 2.0.0
689CREATE OR REPLACE FUNCTION geometry_below(geom1 geometry, geom2 geometry)
690 RETURNS bool
691 AS 'MODULE_PATHNAME', 'gserialized_below_2d'
692 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
693
694-- Availability: 0.1.0
695CREATE OPERATOR <<| (
696 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_below,
697 COMMUTATOR = '|>>',
698 RESTRICT = positionsel, JOIN = positionjoinsel
699);
700
701-- Availability: 2.0.0
702CREATE OR REPLACE FUNCTION geometry_overbelow(geom1 geometry, geom2 geometry)
703 RETURNS bool
704 AS 'MODULE_PATHNAME', 'gserialized_overbelow_2d'
705 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
706
707-- Availability: 0.1.0
708CREATE OPERATOR &<| (
709 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overbelow,
710 RESTRICT = positionsel, JOIN = positionjoinsel
711);
712
713-- Availability: 2.0.0
714CREATE OR REPLACE FUNCTION geometry_overright(geom1 geometry, geom2 geometry)
715 RETURNS bool
716 AS 'MODULE_PATHNAME', 'gserialized_overright_2d'
717 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
718
719-- Availability: 0.1.0
720CREATE OPERATOR &> (
721 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overright,
722 RESTRICT = positionsel, JOIN = positionjoinsel
723);
724
725-- Availability: 2.0.0
726CREATE OR REPLACE FUNCTION geometry_right(geom1 geometry, geom2 geometry)
727 RETURNS bool
728 AS 'MODULE_PATHNAME', 'gserialized_right_2d'
729 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
730
731-- Availability: 0.1.0
732CREATE OPERATOR >> (
733 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_right,
734 COMMUTATOR = '<<',
735 RESTRICT = positionsel, JOIN = positionjoinsel
736);
737
738-- Availability: 2.0.0
739CREATE OR REPLACE FUNCTION geometry_overabove(geom1 geometry, geom2 geometry)
740 RETURNS bool
741 AS 'MODULE_PATHNAME', 'gserialized_overabove_2d'
742 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
743
744-- Availability: 0.1.0
745CREATE OPERATOR |&> (
746 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overabove,
747 RESTRICT = positionsel, JOIN = positionjoinsel
748);
749
750-- Availability: 2.0.0
751CREATE OR REPLACE FUNCTION geometry_above(geom1 geometry, geom2 geometry)
752 RETURNS bool
753 AS 'MODULE_PATHNAME', 'gserialized_above_2d'
754 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
755
756-- Availability: 0.1.0
757CREATE OPERATOR |>> (
758 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_above,
759 COMMUTATOR = '<<|',
760 RESTRICT = positionsel, JOIN = positionjoinsel
761);
762
763-- Availability: 2.0.0
764CREATE OPERATOR CLASS gist_geometry_ops_2d
765 DEFAULT FOR TYPE geometry USING GIST AS
766 STORAGE box2df,
767 OPERATOR 1 << ,
768 OPERATOR 2 &< ,
769 OPERATOR 3 && ,
770 OPERATOR 4 &> ,
771 OPERATOR 5 >> ,
772 OPERATOR 6 ~= ,
773 OPERATOR 7 ~ ,
774 OPERATOR 8 @ ,
775 OPERATOR 9 &<| ,
776 OPERATOR 10 <<| ,
777 OPERATOR 11 |>> ,
778 OPERATOR 12 |&> ,
779 OPERATOR 13 <-> FOR ORDER BY pg_catalog.float_ops,
780 OPERATOR 14 <#> FOR ORDER BY pg_catalog.float_ops,
781 FUNCTION 8 geometry_gist_distance_2d (internal, geometry, int4),
782 FUNCTION 1 geometry_gist_consistent_2d (internal, geometry, int4),
783 FUNCTION 2 geometry_gist_union_2d (bytea, internal),
784 FUNCTION 3 geometry_gist_compress_2d (internal),
785 FUNCTION 4 geometry_gist_decompress_2d (internal),
786 FUNCTION 5 geometry_gist_penalty_2d (internal, internal, internal),
787 FUNCTION 6 geometry_gist_picksplit_2d (internal, internal),
788 FUNCTION 7 geometry_gist_same_2d (geom1 geometry, geom2 geometry, internal);
789
790-----------------------------------------------------------------------------
791-- GiST ND GEOMETRY-over-GSERIALIZED
792-----------------------------------------------------------------------------
793
794-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
795-- GiST Support Functions
796-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
797
798-- Availability: 2.0.0
799CREATE OR REPLACE FUNCTION geometry_gist_consistent_nd(internal,geometry,int4)
800 RETURNS bool
801 AS 'MODULE_PATHNAME' ,'gserialized_gist_consistent'
802 LANGUAGE 'c' _PARALLEL;
803
804-- Availability: 2.0.0
805CREATE OR REPLACE FUNCTION geometry_gist_compress_nd(internal)
806 RETURNS internal
807 AS 'MODULE_PATHNAME','gserialized_gist_compress'
808 LANGUAGE 'c' _PARALLEL;
809
810-- Availability: 2.0.0
811CREATE OR REPLACE FUNCTION geometry_gist_penalty_nd(internal,internal,internal)
812 RETURNS internal
813 AS 'MODULE_PATHNAME' ,'gserialized_gist_penalty'
814 LANGUAGE 'c' _PARALLEL;
815
816-- Availability: 2.0.0
817CREATE OR REPLACE FUNCTION geometry_gist_picksplit_nd(internal, internal)
818 RETURNS internal
819 AS 'MODULE_PATHNAME' ,'gserialized_gist_picksplit'
820 LANGUAGE 'c' _PARALLEL;
821
822-- Availability: 2.0.0
823CREATE OR REPLACE FUNCTION geometry_gist_union_nd(bytea, internal)
824 RETURNS internal
825 AS 'MODULE_PATHNAME' ,'gserialized_gist_union'
826 LANGUAGE 'c' _PARALLEL;
827
828-- Availability: 2.0.0
829CREATE OR REPLACE FUNCTION geometry_gist_same_nd(geometry, geometry, internal)
830 RETURNS internal
831 AS 'MODULE_PATHNAME' ,'gserialized_gist_same'
832 LANGUAGE 'c' _PARALLEL;
833
834-- Availability: 2.0.0
835CREATE OR REPLACE FUNCTION geometry_gist_decompress_nd(internal)
836 RETURNS internal
837 AS 'MODULE_PATHNAME' ,'gserialized_gist_decompress'
838 LANGUAGE 'c' _PARALLEL;
839
840-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
841-- N-D GEOMETRY Operators
842-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
843
844-- Availability: 2.0.0
845CREATE OR REPLACE FUNCTION geometry_overlaps_nd(geometry, geometry)
846 RETURNS boolean
847 AS 'MODULE_PATHNAME' ,'gserialized_overlaps'
848 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
849
850-- Availability: 2.0.0
851CREATE OPERATOR &&& (
852 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overlaps_nd,
853 COMMUTATOR = '&&&',
854 RESTRICT = gserialized_gist_sel_nd,
855 JOIN = gserialized_gist_joinsel_nd
856);
857
858-- Availability: 3.0.0
859CREATE OR REPLACE FUNCTION geometry_contains_nd(geometry, geometry)
860 RETURNS boolean
861 AS 'MODULE_PATHNAME' ,'gserialized_contains'
862 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
863
864-- Availability: 3.0.0
865CREATE OPERATOR ~~ (
866 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_contains_nd,
867 COMMUTATOR = '@@',
868 RESTRICT = gserialized_gist_sel_nd,
869 JOIN = gserialized_gist_joinsel_nd
870);
871
872-- Availability: 3.0.0
873CREATE OR REPLACE FUNCTION geometry_within_nd(geometry, geometry)
874 RETURNS boolean
875 AS 'MODULE_PATHNAME' ,'gserialized_within'
876 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
877
878-- Availability: 3.0.0
879CREATE OPERATOR @@ (
880 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_within_nd,
881 COMMUTATOR = '~~',
882 RESTRICT = gserialized_gist_sel_nd,
883 JOIN = gserialized_gist_joinsel_nd
884);
885
886-- Availability: 3.0.0
887CREATE OR REPLACE FUNCTION geometry_same_nd(geometry, geometry)
888 RETURNS boolean
889 AS 'MODULE_PATHNAME' ,'gserialized_same'
890 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
891
892-- Availability: 3.0.0
893CREATE OPERATOR ~~= (
894 LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_same_nd,
895 COMMUTATOR = '~~=',
896 RESTRICT = gserialized_gist_sel_nd,
897 JOIN = gserialized_gist_joinsel_nd
898);
899
900-- Availability: 2.2.0
901CREATE OR REPLACE FUNCTION geometry_distance_centroid_nd(geometry,geometry)
902 RETURNS float8
903 AS 'MODULE_PATHNAME', 'gserialized_distance_nd'
904 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
905
906-- Availability: 2.2.0
907CREATE OPERATOR <<->> (
908 LEFTARG = geometry, RIGHTARG = geometry,
909 PROCEDURE = geometry_distance_centroid_nd,
910 COMMUTATOR = '<<->>'
911);
912
913--
914-- This is for use with |=| operator, which does not directly use
915-- ST_DistanceCPA just in case it'll ever need to change behavior
916-- (operators definition cannot be altered)
917--
918-- Availability: 2.2.0
919CREATE OR REPLACE FUNCTION geometry_distance_cpa(geometry, geometry)
920 RETURNS float8
921 AS 'MODULE_PATHNAME', 'ST_DistanceCPA'
922 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
923
924-- Availability: 2.2.0
925CREATE OPERATOR |=| (
926 LEFTARG = geometry, RIGHTARG = geometry,
927 PROCEDURE = geometry_distance_cpa,
928 COMMUTATOR = '|=|'
929);
930
931-- Availability: 2.2.0
932CREATE OR REPLACE FUNCTION geometry_gist_distance_nd(internal,geometry,int4)
933 RETURNS float8
934 AS 'MODULE_PATHNAME', 'gserialized_gist_distance'
935 LANGUAGE 'c' _PARALLEL;
936
937-- Availability: 2.0.0
938CREATE OPERATOR CLASS gist_geometry_ops_nd
939 FOR TYPE geometry USING GIST AS
940 STORAGE gidx,
941 OPERATOR 3 &&& ,
942 -- Availability: 3.0.0
943 OPERATOR 6 ~~= ,
944 -- Availability: 3.0.0
945 OPERATOR 7 ~~ ,
946 -- Availability: 3.0.0
947 OPERATOR 8 @@ ,
948 -- Availability: 2.2.0
949 OPERATOR 13 <<->> FOR ORDER BY pg_catalog.float_ops,
950#if POSTGIS_PGSQL_VERSION >= 95
951 -- Availability: 2.2.0
952 OPERATOR 20 |=| FOR ORDER BY pg_catalog.float_ops,
953#endif
954 -- Availability: 2.2.0
955 FUNCTION 8 geometry_gist_distance_nd (internal, geometry, int4),
956 FUNCTION 1 geometry_gist_consistent_nd (internal, geometry, int4),
957 FUNCTION 2 geometry_gist_union_nd (bytea, internal),
958 FUNCTION 3 geometry_gist_compress_nd (internal),
959 FUNCTION 4 geometry_gist_decompress_nd (internal),
960 FUNCTION 5 geometry_gist_penalty_nd (internal, internal, internal),
961 FUNCTION 6 geometry_gist_picksplit_nd (internal, internal),
962 FUNCTION 7 geometry_gist_same_nd (geometry, geometry, internal);
963
964-- Availability: 2.2.0
965CREATE OR REPLACE FUNCTION ST_ShiftLongitude(geometry)
966 RETURNS geometry
967 AS 'MODULE_PATHNAME', 'LWGEOM_longitude_shift'
968 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
969
970-- Availability: 2.3.0
971CREATE OR REPLACE FUNCTION ST_WrapX(geom geometry, wrap float8, move float8)
972 RETURNS geometry
973 AS 'MODULE_PATHNAME', 'ST_WrapX'
974 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
975
976-----------------------------------------------------------------------------
977-- BOX3D FUNCTIONS
978-----------------------------------------------------------------------------
979
980-- Availability: 1.2.2
981CREATE OR REPLACE FUNCTION ST_XMin(box3d)
982 RETURNS FLOAT8
983 AS 'MODULE_PATHNAME','BOX3D_xmin'
984 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
985
986-- Availability: 1.2.2
987CREATE OR REPLACE FUNCTION ST_YMin(box3d)
988 RETURNS FLOAT8
989 AS 'MODULE_PATHNAME','BOX3D_ymin'
990 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
991
992-- Availability: 1.2.2
993CREATE OR REPLACE FUNCTION ST_ZMin(box3d)
994 RETURNS FLOAT8
995 AS 'MODULE_PATHNAME','BOX3D_zmin'
996 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
997
998-- Availability: 1.2.2
999CREATE OR REPLACE FUNCTION ST_XMax(box3d)
1000 RETURNS FLOAT8
1001 AS 'MODULE_PATHNAME','BOX3D_xmax'
1002 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
1003
1004-- Availability: 1.2.2
1005CREATE OR REPLACE FUNCTION ST_YMax(box3d)
1006 RETURNS FLOAT8
1007 AS 'MODULE_PATHNAME','BOX3D_ymax'
1008 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
1009
1010-- Availability: 1.2.2
1011CREATE OR REPLACE FUNCTION ST_ZMax(box3d)
1012 RETURNS FLOAT8
1013 AS 'MODULE_PATHNAME','BOX3D_zmax'
1014 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
1015
1016-----------------------------------------------------------------------------
1017-- BOX2D FUNCTIONS
1018-----------------------------------------------------------------------------
1019
1020-- Availability: 1.2.2
1021CREATE OR REPLACE FUNCTION ST_Expand(box2d,float8)
1022 RETURNS box2d
1023 AS 'MODULE_PATHNAME', 'BOX2D_expand'
1024 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
1025
1026-- Availability: 2.3.0
1027CREATE OR REPLACE FUNCTION ST_Expand(box box2d, dx float8, dy float8)
1028 RETURNS box2d
1029 AS 'MODULE_PATHNAME', 'BOX2D_expand'
1030 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
1031
1032-- Availability: 1.5.0
1033CREATE OR REPLACE FUNCTION postgis_getbbox(geometry)
1034 RETURNS box2d
1035 AS 'MODULE_PATHNAME','LWGEOM_to_BOX2DF'
1036 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
1037
1038-- Availability: 1.2.2
1039CREATE OR REPLACE FUNCTION ST_MakeBox2d(geom1 geometry, geom2 geometry)
1040 RETURNS box2d
1041 AS 'MODULE_PATHNAME', 'BOX2D_construct'
1042 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
1043
1044-----------------------------------------------------------------------
1045-- ST_ESTIMATED_EXTENT( <schema name>, <table name>, <column name> )
1046-----------------------------------------------------------------------
1047
1048-- Availability: 2.3.0
1049CREATE OR REPLACE FUNCTION ST_EstimatedExtent(text,text,text,boolean) RETURNS box2d AS
1050 'MODULE_PATHNAME', 'gserialized_estimated_extent'
1051 LANGUAGE 'c' STABLE STRICT SECURITY DEFINER;
1052
1053-- Availability: 2.1.0
1054CREATE OR REPLACE FUNCTION ST_EstimatedExtent(text,text,text) RETURNS box2d AS
1055 'MODULE_PATHNAME', 'gserialized_estimated_extent'
1056 LANGUAGE 'c' STABLE STRICT SECURITY DEFINER;
1057
1058-----------------------------------------------------------------------
1059-- ST_ESTIMATED_EXTENT( <table name>, <column name> )
1060-----------------------------------------------------------------------
1061
1062-- Availability: 2.1.0
1063CREATE OR REPLACE FUNCTION ST_EstimatedExtent(text,text) RETURNS box2d AS
1064 'MODULE_PATHNAME', 'gserialized_estimated_extent'
1065 LANGUAGE 'c' STABLE STRICT SECURITY DEFINER;
1066
1067-----------------------------------------------------------------------
1068-- FIND_EXTENT( <schema name>, <table name>, <column name> )
1069-----------------------------------------------------------------------
1070
1071-- Availability: 2.2.0
1072CREATE OR REPLACE FUNCTION ST_FindExtent(text,text,text) RETURNS box2d AS
1073$$
1074DECLARE
1075 schemaname alias for $1;
1076 tablename alias for $2;
1077 columnname alias for $3;
1078 myrec RECORD;
1079BEGIN
1080 FOR myrec IN EXECUTE 'SELECT @extschema@.ST_Extent("' || columnname || '") As extent FROM "' || schemaname || '"."' || tablename || '"' LOOP
1081 return myrec.extent;
1082 END LOOP;
1083END;
1084$$
1085LANGUAGE 'plpgsql' STABLE STRICT _PARALLEL;
1086
1087-----------------------------------------------------------------------
1088-- FIND_EXTENT( <table name>, <column name> )
1089-----------------------------------------------------------------------
1090
1091-- Availability: 2.2.0
1092CREATE OR REPLACE FUNCTION ST_FindExtent(text,text) RETURNS box2d AS
1093$$
1094DECLARE
1095 tablename alias for $1;
1096 columnname alias for $2;
1097 myrec RECORD;
1098
1099BEGIN
1100 FOR myrec IN EXECUTE 'SELECT @extschema@.ST_Extent("' || columnname || '") As extent FROM "' || tablename || '"' LOOP
1101 return myrec.extent;
1102 END LOOP;
1103END;
1104$$
1105LANGUAGE 'plpgsql' STABLE STRICT _PARALLEL;
1106
1107
1108-------------------------------------------
1109-- other lwgeom functions
1110-------------------------------------------
1111-- Availability: 1.5.0
1112CREATE OR REPLACE FUNCTION postgis_addbbox(geometry)
1113 RETURNS geometry
1114 AS 'MODULE_PATHNAME','LWGEOM_addBBOX'
1115 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
1116
1117-- Availability: 1.5.0
1118CREATE OR REPLACE FUNCTION postgis_dropbbox(geometry)
1119 RETURNS geometry
1120 AS 'MODULE_PATHNAME','LWGEOM_dropBBOX'
1121 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
1122
1123-- Availability: 1.5.0
1124CREATE OR REPLACE FUNCTION postgis_hasbbox(geometry)
1125 RETURNS bool
1126 AS 'MODULE_PATHNAME', 'LWGEOM_hasBBOX'
1127 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
1128
1129-- Availability: 2.5.0
1130CREATE OR REPLACE FUNCTION ST_QuantizeCoordinates(g geometry, prec_x int, prec_y int DEFAULT NULL, prec_z int DEFAULT NULL, prec_m int DEFAULT NULL)
1131 RETURNS geometry
1132 AS 'MODULE_PATHNAME', 'ST_QuantizeCoordinates'
1133 LANGUAGE 'c' IMMUTABLE _PARALLEL
1134 _COST_MEDIUM;
1135
1136------------------------------------------------------------------------
1137-- DEBUG
1138------------------------------------------------------------------------
1139
1140-- Availability: 2.2.0
1141CREATE OR REPLACE FUNCTION ST_MemSize(geometry)
1142 RETURNS int4
1143 AS 'MODULE_PATHNAME', 'LWGEOM_mem_size'
1144 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1145 _COST_LOW;
1146
1147-- Availability: 1.2.2
1148CREATE OR REPLACE FUNCTION ST_Summary(geometry)
1149 RETURNS text
1150 AS 'MODULE_PATHNAME', 'LWGEOM_summary'
1151 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1152 _COST_LOW;
1153
1154-- Availability: 1.2.2
1155CREATE OR REPLACE FUNCTION ST_NPoints(geometry)
1156 RETURNS int4
1157 AS 'MODULE_PATHNAME', 'LWGEOM_npoints'
1158 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1159 _COST_LOW;
1160
1161-- Availability: 1.2.2
1162CREATE OR REPLACE FUNCTION ST_NRings(geometry)
1163 RETURNS int4
1164 AS 'MODULE_PATHNAME', 'LWGEOM_nrings'
1165 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1166 _COST_LOW;
1167
1168------------------------------------------------------------------------
1169-- Measures
1170------------------------------------------------------------------------
1171-- Availability: 2.0.0
1172CREATE OR REPLACE FUNCTION ST_3DLength(geometry)
1173 RETURNS FLOAT8
1174 AS 'MODULE_PATHNAME', 'LWGEOM_length_linestring'
1175 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1176 _COST_LOW;
1177
1178-- Availability: 1.2.2
1179CREATE OR REPLACE FUNCTION ST_Length2d(geometry)
1180 RETURNS FLOAT8
1181 AS 'MODULE_PATHNAME', 'LWGEOM_length2d_linestring'
1182 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1183 _COST_LOW;
1184
1185-- PostGIS equivalent function: length2d(geometry)
1186CREATE OR REPLACE FUNCTION ST_Length(geometry)
1187 RETURNS FLOAT8
1188 AS 'MODULE_PATHNAME', 'LWGEOM_length2d_linestring'
1189 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1190 _COST_LOW;
1191
1192-- Availability in 2.2.0
1193CREATE OR REPLACE FUNCTION ST_LengthSpheroid(geometry, spheroid)
1194 RETURNS FLOAT8
1195 AS 'MODULE_PATHNAME','LWGEOM_length_ellipsoid_linestring'
1196 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1197 _COST_MEDIUM;
1198
1199-- Availability: 2.2.0
1200CREATE OR REPLACE FUNCTION ST_Length2DSpheroid(geometry, spheroid)
1201 RETURNS FLOAT8
1202 AS 'MODULE_PATHNAME','LWGEOM_length2d_ellipsoid'
1203 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1204 _COST_MEDIUM;
1205
1206-- Availability: 2.0.0
1207CREATE OR REPLACE FUNCTION ST_3DPerimeter(geometry)
1208 RETURNS FLOAT8
1209 AS 'MODULE_PATHNAME', 'LWGEOM_perimeter_poly'
1210 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1211 _COST_LOW;
1212
1213-- Availability: 1.2.2
1214CREATE OR REPLACE FUNCTION ST_perimeter2d(geometry)
1215 RETURNS FLOAT8
1216 AS 'MODULE_PATHNAME', 'LWGEOM_perimeter2d_poly'
1217 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1218 _COST_LOW;
1219
1220-- PostGIS equivalent function: perimeter2d(geometry)
1221CREATE OR REPLACE FUNCTION ST_Perimeter(geometry)
1222 RETURNS FLOAT8
1223 AS 'MODULE_PATHNAME', 'LWGEOM_perimeter2d_poly'
1224 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1225 _COST_LOW;
1226
1227-- Availability: 1.2.2
1228-- Deprecation in 1.3.4
1229CREATE OR REPLACE FUNCTION ST_Area2D(geometry)
1230 RETURNS FLOAT8
1231 AS 'MODULE_PATHNAME', 'ST_Area'
1232 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1233 _COST_LOW;
1234
1235-- PostGIS equivalent function: area(geometry)
1236CREATE OR REPLACE FUNCTION ST_Area(geometry)
1237 RETURNS FLOAT8
1238 AS 'MODULE_PATHNAME','ST_Area'
1239 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1240 _COST_LOW;
1241
1242-- Availability: 2.4.0
1243CREATE OR REPLACE FUNCTION ST_IsPolygonCW(geometry)
1244 RETURNS boolean
1245 AS 'MODULE_PATHNAME','ST_IsPolygonCW'
1246 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1247 _COST_LOW;
1248
1249-- Availability: 2.4.0
1250CREATE OR REPLACE FUNCTION ST_IsPolygonCCW(geometry)
1251 RETURNS boolean
1252 AS 'MODULE_PATHNAME','ST_IsPolygonCCW'
1253 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1254 _COST_LOW;
1255
1256-- Availability: 2.0.0
1257CREATE OR REPLACE FUNCTION ST_DistanceSpheroid(geom1 geometry, geom2 geometry,spheroid)
1258 RETURNS FLOAT8
1259 AS 'MODULE_PATHNAME','LWGEOM_distance_ellipsoid'
1260 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1261 _COST_MEDIUM; --upped this
1262
1263-- Minimum distance. 2D only.
1264CREATE OR REPLACE FUNCTION ST_Distance(geom1 geometry, geom2 geometry)
1265 RETURNS float8
1266 AS 'MODULE_PATHNAME', 'ST_Distance'
1267 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1268 _COST_HIGH;
1269
1270-- Availability: 2.2.0
1271CREATE OR REPLACE FUNCTION ST_PointInsideCircle(geometry,float8,float8,float8)
1272 RETURNS bool
1273 AS 'MODULE_PATHNAME', 'LWGEOM_inside_circle_point'
1274 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1275 _COST_MEDIUM;
1276
1277-- Availability: 1.2.2
1278CREATE OR REPLACE FUNCTION ST_azimuth(geom1 geometry, geom2 geometry)
1279 RETURNS float8
1280 AS 'MODULE_PATHNAME', 'LWGEOM_azimuth'
1281 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1282 _COST_LOW;
1283
1284-- Availability: 2.5.0
1285CREATE OR REPLACE FUNCTION ST_Angle(pt1 geometry, pt2 geometry, pt3 geometry, pt4 geometry default 'POINT EMPTY'::geometry)
1286 RETURNS float8
1287 AS 'MODULE_PATHNAME', 'LWGEOM_angle'
1288 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1289 _COST_LOW;
1290
1291-- Availability: Future
1292-- CREATE OR REPLACE FUNCTION _ST_DistanceRectTree(g1 geometry, g2 geometry)
1293-- RETURNS float8
1294-- AS 'MODULE_PATHNAME', 'ST_DistanceRectTree'
1295-- LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1296-- _COST_MEDIUM;
1297
1298-- Availability: Future
1299-- CREATE OR REPLACE FUNCTION _ST_DistanceRectTreeCached(g1 geometry, g2 geometry)
1300-- RETURNS float8
1301-- AS 'MODULE_PATHNAME', 'ST_DistanceRectTreeCached'
1302-- LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1303-- _COST_MEDIUM;
1304
1305------------------------------------------------------------------------
1306-- MISC
1307------------------------------------------------------------------------
1308
1309-- Availability: 2.1.0
1310CREATE OR REPLACE FUNCTION ST_Force2D(geometry)
1311 RETURNS geometry
1312 AS 'MODULE_PATHNAME', 'LWGEOM_force_2d'
1313 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1314 _COST_LOW;
1315
1316-- Availability: 2.1.0
1317CREATE OR REPLACE FUNCTION ST_Force3DZ(geometry)
1318 RETURNS geometry
1319 AS 'MODULE_PATHNAME', 'LWGEOM_force_3dz'
1320 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1321 _COST_LOW;
1322
1323-- Availability: 2.1.0
1324CREATE OR REPLACE FUNCTION ST_Force3D(geometry)
1325 RETURNS geometry
1326 AS 'MODULE_PATHNAME', 'LWGEOM_force_3dz'
1327 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1328 _COST_LOW;
1329
1330-- Availability: 2.1.0
1331CREATE OR REPLACE FUNCTION ST_Force3DM(geometry)
1332 RETURNS geometry
1333 AS 'MODULE_PATHNAME', 'LWGEOM_force_3dm'
1334 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1335 _COST_LOW;
1336
1337-- Availability: 2.1.0
1338CREATE OR REPLACE FUNCTION ST_Force4D(geometry)
1339 RETURNS geometry
1340 AS 'MODULE_PATHNAME', 'LWGEOM_force_4d'
1341 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1342 _COST_LOW;
1343
1344-- Availability: 2.1.0
1345CREATE OR REPLACE FUNCTION ST_ForceCollection(geometry)
1346 RETURNS geometry
1347 AS 'MODULE_PATHNAME', 'LWGEOM_force_collection'
1348 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1349 _COST_LOW;
1350
1351-- Availability: 1.5.0
1352CREATE OR REPLACE FUNCTION ST_CollectionExtract(geometry, integer)
1353 RETURNS geometry
1354 AS 'MODULE_PATHNAME', 'ST_CollectionExtract'
1355 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1356 _COST_LOW;
1357
1358-- Availability: 2.0.0
1359CREATE OR REPLACE FUNCTION ST_CollectionHomogenize(geometry)
1360 RETURNS geometry
1361 AS 'MODULE_PATHNAME', 'ST_CollectionHomogenize'
1362 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1363 _COST_LOW;
1364
1365-- Availability: 1.2.2
1366CREATE OR REPLACE FUNCTION ST_Multi(geometry)
1367 RETURNS geometry
1368 AS 'MODULE_PATHNAME', 'LWGEOM_force_multi'
1369 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1370 _COST_LOW;
1371
1372-- Availability: 2.2.0
1373CREATE OR REPLACE FUNCTION ST_ForceCurve(geometry)
1374 RETURNS geometry
1375 AS 'MODULE_PATHNAME', 'LWGEOM_force_curve'
1376 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1377 _COST_MEDIUM;
1378
1379-- Availability: 2.1.0
1380CREATE OR REPLACE FUNCTION ST_ForceSFS(geometry)
1381 RETURNS geometry
1382 AS 'MODULE_PATHNAME', 'LWGEOM_force_sfs'
1383 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1384 _COST_MEDIUM;
1385
1386-- Availability: 2.1.0
1387CREATE OR REPLACE FUNCTION ST_ForceSFS(geometry, version text)
1388 RETURNS geometry
1389 AS 'MODULE_PATHNAME', 'LWGEOM_force_sfs'
1390 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1391 _COST_MEDIUM;
1392
1393-- Availability: 1.2.2
1394CREATE OR REPLACE FUNCTION ST_Expand(box3d,float8)
1395 RETURNS box3d
1396 AS 'MODULE_PATHNAME', 'BOX3D_expand'
1397 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1398 _COST_LOW;
1399
1400-- Availability: 2.3.0
1401CREATE OR REPLACE FUNCTION ST_Expand(box box3d, dx float8, dy float8, dz float8 DEFAULT 0)
1402 RETURNS box3d
1403 AS 'MODULE_PATHNAME', 'BOX3D_expand'
1404 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1405 _COST_LOW;
1406
1407-- Availability: 1.2.2
1408CREATE OR REPLACE FUNCTION ST_Expand(geometry,float8)
1409 RETURNS geometry
1410 AS 'MODULE_PATHNAME', 'LWGEOM_expand'
1411 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1412 _COST_LOW;
1413
1414-- Availability: 2.3.0
1415CREATE OR REPLACE FUNCTION ST_Expand(geom geometry, dx float8, dy float8, dz float8 DEFAULT 0, dm float8 DEFAULT 0)
1416 RETURNS geometry
1417 AS 'MODULE_PATHNAME', 'LWGEOM_expand'
1418 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1419 _COST_LOW;
1420
1421-- PostGIS equivalent function: envelope(geometry)
1422CREATE OR REPLACE FUNCTION ST_Envelope(geometry)
1423 RETURNS geometry
1424 AS 'MODULE_PATHNAME', 'LWGEOM_envelope'
1425 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1426 _COST_LOW;
1427
1428-- Availability: 2.2.0
1429CREATE OR REPLACE FUNCTION ST_BoundingDiagonal(geom geometry, fits boolean DEFAULT false)
1430 RETURNS geometry
1431 AS 'MODULE_PATHNAME', 'ST_BoundingDiagonal'
1432 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1433 _COST_LOW;
1434
1435-- Availability: 1.2.2
1436CREATE OR REPLACE FUNCTION ST_Reverse(geometry)
1437 RETURNS geometry
1438 AS 'MODULE_PATHNAME', 'LWGEOM_reverse'
1439 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1440 _COST_MEDIUM;
1441
1442-- Availability: 2.4.0
1443CREATE OR REPLACE FUNCTION ST_ForcePolygonCW(geometry)
1444 RETURNS geometry
1445 AS 'MODULE_PATHNAME', 'LWGEOM_force_clockwise_poly'
1446 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1447 _COST_MEDIUM;
1448
1449-- Availability: 2.4.0
1450CREATE OR REPLACE FUNCTION ST_ForcePolygonCCW(geometry)
1451 RETURNS geometry
1452 AS $$ SELECT @extschema@.ST_Reverse(@extschema@.ST_ForcePolygonCW($1)) $$
1453 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
1454
1455-- Availability: 1.2.2
1456CREATE OR REPLACE FUNCTION ST_ForceRHR(geometry)
1457 RETURNS geometry
1458 AS 'MODULE_PATHNAME', 'LWGEOM_force_clockwise_poly'
1459 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1460 _COST_MEDIUM;
1461
1462-- Availability: 1.5.0
1463CREATE OR REPLACE FUNCTION postgis_noop(geometry)
1464 RETURNS geometry
1465 AS 'MODULE_PATHNAME', 'LWGEOM_noop'
1466 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1467 _COST_DEFAULT;
1468
1469-- Availability: 3.0.0
1470CREATE OR REPLACE FUNCTION postgis_geos_noop(geometry)
1471 RETURNS geometry
1472 AS 'MODULE_PATHNAME', 'GEOSnoop'
1473 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1474 _COST_DEFAULT;
1475
1476-- Availability: 2.3.0
1477CREATE OR REPLACE FUNCTION ST_Normalize(geom geometry)
1478 RETURNS geometry
1479 AS 'MODULE_PATHNAME', 'ST_Normalize'
1480 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1481 _COST_LOW;
1482
1483-- Deprecation in 1.5.0
1484CREATE OR REPLACE FUNCTION ST_zmflag(geometry)
1485 RETURNS smallint
1486 AS 'MODULE_PATHNAME', 'LWGEOM_zmflag'
1487 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1488 _COST_DEFAULT;
1489
1490-- Availability: 1.2.2
1491CREATE OR REPLACE FUNCTION ST_NDims(geometry)
1492 RETURNS smallint
1493 AS 'MODULE_PATHNAME', 'LWGEOM_ndims'
1494 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1495 _COST_DEFAULT;
1496
1497-- Availability: 1.2.2
1498CREATE OR REPLACE FUNCTION ST_AsEWKT(geometry)
1499 RETURNS TEXT
1500 AS 'MODULE_PATHNAME','LWGEOM_asEWKT'
1501 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1502 _COST_LOW;
1503
1504-- Availability: 2.2.0
1505CREATE OR REPLACE FUNCTION ST_AsTWKB(geom geometry, prec int4 default NULL, prec_z int4 default NULL, prec_m int4 default NULL, with_sizes boolean default NULL, with_boxes boolean default NULL)
1506 RETURNS bytea
1507 AS 'MODULE_PATHNAME','TWKBFromLWGEOM'
1508 LANGUAGE 'c' IMMUTABLE _PARALLEL
1509 _COST_MEDIUM;
1510
1511-- Availability: 2.2.0
1512CREATE OR REPLACE FUNCTION ST_AsTWKB(geom geometry[], ids bigint[], prec int4 default NULL, prec_z int4 default NULL, prec_m int4 default NULL, with_sizes boolean default NULL, with_boxes boolean default NULL)
1513 RETURNS bytea
1514 AS 'MODULE_PATHNAME','TWKBFromLWGEOMArray'
1515 LANGUAGE 'c' IMMUTABLE _PARALLEL
1516 _COST_MEDIUM;
1517
1518-- Availability: 1.2.2
1519CREATE OR REPLACE FUNCTION ST_AsEWKB(geometry)
1520 RETURNS BYTEA
1521 AS 'MODULE_PATHNAME','WKBFromLWGEOM'
1522 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1523 _COST_LOW;
1524
1525-- Availability: 1.2.2
1526CREATE OR REPLACE FUNCTION ST_AsHEXEWKB(geometry)
1527 RETURNS TEXT
1528 AS 'MODULE_PATHNAME','LWGEOM_asHEXEWKB'
1529 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1530 _COST_LOW;
1531
1532-- Availability: 1.2.2
1533CREATE OR REPLACE FUNCTION ST_AsHEXEWKB(geometry, text)
1534 RETURNS TEXT
1535 AS 'MODULE_PATHNAME','LWGEOM_asHEXEWKB'
1536 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1537 _COST_LOW;
1538
1539-- Availability: 1.2.2
1540CREATE OR REPLACE FUNCTION ST_AsEWKB(geometry,text)
1541 RETURNS bytea
1542 AS 'MODULE_PATHNAME','WKBFromLWGEOM'
1543 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1544 _COST_LOW;
1545
1546-- Availability: 2.0.0
1547CREATE OR REPLACE FUNCTION ST_AsLatLonText(geom geometry, tmpl text DEFAULT '')
1548 RETURNS text
1549 AS 'MODULE_PATHNAME','LWGEOM_to_latlon'
1550 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1551 _COST_LOW;
1552
1553-- Deprecation in 1.2.3
1554CREATE OR REPLACE FUNCTION GeomFromEWKB(bytea)
1555 RETURNS geometry
1556 AS 'MODULE_PATHNAME','LWGEOMFromEWKB'
1557 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1558 _COST_LOW;
1559
1560-- Availability: 1.2.2
1561CREATE OR REPLACE FUNCTION ST_GeomFromEWKB(bytea)
1562 RETURNS geometry
1563 AS 'MODULE_PATHNAME','LWGEOMFromEWKB'
1564 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1565 _COST_LOW;
1566
1567-- Availability: 2.2
1568CREATE OR REPLACE FUNCTION ST_GeomFromTWKB(bytea)
1569 RETURNS geometry
1570 AS 'MODULE_PATHNAME','LWGEOMFromTWKB'
1571 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1572 _COST_LOW;
1573
1574-- Deprecation in 1.2.3
1575CREATE OR REPLACE FUNCTION GeomFromEWKT(text)
1576 RETURNS geometry
1577 AS 'MODULE_PATHNAME','parse_WKT_lwgeom'
1578 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1579 _COST_LOW;
1580
1581-- Availability: 1.2.2
1582CREATE OR REPLACE FUNCTION ST_GeomFromEWKT(text)
1583 RETURNS geometry
1584 AS 'MODULE_PATHNAME','parse_WKT_lwgeom'
1585 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1586 _COST_LOW;
1587
1588-- Availability: 1.5.0
1589CREATE OR REPLACE FUNCTION postgis_cache_bbox()
1590 RETURNS trigger
1591 AS 'MODULE_PATHNAME', 'cache_bbox'
1592 LANGUAGE 'c';
1593
1594------------------------------------------------------------------------
1595-- CONSTRUCTORS
1596------------------------------------------------------------------------
1597
1598-- Availability: 1.2.2
1599CREATE OR REPLACE FUNCTION ST_MakePoint(float8, float8)
1600 RETURNS geometry
1601 AS 'MODULE_PATHNAME', 'LWGEOM_makepoint'
1602 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1603 _COST_LOW;
1604
1605-- Availability: 1.2.2
1606CREATE OR REPLACE FUNCTION ST_MakePoint(float8, float8, float8)
1607 RETURNS geometry
1608 AS 'MODULE_PATHNAME', 'LWGEOM_makepoint'
1609 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1610 _COST_LOW;
1611
1612-- Availability: 1.2.2
1613CREATE OR REPLACE FUNCTION ST_MakePoint(float8, float8, float8, float8)
1614 RETURNS geometry
1615 AS 'MODULE_PATHNAME', 'LWGEOM_makepoint'
1616 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1617 _COST_LOW;
1618
1619-- Availability: 1.3.4
1620CREATE OR REPLACE FUNCTION ST_MakePointM(float8, float8, float8)
1621 RETURNS geometry
1622 AS 'MODULE_PATHNAME', 'LWGEOM_makepoint3dm'
1623 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1624 _COST_LOW;
1625
1626-- Availability: 2.0.0
1627CREATE OR REPLACE FUNCTION ST_3DMakeBox(geom1 geometry, geom2 geometry)
1628 RETURNS box3d
1629 AS 'MODULE_PATHNAME', 'BOX3D_construct'
1630 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1631 _COST_LOW;
1632
1633-- Availability: 1.4.0
1634CREATE OR REPLACE FUNCTION ST_MakeLine (geometry[])
1635 RETURNS geometry
1636 AS 'MODULE_PATHNAME', 'LWGEOM_makeline_garray'
1637 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1638 _COST_LOW;
1639
1640-- Availability: 1.2.2
1641CREATE OR REPLACE FUNCTION ST_LineFromMultiPoint(geometry)
1642 RETURNS geometry
1643 AS 'MODULE_PATHNAME', 'LWGEOM_line_from_mpoint'
1644 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1645 _COST_LOW;
1646
1647-- Availability: 1.2.2
1648CREATE OR REPLACE FUNCTION ST_MakeLine(geom1 geometry, geom2 geometry)
1649 RETURNS geometry
1650 AS 'MODULE_PATHNAME', 'LWGEOM_makeline'
1651 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1652 _COST_LOW;
1653
1654-- Availability: 1.2.2
1655CREATE OR REPLACE FUNCTION ST_AddPoint(geom1 geometry, geom2 geometry)
1656 RETURNS geometry
1657 AS 'MODULE_PATHNAME', 'LWGEOM_addpoint'
1658 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1659 _COST_LOW;
1660
1661-- Availability: 1.2.2
1662CREATE OR REPLACE FUNCTION ST_AddPoint(geom1 geometry, geom2 geometry, integer)
1663 RETURNS geometry
1664 AS 'MODULE_PATHNAME', 'LWGEOM_addpoint'
1665 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1666 _COST_LOW;
1667
1668-- Availability: 1.2.2
1669CREATE OR REPLACE FUNCTION ST_RemovePoint(geometry, integer)
1670 RETURNS geometry
1671 AS 'MODULE_PATHNAME', 'LWGEOM_removepoint'
1672 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1673 _COST_LOW;
1674
1675-- Availability: 1.2.2
1676CREATE OR REPLACE FUNCTION ST_SetPoint(geometry, integer, geometry)
1677 RETURNS geometry
1678 AS 'MODULE_PATHNAME', 'LWGEOM_setpoint_linestring'
1679 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1680 _COST_LOW;
1681
1682-- Availability: 1.5.0
1683-- Availability: 2.0.0 - made srid optional
1684CREATE OR REPLACE FUNCTION ST_MakeEnvelope(float8, float8, float8, float8, integer DEFAULT 0)
1685 RETURNS geometry
1686 AS 'MODULE_PATHNAME', 'ST_MakeEnvelope'
1687 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1688 _COST_LOW;
1689
1690-- Availability: 3.0.0
1691CREATE OR REPLACE FUNCTION ST_TileEnvelope(zoom integer, x integer, y integer, bounds geometry DEFAULT 'SRID=3857;LINESTRING(-20037508.342789 -20037508.342789, 20037508.342789 20037508.342789)'::geometry)
1692 RETURNS geometry
1693 AS 'MODULE_PATHNAME', 'ST_TileEnvelope'
1694 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1695 _COST_LOW;
1696
1697-- Availability: 1.2.2
1698CREATE OR REPLACE FUNCTION ST_MakePolygon(geometry, geometry[])
1699 RETURNS geometry
1700 AS 'MODULE_PATHNAME', 'LWGEOM_makepoly'
1701 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1702 _COST_LOW;
1703
1704-- Availability: 1.2.2
1705CREATE OR REPLACE FUNCTION ST_MakePolygon(geometry)
1706 RETURNS geometry
1707 AS 'MODULE_PATHNAME', 'LWGEOM_makepoly'
1708 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1709 _COST_LOW;
1710
1711-- Availability: 1.2.2
1712CREATE OR REPLACE FUNCTION ST_BuildArea(geometry)
1713 RETURNS geometry
1714 AS 'MODULE_PATHNAME', 'ST_BuildArea'
1715 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1716 _COST_HIGH;
1717
1718-- Availability: 1.4.0
1719CREATE OR REPLACE FUNCTION ST_Polygonize (geometry[])
1720 RETURNS geometry
1721 AS 'MODULE_PATHNAME', 'polygonize_garray'
1722 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1723 _COST_HIGH;
1724
1725-- Availability: 2.2
1726CREATE OR REPLACE FUNCTION ST_ClusterIntersecting(geometry[])
1727 RETURNS geometry[]
1728 AS 'MODULE_PATHNAME', 'clusterintersecting_garray'
1729 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1730 _COST_HIGH;
1731
1732-- Availability: 2.2
1733CREATE OR REPLACE FUNCTION ST_ClusterWithin(geometry[], float8)
1734 RETURNS geometry[]
1735 AS 'MODULE_PATHNAME', 'cluster_within_distance_garray'
1736 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1737 _COST_HIGH;
1738
1739-- Availability: 2.3
1740CREATE OR REPLACE FUNCTION ST_ClusterDBSCAN (geometry, eps float8, minpoints int)
1741 RETURNS int
1742 AS 'MODULE_PATHNAME', 'ST_ClusterDBSCAN'
1743 LANGUAGE 'c' IMMUTABLE STRICT WINDOW _PARALLEL
1744 _COST_HIGH;
1745
1746-- Availability: 1.2.2
1747CREATE OR REPLACE FUNCTION ST_LineMerge(geometry)
1748 RETURNS geometry
1749 AS 'MODULE_PATHNAME', 'linemerge'
1750 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1751 _COST_HIGH;
1752
1753-----------------------------------------------------------------------------
1754-- Affine transforms
1755-----------------------------------------------------------------------------
1756
1757-- Availability: 1.2.2
1758CREATE OR REPLACE FUNCTION ST_Affine(geometry,float8,float8,float8,float8,float8,float8,float8,float8,float8,float8,float8,float8)
1759 RETURNS geometry
1760 AS 'MODULE_PATHNAME', 'LWGEOM_affine'
1761 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1762 _COST_MEDIUM; -- reset cost, see #3675
1763
1764-- Availability: 1.2.2
1765CREATE OR REPLACE FUNCTION ST_Affine(geometry,float8,float8,float8,float8,float8,float8)
1766 RETURNS geometry
1767 AS 'SELECT @extschema@.ST_Affine($1, $2, $3, 0, $4, $5, 0, 0, 0, 1, $6, $7, 0)'
1768 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
1769
1770-- Availability: 1.2.2
1771CREATE OR REPLACE FUNCTION ST_Rotate(geometry,float8)
1772 RETURNS geometry
1773 AS 'SELECT @extschema@.ST_Affine($1, cos($2), -sin($2), 0, sin($2), cos($2), 0, 0, 0, 1, 0, 0, 0)'
1774 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
1775
1776-- Availability: 2.0.0
1777CREATE OR REPLACE FUNCTION ST_Rotate(geometry,float8,float8,float8)
1778 RETURNS geometry
1779 AS 'SELECT @extschema@.ST_Affine($1, cos($2), -sin($2), 0, sin($2), cos($2), 0, 0, 0, 1, $3 - cos($2) * $3 + sin($2) * $4, $4 - sin($2) * $3 - cos($2) * $4, 0)'
1780 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
1781
1782-- Availability: 2.0.0
1783CREATE OR REPLACE FUNCTION ST_Rotate(geometry,float8,geometry)
1784 RETURNS geometry
1785 AS 'SELECT @extschema@.ST_Affine($1, cos($2), -sin($2), 0, sin($2), cos($2), 0, 0, 0, 1, @extschema@.ST_X($3) - cos($2) * @extschema@.ST_X($3) + sin($2) * @extschema@.ST_Y($3), @extschema@.ST_Y($3) - sin($2) * @extschema@.ST_X($3) - cos($2) * @extschema@.ST_Y($3), 0)'
1786 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
1787
1788-- Availability: 1.2.2
1789CREATE OR REPLACE FUNCTION ST_RotateZ(geometry,float8)
1790 RETURNS geometry
1791 AS 'SELECT @extschema@.ST_Rotate($1, $2)'
1792 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
1793
1794-- Availability: 1.2.2
1795CREATE OR REPLACE FUNCTION ST_RotateX(geometry,float8)
1796 RETURNS geometry
1797 AS 'SELECT @extschema@.ST_Affine($1, 1, 0, 0, 0, cos($2), -sin($2), 0, sin($2), cos($2), 0, 0, 0)'
1798 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
1799
1800-- Availability: 1.2.2
1801CREATE OR REPLACE FUNCTION ST_RotateY(geometry,float8)
1802 RETURNS geometry
1803 AS 'SELECT @extschema@.ST_Affine($1, cos($2), 0, sin($2), 0, 1, 0, -sin($2), 0, cos($2), 0, 0, 0)'
1804 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
1805
1806-- Availability: 1.2.2
1807CREATE OR REPLACE FUNCTION ST_Translate(geometry,float8,float8,float8)
1808 RETURNS geometry
1809 AS 'SELECT @extschema@.ST_Affine($1, 1, 0, 0, 0, 1, 0, 0, 0, 1, $2, $3, $4)'
1810 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
1811
1812-- Availability: 1.2.2
1813CREATE OR REPLACE FUNCTION ST_Translate(geometry,float8,float8)
1814 RETURNS geometry
1815 AS 'SELECT @extschema@.ST_Translate($1, $2, $3, 0)'
1816 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
1817
1818-- Availability: 2.2.0
1819CREATE OR REPLACE FUNCTION ST_Scale(geometry,geometry)
1820 RETURNS geometry
1821 AS 'MODULE_PATHNAME', 'ST_Scale'
1822 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1823 _COST_MEDIUM;
1824
1825-- Availability: 2.5.0
1826CREATE OR REPLACE FUNCTION ST_Scale(geometry,geometry,origin geometry)
1827 RETURNS geometry
1828 AS 'MODULE_PATHNAME', 'ST_Scale'
1829 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1830 _COST_MEDIUM;
1831
1832-- Availability: 1.2.2
1833CREATE OR REPLACE FUNCTION ST_Scale(geometry,float8,float8,float8)
1834 RETURNS geometry
1835 --AS 'SELECT ST_Affine($1, $2, 0, 0, 0, $3, 0, 0, 0, $4, 0, 0, 0)'
1836 AS 'SELECT @extschema@.ST_Scale($1, @extschema@.ST_MakePoint($2, $3, $4))'
1837 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
1838
1839-- Availability: 1.2.2
1840CREATE OR REPLACE FUNCTION ST_Scale(geometry,float8,float8)
1841 RETURNS geometry
1842 AS 'SELECT @extschema@.ST_Scale($1, $2, $3, 1)'
1843 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
1844
1845-- Availability: 1.2.2
1846CREATE OR REPLACE FUNCTION ST_Transscale(geometry,float8,float8,float8,float8)
1847 RETURNS geometry
1848 AS 'SELECT @extschema@.ST_Affine($1, $4, 0, 0, 0, $5, 0,
1849 0, 0, 1, $2 * $4, $3 * $5, 0)'
1850 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
1851
1852-----------------------------------------------------------------------
1853-- Dumping
1854-----------------------------------------------------------------------
1855
1856-- Availability: 1.0.0
1857CREATE TYPE geometry_dump AS (
1858 path integer[],
1859 geom geometry
1860);
1861
1862-- Availability: 1.2.2
1863CREATE OR REPLACE FUNCTION ST_Dump(geometry)
1864 RETURNS SETOF geometry_dump
1865 AS 'MODULE_PATHNAME', 'LWGEOM_dump'
1866 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1867 _COST_MEDIUM;
1868
1869-- Availability: 1.2.2
1870CREATE OR REPLACE FUNCTION ST_DumpRings(geometry)
1871 RETURNS SETOF geometry_dump
1872 AS 'MODULE_PATHNAME', 'LWGEOM_dump_rings'
1873 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1874 _COST_MEDIUM;
1875
1876-----------------------------------------------------------------------
1877-- ST_DumpPoints()
1878-----------------------------------------------------------------------
1879-- This function mimicks that of ST_Dump for collections, but this function
1880-- that returns a path and all the points that make up a particular geometry.
1881-- Availability: 1.5.0
1882CREATE OR REPLACE FUNCTION ST_DumpPoints(geometry)
1883 RETURNS SETOF geometry_dump
1884 AS 'MODULE_PATHNAME', 'LWGEOM_dumppoints'
1885 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
1886 COST 100;
1887
1888-------------------------------------------------------------------
1889-- SPATIAL_REF_SYS
1890-------------------------------------------------------------------
1891CREATE TABLE spatial_ref_sys (
1892 srid integer not null primary key
1893 check (srid > 0 and srid <= SRID_USR_MAX),
1894 auth_name varchar(256),
1895 auth_srid integer,
1896 srtext varchar(2048),
1897 proj4text varchar(2048)
1898);
1899
1900-----------------------------------------------------------------------
1901-- POPULATE_GEOMETRY_COLUMNS()
1902-----------------------------------------------------------------------
1903-- Truncates and refills the geometry_columns table from all tables and
1904-- views in the database that contain geometry columns. This function
1905-- is a simple wrapper for populate_geometry_columns(oid). In essence,
1906-- this function ensures every geometry column in the database has the
1907-- appropriate spatial contraints (for tables) and exists in the
1908-- geometry_columns table.
1909-- Availability: 1.4.0
1910-- Revised: 2.0.0 -- no longer deletes from geometry_columns
1911-- Has new use_typmod option that defaults to true.
1912-- If use typmod is set to false will use old constraint behavior.
1913-- Will only touch table missing typmod or geometry constraints
1914-----------------------------------------------------------------------
1915CREATE OR REPLACE FUNCTION populate_geometry_columns(use_typmod boolean DEFAULT true)
1916 RETURNS text AS
1917$$
1918DECLARE
1919 inserted integer;
1920 oldcount integer;
1921 probed integer;
1922 stale integer;
1923 gcs RECORD;
1924 gc RECORD;
1925 gsrid integer;
1926 gndims integer;
1927 gtype text;
1928 query text;
1929 gc_is_valid boolean;
1930
1931BEGIN
1932 SELECT count(*) INTO oldcount FROM @extschema@.geometry_columns;
1933 inserted := 0;
1934
1935 -- Count the number of geometry columns in all tables and views
1936 SELECT count(DISTINCT c.oid) INTO probed
1937 FROM pg_class c,
1938 pg_attribute a,
1939 pg_type t,
1940 pg_namespace n
1941 WHERE c.relkind IN('r','v','f')
1942 AND t.typname = 'geometry'
1943 AND a.attisdropped = false
1944 AND a.atttypid = t.oid
1945 AND a.attrelid = c.oid
1946 AND c.relnamespace = n.oid
1947 AND n.nspname NOT ILIKE 'pg_temp%' AND c.relname != 'raster_columns' ;
1948
1949 -- Iterate through all non-dropped geometry columns
1950 RAISE DEBUG 'Processing Tables.....';
1951
1952 FOR gcs IN
1953 SELECT DISTINCT ON (c.oid) c.oid, n.nspname, c.relname
1954 FROM pg_class c,
1955 pg_attribute a,
1956 pg_type t,
1957 pg_namespace n
1958 WHERE c.relkind IN( 'r', 'f')
1959 AND t.typname = 'geometry'
1960 AND a.attisdropped = false
1961 AND a.atttypid = t.oid
1962 AND a.attrelid = c.oid
1963 AND c.relnamespace = n.oid
1964 AND n.nspname NOT ILIKE 'pg_temp%' AND c.relname != 'raster_columns'
1965 LOOP
1966
1967 inserted := inserted + @extschema@.populate_geometry_columns(gcs.oid, use_typmod);
1968 END LOOP;
1969
1970 IF oldcount > inserted THEN
1971 stale = oldcount-inserted;
1972 ELSE
1973 stale = 0;
1974 END IF;
1975
1976 RETURN 'probed:' ||probed|| ' inserted:'||inserted;
1977END
1978
1979$$
1980LANGUAGE 'plpgsql' VOLATILE;
1981
1982-----------------------------------------------------------------------
1983-- POPULATE_GEOMETRY_COLUMNS(tbl_oid oid)
1984-----------------------------------------------------------------------
1985-- DELETEs from and reINSERTs into the geometry_columns table all entries
1986-- associated with the oid of a particular table or view.
1987--
1988-- If the provided oid is for a table, this function tries to determine
1989-- the srid, dimension, and geometry type of the all geometries
1990-- in the table, adding contraints as necessary to the table. If
1991-- successful, an appropriate row is inserted into the geometry_columns
1992-- table, otherwise, the exception is caught and an error notice is
1993-- raised describing the problem. (This is so the wrapper function
1994-- populate_geometry_columns() can apply spatial constraints to all
1995-- geometry columns across an entire database at once without erroring
1996-- out)
1997--
1998-- If the provided oid is for a view, as with a table oid, this function
1999-- tries to determine the srid, dimension, and type of all the geometries
2000-- in the view, inserting appropriate entries into the geometry_columns
2001-- table.
2002-- Availability: 1.4.0
2003-----------------------------------------------------------------------
2004CREATE OR REPLACE FUNCTION populate_geometry_columns(tbl_oid oid, use_typmod boolean DEFAULT true)
2005 RETURNS integer AS
2006$$
2007DECLARE
2008 gcs RECORD;
2009 gc RECORD;
2010 gc_old RECORD;
2011 gsrid integer;
2012 gndims integer;
2013 gtype text;
2014 query text;
2015 gc_is_valid boolean;
2016 inserted integer;
2017 constraint_successful boolean := false;
2018
2019BEGIN
2020 inserted := 0;
2021
2022 -- Iterate through all geometry columns in this table
2023 FOR gcs IN
2024 SELECT n.nspname, c.relname, a.attname
2025 FROM pg_class c,
2026 pg_attribute a,
2027 pg_type t,
2028 pg_namespace n
2029 WHERE c.relkind IN('r', 'f')
2030 AND t.typname = 'geometry'
2031 AND a.attisdropped = false
2032 AND a.atttypid = t.oid
2033 AND a.attrelid = c.oid
2034 AND c.relnamespace = n.oid
2035 AND n.nspname NOT ILIKE 'pg_temp%'
2036 AND c.oid = tbl_oid
2037 LOOP
2038
2039 RAISE DEBUG 'Processing column %.%.%', gcs.nspname, gcs.relname, gcs.attname;
2040
2041 gc_is_valid := true;
2042 -- Find the srid, coord_dimension, and type of current geometry
2043 -- in geometry_columns -- which is now a view
2044
2045 SELECT type, srid, coord_dimension INTO gc_old
2046 FROM geometry_columns
2047 WHERE f_table_schema = gcs.nspname AND f_table_name = gcs.relname AND f_geometry_column = gcs.attname;
2048
2049 IF upper(gc_old.type) = 'GEOMETRY' THEN
2050 -- This is an unconstrained geometry we need to do something
2051 -- We need to figure out what to set the type by inspecting the data
2052 EXECUTE 'SELECT @extschema@.ST_srid(' || quote_ident(gcs.attname) || ') As srid, @extschema@.GeometryType(' || quote_ident(gcs.attname) || ') As type, @extschema@.ST_NDims(' || quote_ident(gcs.attname) || ') As dims ' ||
2053 ' FROM ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) ||
2054 ' WHERE ' || quote_ident(gcs.attname) || ' IS NOT NULL LIMIT 1;'
2055 INTO gc;
2056 IF gc IS NULL THEN -- there is no data so we can not determine geometry type
2057 RAISE WARNING 'No data in table %.%, so no information to determine geometry type and srid', gcs.nspname, gcs.relname;
2058 RETURN 0;
2059 END IF;
2060 gsrid := gc.srid; gtype := gc.type; gndims := gc.dims;
2061
2062 IF use_typmod THEN
2063 BEGIN
2064 EXECUTE 'ALTER TABLE ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || ' ALTER COLUMN ' || quote_ident(gcs.attname) ||
2065 ' TYPE geometry(' || postgis_type_name(gtype, gndims, true) || ', ' || gsrid::text || ') ';
2066 inserted := inserted + 1;
2067 EXCEPTION
2068 WHEN invalid_parameter_value OR feature_not_supported THEN
2069 RAISE WARNING 'Could not convert ''%'' in ''%.%'' to use typmod with srid %, type %: %', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname), gsrid, postgis_type_name(gtype, gndims, true), SQLERRM;
2070 gc_is_valid := false;
2071 END;
2072
2073 ELSE
2074 -- Try to apply srid check to column
2075 constraint_successful = false;
2076 IF (gsrid > 0 AND postgis_constraint_srid(gcs.nspname, gcs.relname,gcs.attname) IS NULL ) THEN
2077 BEGIN
2078 EXECUTE 'ALTER TABLE ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) ||
2079 ' ADD CONSTRAINT ' || quote_ident('enforce_srid_' || gcs.attname) ||
2080 ' CHECK (ST_srid(' || quote_ident(gcs.attname) || ') = ' || gsrid || ')';
2081 constraint_successful := true;
2082 EXCEPTION
2083 WHEN check_violation THEN
2084 RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not apply constraint CHECK (st_srid(%) = %)', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname), quote_ident(gcs.attname), gsrid;
2085 gc_is_valid := false;
2086 END;
2087 END IF;
2088
2089 -- Try to apply ndims check to column
2090 IF (gndims IS NOT NULL AND postgis_constraint_dims(gcs.nspname, gcs.relname,gcs.attname) IS NULL ) THEN
2091 BEGIN
2092 EXECUTE 'ALTER TABLE ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || '
2093 ADD CONSTRAINT ' || quote_ident('enforce_dims_' || gcs.attname) || '
2094 CHECK (st_ndims(' || quote_ident(gcs.attname) || ') = '||gndims||')';
2095 constraint_successful := true;
2096 EXCEPTION
2097 WHEN check_violation THEN
2098 RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not apply constraint CHECK (st_ndims(%) = %)', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname), quote_ident(gcs.attname), gndims;
2099 gc_is_valid := false;
2100 END;
2101 END IF;
2102
2103 -- Try to apply geometrytype check to column
2104 IF (gtype IS NOT NULL AND postgis_constraint_type(gcs.nspname, gcs.relname,gcs.attname) IS NULL ) THEN
2105 BEGIN
2106 EXECUTE 'ALTER TABLE ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || '
2107 ADD CONSTRAINT ' || quote_ident('enforce_geotype_' || gcs.attname) || '
2108 CHECK (geometrytype(' || quote_ident(gcs.attname) || ') = ' || quote_literal(gtype) || ')';
2109 constraint_successful := true;
2110 EXCEPTION
2111 WHEN check_violation THEN
2112 -- No geometry check can be applied. This column contains a number of geometry types.
2113 RAISE WARNING 'Could not add geometry type check (%) to table column: %.%.%', gtype, quote_ident(gcs.nspname),quote_ident(gcs.relname),quote_ident(gcs.attname);
2114 END;
2115 END IF;
2116 --only count if we were successful in applying at least one constraint
2117 IF constraint_successful THEN
2118 inserted := inserted + 1;
2119 END IF;
2120 END IF;
2121 END IF;
2122
2123 END LOOP;
2124
2125 RETURN inserted;
2126END
2127
2128$$
2129LANGUAGE 'plpgsql' VOLATILE;
2130
2131-----------------------------------------------------------------------
2132-- ADDGEOMETRYCOLUMN
2133-- <catalogue>, <schema>, <table>, <column>, <srid>, <type>, <dim>
2134-----------------------------------------------------------------------
2135--
2136-- Type can be one of GEOMETRY, GEOMETRYCOLLECTION, POINT, MULTIPOINT, POLYGON,
2137-- MULTIPOLYGON, LINESTRING, or MULTILINESTRING.
2138--
2139-- Geometry types (except GEOMETRY) are checked for consistency using a CHECK constraint.
2140-- Uses an ALTER TABLE command to add the geometry column to the table.
2141-- Addes a row to geometry_columns.
2142-- Addes a constraint on the table that all the geometries MUST have the same
2143-- SRID. Checks the coord_dimension to make sure its between 0 and 3.
2144-- Should also check the precision grid (future expansion).
2145--
2146-----------------------------------------------------------------------
2147CREATE OR REPLACE FUNCTION AddGeometryColumn(catalog_name varchar,schema_name varchar,table_name varchar,column_name varchar,new_srid_in integer,new_type varchar,new_dim integer, use_typmod boolean DEFAULT true)
2148 RETURNS text
2149 AS
2150$$
2151DECLARE
2152 rec RECORD;
2153 sr varchar;
2154 real_schema name;
2155 sql text;
2156 new_srid integer;
2157
2158BEGIN
2159
2160 -- Verify geometry type
2161 IF (postgis_type_name(new_type,new_dim) IS NULL )
2162 THEN
2163 RAISE EXCEPTION 'Invalid type name "%(%)" - valid ones are:
2164 POINT, MULTIPOINT,
2165 LINESTRING, MULTILINESTRING,
2166 POLYGON, MULTIPOLYGON,
2167 CIRCULARSTRING, COMPOUNDCURVE, MULTICURVE,
2168 CURVEPOLYGON, MULTISURFACE,
2169 GEOMETRY, GEOMETRYCOLLECTION,
2170 POINTM, MULTIPOINTM,
2171 LINESTRINGM, MULTILINESTRINGM,
2172 POLYGONM, MULTIPOLYGONM,
2173 CIRCULARSTRINGM, COMPOUNDCURVEM, MULTICURVEM
2174 CURVEPOLYGONM, MULTISURFACEM, TRIANGLE, TRIANGLEM,
2175 POLYHEDRALSURFACE, POLYHEDRALSURFACEM, TIN, TINM
2176 or GEOMETRYCOLLECTIONM', new_type, new_dim;
2177 RETURN 'fail';
2178 END IF;
2179
2180 -- Verify dimension
2181 IF ( (new_dim >4) OR (new_dim <2) ) THEN
2182 RAISE EXCEPTION 'invalid dimension';
2183 RETURN 'fail';
2184 END IF;
2185
2186 IF ( (new_type LIKE '%M') AND (new_dim!=3) ) THEN
2187 RAISE EXCEPTION 'TypeM needs 3 dimensions';
2188 RETURN 'fail';
2189 END IF;
2190
2191 -- Verify SRID
2192 IF ( new_srid_in > 0 ) THEN
2193 IF new_srid_in > SRID_USR_MAX THEN
2194 RAISE EXCEPTION 'AddGeometryColumn() - SRID must be <= %', SRID_USR_MAX;
2195 END IF;
2196 new_srid := new_srid_in;
2197 SELECT SRID INTO sr FROM spatial_ref_sys WHERE SRID = new_srid;
2198 IF NOT FOUND THEN
2199 RAISE EXCEPTION 'AddGeometryColumn() - invalid SRID';
2200 RETURN 'fail';
2201 END IF;
2202 ELSE
2203 new_srid := @extschema@.ST_SRID('POINT EMPTY'::@extschema@.geometry);
2204 IF ( new_srid_in != new_srid ) THEN
2205 RAISE NOTICE 'SRID value % converted to the officially unknown SRID value %', new_srid_in, new_srid;
2206 END IF;
2207 END IF;
2208
2209 -- Verify schema
2210 IF ( schema_name IS NOT NULL AND schema_name != '' ) THEN
2211 sql := 'SELECT nspname FROM pg_namespace ' ||
2212 'WHERE text(nspname) = ' || quote_literal(schema_name) ||
2213 'LIMIT 1';
2214 RAISE DEBUG '%', sql;
2215 EXECUTE sql INTO real_schema;
2216
2217 IF ( real_schema IS NULL ) THEN
2218 RAISE EXCEPTION 'Schema % is not a valid schemaname', quote_literal(schema_name);
2219 RETURN 'fail';
2220 END IF;
2221 END IF;
2222
2223 IF ( real_schema IS NULL ) THEN
2224 RAISE DEBUG 'Detecting schema';
2225 sql := 'SELECT n.nspname AS schemaname ' ||
2226 'FROM pg_catalog.pg_class c ' ||
2227 'JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace ' ||
2228 'WHERE c.relkind = ' || quote_literal('r') ||
2229 ' AND n.nspname NOT IN (' || quote_literal('pg_catalog') || ', ' || quote_literal('pg_toast') || ')' ||
2230 ' AND pg_catalog.pg_table_is_visible(c.oid)' ||
2231 ' AND c.relname = ' || quote_literal(table_name);
2232 RAISE DEBUG '%', sql;
2233 EXECUTE sql INTO real_schema;
2234
2235 IF ( real_schema IS NULL ) THEN
2236 RAISE EXCEPTION 'Table % does not occur in the search_path', quote_literal(table_name);
2237 RETURN 'fail';
2238 END IF;
2239 END IF;
2240
2241 -- Add geometry column to table
2242 IF use_typmod THEN
2243 sql := 'ALTER TABLE ' ||
2244 quote_ident(real_schema) || '.' || quote_ident(table_name)
2245 || ' ADD COLUMN ' || quote_ident(column_name) ||
2246 ' geometry(' || @extschema@.postgis_type_name(new_type, new_dim) || ', ' || new_srid::text || ')';
2247 RAISE DEBUG '%', sql;
2248 ELSE
2249 sql := 'ALTER TABLE ' ||
2250 quote_ident(real_schema) || '.' || quote_ident(table_name)
2251 || ' ADD COLUMN ' || quote_ident(column_name) ||
2252 ' geometry ';
2253 RAISE DEBUG '%', sql;
2254 END IF;
2255 EXECUTE sql;
2256
2257 IF NOT use_typmod THEN
2258 -- Add table CHECKs
2259 sql := 'ALTER TABLE ' ||
2260 quote_ident(real_schema) || '.' || quote_ident(table_name)
2261 || ' ADD CONSTRAINT '
2262 || quote_ident('enforce_srid_' || column_name)
2263 || ' CHECK (st_srid(' || quote_ident(column_name) ||
2264 ') = ' || new_srid::text || ')' ;
2265 RAISE DEBUG '%', sql;
2266 EXECUTE sql;
2267
2268 sql := 'ALTER TABLE ' ||
2269 quote_ident(real_schema) || '.' || quote_ident(table_name)
2270 || ' ADD CONSTRAINT '
2271 || quote_ident('enforce_dims_' || column_name)
2272 || ' CHECK (st_ndims(' || quote_ident(column_name) ||
2273 ') = ' || new_dim::text || ')' ;
2274 RAISE DEBUG '%', sql;
2275 EXECUTE sql;
2276
2277 IF ( NOT (new_type = 'GEOMETRY')) THEN
2278 sql := 'ALTER TABLE ' ||
2279 quote_ident(real_schema) || '.' || quote_ident(table_name) || ' ADD CONSTRAINT ' ||
2280 quote_ident('enforce_geotype_' || column_name) ||
2281 ' CHECK (GeometryType(' ||
2282 quote_ident(column_name) || ')=' ||
2283 quote_literal(new_type) || ' OR (' ||
2284 quote_ident(column_name) || ') is null)';
2285 RAISE DEBUG '%', sql;
2286 EXECUTE sql;
2287 END IF;
2288 END IF;
2289
2290 RETURN
2291 real_schema || '.' ||
2292 table_name || '.' || column_name ||
2293 ' SRID:' || new_srid::text ||
2294 ' TYPE:' || new_type ||
2295 ' DIMS:' || new_dim::text || ' ';
2296END;
2297$$
2298LANGUAGE 'plpgsql' VOLATILE STRICT;
2299
2300----------------------------------------------------------------------------
2301-- ADDGEOMETRYCOLUMN ( <schema>, <table>, <column>, <srid>, <type>, <dim> )
2302----------------------------------------------------------------------------
2303--
2304-- This is a wrapper to the real AddGeometryColumn, for use
2305-- when catalogue is undefined
2306--
2307----------------------------------------------------------------------------
2308CREATE OR REPLACE FUNCTION AddGeometryColumn(schema_name varchar,table_name varchar,column_name varchar,new_srid integer,new_type varchar,new_dim integer, use_typmod boolean DEFAULT true) RETURNS text AS $$
2309DECLARE
2310 ret text;
2311BEGIN
2312 SELECT @extschema@.AddGeometryColumn('',$1,$2,$3,$4,$5,$6,$7) into ret;
2313 RETURN ret;
2314END;
2315$$
2316LANGUAGE 'plpgsql' STABLE STRICT;
2317
2318----------------------------------------------------------------------------
2319-- ADDGEOMETRYCOLUMN ( <table>, <column>, <srid>, <type>, <dim> )
2320----------------------------------------------------------------------------
2321--
2322-- This is a wrapper to the real AddGeometryColumn, for use
2323-- when catalogue and schema are undefined
2324--
2325----------------------------------------------------------------------------
2326CREATE OR REPLACE FUNCTION AddGeometryColumn(table_name varchar,column_name varchar,new_srid integer,new_type varchar,new_dim integer, use_typmod boolean DEFAULT true) RETURNS text AS $$
2327DECLARE
2328 ret text;
2329BEGIN
2330 SELECT @extschema@.AddGeometryColumn('','',$1,$2,$3,$4,$5, $6) into ret;
2331 RETURN ret;
2332END;
2333$$
2334LANGUAGE 'plpgsql' VOLATILE STRICT;
2335
2336-----------------------------------------------------------------------
2337-- DROPGEOMETRYCOLUMN
2338-- <catalogue>, <schema>, <table>, <column>
2339-----------------------------------------------------------------------
2340--
2341-- Removes geometry column reference from geometry_columns table.
2342-- Drops the column with pgsql >= 73.
2343-- Make some silly enforcements on it for pgsql < 73
2344--
2345-----------------------------------------------------------------------
2346CREATE OR REPLACE FUNCTION DropGeometryColumn(catalog_name varchar, schema_name varchar,table_name varchar,column_name varchar)
2347 RETURNS text
2348 AS
2349$$
2350DECLARE
2351 myrec RECORD;
2352 okay boolean;
2353 real_schema name;
2354
2355BEGIN
2356
2357 -- Find, check or fix schema_name
2358 IF ( schema_name != '' ) THEN
2359 okay = false;
2360
2361 FOR myrec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP
2362 okay := true;
2363 END LOOP;
2364
2365 IF ( okay <> true ) THEN
2366 RAISE NOTICE 'Invalid schema name - using current_schema()';
2367 SELECT current_schema() into real_schema;
2368 ELSE
2369 real_schema = schema_name;
2370 END IF;
2371 ELSE
2372 SELECT current_schema() into real_schema;
2373 END IF;
2374
2375 -- Find out if the column is in the geometry_columns table
2376 okay = false;
2377 FOR myrec IN SELECT * from @extschema@.geometry_columns where f_table_schema = text(real_schema) and f_table_name = table_name and f_geometry_column = column_name LOOP
2378 okay := true;
2379 END LOOP;
2380 IF (okay <> true) THEN
2381 RAISE EXCEPTION 'column not found in geometry_columns table';
2382 RETURN false;
2383 END IF;
2384
2385 -- Remove table column
2386 EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) || '.' ||
2387 quote_ident(table_name) || ' DROP COLUMN ' ||
2388 quote_ident(column_name);
2389
2390 RETURN real_schema || '.' || table_name || '.' || column_name ||' effectively removed.';
2391
2392END;
2393$$
2394LANGUAGE 'plpgsql' VOLATILE STRICT;
2395
2396-----------------------------------------------------------------------
2397-- DROPGEOMETRYCOLUMN
2398-- <schema>, <table>, <column>
2399-----------------------------------------------------------------------
2400--
2401-- This is a wrapper to the real DropGeometryColumn, for use
2402-- when catalogue is undefined
2403--
2404-----------------------------------------------------------------------
2405CREATE OR REPLACE FUNCTION DropGeometryColumn(schema_name varchar, table_name varchar,column_name varchar)
2406 RETURNS text
2407 AS
2408$$
2409DECLARE
2410 ret text;
2411BEGIN
2412 SELECT @extschema@.DropGeometryColumn('',$1,$2,$3) into ret;
2413 RETURN ret;
2414END;
2415$$
2416LANGUAGE 'plpgsql' VOLATILE STRICT;
2417
2418-----------------------------------------------------------------------
2419-- DROPGEOMETRYCOLUMN
2420-- <table>, <column>
2421-----------------------------------------------------------------------
2422--
2423-- This is a wrapper to the real DropGeometryColumn, for use
2424-- when catalogue and schema is undefined.
2425--
2426-----------------------------------------------------------------------
2427CREATE OR REPLACE FUNCTION DropGeometryColumn(table_name varchar, column_name varchar)
2428 RETURNS text
2429 AS
2430$$
2431DECLARE
2432 ret text;
2433BEGIN
2434 SELECT @extschema@.DropGeometryColumn('','',$1,$2) into ret;
2435 RETURN ret;
2436END;
2437$$
2438LANGUAGE 'plpgsql' VOLATILE STRICT;
2439
2440-----------------------------------------------------------------------
2441-- DROPGEOMETRYTABLE
2442-- <catalogue>, <schema>, <table>
2443-----------------------------------------------------------------------
2444--
2445-- Drop a table and all its references in geometry_columns
2446--
2447-----------------------------------------------------------------------
2448CREATE OR REPLACE FUNCTION DropGeometryTable(catalog_name varchar, schema_name varchar, table_name varchar)
2449 RETURNS text
2450 AS
2451$$
2452DECLARE
2453 real_schema name;
2454
2455BEGIN
2456
2457 IF ( schema_name = '' ) THEN
2458 SELECT current_schema() into real_schema;
2459 ELSE
2460 real_schema = schema_name;
2461 END IF;
2462
2463 -- TODO: Should we warn if table doesn't exist probably instead just saying dropped
2464 -- Remove table
2465 EXECUTE 'DROP TABLE IF EXISTS '
2466 || quote_ident(real_schema) || '.' ||
2467 quote_ident(table_name) || ' RESTRICT';
2468
2469 RETURN
2470 real_schema || '.' ||
2471 table_name ||' dropped.';
2472
2473END;
2474$$
2475LANGUAGE 'plpgsql' VOLATILE STRICT;
2476
2477-----------------------------------------------------------------------
2478-- DROPGEOMETRYTABLE
2479-- <schema>, <table>
2480-----------------------------------------------------------------------
2481--
2482-- Drop a table and all its references in geometry_columns
2483--
2484-----------------------------------------------------------------------
2485CREATE OR REPLACE FUNCTION DropGeometryTable(schema_name varchar, table_name varchar) RETURNS text AS
2486$$ SELECT @extschema@.DropGeometryTable('',$1,$2) $$
2487LANGUAGE 'sql' VOLATILE STRICT;
2488
2489-----------------------------------------------------------------------
2490-- DROPGEOMETRYTABLE
2491-- <table>
2492-----------------------------------------------------------------------
2493--
2494-- Drop a table and all its references in geometry_columns
2495-- For PG>=73 use current_schema()
2496--
2497-----------------------------------------------------------------------
2498CREATE OR REPLACE FUNCTION DropGeometryTable(table_name varchar) RETURNS text AS
2499$$ SELECT @extschema@.DropGeometryTable('','',$1) $$
2500LANGUAGE 'sql' VOLATILE STRICT;
2501
2502-----------------------------------------------------------------------
2503-- UPDATEGEOMETRYSRID
2504-- <catalogue>, <schema>, <table>, <column>, <srid>
2505-----------------------------------------------------------------------
2506--
2507-- Change SRID of all features in a spatially-enabled table
2508--
2509-----------------------------------------------------------------------
2510-- Changed: 2.1.4 check against real_schema
2511CREATE OR REPLACE FUNCTION UpdateGeometrySRID(catalogn_name varchar,schema_name varchar,table_name varchar,column_name varchar,new_srid_in integer)
2512 RETURNS text
2513 AS
2514$$
2515DECLARE
2516 myrec RECORD;
2517 okay boolean;
2518 cname varchar;
2519 real_schema name;
2520 unknown_srid integer;
2521 new_srid integer := new_srid_in;
2522
2523BEGIN
2524
2525 -- Find, check or fix schema_name
2526 IF ( schema_name != '' ) THEN
2527 okay = false;
2528
2529 FOR myrec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP
2530 okay := true;
2531 END LOOP;
2532
2533 IF ( okay <> true ) THEN
2534 RAISE EXCEPTION 'Invalid schema name';
2535 ELSE
2536 real_schema = schema_name;
2537 END IF;
2538 ELSE
2539 SELECT INTO real_schema current_schema()::text;
2540 END IF;
2541
2542 -- Ensure that column_name is in geometry_columns
2543 okay = false;
2544 FOR myrec IN SELECT type, coord_dimension FROM @extschema@.geometry_columns WHERE f_table_schema = text(real_schema) and f_table_name = table_name and f_geometry_column = column_name LOOP
2545 okay := true;
2546 END LOOP;
2547 IF (NOT okay) THEN
2548 RAISE EXCEPTION 'column not found in geometry_columns table';
2549 RETURN false;
2550 END IF;
2551
2552 -- Ensure that new_srid is valid
2553 IF ( new_srid > 0 ) THEN
2554 IF ( SELECT count(*) = 0 from spatial_ref_sys where srid = new_srid ) THEN
2555 RAISE EXCEPTION 'invalid SRID: % not found in spatial_ref_sys', new_srid;
2556 RETURN false;
2557 END IF;
2558 ELSE
2559 unknown_srid := @extschema@.ST_SRID('POINT EMPTY'::@extschema@.geometry);
2560 IF ( new_srid != unknown_srid ) THEN
2561 new_srid := unknown_srid;
2562 RAISE NOTICE 'SRID value % converted to the officially unknown SRID value %', new_srid_in, new_srid;
2563 END IF;
2564 END IF;
2565
2566 IF postgis_constraint_srid(real_schema, table_name, column_name) IS NOT NULL THEN
2567 -- srid was enforced with constraints before, keep it that way.
2568 -- Make up constraint name
2569 cname = 'enforce_srid_' || column_name;
2570
2571 -- Drop enforce_srid constraint
2572 EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) ||
2573 '.' || quote_ident(table_name) ||
2574 ' DROP constraint ' || quote_ident(cname);
2575
2576 -- Update geometries SRID
2577 EXECUTE 'UPDATE ' || quote_ident(real_schema) ||
2578 '.' || quote_ident(table_name) ||
2579 ' SET ' || quote_ident(column_name) ||
2580 ' = @extschema@.ST_SetSRID(' || quote_ident(column_name) ||
2581 ', ' || new_srid::text || ')';
2582
2583 -- Reset enforce_srid constraint
2584 EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) ||
2585 '.' || quote_ident(table_name) ||
2586 ' ADD constraint ' || quote_ident(cname) ||
2587 ' CHECK (st_srid(' || quote_ident(column_name) ||
2588 ') = ' || new_srid::text || ')';
2589 ELSE
2590 -- We will use typmod to enforce if no srid constraints
2591 -- We are using postgis_type_name to lookup the new name
2592 -- (in case Paul changes his mind and flips geometry_columns to return old upper case name)
2593 EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) || '.' || quote_ident(table_name) ||
2594 ' ALTER COLUMN ' || quote_ident(column_name) || ' TYPE geometry(' || @extschema@.postgis_type_name(myrec.type, myrec.coord_dimension, true) || ', ' || new_srid::text || ') USING @extschema@.ST_SetSRID(' || quote_ident(column_name) || ',' || new_srid::text || ');' ;
2595 END IF;
2596
2597 RETURN real_schema || '.' || table_name || '.' || column_name ||' SRID changed to ' || new_srid::text;
2598
2599END;
2600$$
2601LANGUAGE 'plpgsql' VOLATILE STRICT;
2602
2603-----------------------------------------------------------------------
2604-- UPDATEGEOMETRYSRID
2605-- <schema>, <table>, <column>, <srid>
2606-----------------------------------------------------------------------
2607CREATE OR REPLACE FUNCTION UpdateGeometrySRID(varchar,varchar,varchar,integer)
2608 RETURNS text
2609 AS $$
2610DECLARE
2611 ret text;
2612BEGIN
2613 SELECT @extschema@.UpdateGeometrySRID('',$1,$2,$3,$4) into ret;
2614 RETURN ret;
2615END;
2616$$
2617LANGUAGE 'plpgsql' VOLATILE STRICT;
2618
2619-----------------------------------------------------------------------
2620-- UPDATEGEOMETRYSRID
2621-- <table>, <column>, <srid>
2622-----------------------------------------------------------------------
2623CREATE OR REPLACE FUNCTION UpdateGeometrySRID(varchar,varchar,integer)
2624 RETURNS text
2625 AS $$
2626DECLARE
2627 ret text;
2628BEGIN
2629 SELECT @extschema@.UpdateGeometrySRID('','',$1,$2,$3) into ret;
2630 RETURN ret;
2631END;
2632$$
2633LANGUAGE 'plpgsql' VOLATILE STRICT;
2634
2635-----------------------------------------------------------------------
2636-- FIND_SRID( <schema>, <table>, <geom col> )
2637-----------------------------------------------------------------------
2638-- Changed: 2.1.8 improve performance
2639CREATE OR REPLACE FUNCTION find_srid(varchar,varchar,varchar) RETURNS int4 AS
2640$$
2641DECLARE
2642 schem varchar = $1;
2643 tabl varchar = $2;
2644 sr int4;
2645BEGIN
2646-- if the table contains a . and the schema is empty
2647-- split the table into a schema and a table
2648-- otherwise drop through to default behavior
2649 IF ( schem = '' and strpos(tabl,'.') > 0 ) THEN
2650 schem = substr(tabl,1,strpos(tabl,'.')-1);
2651 tabl = substr(tabl,length(schem)+2);
2652 END IF;
2653
2654 select SRID into sr from @extschema@.geometry_columns where (f_table_schema = schem or schem = '') and f_table_name = tabl and f_geometry_column = $3;
2655 IF NOT FOUND THEN
2656 RAISE EXCEPTION 'find_srid() - could not find the corresponding SRID - is the geometry registered in the GEOMETRY_COLUMNS table? Is there an uppercase/lowercase mismatch?';
2657 END IF;
2658 return sr;
2659END;
2660$$
2661LANGUAGE 'plpgsql' STABLE STRICT _PARALLEL;
2662
2663---------------------------------------------------------------
2664-- PROJ support
2665---------------------------------------------------------------
2666
2667CREATE OR REPLACE FUNCTION get_proj4_from_srid(integer) RETURNS text AS
2668 $$
2669 BEGIN
2670 RETURN proj4text::text FROM @extschema@.spatial_ref_sys WHERE srid= $1;
2671 END;
2672 $$
2673 LANGUAGE 'plpgsql' IMMUTABLE STRICT _PARALLEL;
2674
2675-- Availability: 1.2.2
2676CREATE OR REPLACE FUNCTION ST_SetSRID(geom geometry, srid int4)
2677 RETURNS geometry
2678 AS 'MODULE_PATHNAME','LWGEOM_set_srid'
2679 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
2680 _COST_LOW;
2681
2682CREATE OR REPLACE FUNCTION ST_SRID(geom geometry)
2683 RETURNS int4
2684 AS 'MODULE_PATHNAME','LWGEOM_get_srid'
2685 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
2686 _COST_LOW;
2687
2688CREATE OR REPLACE FUNCTION postgis_transform_geometry(geom geometry, text, text, int)
2689 RETURNS geometry
2690 AS 'MODULE_PATHNAME','transform_geom'
2691 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
2692 _COST_MEDIUM;
2693
2694-- PostGIS equivalent of old function: transform(geometry,integer)
2695CREATE OR REPLACE FUNCTION ST_Transform(geometry,integer)
2696 RETURNS geometry
2697 AS 'MODULE_PATHNAME','transform'
2698 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
2699 _COST_MEDIUM;
2700
2701-- Availability: 2.3.0
2702CREATE OR REPLACE FUNCTION ST_Transform(geom geometry, to_proj text)
2703 RETURNS geometry AS
2704 'SELECT @extschema@.postgis_transform_geometry($1, proj4text, $2, 0)
2705 FROM spatial_ref_sys WHERE srid=@extschema@.ST_SRID($1);'
2706 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
2707
2708-- Availability: 2.3.0
2709CREATE OR REPLACE FUNCTION ST_Transform(geom geometry, from_proj text, to_proj text)
2710 RETURNS geometry AS
2711 'SELECT @extschema@.postgis_transform_geometry($1, $2, $3, 0)'
2712 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
2713
2714-- Availability: 2.3.0
2715CREATE OR REPLACE FUNCTION ST_Transform(geom geometry, from_proj text, to_srid integer)
2716 RETURNS geometry AS
2717 'SELECT @extschema@.postgis_transform_geometry($1, $2, proj4text, $3)
2718 FROM spatial_ref_sys WHERE srid=$3;'
2719 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
2720
2721-----------------------------------------------------------------------
2722-- POSTGIS_VERSION()
2723-----------------------------------------------------------------------
2724
2725CREATE OR REPLACE FUNCTION postgis_version() RETURNS text
2726 AS 'MODULE_PATHNAME'
2727 LANGUAGE 'c' IMMUTABLE
2728 _COST_DEFAULT;
2729
2730CREATE OR REPLACE FUNCTION postgis_liblwgeom_version() RETURNS text
2731 AS 'MODULE_PATHNAME'
2732 LANGUAGE 'c' IMMUTABLE
2733 _COST_DEFAULT;
2734
2735CREATE OR REPLACE FUNCTION postgis_proj_version() RETURNS text
2736 AS 'MODULE_PATHNAME'
2737 LANGUAGE 'c' IMMUTABLE
2738 _COST_DEFAULT;
2739
2740CREATE OR REPLACE FUNCTION postgis_wagyu_version() RETURNS text
2741 AS 'MODULE_PATHNAME'
2742 LANGUAGE 'c' IMMUTABLE
2743 _COST_DEFAULT;
2744
2745--
2746-- IMPORTANT:
2747-- Starting at 1.1.0 this function is used by postgis_proc_upgrade.pl
2748-- to extract version of postgis being installed.
2749-- Do not modify this w/out also changing postgis_proc_upgrade.pl
2750--
2751CREATE OR REPLACE FUNCTION postgis_scripts_installed() RETURNS text
2752 AS _POSTGIS_SQL_SELECT_POSTGIS_SCRIPTS_VERSION
2753 LANGUAGE 'sql' IMMUTABLE;
2754
2755CREATE OR REPLACE FUNCTION postgis_lib_version() RETURNS text
2756 AS 'MODULE_PATHNAME'
2757 LANGUAGE 'c' IMMUTABLE; -- a new lib will require a new session
2758
2759-- NOTE: from 1.1.0 to 1.5.x this was the same of postgis_lib_version()
2760-- NOTE: from 2.0.0 up it includes postgis_svn_revision()
2761CREATE OR REPLACE FUNCTION postgis_scripts_released() RETURNS text
2762 AS 'MODULE_PATHNAME'
2763 LANGUAGE 'c' IMMUTABLE;
2764
2765CREATE OR REPLACE FUNCTION postgis_geos_version() RETURNS text
2766 AS 'MODULE_PATHNAME'
2767 LANGUAGE 'c' IMMUTABLE;
2768
2769CREATE OR REPLACE FUNCTION postgis_svn_version() RETURNS text
2770 AS 'MODULE_PATHNAME'
2771 LANGUAGE 'c' IMMUTABLE;
2772
2773CREATE OR REPLACE FUNCTION postgis_libxml_version() RETURNS text
2774 AS 'MODULE_PATHNAME'
2775 LANGUAGE 'c' IMMUTABLE;
2776
2777CREATE OR REPLACE FUNCTION postgis_scripts_build_date() RETURNS text
2778 AS _POSTGIS_SQL_SELECT_POSTGIS_BUILD_DATE
2779 LANGUAGE 'sql' IMMUTABLE;
2780
2781CREATE OR REPLACE FUNCTION postgis_lib_build_date() RETURNS text
2782 AS 'MODULE_PATHNAME'
2783 LANGUAGE 'c' IMMUTABLE;
2784
2785CREATE OR REPLACE FUNCTION _postgis_scripts_pgsql_version() RETURNS text
2786 AS _POSTGIS_SQL_SELECT_POSTGIS_PGSQL_VERSION
2787 LANGUAGE 'sql' IMMUTABLE;
2788
2789CREATE OR REPLACE FUNCTION _postgis_pgsql_version() RETURNS text
2790AS $$
2791 SELECT CASE WHEN split_part(s,'.',1)::integer > 9 THEN split_part(s,'.',1) || '0' ELSE split_part(s,'.', 1) || split_part(s,'.', 2) END AS v
2792 FROM substring(version(), 'PostgreSQL ([0-9\.]+)') AS s;
2793$$ LANGUAGE 'sql' STABLE;
2794
2795-- Availability: 2.5.0
2796-- Changed: 3.0.0 also upgrade postgis_raster if it exists
2797CREATE OR REPLACE FUNCTION postgis_extensions_upgrade() RETURNS text
2798AS $$
2799DECLARE rec record; sql text; var_schema text;
2800BEGIN
2801
2802 FOR rec IN
2803 SELECT name, default_version, installed_version
2804 FROM pg_catalog.pg_available_extensions
2805 WHERE name IN (
2806 'postgis',
2807 'postgis_raster',
2808 'postgis_sfcgal',
2809 'postgis_topology',
2810 'postgis_tiger_geocoder'
2811 )
2812 ORDER BY length(name) -- this is to make sure 'postgis' is first !
2813 LOOP
2814 IF rec.installed_version IS NULL THEN
2815 -- If the support installed by available extension
2816 -- is found unpackaged, we package it
2817 IF
2818 -- PostGIS is always available (this function is part of it)
2819 rec.name = 'postgis'
2820
2821 -- PostGIS raster is available if type 'raster' exists
2822 OR ( rec.name = 'postgis_raster' AND EXISTS (
2823 SELECT 1 FROM pg_catalog.pg_type
2824 WHERE typname = 'raster' ) )
2825
2826 -- PostGIS SFCGAL is availble if
2827 -- 'postgis_sfcgal_version' function exists
2828 OR ( rec.name = 'postgis_sfcgal' AND EXISTS (
2829 SELECT 1 FROM pg_catalog.pg_proc
2830 WHERE proname = 'postgis_sfcgal_version' ) )
2831
2832 -- PostGIS Topology is available if
2833 -- 'topology.topology' table exists
2834 -- NOTE: watch out for https://trac.osgeo.org/postgis/ticket/2503
2835 OR ( rec.name = 'postgis_topology' AND EXISTS (
2836 SELECT 1 FROM pg_catalog.pg_class c
2837 JOIN pg_catalog.pg_namespace n ON (c.relnamespace = n.oid )
2838 WHERE n.nspname = 'topology' AND c.relname = 'topology') )
2839
2840 -- TODO: How do we tell if PostGIS Tiger Geocoder is available ?
2841 THEN
2842 sql = 'CREATE EXTENSION ' || rec.name || ' FROM unpackaged';
2843 RAISE NOTICE 'Packaging extension %', rec.name;
2844 RAISE DEBUG '%', sql;
2845 EXECUTE sql;
2846 ELSE
2847 RAISE NOTICE 'Extension % is not available or not packagable for some reason', rec.name;
2848 END IF;
2849 ELSIF rec.default_version != rec.installed_version
2850 THEN
2851 sql = 'ALTER EXTENSION ' || rec.name || ' UPDATE TO ' ||
2852 quote_ident(rec.default_version) || ';';
2853 RAISE NOTICE 'Updating extension % from % to %',
2854 rec.name, rec.installed_version, rec.default_version;
2855 RAISE DEBUG '%', sql;
2856 EXECUTE sql;
2857 ELSIF (rec.default_version = rec.installed_version AND rec.installed_version ILIKE '%dev') OR
2858 (@extschema@._postgis_pgsql_version() != @extschema@._postgis_scripts_pgsql_version())
2859 THEN
2860 -- we need to upgrade to next and back
2861 RAISE NOTICE 'Updating extension % %',
2862 rec.name, rec.installed_version;
2863 sql = 'ALTER EXTENSION ' || rec.name || ' UPDATE TO ' ||
2864 quote_ident(rec.default_version || 'next') || ';';
2865 RAISE DEBUG '%', sql;
2866 EXECUTE sql;
2867 sql = 'ALTER EXTENSION ' || rec.name || ' UPDATE TO ' ||
2868 quote_ident(rec.default_version) || ';';
2869 RAISE DEBUG '%', sql;
2870 EXECUTE sql;
2871 END IF;
2872
2873 END LOOP;
2874
2875 RETURN 'Upgrade completed, run SELECT postgis_full_version(); for details';
2876
2877END
2878$$ LANGUAGE plpgsql VOLATILE;
2879
2880-- Changed: 3.0.0
2881CREATE OR REPLACE FUNCTION postgis_full_version() RETURNS text
2882AS $$
2883DECLARE
2884 libver text;
2885 svnver text;
2886 projver text;
2887 geosver text;
2888 sfcgalver text;
2889 gdalver text := NULL;
2890 libxmlver text;
2891 liblwgeomver text;
2892 dbproc text;
2893 relproc text;
2894 fullver text;
2895 rast_lib_ver text := NULL;
2896 rast_scr_ver text := NULL;
2897 topo_scr_ver text := NULL;
2898 json_lib_ver text;
2899 protobuf_lib_ver text;
2900 wagyu_lib_ver text;
2901 sfcgal_lib_ver text;
2902 sfcgal_scr_ver text;
2903 pgsql_scr_ver text;
2904 pgsql_ver text;
2905 core_is_extension bool;
2906BEGIN
2907 SELECT @extschema@.postgis_lib_version() INTO libver;
2908 SELECT @extschema@.postgis_proj_version() INTO projver;
2909 SELECT @extschema@.postgis_geos_version() INTO geosver;
2910 SELECT @extschema@.postgis_libjson_version() INTO json_lib_ver;
2911 SELECT @extschema@.postgis_libprotobuf_version() INTO protobuf_lib_ver;
2912 SELECT @extschema@.postgis_wagyu_version() INTO wagyu_lib_ver;
2913 SELECT @extschema@._postgis_scripts_pgsql_version() INTO pgsql_scr_ver;
2914 SELECT @extschema@._postgis_pgsql_version() INTO pgsql_ver;
2915 BEGIN
2916 SELECT @extschema@.postgis_gdal_version() INTO gdalver;
2917 EXCEPTION
2918 WHEN undefined_function THEN
2919 RAISE DEBUG 'Function postgis_gdal_version() not found. Is raster support enabled and rtpostgis.sql installed?';
2920 END;
2921 BEGIN
2922 SELECT @extschema@.postgis_sfcgal_version() INTO sfcgalver;
2923 BEGIN
2924 SELECT @extschema@.postgis_sfcgal_scripts_installed() INTO sfcgal_scr_ver;
2925 EXCEPTION
2926 WHEN undefined_function THEN
2927 sfcgal_scr_ver := 'missing';
2928 END;
2929 EXCEPTION
2930 WHEN undefined_function THEN
2931 RAISE DEBUG 'Function postgis_sfcgal_scripts_installed() not found. Is sfcgal support enabled and sfcgal.sql installed?';
2932 END;
2933 SELECT @extschema@.postgis_liblwgeom_version() INTO liblwgeomver;
2934 SELECT @extschema@.postgis_libxml_version() INTO libxmlver;
2935 SELECT @extschema@.postgis_scripts_installed() INTO dbproc;
2936 SELECT @extschema@.postgis_scripts_released() INTO relproc;
2937 SELECT @extschema@.postgis_svn_version() INTO svnver;
2938 BEGIN
2939 SELECT topology.postgis_topology_scripts_installed() INTO topo_scr_ver;
2940 EXCEPTION
2941 WHEN undefined_function OR invalid_schema_name THEN
2942 RAISE DEBUG 'Function postgis_topology_scripts_installed() not found. Is topology support enabled and topology.sql installed?';
2943 WHEN insufficient_privilege THEN
2944 RAISE NOTICE 'Topology support cannot be inspected. Is current user granted USAGE on schema "topology" ?';
2945 WHEN OTHERS THEN
2946 RAISE NOTICE 'Function postgis_topology_scripts_installed() could not be called: % (%)', SQLERRM, SQLSTATE;
2947 END;
2948
2949 BEGIN
2950 SELECT postgis_raster_scripts_installed() INTO rast_scr_ver;
2951 EXCEPTION
2952 WHEN undefined_function THEN
2953 RAISE DEBUG 'Function postgis_raster_scripts_installed() not found. Is raster support enabled and rtpostgis.sql installed?';
2954 WHEN OTHERS THEN
2955 RAISE NOTICE 'Function postgis_raster_scripts_installed() could not be called: % (%)', SQLERRM, SQLSTATE;
2956 END;
2957
2958 BEGIN
2959 SELECT @extschema@.postgis_raster_lib_version() INTO rast_lib_ver;
2960 EXCEPTION
2961 WHEN undefined_function THEN
2962 RAISE DEBUG 'Function postgis_raster_lib_version() not found. Is raster support enabled and rtpostgis.sql installed?';
2963 WHEN OTHERS THEN
2964 RAISE NOTICE 'Function postgis_raster_lib_version() could not be called: % (%)', SQLERRM, SQLSTATE;
2965 END;
2966
2967 fullver = 'POSTGIS="' || libver;
2968
2969 IF svnver IS NOT NULL THEN
2970 fullver = fullver || ' r' || svnver;
2971 END IF;
2972
2973 fullver = fullver || '"';
2974
2975 IF EXISTS (
2976 SELECT * FROM pg_catalog.pg_extension
2977 WHERE extname = 'postgis')
2978 THEN
2979 fullver = fullver || ' [EXTENSION]';
2980 core_is_extension := true;
2981 ELSE
2982 core_is_extension := false;
2983 END IF;
2984
2985 IF liblwgeomver != relproc THEN
2986 fullver = fullver || ' (liblwgeom version mismatch: "' || liblwgeomver || '")';
2987 END IF;
2988
2989 fullver = fullver || ' PGSQL="' || pgsql_scr_ver || '"';
2990 IF pgsql_scr_ver != pgsql_ver THEN
2991 fullver = fullver || ' (procs need upgrade for use with PostgreSQL "' || pgsql_ver || '")';
2992 END IF;
2993
2994 IF geosver IS NOT NULL THEN
2995 fullver = fullver || ' GEOS="' || geosver || '"';
2996 END IF;
2997
2998 IF sfcgalver IS NOT NULL THEN
2999 fullver = fullver || ' SFCGAL="' || sfcgalver || '"';
3000 END IF;
3001
3002 IF projver IS NOT NULL THEN
3003 fullver = fullver || ' PROJ="' || projver || '"';
3004 END IF;
3005
3006 IF gdalver IS NOT NULL THEN
3007 fullver = fullver || ' GDAL="' || gdalver || '"';
3008 END IF;
3009
3010 IF libxmlver IS NOT NULL THEN
3011 fullver = fullver || ' LIBXML="' || libxmlver || '"';
3012 END IF;
3013
3014 IF json_lib_ver IS NOT NULL THEN
3015 fullver = fullver || ' LIBJSON="' || json_lib_ver || '"';
3016 END IF;
3017
3018 IF protobuf_lib_ver IS NOT NULL THEN
3019 fullver = fullver || ' LIBPROTOBUF="' || protobuf_lib_ver || '"';
3020 END IF;
3021
3022 IF wagyu_lib_ver IS NOT NULL THEN
3023 fullver = fullver || ' WAGYU="' || wagyu_lib_ver || '"';
3024 END IF;
3025
3026 IF dbproc != relproc THEN
3027 fullver = fullver || ' (core procs from "' || dbproc || '" need upgrade)';
3028 END IF;
3029
3030 IF topo_scr_ver IS NOT NULL THEN
3031 fullver = fullver || ' TOPOLOGY';
3032 IF topo_scr_ver != relproc THEN
3033 fullver = fullver || ' (topology procs from "' || topo_scr_ver || '" need upgrade)';
3034 END IF;
3035 IF core_is_extension AND NOT EXISTS (
3036 SELECT * FROM pg_catalog.pg_extension
3037 WHERE extname = 'postgis_topology')
3038 THEN
3039 fullver = fullver || ' [UNPACKAGED!]';
3040 END IF;
3041 END IF;
3042
3043 IF rast_lib_ver IS NOT NULL THEN
3044 fullver = fullver || ' RASTER';
3045 IF rast_lib_ver != relproc THEN
3046 fullver = fullver || ' (raster lib from "' || rast_lib_ver || '" need upgrade)';
3047 END IF;
3048 IF core_is_extension AND NOT EXISTS (
3049 SELECT * FROM pg_catalog.pg_extension
3050 WHERE extname = 'postgis_raster')
3051 THEN
3052 fullver = fullver || ' [UNPACKAGED!]';
3053 END IF;
3054 END IF;
3055
3056 IF rast_scr_ver IS NOT NULL AND rast_scr_ver != relproc THEN
3057 fullver = fullver || ' (raster procs from "' || rast_scr_ver || '" need upgrade)';
3058 END IF;
3059
3060 IF sfcgal_scr_ver IS NOT NULL AND sfcgal_scr_ver != relproc THEN
3061 fullver = fullver || ' (sfcgal procs from "' || sfcgal_scr_ver || '" need upgrade)';
3062 END IF;
3063
3064 RETURN fullver;
3065END
3066$$
3067LANGUAGE 'plpgsql' IMMUTABLE;
3068
3069---------------------------------------------------------------
3070-- CASTS
3071---------------------------------------------------------------
3072
3073CREATE OR REPLACE FUNCTION box2d(geometry)
3074 RETURNS box2d
3075 AS 'MODULE_PATHNAME','LWGEOM_to_BOX2D'
3076 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3077 _COST_LOW;
3078
3079CREATE OR REPLACE FUNCTION box3d(geometry)
3080 RETURNS box3d
3081 AS 'MODULE_PATHNAME','LWGEOM_to_BOX3D'
3082 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3083 _COST_LOW;
3084
3085CREATE OR REPLACE FUNCTION box(geometry)
3086 RETURNS box
3087 AS 'MODULE_PATHNAME','LWGEOM_to_BOX'
3088 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3089 _COST_LOW;
3090
3091CREATE OR REPLACE FUNCTION box2d(box3d)
3092 RETURNS box2d
3093 AS 'MODULE_PATHNAME','BOX3D_to_BOX2D'
3094 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3095 _COST_LOW;
3096
3097CREATE OR REPLACE FUNCTION box3d(box2d)
3098 RETURNS box3d
3099 AS 'MODULE_PATHNAME','BOX2D_to_BOX3D'
3100 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3101 _COST_LOW;
3102
3103CREATE OR REPLACE FUNCTION box(box3d)
3104 RETURNS box
3105 AS 'MODULE_PATHNAME','BOX3D_to_BOX'
3106 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3107 _COST_LOW;
3108
3109CREATE OR REPLACE FUNCTION text(geometry)
3110 RETURNS text
3111 AS 'MODULE_PATHNAME','LWGEOM_to_text'
3112 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3113 _COST_LOW;
3114
3115-- this is kept for backward-compatibility
3116-- Deprecation in 1.2.3
3117CREATE OR REPLACE FUNCTION box3dtobox(box3d)
3118 RETURNS box
3119 AS 'MODULE_PATHNAME','BOX3D_to_BOX'
3120 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3121 _COST_LOW;
3122
3123CREATE OR REPLACE FUNCTION geometry(box2d)
3124 RETURNS geometry
3125 AS 'MODULE_PATHNAME','BOX2D_to_LWGEOM'
3126 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3127 _COST_LOW;
3128
3129CREATE OR REPLACE FUNCTION geometry(box3d)
3130 RETURNS geometry
3131 AS 'MODULE_PATHNAME','BOX3D_to_LWGEOM'
3132 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3133 _COST_LOW;
3134
3135CREATE OR REPLACE FUNCTION geometry(text)
3136 RETURNS geometry
3137 AS 'MODULE_PATHNAME','parse_WKT_lwgeom'
3138 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3139 _COST_LOW;
3140
3141CREATE OR REPLACE FUNCTION geometry(bytea)
3142 RETURNS geometry
3143 AS 'MODULE_PATHNAME','LWGEOM_from_bytea'
3144 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3145 _COST_LOW;
3146
3147CREATE OR REPLACE FUNCTION bytea(geometry)
3148 RETURNS bytea
3149 AS 'MODULE_PATHNAME','LWGEOM_to_bytea'
3150 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3151 _COST_LOW;
3152
3153-- 7.3+ explicit casting definitions
3154CREATE CAST (geometry AS box2d) WITH FUNCTION box2d(geometry) AS IMPLICIT;
3155CREATE CAST (geometry AS box3d) WITH FUNCTION box3d(geometry) AS IMPLICIT;
3156
3157-- ticket: 2262 changed 2.1.0 to assignment to prevent PostGIS
3158-- from misusing PostgreSQL geometric functions
3159CREATE CAST (geometry AS box) WITH FUNCTION box(geometry) AS ASSIGNMENT;
3160
3161CREATE CAST (box3d AS box2d) WITH FUNCTION box2d(box3d) AS IMPLICIT;
3162CREATE CAST (box2d AS box3d) WITH FUNCTION box3d(box2d) AS IMPLICIT;
3163CREATE CAST (box2d AS geometry) WITH FUNCTION geometry(box2d) AS IMPLICIT;
3164CREATE CAST (box3d AS box) WITH FUNCTION box(box3d) AS IMPLICIT;
3165CREATE CAST (box3d AS geometry) WITH FUNCTION geometry(box3d) AS IMPLICIT;
3166CREATE CAST (text AS geometry) WITH FUNCTION geometry(text) AS IMPLICIT;
3167CREATE CAST (geometry AS text) WITH FUNCTION text(geometry) AS IMPLICIT;
3168CREATE CAST (bytea AS geometry) WITH FUNCTION geometry(bytea) AS IMPLICIT;
3169CREATE CAST (geometry AS bytea) WITH FUNCTION bytea(geometry) AS IMPLICIT;
3170
3171---------------------------------------------------------------
3172-- Algorithms
3173---------------------------------------------------------------
3174
3175-- Availability: 1.2.2
3176CREATE OR REPLACE FUNCTION ST_Simplify(geometry, float8)
3177 RETURNS geometry
3178 AS 'MODULE_PATHNAME', 'LWGEOM_simplify2d'
3179 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3180 _COST_HIGH;
3181
3182-- Availability: 2.2.0
3183CREATE OR REPLACE FUNCTION ST_Simplify(geometry, float8, boolean)
3184 RETURNS geometry
3185 AS 'MODULE_PATHNAME', 'LWGEOM_simplify2d'
3186 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3187 _COST_HIGH;
3188
3189-- Availability: 2.2.0
3190CREATE OR REPLACE FUNCTION ST_SimplifyVW(geometry, float8)
3191 RETURNS geometry
3192 AS 'MODULE_PATHNAME', 'LWGEOM_SetEffectiveArea'
3193 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3194 _COST_HIGH;
3195
3196-- Availability: 2.2.0
3197CREATE OR REPLACE FUNCTION ST_SetEffectiveArea(geometry, float8 default -1, integer default 1)
3198 RETURNS geometry
3199 AS 'MODULE_PATHNAME', 'LWGEOM_SetEffectiveArea'
3200 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3201 _COST_MEDIUM;
3202
3203-- Availability: 2.5.0
3204CREATE OR REPLACE FUNCTION ST_FilterByM(geometry, double precision, double precision default null, boolean default false)
3205 RETURNS geometry
3206 AS 'MODULE_PATHNAME', 'LWGEOM_FilterByM'
3207 LANGUAGE 'c' IMMUTABLE _PARALLEL
3208 _COST_MEDIUM;
3209
3210-- Availability: 2.5.0
3211CREATE OR REPLACE FUNCTION ST_ChaikinSmoothing(geometry, integer default 1, boolean default false)
3212 RETURNS geometry
3213 AS 'MODULE_PATHNAME', 'LWGEOM_ChaikinSmoothing'
3214 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3215 _COST_HIGH;
3216
3217-- ST_SnapToGrid(input, xoff, yoff, xsize, ysize)
3218-- Availability: 1.2.2
3219CREATE OR REPLACE FUNCTION ST_SnapToGrid(geometry, float8, float8, float8, float8)
3220 RETURNS geometry
3221 AS 'MODULE_PATHNAME', 'LWGEOM_snaptogrid'
3222 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3223 _COST_MEDIUM;
3224
3225-- ST_SnapToGrid(input, xsize, ysize) # offsets=0
3226-- Availability: 1.2.2
3227CREATE OR REPLACE FUNCTION ST_SnapToGrid(geometry, float8, float8)
3228 RETURNS geometry
3229 AS 'SELECT @extschema@.ST_SnapToGrid($1, 0, 0, $2, $3)'
3230 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL
3231 _COST_MEDIUM;
3232
3233-- ST_SnapToGrid(input, size) # xsize=ysize=size, offsets=0
3234-- Availability: 1.2.2
3235CREATE OR REPLACE FUNCTION ST_SnapToGrid(geometry, float8)
3236 RETURNS geometry
3237 AS 'SELECT @extschema@.ST_SnapToGrid($1, 0, 0, $2, $2)'
3238 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
3239
3240-- ST_SnapToGrid(input, point_offsets, xsize, ysize, zsize, msize)
3241-- Availability: 1.2.2
3242CREATE OR REPLACE FUNCTION ST_SnapToGrid(geom1 geometry, geom2 geometry, float8, float8, float8, float8)
3243 RETURNS geometry
3244 AS 'MODULE_PATHNAME', 'LWGEOM_snaptogrid_pointoff'
3245 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3246 _COST_MEDIUM;
3247
3248-- Availability: 1.2.2
3249CREATE OR REPLACE FUNCTION ST_Segmentize(geometry, float8)
3250 RETURNS geometry
3251 AS 'MODULE_PATHNAME', 'LWGEOM_segmentize2d'
3252 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3253 _COST_MEDIUM;
3254
3255---------------------------------------------------------------
3256-- LRS
3257---------------------------------------------------------------
3258
3259-- Availability: 2.1.0
3260CREATE OR REPLACE FUNCTION ST_LineInterpolatePoint(geometry, float8)
3261 RETURNS geometry
3262 AS 'MODULE_PATHNAME', 'LWGEOM_line_interpolate_point'
3263 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3264 _COST_MEDIUM;
3265
3266-- Availability: 2.5.0
3267CREATE OR REPLACE FUNCTION ST_LineInterpolatePoints(geometry, float8, repeat boolean DEFAULT true)
3268 RETURNS geometry
3269 AS 'MODULE_PATHNAME', 'LWGEOM_line_interpolate_point'
3270 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3271 _COST_MEDIUM;
3272
3273-- Availability: 2.1.0
3274CREATE OR REPLACE FUNCTION ST_LineSubstring(geometry, float8, float8)
3275 RETURNS geometry
3276 AS 'MODULE_PATHNAME', 'LWGEOM_line_substring'
3277 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3278 _COST_MEDIUM;
3279
3280-- Availability: 2.1.0
3281CREATE OR REPLACE FUNCTION ST_LineLocatePoint(geom1 geometry, geom2 geometry)
3282 RETURNS float8
3283 AS 'MODULE_PATHNAME', 'LWGEOM_line_locate_point'
3284 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3285 _COST_MEDIUM;
3286
3287-- Availability: 1.5.0
3288CREATE OR REPLACE FUNCTION ST_AddMeasure(geometry, float8, float8)
3289 RETURNS geometry
3290 AS 'MODULE_PATHNAME', 'ST_AddMeasure'
3291 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3292 _COST_MEDIUM;
3293
3294---------------------------------------------------------------
3295-- TEMPORAL
3296---------------------------------------------------------------
3297
3298-- Availability: 2.2.0
3299CREATE OR REPLACE FUNCTION ST_ClosestPointOfApproach(geometry, geometry)
3300 RETURNS float8
3301 AS 'MODULE_PATHNAME', 'ST_ClosestPointOfApproach'
3302 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3303 _COST_HIGH;
3304
3305-- Availability: 2.2.0
3306CREATE OR REPLACE FUNCTION ST_DistanceCPA(geometry, geometry)
3307 RETURNS float8
3308 AS 'MODULE_PATHNAME', 'ST_DistanceCPA'
3309 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3310 _COST_HIGH;
3311
3312-- Availability: 2.2.0
3313CREATE OR REPLACE FUNCTION ST_CPAWithin(geometry, geometry, float8)
3314 RETURNS bool
3315 AS 'MODULE_PATHNAME', 'ST_CPAWithin'
3316 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3317 _COST_HIGH;
3318
3319-- Availability: 2.2.0
3320CREATE OR REPLACE FUNCTION ST_IsValidTrajectory(geometry)
3321 RETURNS bool
3322 AS 'MODULE_PATHNAME', 'ST_IsValidTrajectory'
3323 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3324 _COST_HIGH;
3325
3326---------------------------------------------------------------
3327-- GEOS
3328---------------------------------------------------------------
3329
3330CREATE OR REPLACE FUNCTION ST_Intersection(geom1 geometry, geom2 geometry)
3331 RETURNS geometry
3332 AS 'MODULE_PATHNAME','ST_Intersection'
3333 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3334 _COST_HIGH;
3335
3336CREATE OR REPLACE FUNCTION ST_Buffer(geom geometry, radius float8, options text DEFAULT '')
3337 RETURNS geometry
3338 AS 'MODULE_PATHNAME','buffer'
3339 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3340 _COST_HIGH;
3341
3342-- Availability: 1.2.2
3343CREATE OR REPLACE FUNCTION ST_Buffer(geom geometry, radius float8, quadsegs integer)
3344 RETURNS geometry
3345 AS $$ SELECT @extschema@.ST_Buffer($1, $2, CAST('quad_segs='||CAST($3 AS text) as text)) $$
3346 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
3347
3348-- Availability: 2.3.0
3349CREATE OR REPLACE FUNCTION ST_MinimumBoundingRadius(geometry, OUT center geometry, OUT radius double precision)
3350 AS 'MODULE_PATHNAME', 'ST_MinimumBoundingRadius'
3351 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3352 _COST_HIGH;
3353
3354-- Availability: 1.4.0
3355CREATE OR REPLACE FUNCTION ST_MinimumBoundingCircle(inputgeom geometry, segs_per_quarter integer DEFAULT 48)
3356 RETURNS geometry
3357 AS 'MODULE_PATHNAME', 'ST_MinimumBoundingCircle'
3358 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3359 _COST_HIGH;
3360
3361-- Availability: 2.5.0
3362CREATE OR REPLACE FUNCTION ST_OrientedEnvelope(geometry)
3363 RETURNS geometry
3364 AS 'MODULE_PATHNAME', 'ST_OrientedEnvelope'
3365 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3366 _COST_HIGH;
3367
3368-- Availability: 2.0.0
3369CREATE OR REPLACE FUNCTION ST_OffsetCurve(line geometry, distance float8, params text DEFAULT '')
3370RETURNS geometry
3371 AS 'MODULE_PATHNAME','ST_OffsetCurve'
3372 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3373 _COST_HIGH;
3374
3375-- Availability: 2.3.0
3376-- Changed: 3.0.0
3377CREATE OR REPLACE FUNCTION ST_GeneratePoints(area geometry, npoints integer)
3378RETURNS geometry
3379 AS 'MODULE_PATHNAME','ST_GeneratePoints'
3380 LANGUAGE 'c' VOLATILE STRICT _PARALLEL
3381 _COST_HIGH;
3382
3383-- Availability: 3.0.0
3384CREATE OR REPLACE FUNCTION ST_GeneratePoints(area geometry, npoints integer, seed integer)
3385RETURNS geometry
3386 AS 'MODULE_PATHNAME','ST_GeneratePoints'
3387 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3388 _COST_HIGH;
3389
3390-- PostGIS equivalent function: convexhull(geometry)
3391CREATE OR REPLACE FUNCTION ST_ConvexHull(geometry)
3392 RETURNS geometry
3393 AS 'MODULE_PATHNAME','convexhull'
3394 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3395 _COST_HIGH;
3396
3397-- Availability: 1.3.3
3398CREATE OR REPLACE FUNCTION ST_SimplifyPreserveTopology(geometry, float8)
3399 RETURNS geometry
3400 AS 'MODULE_PATHNAME','topologypreservesimplify'
3401 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3402 _COST_HIGH;
3403
3404-- Availability: 1.4.0
3405CREATE OR REPLACE FUNCTION ST_IsValidReason(geometry)
3406 RETURNS text
3407 AS 'MODULE_PATHNAME', 'isvalidreason'
3408 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3409 _COST_HIGH;
3410
3411-- Availability: 2.0.0
3412CREATE TYPE valid_detail AS (
3413 valid bool,
3414 reason varchar,
3415 location geometry
3416);
3417
3418-- Availability: 2.0.0
3419CREATE OR REPLACE FUNCTION ST_IsValidDetail(geom geometry, flags int4 DEFAULT 0)
3420 RETURNS valid_detail
3421 AS 'MODULE_PATHNAME', 'isvaliddetail'
3422 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3423 _COST_HIGH;
3424
3425-- Availability: 2.0.0
3426CREATE OR REPLACE FUNCTION ST_IsValidReason(geometry, int4)
3427 RETURNS text
3428 AS $$
3429 SELECT CASE WHEN valid THEN 'Valid Geometry' ELSE reason END FROM (
3430 SELECT (@extschema@.ST_isValidDetail($1, $2)).*
3431 ) foo
3432 $$
3433 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
3434
3435-- Availability: 2.0.0
3436CREATE OR REPLACE FUNCTION ST_IsValid(geometry, int4)
3437 RETURNS boolean
3438 AS 'SELECT (@extschema@.ST_isValidDetail($1, $2)).valid'
3439 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
3440
3441-- Availability: 1.5.0
3442CREATE OR REPLACE FUNCTION ST_HausdorffDistance(geom1 geometry, geom2 geometry)
3443 RETURNS FLOAT8
3444 AS 'MODULE_PATHNAME', 'hausdorffdistance'
3445 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3446 _COST_HIGH;
3447
3448-- Availability: 1.5.0
3449CREATE OR REPLACE FUNCTION ST_HausdorffDistance(geom1 geometry, geom2 geometry, float8)
3450 RETURNS FLOAT8
3451 AS 'MODULE_PATHNAME', 'hausdorffdistancedensify'
3452 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3453 _COST_HIGH;
3454
3455-- Availability: 2.4.0
3456CREATE OR REPLACE FUNCTION ST_FrechetDistance(geom1 geometry, geom2 geometry, float8 default -1)
3457 RETURNS FLOAT8
3458 AS 'MODULE_PATHNAME', 'ST_FrechetDistance'
3459 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3460 _COST_HIGH;
3461
3462-- PostGIS equivalent function: difference(geom1 geometry, geom2 geometry)
3463CREATE OR REPLACE FUNCTION ST_Difference(geom1 geometry, geom2 geometry)
3464 RETURNS geometry
3465 AS 'MODULE_PATHNAME','ST_Difference'
3466 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3467 _COST_HIGH;
3468
3469-- PostGIS equivalent function: boundary(geometry)
3470CREATE OR REPLACE FUNCTION ST_Boundary(geometry)
3471 RETURNS geometry
3472 AS 'MODULE_PATHNAME','boundary'
3473 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3474 _COST_MEDIUM;
3475
3476-- Availability: 2.3.0
3477CREATE OR REPLACE FUNCTION ST_Points(geometry)
3478 RETURNS geometry
3479 AS 'MODULE_PATHNAME', 'ST_Points'
3480 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3481 _COST_MEDIUM;
3482
3483-- PostGIS equivalent function: symdifference(geom1 geometry, geom2 geometry)
3484CREATE OR REPLACE FUNCTION ST_SymDifference(geom1 geometry, geom2 geometry)
3485 RETURNS geometry
3486 AS 'MODULE_PATHNAME','symdifference'
3487 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3488 _COST_HIGH;
3489
3490-- Availability: 1.2.2
3491CREATE OR REPLACE FUNCTION ST_SymmetricDifference(geom1 geometry, geom2 geometry)
3492 RETURNS geometry
3493 AS 'MODULE_PATHNAME','symdifference'
3494 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3495 _COST_HIGH;
3496
3497-- PostGIS equivalent function: GeomUnion(geom1 geometry, geom2 geometry)
3498CREATE OR REPLACE FUNCTION ST_Union(geom1 geometry, geom2 geometry)
3499 RETURNS geometry
3500 AS 'MODULE_PATHNAME','ST_Union'
3501 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3502 _COST_HIGH;
3503
3504-- Availability: 2.0.0
3505CREATE OR REPLACE FUNCTION ST_UnaryUnion(geometry)
3506 RETURNS geometry
3507 AS 'MODULE_PATHNAME','ST_UnaryUnion'
3508 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3509 _COST_HIGH;
3510
3511-- ST_RemoveRepeatedPoints(in geometry)
3512--
3513-- Removes duplicate vertices in input.
3514-- Only checks consecutive points for lineal and polygonal geoms.
3515-- Checks all points for multipoint geoms.
3516--
3517-- Availability: 2.2.0
3518CREATE OR REPLACE FUNCTION ST_RemoveRepeatedPoints(geom geometry, tolerance float8 default 0.0)
3519 RETURNS geometry
3520 AS 'MODULE_PATHNAME', 'ST_RemoveRepeatedPoints'
3521 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3522 _COST_MEDIUM;
3523
3524-- Availability: 2.2.0
3525CREATE OR REPLACE FUNCTION ST_ClipByBox2d(geom geometry, box box2d)
3526 RETURNS geometry
3527 AS 'MODULE_PATHNAME', 'ST_ClipByBox2d'
3528 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3529 _COST_HIGH;
3530
3531-- Availability: 2.2.0
3532CREATE OR REPLACE FUNCTION ST_Subdivide(geom geometry, maxvertices integer DEFAULT 256)
3533 RETURNS setof geometry
3534 AS 'MODULE_PATHNAME', 'ST_Subdivide'
3535 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3536 _COST_HIGH;
3537
3538--------------------------------------------------------------------------------
3539-- ST_CleanGeometry / ST_MakeValid
3540--------------------------------------------------------------------------------
3541
3542-- ST_MakeValid(in geometry)
3543--
3544-- Try to make the input valid maintaining the boundary profile.
3545-- May return a collection.
3546-- May return a geometry with inferior dimensions (dimensional collapses).
3547-- May return NULL if can't handle input.
3548--
3549-- Availability: 2.0.0
3550CREATE OR REPLACE FUNCTION ST_MakeValid(geometry)
3551 RETURNS geometry
3552 AS 'MODULE_PATHNAME', 'ST_MakeValid'
3553 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3554 _COST_HIGH;
3555
3556-- ST_CleanGeometry(in geometry)
3557--
3558-- Make input:
3559-- - Simple (lineal components)
3560-- - Valid (polygonal components)
3561-- - Obeying the RHR (if polygonal)
3562-- - Simplified of consecutive duplicated points
3563-- Ensuring:
3564-- - No input vertexes are discarded (except consecutive repeated ones)
3565-- - Output geometry type matches input
3566--
3567-- Returns NULL on failure.
3568--
3569-- Availability: 2.0.0
3570CREATE OR REPLACE FUNCTION ST_CleanGeometry(geometry)
3571 RETURNS geometry
3572 AS 'MODULE_PATHNAME', 'ST_CleanGeometry'
3573 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3574 _COST_HIGH;
3575
3576--------------------------------------------------------------------------------
3577-- ST_Split
3578--------------------------------------------------------------------------------
3579
3580-- ST_Split(in geometry, blade geometry)
3581--
3582-- Split a geometry in parts after cutting it with given blade.
3583-- Returns a collection containing all parts.
3584--
3585-- Note that multi-part geometries will be returned exploded,
3586-- no matter relation to blade.
3587--
3588-- Availability: 2.0.0
3589--
3590CREATE OR REPLACE FUNCTION ST_Split(geom1 geometry, geom2 geometry)
3591 RETURNS geometry
3592 AS 'MODULE_PATHNAME', 'ST_Split'
3593 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3594 _COST_HIGH;
3595
3596--------------------------------------------------------------------------------
3597-- ST_SharedPaths
3598--------------------------------------------------------------------------------
3599
3600-- ST_SharedPaths(lineal1 geometry, lineal1 geometry)
3601--
3602-- Returns a collection containing paths shared by the two
3603-- input geometries. Those going in the same direction are
3604-- in the first element of the collection, those going in the
3605-- opposite direction are in the second element.
3606--
3607-- The paths themselves are given in the direction of the
3608-- first geometry.
3609--
3610-- Availability: 2.0.0
3611--
3612CREATE OR REPLACE FUNCTION ST_SharedPaths(geom1 geometry, geom2 geometry)
3613 RETURNS geometry
3614 AS 'MODULE_PATHNAME', 'ST_SharedPaths'
3615 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3616 _COST_HIGH;
3617
3618--------------------------------------------------------------------------------
3619-- ST_Snap
3620--------------------------------------------------------------------------------
3621
3622-- ST_Snap(g1 geometry, g2 geometry, tolerance float8)
3623--
3624-- Snap first geometry against second.
3625--
3626-- Availability: 2.0.0
3627--
3628CREATE OR REPLACE FUNCTION ST_Snap(geom1 geometry, geom2 geometry, float8)
3629 RETURNS geometry
3630 AS 'MODULE_PATHNAME', 'ST_Snap'
3631 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3632 _COST_HIGH;
3633
3634--------------------------------------------------------------------------------
3635-- ST_RelateMatch
3636--------------------------------------------------------------------------------
3637
3638-- ST_RelateMatch(matrix text, pattern text)
3639--
3640-- Returns true if pattern 'pattern' matches DE9 intersection matrix 'matrix'
3641--
3642-- Availability: 2.0.0
3643--
3644CREATE OR REPLACE FUNCTION ST_RelateMatch(text, text)
3645 RETURNS bool
3646 AS 'MODULE_PATHNAME', 'ST_RelateMatch'
3647 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3648 _COST_MEDIUM;
3649
3650--------------------------------------------------------------------------------
3651-- ST_Node
3652--------------------------------------------------------------------------------
3653
3654-- ST_Node(in geometry)
3655--
3656-- Fully node lines in input using the least set of nodes while
3657-- preserving each of the input ones.
3658-- Returns a linestring or a multilinestring containing all parts.
3659--
3660-- Availability: 2.0.0
3661--
3662CREATE OR REPLACE FUNCTION ST_Node(g geometry)
3663 RETURNS geometry
3664 AS 'MODULE_PATHNAME', 'ST_Node'
3665 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3666 _COST_HIGH;
3667
3668--------------------------------------------------------------------------------
3669-- ST_DelaunayTriangles
3670--------------------------------------------------------------------------------
3671
3672-- ST_DelaunayTriangles(g1 geometry, tolerance float8, flags int4)
3673--
3674-- Builds Delaunay triangulation out of geometry vertices.
3675--
3676-- Returns a collection of triangular polygons with flags=0
3677-- or a multilinestring with flags=1
3678--
3679-- If a tolerance is given it will be used to snap the input points
3680-- each-other.
3681--
3682--
3683-- Availability: 2.1.0
3684--
3685CREATE OR REPLACE FUNCTION ST_DelaunayTriangles(g1 geometry, tolerance float8 DEFAULT 0.0, flags int4 DEFAULT 0)
3686 RETURNS geometry
3687 AS 'MODULE_PATHNAME', 'ST_DelaunayTriangles'
3688 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3689 _COST_HIGH;
3690
3691--------------------------------------------------------------------------------
3692-- _ST_Voronoi
3693--------------------------------------------------------------------------------
3694
3695-- ST_Voronoi(g1 geometry, clip geometry, tolerance float8, return_polygons boolean)
3696--
3697-- Builds a Voronoi Diagram from the vertices of the supplied geometry.
3698--
3699-- By default, the diagram will be extended to an envelope larger than the
3700-- input points.
3701--
3702-- If a second geometry is supplied, the diagram will be extended to fill the
3703-- envelope of the second geometry, unless that is smaller than the default
3704-- envelope.
3705--
3706-- If a tolerance is given it will be used to snap the input points
3707-- each-other.
3708--
3709-- If return_polygons is true, returns a GeometryCollection of polygons.
3710-- If return_polygons is false, returns a MultiLineString.
3711--
3712-- Availability: 2.3.0
3713--
3714
3715CREATE OR REPLACE FUNCTION _ST_Voronoi(g1 geometry, clip geometry DEFAULT NULL, tolerance float8 DEFAULT 0.0, return_polygons boolean DEFAULT true)
3716 RETURNS geometry
3717 AS 'MODULE_PATHNAME', 'ST_Voronoi'
3718 LANGUAGE 'c' IMMUTABLE _PARALLEL
3719 _COST_HIGH;
3720
3721CREATE OR REPLACE FUNCTION ST_VoronoiPolygons(g1 geometry, tolerance float8 DEFAULT 0.0, extend_to geometry DEFAULT NULL)
3722 RETURNS geometry
3723 AS $$ SELECT @extschema@._ST_Voronoi(g1, extend_to, tolerance, true) $$
3724 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
3725
3726CREATE OR REPLACE FUNCTION ST_VoronoiLines(g1 geometry, tolerance float8 DEFAULT 0.0, extend_to geometry DEFAULT NULL)
3727 RETURNS geometry
3728 AS $$ SELECT @extschema@._ST_Voronoi(g1, extend_to, tolerance, false) $$
3729 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
3730
3731--------------------------------------------------------------------------------
3732-- Aggregates and their supporting functions
3733--------------------------------------------------------------------------------
3734
3735-- Availability: 2.2.0
3736CREATE OR REPLACE FUNCTION ST_CombineBBox(box3d,geometry)
3737 RETURNS box3d
3738 AS 'MODULE_PATHNAME', 'BOX3D_combine'
3739 LANGUAGE 'c' IMMUTABLE _PARALLEL;
3740
3741-- Availability: 2.3.0
3742CREATE OR REPLACE FUNCTION ST_CombineBBox(box3d,box3d)
3743 RETURNS box3d
3744 AS 'MODULE_PATHNAME', 'BOX3D_combine_BOX3D'
3745 LANGUAGE 'c' IMMUTABLE _PARALLEL;
3746
3747-- Availability: 2.2.0
3748CREATE OR REPLACE FUNCTION ST_CombineBbox(box2d,geometry)
3749 RETURNS box2d
3750 AS 'MODULE_PATHNAME', 'BOX2D_combine'
3751 LANGUAGE 'c' IMMUTABLE _PARALLEL;
3752
3753-- Availability: 1.2.2
3754-- Changed: 2.2.0 to use non-deprecated ST_CombineBBox (r13535)
3755-- Changed: 2.3.0 to support PostgreSQL 9.6
3756-- Changed: 2.3.1 to support PostgreSQL 9.6 parallel safe
3757CREATE AGGREGATE ST_Extent(geometry) (
3758 sfunc = ST_CombineBBox,
3759 stype = box3d,
3760#if POSTGIS_PGSQL_VERSION >= 96
3761 combinefunc = ST_CombineBBox,
3762 parallel = safe,
3763#endif
3764 finalfunc = box2d
3765 );
3766
3767-- Availability: 2.0.0
3768-- Changed: 2.2.0 to use non-deprecated ST_CombineBBox (r13535)
3769-- Changed: 2.3.0 to support PostgreSQL 9.6
3770-- Changed: 2.3.1 to support PostgreSQL 9.6 parallel safe
3771CREATE AGGREGATE ST_3DExtent(geometry)(
3772 sfunc = ST_CombineBBox,
3773#if POSTGIS_PGSQL_VERSION >= 96
3774 combinefunc = ST_CombineBBox,
3775 parallel = safe,
3776#endif
3777 stype = box3d
3778 );
3779
3780-- Availability: 1.2.2
3781CREATE OR REPLACE FUNCTION ST_Collect(geom1 geometry, geom2 geometry)
3782 RETURNS geometry
3783 AS 'MODULE_PATHNAME', 'LWGEOM_collect'
3784 LANGUAGE 'c' IMMUTABLE _PARALLEL;
3785
3786-- Availability: 1.2.2
3787-- Changed: 2.3.0 to support PostgreSQL 9.6
3788-- Changed: 2.3.1 to support PostgreSQL 9.6 parallel safe
3789CREATE AGGREGATE ST_MemCollect(geometry)(
3790 sfunc = ST_collect,
3791#if POSTGIS_PGSQL_VERSION >= 96
3792 combinefunc = ST_collect,
3793 parallel = safe,
3794#endif
3795 stype = geometry
3796 );
3797
3798-- Availability: 1.2.2
3799CREATE OR REPLACE FUNCTION ST_Collect(geometry[])
3800 RETURNS geometry
3801 AS 'MODULE_PATHNAME', 'LWGEOM_collect_garray'
3802 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
3803
3804-- Availability: 1.2.2
3805-- Changed: 2.3.0 to support PostgreSQL 9.6
3806-- Changed: 2.3.1 to support PostgreSQL 9.6 parallel safe
3807CREATE AGGREGATE ST_MemUnion(geometry) (
3808 sfunc = ST_Union,
3809#if POSTGIS_PGSQL_VERSION >= 96
3810 combinefunc = ST_Union,
3811 parallel = safe,
3812#endif
3813 stype = geometry
3814 );
3815
3816
3817-- Availability: 1.4.0
3818-- Changed: 2.5.0 use 'internal' transfer type
3819CREATE OR REPLACE FUNCTION pgis_geometry_accum_transfn(internal, geometry)
3820 RETURNS internal
3821 AS 'MODULE_PATHNAME'
3822 LANGUAGE 'c' _PARALLEL;
3823
3824-- Availability: 2.2
3825-- Changed: 2.5.0 use 'internal' transfer type
3826CREATE OR REPLACE FUNCTION pgis_geometry_accum_transfn(internal, geometry, float8)
3827 RETURNS internal
3828 AS 'MODULE_PATHNAME'
3829 LANGUAGE 'c' _PARALLEL;
3830
3831-- Availability: 2.3
3832-- Changed: 2.5.0 use 'internal' transfer type
3833CREATE OR REPLACE FUNCTION pgis_geometry_accum_transfn(internal, geometry, float8, int)
3834 RETURNS internal
3835 AS 'MODULE_PATHNAME'
3836 LANGUAGE 'c' _PARALLEL;
3837
3838-- Availability: 1.4.0
3839-- Changed: 2.5.0 use 'internal' transfer type
3840CREATE OR REPLACE FUNCTION pgis_geometry_union_finalfn(internal)
3841 RETURNS geometry
3842 AS 'MODULE_PATHNAME'
3843 LANGUAGE 'c' _PARALLEL;
3844
3845-- Availability: 1.4.0
3846-- Changed: 2.5.0 use 'internal' transfer type
3847CREATE OR REPLACE FUNCTION pgis_geometry_collect_finalfn(internal)
3848 RETURNS geometry
3849 AS 'MODULE_PATHNAME'
3850 LANGUAGE 'c' _PARALLEL;
3851
3852-- Availability: 1.4.0
3853-- Changed: 2.5.0 use 'internal' transfer type
3854CREATE OR REPLACE FUNCTION pgis_geometry_polygonize_finalfn(internal)
3855 RETURNS geometry
3856 AS 'MODULE_PATHNAME'
3857 LANGUAGE 'c' _PARALLEL;
3858
3859-- Availability: 2.2
3860-- Changed: 2.5.0 use 'internal' transfer type
3861CREATE OR REPLACE FUNCTION pgis_geometry_clusterintersecting_finalfn(internal)
3862 RETURNS geometry[]
3863 AS 'MODULE_PATHNAME'
3864 LANGUAGE 'c' _PARALLEL;
3865
3866-- Availability: 2.2
3867-- Changed: 2.5.0 use 'internal' transfer type
3868CREATE OR REPLACE FUNCTION pgis_geometry_clusterwithin_finalfn(internal)
3869 RETURNS geometry[]
3870 AS 'MODULE_PATHNAME'
3871 LANGUAGE 'c' _PARALLEL;
3872
3873-- Availability: 1.4.0
3874-- Changed: 2.5.0 use 'internal' transfer type
3875CREATE OR REPLACE FUNCTION pgis_geometry_makeline_finalfn(internal)
3876 RETURNS geometry
3877 AS 'MODULE_PATHNAME'
3878 LANGUAGE 'c' _PARALLEL;
3879
3880-- Availability: 1.4.0
3881CREATE OR REPLACE FUNCTION ST_Union (geometry[])
3882 RETURNS geometry
3883 AS 'MODULE_PATHNAME','pgis_union_geometry_array'
3884 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
3885
3886-- Availability: 1.2.2
3887-- Changed but upgrader helper no touch: 2.4.0 marked parallel safe
3888-- we don't want to force drop of this agg since its often used in views
3889-- parallel handling dealt with in postgis_after_upgrade.sql
3890-- Changed: 2.5.0 use 'internal' stype
3891CREATE AGGREGATE ST_Union (geometry) (
3892 sfunc = pgis_geometry_accum_transfn,
3893 stype = internal,
3894#if POSTGIS_PGSQL_VERSION >= 96
3895 parallel = safe,
3896#endif
3897 finalfunc = pgis_geometry_union_finalfn
3898 );
3899
3900-- Availability: 1.2.2
3901-- Changed: 2.4.0: marked parallel safe
3902-- Changed: 2.5.0 use 'internal' stype
3903CREATE AGGREGATE ST_Collect (geometry) (
3904 SFUNC = pgis_geometry_accum_transfn,
3905 STYPE = internal,
3906#if POSTGIS_PGSQL_VERSION >= 96
3907 parallel = safe,
3908#endif
3909 FINALFUNC = pgis_geometry_collect_finalfn
3910 );
3911
3912-- Availability: 2.2
3913-- Changed: 2.4.0: marked parallel safe
3914-- Changed: 2.5.0 use 'internal' stype
3915CREATE AGGREGATE ST_ClusterIntersecting (geometry) (
3916 SFUNC = pgis_geometry_accum_transfn,
3917 STYPE = internal,
3918#if POSTGIS_PGSQL_VERSION >= 96
3919 parallel = safe,
3920#endif
3921 FINALFUNC = pgis_geometry_clusterintersecting_finalfn
3922 );
3923
3924-- Availability: 2.2
3925-- Changed: 2.4.0 marked parallel safe
3926-- Changed: 2.5.0 use 'internal' stype
3927CREATE AGGREGATE ST_ClusterWithin (geometry, float8) (
3928 SFUNC = pgis_geometry_accum_transfn,
3929 STYPE = internal,
3930#if POSTGIS_PGSQL_VERSION >= 96
3931 parallel = safe,
3932#endif
3933 FINALFUNC = pgis_geometry_clusterwithin_finalfn
3934 );
3935
3936-- Availability: 1.2.2
3937-- Changed: 2.4.0 marked parallel safe
3938-- Changed: 2.5.0 use 'internal' stype
3939CREATE AGGREGATE ST_Polygonize (geometry) (
3940 SFUNC = pgis_geometry_accum_transfn,
3941 STYPE = internal,
3942#if POSTGIS_PGSQL_VERSION >= 96
3943 parallel = safe,
3944#endif
3945 FINALFUNC = pgis_geometry_polygonize_finalfn
3946 );
3947
3948-- Availability: 1.2.2
3949-- Changed: 2.4.0 marked parallel safe
3950-- Changed: 2.5.0 use 'internal' stype
3951CREATE AGGREGATE ST_MakeLine (geometry) (
3952 SFUNC = pgis_geometry_accum_transfn,
3953 STYPE = internal,
3954#if POSTGIS_PGSQL_VERSION >= 96
3955 parallel = safe,
3956#endif
3957 FINALFUNC = pgis_geometry_makeline_finalfn
3958 );
3959
3960--------------------------------------------------------------------------------
3961
3962-- Availability: 2.3.0
3963CREATE OR REPLACE FUNCTION ST_ClusterKMeans(geom geometry, k integer)
3964 RETURNS integer
3965 AS 'MODULE_PATHNAME', 'ST_ClusterKMeans'
3966 LANGUAGE 'c' VOLATILE STRICT WINDOW
3967 _COST_HIGH;
3968
3969-- Availability: 1.2.2
3970CREATE OR REPLACE FUNCTION ST_Relate(geom1 geometry, geom2 geometry)
3971 RETURNS text
3972 AS 'MODULE_PATHNAME','relate_full'
3973 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3974 _COST_HIGH;
3975
3976-- Availability: 2.0.0
3977CREATE OR REPLACE FUNCTION ST_Relate(geom1 geometry, geom2 geometry, int4)
3978 RETURNS text
3979 AS 'MODULE_PATHNAME','relate_full'
3980 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3981 _COST_HIGH;
3982
3983-- PostGIS equivalent function: relate(geom1 geometry, geom2 geometry,text)
3984CREATE OR REPLACE FUNCTION ST_Relate(geom1 geometry, geom2 geometry,text)
3985 RETURNS boolean
3986 AS 'MODULE_PATHNAME','relate_pattern'
3987 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3988 _COST_HIGH;
3989
3990-- PostGIS equivalent function: disjoint(geom1 geometry, geom2 geometry)
3991CREATE OR REPLACE FUNCTION ST_Disjoint(geom1 geometry, geom2 geometry)
3992 RETURNS boolean
3993 AS 'MODULE_PATHNAME','disjoint'
3994 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
3995 _COST_HIGH;
3996
3997-----------------------------------------------------------------------------
3998-- Non-indexed functions (see above for public indexed variants)
3999
4000-- Availability: 1.4.0
4001CREATE OR REPLACE FUNCTION _ST_LineCrossingDirection(line1 geometry, line2 geometry)
4002 RETURNS integer
4003 AS 'MODULE_PATHNAME', 'ST_LineCrossingDirection'
4004 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4005 _COST_HIGH;
4006
4007-- Availability: 1.3.4
4008CREATE OR REPLACE FUNCTION _ST_DWithin(geom1 geometry, geom2 geometry,float8)
4009 RETURNS boolean
4010 AS 'MODULE_PATHNAME', 'LWGEOM_dwithin'
4011 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4012 _COST_HIGH;
4013
4014-- Availability: 1.2.2
4015CREATE OR REPLACE FUNCTION _ST_Touches(geom1 geometry, geom2 geometry)
4016 RETURNS boolean
4017 AS 'MODULE_PATHNAME','touches'
4018 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4019 _COST_HIGH;
4020
4021-- Availability: 1.2.2
4022CREATE OR REPLACE FUNCTION _ST_Intersects(geom1 geometry, geom2 geometry)
4023 RETURNS boolean
4024 AS 'MODULE_PATHNAME','ST_Intersects'
4025 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4026 _COST_HIGH;
4027
4028-- Availability: 1.2.2
4029CREATE OR REPLACE FUNCTION _ST_Crosses(geom1 geometry, geom2 geometry)
4030 RETURNS boolean
4031 AS 'MODULE_PATHNAME','crosses'
4032 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4033 _COST_HIGH;
4034
4035-- Availability: 1.2.2
4036CREATE OR REPLACE FUNCTION _ST_Contains(geom1 geometry, geom2 geometry)
4037 RETURNS boolean
4038 AS 'MODULE_PATHNAME','contains'
4039 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4040 _COST_HIGH;
4041
4042-- Availability: 1.4.0
4043CREATE OR REPLACE FUNCTION _ST_ContainsProperly(geom1 geometry, geom2 geometry)
4044 RETURNS boolean
4045 AS 'MODULE_PATHNAME','containsproperly'
4046 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4047 _COST_HIGH;
4048
4049-- Availability: 1.2.2
4050CREATE OR REPLACE FUNCTION _ST_Covers(geom1 geometry, geom2 geometry)
4051 RETURNS boolean
4052 AS 'MODULE_PATHNAME', 'covers'
4053 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4054 _COST_HIGH;
4055
4056-- Availability: 1.2.2
4057CREATE OR REPLACE FUNCTION _ST_CoveredBy(geom1 geometry, geom2 geometry)
4058 RETURNS boolean
4059 AS 'MODULE_PATHNAME', 'coveredby'
4060 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4061 _COST_HIGH;
4062
4063-- Availability: 1.2.2
4064CREATE OR REPLACE FUNCTION _ST_Within(geom1 geometry, geom2 geometry)
4065 RETURNS boolean
4066 AS 'SELECT @extschema@._ST_Contains($2,$1)'
4067 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4068
4069-- Availability: 1.2.2
4070CREATE OR REPLACE FUNCTION _ST_Overlaps(geom1 geometry, geom2 geometry)
4071 RETURNS boolean
4072 AS 'MODULE_PATHNAME','overlaps'
4073 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4074 _COST_HIGH;
4075
4076CREATE OR REPLACE FUNCTION _ST_DFullyWithin(geom1 geometry, geom2 geometry,float8)
4077 RETURNS boolean
4078 AS 'MODULE_PATHNAME', 'LWGEOM_dfullywithin'
4079 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4080 _COST_HIGH;
4081
4082CREATE OR REPLACE FUNCTION _ST_3DDWithin(geom1 geometry, geom2 geometry,float8)
4083 RETURNS boolean
4084 AS 'MODULE_PATHNAME', 'LWGEOM_dwithin3d'
4085 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4086 _COST_HIGH;
4087
4088CREATE OR REPLACE FUNCTION _ST_3DDFullyWithin(geom1 geometry, geom2 geometry,float8)
4089 RETURNS boolean
4090 AS 'MODULE_PATHNAME', 'LWGEOM_dfullywithin3d'
4091 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4092 _COST_HIGH;
4093
4094CREATE OR REPLACE FUNCTION _ST_3DIntersects(geom1 geometry, geom2 geometry)
4095 RETURNS boolean
4096 AS 'MODULE_PATHNAME', 'ST_3DIntersects'
4097 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4098 _COST_HIGH;
4099
4100CREATE OR REPLACE FUNCTION _ST_OrderingEquals(geom1 geometry, geom2 geometry)
4101 RETURNS boolean
4102 AS 'MODULE_PATHNAME', 'LWGEOM_same'
4103 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4104 _COST_HIGH;
4105
4106CREATE OR REPLACE FUNCTION _ST_Equals(geom1 geometry, geom2 geometry)
4107 RETURNS boolean
4108 AS 'MODULE_PATHNAME','ST_Equals'
4109 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4110 _COST_HIGH;
4111
4112-----------------------------------------------------------------------------
4113
4114#if POSTGIS_PGSQL_VERSION >= 120
4115
4116-----------------------------------------------------------------------------
4117-- Planner Support Functions
4118-----------------------------------------------------------------------------
4119-- Availability 3.0.0
4120CREATE OR REPLACE FUNCTION postgis_index_supportfn (internal)
4121 RETURNS internal
4122 AS 'MODULE_PATHNAME', 'postgis_index_supportfn'
4123 LANGUAGE 'c';
4124
4125-----------------------------------------------------------------------------
4126
4127-- Availability: 1.4.0
4128CREATE OR REPLACE FUNCTION ST_LineCrossingDirection(geom1 geometry, geom2 geometry)
4129 RETURNS integer
4130 AS 'MODULE_PATHNAME', 'ST_LineCrossingDirection'
4131 SUPPORT postgis_index_supportfn
4132 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4133 _COST_HIGH;
4134
4135-- Availability: 1.3.4
4136CREATE OR REPLACE FUNCTION ST_DWithin(geom1 geometry, geom2 geometry,float8)
4137 RETURNS boolean
4138 AS 'MODULE_PATHNAME', 'LWGEOM_dwithin'
4139 SUPPORT postgis_index_supportfn
4140 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4141 _COST_HIGH;
4142
4143-- Availability: 1.2.2
4144CREATE OR REPLACE FUNCTION ST_Touches(geom1 geometry, geom2 geometry)
4145 RETURNS boolean
4146 AS 'MODULE_PATHNAME','touches'
4147 SUPPORT postgis_index_supportfn
4148 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4149 _COST_HIGH;
4150
4151-- Availability: 1.2.2
4152CREATE OR REPLACE FUNCTION ST_Intersects(geom1 geometry, geom2 geometry)
4153 RETURNS boolean
4154 AS 'MODULE_PATHNAME','ST_Intersects'
4155 SUPPORT postgis_index_supportfn
4156 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4157 _COST_HIGH;
4158
4159-- Availability: 1.2.2
4160CREATE OR REPLACE FUNCTION ST_Crosses(geom1 geometry, geom2 geometry)
4161 RETURNS boolean
4162 AS 'MODULE_PATHNAME','crosses'
4163 SUPPORT postgis_index_supportfn
4164 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4165 _COST_HIGH;
4166
4167-- Availability: 1.2.2
4168CREATE OR REPLACE FUNCTION ST_Contains(geom1 geometry, geom2 geometry)
4169 RETURNS boolean
4170 AS 'MODULE_PATHNAME','contains'
4171 SUPPORT postgis_index_supportfn
4172 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4173 _COST_HIGH;
4174
4175-- Availability: 1.4.0
4176CREATE OR REPLACE FUNCTION ST_ContainsProperly(geom1 geometry, geom2 geometry)
4177 RETURNS boolean
4178 AS 'MODULE_PATHNAME','containsproperly'
4179 SUPPORT postgis_index_supportfn
4180 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4181 _COST_HIGH;
4182
4183-- Availability: 1.2.2
4184CREATE OR REPLACE FUNCTION ST_Within(geom1 geometry, geom2 geometry)
4185 RETURNS boolean
4186 AS 'MODULE_PATHNAME','within'
4187 SUPPORT postgis_index_supportfn
4188 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4189 _COST_HIGH;
4190
4191-- Availability: 1.2.2
4192CREATE OR REPLACE FUNCTION ST_Covers(geom1 geometry, geom2 geometry)
4193 RETURNS boolean
4194 AS 'MODULE_PATHNAME', 'covers'
4195 SUPPORT postgis_index_supportfn
4196 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4197 _COST_HIGH;
4198
4199-- Availability: 1.2.2
4200CREATE OR REPLACE FUNCTION ST_CoveredBy(geom1 geometry, geom2 geometry)
4201 RETURNS boolean
4202 AS 'MODULE_PATHNAME', 'coveredby'
4203 SUPPORT postgis_index_supportfn
4204 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4205 _COST_HIGH;
4206
4207-- Availability: 1.2.2
4208CREATE OR REPLACE FUNCTION ST_Overlaps(geom1 geometry, geom2 geometry)
4209 RETURNS boolean
4210 AS 'MODULE_PATHNAME','overlaps'
4211 SUPPORT postgis_index_supportfn
4212 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4213 _COST_HIGH;
4214
4215CREATE OR REPLACE FUNCTION ST_DFullyWithin(geom1 geometry, geom2 geometry,float8)
4216 RETURNS boolean
4217 AS 'MODULE_PATHNAME', 'LWGEOM_dfullywithin'
4218 SUPPORT postgis_index_supportfn
4219 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4220 _COST_HIGH;
4221
4222CREATE OR REPLACE FUNCTION ST_3DDWithin(geom1 geometry, geom2 geometry,float8)
4223 RETURNS boolean
4224 AS 'MODULE_PATHNAME', 'LWGEOM_dwithin3d'
4225 SUPPORT postgis_index_supportfn
4226 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4227 _COST_HIGH;
4228
4229CREATE OR REPLACE FUNCTION ST_3DDFullyWithin(geom1 geometry, geom2 geometry,float8)
4230 RETURNS boolean
4231 AS 'MODULE_PATHNAME', 'LWGEOM_dfullywithin3d'
4232 SUPPORT postgis_index_supportfn
4233 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4234 _COST_HIGH;
4235
4236CREATE OR REPLACE FUNCTION ST_3DIntersects(geom1 geometry, geom2 geometry)
4237 RETURNS boolean
4238 AS 'MODULE_PATHNAME', 'ST_3DIntersects'
4239 SUPPORT postgis_index_supportfn
4240 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4241 _COST_HIGH;
4242
4243CREATE OR REPLACE FUNCTION ST_OrderingEquals(geom1 geometry, geom2 geometry)
4244 RETURNS boolean
4245 AS 'MODULE_PATHNAME', 'LWGEOM_same'
4246 SUPPORT postgis_index_supportfn
4247 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4248 _COST_HIGH;
4249
4250CREATE OR REPLACE FUNCTION ST_Equals(geom1 geometry, geom2 geometry)
4251 RETURNS boolean
4252 AS 'MODULE_PATHNAME','ST_Equals'
4253 SUPPORT postgis_index_supportfn
4254 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4255 _COST_HIGH;
4256
4257#else
4258
4259-- Availability: 1.4.0
4260CREATE OR REPLACE FUNCTION ST_LineCrossingDirection(line1 geometry, line2 geometry)
4261 RETURNS integer AS
4262 $$ SELECT CASE WHEN NOT $1 OPERATOR(@extschema@.&&) $2 THEN 0 ELSE @extschema@._ST_LineCrossingDirection($1,$2) END $$
4263 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4264
4265-- Availability: 1.2.2
4266CREATE OR REPLACE FUNCTION ST_DWithin(geom1 geometry, geom2 geometry, float8)
4267 RETURNS boolean
4268 AS 'SELECT $1 OPERATOR(@extschema@.&&) @extschema@.ST_Expand($2,$3) AND $2 OPERATOR(@extschema@.&&) @extschema@.ST_Expand($1,$3) AND @extschema@._ST_DWithin($1, $2, $3)'
4269 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4270
4271-- Availability: 1.2.2
4272CREATE OR REPLACE FUNCTION ST_Touches(geom1 geometry, geom2 geometry)
4273 RETURNS boolean
4274 AS 'SELECT $1 OPERATOR(@extschema@.&&) $2 AND @extschema@._ST_Touches($1,$2)'
4275 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4276
4277-- Availability: 1.2.2
4278CREATE OR REPLACE FUNCTION ST_Intersects(geom1 geometry, geom2 geometry)
4279 RETURNS boolean
4280 AS 'SELECT $1 OPERATOR(@extschema@.&&) $2 AND @extschema@._ST_Intersects($1,$2)'
4281 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4282
4283-- Availability: 1.2.2
4284CREATE OR REPLACE FUNCTION ST_Crosses(geom1 geometry, geom2 geometry)
4285 RETURNS boolean
4286 AS 'SELECT $1 OPERATOR(@extschema@.&&) $2 AND @extschema@._ST_Crosses($1,$2)'
4287 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4288
4289-- Availability: 1.2.2
4290CREATE OR REPLACE FUNCTION ST_Contains(geom1 geometry, geom2 geometry)
4291 RETURNS boolean
4292 AS 'SELECT $1 OPERATOR(@extschema@.~) $2 AND @extschema@._ST_Contains($1,$2)'
4293 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4294
4295-- Availability: 1.2.2
4296CREATE OR REPLACE FUNCTION ST_CoveredBy(geom1 geometry, geom2 geometry)
4297 RETURNS boolean
4298 AS 'SELECT $1 OPERATOR(@extschema@.@) $2 AND @extschema@._ST_CoveredBy($1,$2)'
4299 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4300
4301-- Availability: 1.2.2
4302CREATE OR REPLACE FUNCTION ST_Covers(geom1 geometry, geom2 geometry)
4303 RETURNS boolean
4304 AS 'SELECT $1 OPERATOR(@extschema@.~) $2 AND @extschema@._ST_Covers($1,$2)'
4305 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4306
4307-- Availability: 1.4.0
4308CREATE OR REPLACE FUNCTION ST_ContainsProperly(geom1 geometry, geom2 geometry)
4309 RETURNS boolean
4310 AS 'SELECT $1 OPERATOR(@extschema@.~) $2 AND @extschema@._ST_ContainsProperly($1,$2)'
4311 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4312
4313-- Availability: 1.2.2
4314CREATE OR REPLACE FUNCTION ST_Within(geom1 geometry, geom2 geometry)
4315 RETURNS boolean
4316 AS 'SELECT $2 OPERATOR(@extschema@.~) $1 AND @extschema@._ST_Contains($2,$1)'
4317 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4318
4319-- Availability: 1.2.2
4320CREATE OR REPLACE FUNCTION ST_Overlaps(geom1 geometry, geom2 geometry)
4321 RETURNS boolean
4322 AS 'SELECT $1 OPERATOR(@extschema@.&&) $2 AND @extschema@._ST_Overlaps($1,$2)'
4323 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4324
4325CREATE OR REPLACE FUNCTION ST_DFullyWithin(geom1 geometry, geom2 geometry, float8)
4326 RETURNS boolean
4327 AS 'SELECT $1 OPERATOR(@extschema@.&&) @extschema@.ST_Expand($2,$3) AND $2 OPERATOR(@extschema@.&&) @extschema@.ST_Expand($1,$3) AND @extschema@._ST_DFullyWithin(@extschema@.ST_ConvexHull($1), @extschema@.ST_ConvexHull($2), $3)'
4328 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4329
4330CREATE OR REPLACE FUNCTION ST_3DDWithin(geom1 geometry, geom2 geometry,float8)
4331 RETURNS boolean
4332 AS 'SELECT $1 OPERATOR(@extschema@.&&) @extschema@.ST_Expand($2,$3) AND $2 OPERATOR(@extschema@.&&) @extschema@.ST_Expand($1,$3) AND @extschema@._ST_3DDWithin($1, $2, $3)'
4333 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4334
4335CREATE OR REPLACE FUNCTION ST_3DDFullyWithin(geom1 geometry, geom2 geometry,float8)
4336 RETURNS boolean
4337 AS 'SELECT $1 OPERATOR(@extschema@.&&) @extschema@.ST_Expand($2,$3) AND $2 OPERATOR(@extschema@.&&) @extschema@.ST_Expand($1,$3) AND @extschema@._ST_3DDFullyWithin($1, $2, $3)'
4338 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4339
4340CREATE OR REPLACE FUNCTION ST_3DIntersects(geom1 geometry, geom2 geometry)
4341 RETURNS boolean
4342 AS 'SELECT $1 OPERATOR(@extschema@.&&) $2 AND @extschema@._ST_3DIntersects($1, $2)'
4343 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4344
4345CREATE OR REPLACE FUNCTION ST_OrderingEquals(GeometryA geometry, GeometryB geometry)
4346 RETURNS boolean
4347 AS 'SELECT $1 OPERATOR(@extschema@.~=) $2 AND @extschema@._ST_OrderingEquals($1, $2)'
4348 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4349
4350-- Availability: 1.2.1
4351CREATE OR REPLACE FUNCTION ST_Equals(geom1 geometry, geom2 geometry)
4352 RETURNS boolean
4353 AS 'SELECT $1 OPERATOR(@extschema@.~=) $2 AND @extschema@._ST_Equals($1,$2)'
4354 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4355
4356#endif
4357
4358-----------------------------------------------------------------------------
4359
4360-- PostGIS equivalent function: IsValid(geometry)
4361-- TODO: change null returns to true
4362CREATE OR REPLACE FUNCTION ST_IsValid(geometry)
4363 RETURNS boolean
4364 AS 'MODULE_PATHNAME', 'isvalid'
4365 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4366 _COST_HIGH;
4367
4368-- Availability: 2.3.0
4369CREATE OR REPLACE FUNCTION ST_MinimumClearance(geometry)
4370 RETURNS float8
4371 AS 'MODULE_PATHNAME', 'ST_MinimumClearance'
4372 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4373 _COST_HIGH;
4374
4375-- Availability: 2.3.0
4376CREATE OR REPLACE FUNCTION ST_MinimumClearanceLine(geometry)
4377 RETURNS geometry
4378 AS 'MODULE_PATHNAME', 'ST_MinimumClearanceLine'
4379 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4380 _COST_HIGH;
4381
4382-- PostGIS equivalent function: Centroid(geometry)
4383CREATE OR REPLACE FUNCTION ST_Centroid(geometry)
4384 RETURNS geometry
4385 AS 'MODULE_PATHNAME', 'centroid'
4386 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4387 _COST_MEDIUM;
4388
4389-- Availability: 2.3.0
4390CREATE OR REPLACE FUNCTION ST_GeometricMedian(g geometry, tolerance float8 DEFAULT NULL, max_iter int DEFAULT 10000, fail_if_not_converged boolean DEFAULT false)
4391 RETURNS geometry
4392 AS 'MODULE_PATHNAME', 'ST_GeometricMedian'
4393 LANGUAGE 'c' IMMUTABLE _PARALLEL
4394 _COST_HIGH;
4395
4396-- PostGIS equivalent function: IsRing(geometry)
4397CREATE OR REPLACE FUNCTION ST_IsRing(geometry)
4398 RETURNS boolean
4399 AS 'MODULE_PATHNAME', 'isring'
4400 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4401 _COST_MEDIUM;
4402
4403-- PostGIS equivalent function: PointOnSurface(geometry)
4404CREATE OR REPLACE FUNCTION ST_PointOnSurface(geometry)
4405 RETURNS geometry
4406 AS 'MODULE_PATHNAME', 'pointonsurface'
4407 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4408 _COST_MEDIUM;
4409
4410-- PostGIS equivalent function: IsSimple(geometry)
4411CREATE OR REPLACE FUNCTION ST_IsSimple(geometry)
4412 RETURNS boolean
4413 AS 'MODULE_PATHNAME', 'issimple'
4414 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4415 _COST_MEDIUM;
4416
4417-- Availability: 2.0.0
4418CREATE OR REPLACE FUNCTION ST_IsCollection(geometry)
4419 RETURNS boolean
4420 AS 'MODULE_PATHNAME', 'ST_IsCollection'
4421 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4422 _COST_MEDIUM;
4423
4424-- Deprecation in 1.2.3
4425-- TODO: drop in 2.0.0 !
4426CREATE OR REPLACE FUNCTION Equals(geom1 geometry, geom2 geometry)
4427 RETURNS boolean
4428 AS 'MODULE_PATHNAME','ST_Equals'
4429 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4430 _COST_MEDIUM;
4431
4432-----------------------------------------------------------------------
4433-- GML & KML INPUT
4434-----------------------------------------------------------------------
4435CREATE OR REPLACE FUNCTION _ST_GeomFromGML(text, int4)
4436 RETURNS geometry
4437 AS 'MODULE_PATHNAME','geom_from_gml'
4438 LANGUAGE 'c' IMMUTABLE _PARALLEL
4439 _COST_MEDIUM;
4440
4441-- Availability: 2.0.0
4442CREATE OR REPLACE FUNCTION ST_GeomFromGML(text, int4)
4443 RETURNS geometry
4444 AS 'MODULE_PATHNAME','geom_from_gml'
4445 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4446 _COST_MEDIUM;
4447
4448-- Availability: 1.5.0
4449CREATE OR REPLACE FUNCTION ST_GeomFromGML(text)
4450 RETURNS geometry
4451 AS 'SELECT @extschema@._ST_GeomFromGML($1, 0)'
4452 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
4453
4454-- Availability: 1.5.0
4455CREATE OR REPLACE FUNCTION ST_GMLToSQL(text)
4456 RETURNS geometry
4457 AS 'SELECT @extschema@._ST_GeomFromGML($1, 0)'
4458 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
4459
4460-- Availability: 2.0.0
4461CREATE OR REPLACE FUNCTION ST_GMLToSQL(text, int4)
4462 RETURNS geometry
4463 AS 'MODULE_PATHNAME','geom_from_gml'
4464 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4465 _COST_MEDIUM;
4466
4467-- Availability: 1.5.0
4468CREATE OR REPLACE FUNCTION ST_GeomFromKML(text)
4469 RETURNS geometry
4470 AS 'MODULE_PATHNAME','geom_from_kml'
4471 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4472 _COST_MEDIUM;
4473
4474-----------------------------------------------------------------------
4475-- GEOJSON INPUT
4476-----------------------------------------------------------------------
4477-- Availability: 2.0.0
4478CREATE OR REPLACE FUNCTION ST_GeomFromGeoJson(text)
4479 RETURNS geometry
4480 AS 'MODULE_PATHNAME','geom_from_geojson'
4481 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4482 _COST_MEDIUM;
4483
4484-- Availability: 2.5.0
4485CREATE OR REPLACE FUNCTION ST_GeomFromGeoJson(json)
4486 RETURNS geometry
4487 AS 'SELECT @extschema@.ST_GeomFromGeoJson($1::text)'
4488 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL
4489 _COST_MEDIUM;
4490
4491#if POSTGIS_PGSQL_VERSION >= 94
4492-- Availability: 2.5.0
4493CREATE OR REPLACE FUNCTION ST_GeomFromGeoJson(jsonb)
4494 RETURNS geometry
4495 AS 'SELECT @extschema@.ST_GeomFromGeoJson($1::text)'
4496 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL
4497 _COST_MEDIUM;
4498#endif
4499
4500-- Availability: 2.0.0
4501CREATE OR REPLACE FUNCTION postgis_libjson_version()
4502 RETURNS text
4503 AS 'MODULE_PATHNAME','postgis_libjson_version'
4504 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
4505
4506----------------------------------------------------------------------
4507-- ENCODED POLYLINE INPUT
4508-----------------------------------------------------------------------
4509-- Availability: 2.2.0
4510-- ST_LineFromEncodedPolyline(polyline text, precision int4)
4511CREATE OR REPLACE FUNCTION ST_LineFromEncodedPolyline(txtin text, nprecision int4 DEFAULT 5)
4512 RETURNS geometry
4513 AS 'MODULE_PATHNAME','line_from_encoded_polyline'
4514 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4515 _COST_MEDIUM;
4516
4517------------------------------------------------------------------------
4518
4519----------------------------------------------------------------------
4520-- ENCODED POLYLINE OUTPUT
4521-----------------------------------------------------------------------
4522-- Availability: 2.2.0
4523-- ST_AsEncodedPolyline(geom geometry, precision int4)
4524CREATE OR REPLACE FUNCTION ST_AsEncodedPolyline(geom geometry, nprecision int4 DEFAULT 5)
4525 RETURNS TEXT
4526 AS 'MODULE_PATHNAME','LWGEOM_asEncodedPolyline'
4527 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4528 _COST_LOW;
4529
4530------------------------------------------------------------------------
4531
4532-----------------------------------------------------------------------
4533-- SVG OUTPUT
4534-----------------------------------------------------------------------
4535-- Availability: 1.2.2
4536-- Changed: 2.0.0 changed to use default args and allow calling by named args
4537CREATE OR REPLACE FUNCTION ST_AsSVG(geom geometry, rel int4 DEFAULT 0, maxdecimaldigits int4 DEFAULT 15)
4538 RETURNS TEXT
4539 AS 'MODULE_PATHNAME','LWGEOM_asSVG'
4540 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4541 _COST_LOW;
4542
4543-----------------------------------------------------------------------
4544-- GML OUTPUT
4545-----------------------------------------------------------------------
4546-- _ST_AsGML(version, geom, precision, option, prefix, id)
4547CREATE OR REPLACE FUNCTION _ST_AsGML(int4, geometry, int4, int4, text, text)
4548 RETURNS TEXT
4549 AS 'MODULE_PATHNAME','LWGEOM_asGML'
4550 LANGUAGE 'c' IMMUTABLE _PARALLEL
4551 _COST_MEDIUM;
4552
4553-- ST_AsGML(version, geom) / precision=15
4554-- Availability: 1.3.2
4555-- ST_AsGML(version, geom, precision)
4556-- Availability: 1.3.2
4557
4558-- ST_AsGML (geom, precision, option) / version=2
4559-- Availability: 1.4.0
4560-- Changed: 2.0.0 to have default args
4561CREATE OR REPLACE FUNCTION ST_AsGML(geom geometry, maxdecimaldigits int4 DEFAULT 15, options int4 DEFAULT 0)
4562 RETURNS TEXT
4563 AS $$ SELECT @extschema@._ST_AsGML(2, $1, $2, $3, null, null); $$
4564 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
4565
4566-- ST_AsGML(version, geom, precision, option)
4567-- Availability: 1.4.0
4568-- ST_AsGML(version, geom, precision, option, prefix)
4569-- Availability: 2.0.0
4570-- Changed: 2.0.0 to use default and named args
4571-- ST_AsGML(version, geom, precision, option, prefix, id)
4572-- Availability: 2.1.0
4573CREATE OR REPLACE FUNCTION ST_AsGML(version int4, geom geometry, maxdecimaldigits int4 DEFAULT 15, options int4 DEFAULT 0, nprefix text DEFAULT null, id text DEFAULT null)
4574 RETURNS TEXT
4575 AS $$ SELECT @extschema@._ST_AsGML($1, $2, $3, $4, $5, $6); $$
4576 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
4577
4578-----------------------------------------------------------------------
4579-- KML OUTPUT
4580-----------------------------------------------------------------------
4581
4582-- Availability: 1.2.2
4583-- Changed: 2.0.0 to use default args and allow named args
4584CREATE OR REPLACE FUNCTION ST_AsKML(geom geometry, maxdecimaldigits int4 DEFAULT 15, nprefix TEXT default '')
4585 RETURNS TEXT
4586 AS 'MODULE_PATHNAME','LWGEOM_asKML'
4587 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4588 _COST_LOW;
4589
4590-----------------------------------------------------------------------
4591-- GEOJSON OUTPUT
4592-- Availability: 1.3.4
4593-----------------------------------------------------------------------
4594
4595-- ST_AsGeoJson(geom, precision, options) / version=1
4596-- Changed: 2.0.0 to use default args and named args
4597-- Changed: 3.0.0 change default args mode
4598CREATE OR REPLACE FUNCTION ST_AsGeoJson(geom geometry, maxdecimaldigits int4 DEFAULT 9, options int4 DEFAULT 8)
4599 RETURNS text
4600 AS 'MODULE_PATHNAME','LWGEOM_asGeoJson'
4601 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4602 _COST_LOW;
4603
4604-- Availability: 3.0.0
4605CREATE OR REPLACE FUNCTION ST_AsGeoJson(r record, geom_column text DEFAULT '', maxdecimaldigits int4 DEFAULT 9, pretty_bool bool DEFAULT false)
4606 RETURNS text
4607 AS 'MODULE_PATHNAME','ST_AsGeoJsonRow'
4608 LANGUAGE 'c' STABLE STRICT _PARALLEL
4609 _COST_LOW;
4610
4611-- Availability: 3.0.0
4612CREATE OR REPLACE FUNCTION json(geometry)
4613 RETURNS json
4614 AS 'MODULE_PATHNAME','geometry_to_json'
4615 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
4616
4617-- Availability: 3.0.0
4618CREATE OR REPLACE FUNCTION jsonb(geometry)
4619 RETURNS jsonb
4620 AS 'MODULE_PATHNAME','geometry_to_jsonb'
4621 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
4622
4623-- Availability: 3.0.0
4624CREATE CAST (geometry AS json) WITH FUNCTION json(geometry);
4625-- Availability: 3.0.0
4626CREATE CAST (geometry AS jsonb) WITH FUNCTION jsonb(geometry);
4627
4628-----------------------------------------------------------------------
4629-- Mapbox Vector Tile OUTPUT
4630-- Availability: 2.4.0
4631-----------------------------------------------------------------------
4632
4633-- Availability: 2.4.0
4634CREATE OR REPLACE FUNCTION pgis_asmvt_transfn(internal, anyelement)
4635 RETURNS internal
4636 AS 'MODULE_PATHNAME', 'pgis_asmvt_transfn'
4637 LANGUAGE 'c' IMMUTABLE _PARALLEL;
4638
4639-- Availability: 2.4.0
4640CREATE OR REPLACE FUNCTION pgis_asmvt_transfn(internal, anyelement, text)
4641 RETURNS internal
4642 AS 'MODULE_PATHNAME', 'pgis_asmvt_transfn'
4643 LANGUAGE 'c' IMMUTABLE _PARALLEL;
4644
4645-- Availability: 2.4.0
4646CREATE OR REPLACE FUNCTION pgis_asmvt_transfn(internal, anyelement, text, int4)
4647 RETURNS internal
4648 AS 'MODULE_PATHNAME', 'pgis_asmvt_transfn'
4649 LANGUAGE 'c' IMMUTABLE _PARALLEL;
4650
4651-- Availability: 2.4.0
4652CREATE OR REPLACE FUNCTION pgis_asmvt_transfn(internal, anyelement, text, int4, text)
4653 RETURNS internal
4654 AS 'MODULE_PATHNAME', 'pgis_asmvt_transfn'
4655 LANGUAGE 'c' IMMUTABLE _PARALLEL;
4656
4657-- Availability: 3.0.0
4658CREATE OR REPLACE FUNCTION pgis_asmvt_transfn(internal, anyelement, text, int4, text, text)
4659 RETURNS internal
4660 AS 'MODULE_PATHNAME', 'pgis_asmvt_transfn'
4661 LANGUAGE 'c' IMMUTABLE _PARALLEL;
4662
4663-- Availability: 2.4.0
4664CREATE OR REPLACE FUNCTION pgis_asmvt_finalfn(internal)
4665 RETURNS bytea
4666 AS 'MODULE_PATHNAME', 'pgis_asmvt_finalfn'
4667 LANGUAGE 'c' IMMUTABLE _PARALLEL
4668 _COST_MEDIUM;
4669
4670-- Availability: 2.5.0
4671CREATE OR REPLACE FUNCTION pgis_asmvt_combinefn(internal, internal)
4672 RETURNS internal
4673 AS 'MODULE_PATHNAME', 'pgis_asmvt_combinefn'
4674 LANGUAGE 'c' IMMUTABLE _PARALLEL
4675 _COST_MEDIUM;
4676
4677-- Availability: 2.5.0
4678CREATE OR REPLACE FUNCTION pgis_asmvt_serialfn(internal)
4679 RETURNS bytea
4680 AS 'MODULE_PATHNAME', 'pgis_asmvt_serialfn'
4681 LANGUAGE 'c' IMMUTABLE _PARALLEL
4682 _COST_MEDIUM;
4683
4684-- Availability: 2.5.0
4685CREATE OR REPLACE FUNCTION pgis_asmvt_deserialfn(bytea, internal)
4686 RETURNS internal
4687 AS 'MODULE_PATHNAME', 'pgis_asmvt_deserialfn'
4688 LANGUAGE 'c' IMMUTABLE _PARALLEL
4689 _COST_MEDIUM;
4690
4691-- Availability: 2.4.0
4692-- Changed: 2.5.0
4693CREATE AGGREGATE ST_AsMVT(anyelement)
4694(
4695 sfunc = pgis_asmvt_transfn,
4696 stype = internal,
4697#if POSTGIS_PGSQL_VERSION >= 96
4698 parallel = safe,
4699 serialfunc = pgis_asmvt_serialfn,
4700 deserialfunc = pgis_asmvt_deserialfn,
4701 combinefunc = pgis_asmvt_combinefn,
4702#endif
4703 finalfunc = pgis_asmvt_finalfn
4704);
4705
4706-- Availability: 2.4.0
4707-- Changed: 2.5.0
4708CREATE AGGREGATE ST_AsMVT(anyelement, text)
4709(
4710 sfunc = pgis_asmvt_transfn,
4711 stype = internal,
4712#if POSTGIS_PGSQL_VERSION >= 96
4713 parallel = safe,
4714 serialfunc = pgis_asmvt_serialfn,
4715 deserialfunc = pgis_asmvt_deserialfn,
4716 combinefunc = pgis_asmvt_combinefn,
4717#endif
4718 finalfunc = pgis_asmvt_finalfn
4719);
4720
4721-- Availability: 2.4.0
4722-- Changed: 2.5.0
4723CREATE AGGREGATE ST_AsMVT(anyelement, text, int4)
4724(
4725 sfunc = pgis_asmvt_transfn,
4726 stype = internal,
4727#if POSTGIS_PGSQL_VERSION >= 96
4728 parallel = safe,
4729 serialfunc = pgis_asmvt_serialfn,
4730 deserialfunc = pgis_asmvt_deserialfn,
4731 combinefunc = pgis_asmvt_combinefn,
4732#endif
4733 finalfunc = pgis_asmvt_finalfn
4734);
4735
4736-- Availability: 2.4.0
4737-- Changed: 2.5.0
4738CREATE AGGREGATE ST_AsMVT(anyelement, text, int4, text)
4739(
4740 sfunc = pgis_asmvt_transfn,
4741 stype = internal,
4742#if POSTGIS_PGSQL_VERSION >= 96
4743 parallel = safe,
4744 serialfunc = pgis_asmvt_serialfn,
4745 deserialfunc = pgis_asmvt_deserialfn,
4746 combinefunc = pgis_asmvt_combinefn,
4747#endif
4748 finalfunc = pgis_asmvt_finalfn
4749);
4750
4751-- Availability: 3.0.0
4752-- Changed: 3.0.0
4753CREATE AGGREGATE ST_AsMVT(anyelement, text, int4, text, text)
4754(
4755 sfunc = pgis_asmvt_transfn,
4756 stype = internal,
4757#if POSTGIS_PGSQL_VERSION >= 96
4758 parallel = safe,
4759 serialfunc = pgis_asmvt_serialfn,
4760 deserialfunc = pgis_asmvt_deserialfn,
4761 combinefunc = pgis_asmvt_combinefn,
4762#endif
4763 finalfunc = pgis_asmvt_finalfn
4764);
4765
4766-- Availability: 2.4.0
4767CREATE OR REPLACE FUNCTION ST_AsMVTGeom(geom geometry, bounds box2d, extent int4 default 4096, buffer int4 default 256, clip_geom bool default true)
4768 RETURNS geometry
4769 AS 'MODULE_PATHNAME','ST_AsMVTGeom'
4770 LANGUAGE 'c' IMMUTABLE _PARALLEL;
4771
4772-- Availability: 2.4.0
4773CREATE OR REPLACE FUNCTION postgis_libprotobuf_version()
4774 RETURNS text
4775 AS 'MODULE_PATHNAME','postgis_libprotobuf_version'
4776 LANGUAGE 'c' IMMUTABLE STRICT;
4777
4778-----------------------------------------------------------------------
4779-- GEOBUF OUTPUT
4780-- Availability: 2.4.0
4781-----------------------------------------------------------------------
4782
4783-- Availability: 2.4.0
4784CREATE OR REPLACE FUNCTION pgis_asgeobuf_transfn(internal, anyelement)
4785 RETURNS internal
4786 AS 'MODULE_PATHNAME', 'pgis_asgeobuf_transfn'
4787 LANGUAGE 'c' IMMUTABLE _PARALLEL;
4788
4789-- Availability: 2.4.0
4790CREATE OR REPLACE FUNCTION pgis_asgeobuf_transfn(internal, anyelement, text)
4791 RETURNS internal
4792 AS 'MODULE_PATHNAME', 'pgis_asgeobuf_transfn'
4793 LANGUAGE 'c' IMMUTABLE _PARALLEL;
4794
4795-- Availability: 2.4.0
4796CREATE OR REPLACE FUNCTION pgis_asgeobuf_finalfn(internal)
4797 RETURNS bytea
4798 AS 'MODULE_PATHNAME', 'pgis_asgeobuf_finalfn'
4799 LANGUAGE 'c' IMMUTABLE _PARALLEL
4800 _COST_MEDIUM;
4801
4802-- Availability: 2.4.0
4803CREATE AGGREGATE ST_AsGeobuf(anyelement)
4804(
4805 sfunc = pgis_asgeobuf_transfn,
4806 stype = internal,
4807#if POSTGIS_PGSQL_VERSION >= 96
4808 parallel = safe,
4809#endif
4810 finalfunc = pgis_asgeobuf_finalfn
4811);
4812
4813-- Availability: 2.4.0
4814CREATE AGGREGATE ST_AsGeobuf(anyelement, text)
4815(
4816 sfunc = pgis_asgeobuf_transfn,
4817 stype = internal,
4818#if POSTGIS_PGSQL_VERSION >= 96
4819 parallel = safe,
4820#endif
4821 finalfunc = pgis_asgeobuf_finalfn
4822);
4823
4824------------------------------------------------------------------------
4825-- GeoHash (geohash.org)
4826------------------------------------------------------------------------
4827
4828-- Availability 1.4.0
4829-- Changed 2.0.0 to use default args and named args
4830CREATE OR REPLACE FUNCTION ST_GeoHash(geom geometry, maxchars int4 DEFAULT 0)
4831 RETURNS TEXT
4832 AS 'MODULE_PATHNAME', 'ST_GeoHash'
4833 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4834 _COST_MEDIUM;
4835
4836-----------------------------------------------------------------------
4837-- GeoHash input
4838-- Availability: 2.0.?
4839-----------------------------------------------------------------------
4840-- ST_Box2dFromGeoHash(geohash text, precision int4)
4841CREATE OR REPLACE FUNCTION ST_Box2dFromGeoHash(text, int4 DEFAULT NULL)
4842 RETURNS box2d
4843 AS 'MODULE_PATHNAME','box2d_from_geohash'
4844 LANGUAGE 'c' IMMUTABLE _PARALLEL
4845 _COST_MEDIUM;
4846
4847-- ST_PointFromGeoHash(geohash text, precision int4)
4848CREATE OR REPLACE FUNCTION ST_PointFromGeoHash(text, int4 DEFAULT NULL)
4849 RETURNS geometry
4850 AS 'MODULE_PATHNAME','point_from_geohash'
4851 LANGUAGE 'c' IMMUTABLE _PARALLEL
4852 _COST_MEDIUM;
4853
4854-- ST_GeomFromGeoHash(geohash text, precision int4)
4855CREATE OR REPLACE FUNCTION ST_GeomFromGeoHash(text, int4 DEFAULT NULL)
4856 RETURNS geometry
4857 AS $$ SELECT CAST(@extschema@.ST_Box2dFromGeoHash($1, $2) AS geometry); $$
4858 LANGUAGE 'sql' IMMUTABLE _PARALLEL
4859 _COST_MEDIUM;
4860
4861------------------------------------------------------------------------
4862-- OGC defined
4863------------------------------------------------------------------------
4864-- PostGIS equivalent function: NumPoints(geometry)
4865CREATE OR REPLACE FUNCTION ST_NumPoints(geometry)
4866 RETURNS int4
4867 AS 'MODULE_PATHNAME', 'LWGEOM_numpoints_linestring'
4868 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4869 _COST_LOW;
4870
4871-- PostGIS equivalent function: NumGeometries(geometry)
4872CREATE OR REPLACE FUNCTION ST_NumGeometries(geometry)
4873 RETURNS int4
4874 AS 'MODULE_PATHNAME', 'LWGEOM_numgeometries_collection'
4875 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4876 _COST_LOW;
4877
4878-- PostGIS equivalent function: GeometryN(geometry)
4879CREATE OR REPLACE FUNCTION ST_GeometryN(geometry,integer)
4880 RETURNS geometry
4881 AS 'MODULE_PATHNAME', 'LWGEOM_geometryn_collection'
4882 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4883 _COST_LOW;
4884
4885-- PostGIS equivalent function: Dimension(geometry)
4886CREATE OR REPLACE FUNCTION ST_Dimension(geometry)
4887 RETURNS int4
4888 AS 'MODULE_PATHNAME', 'LWGEOM_dimension'
4889 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4890 _COST_LOW;
4891
4892-- PostGIS equivalent function: ExteriorRing(geometry)
4893CREATE OR REPLACE FUNCTION ST_ExteriorRing(geometry)
4894 RETURNS geometry
4895 AS 'MODULE_PATHNAME','LWGEOM_exteriorring_polygon'
4896 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4897 _COST_LOW;
4898
4899-- PostGIS equivalent function: NumInteriorRings(geometry)
4900CREATE OR REPLACE FUNCTION ST_NumInteriorRings(geometry)
4901 RETURNS integer
4902 AS 'MODULE_PATHNAME','LWGEOM_numinteriorrings_polygon'
4903 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4904 _COST_LOW;
4905
4906-- Availability: 1.2.2
4907CREATE OR REPLACE FUNCTION ST_NumInteriorRing(geometry)
4908 RETURNS integer
4909 AS 'MODULE_PATHNAME','LWGEOM_numinteriorrings_polygon'
4910 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4911 _COST_LOW;
4912
4913-- PostGIS equivalent function: InteriorRingN(geometry)
4914CREATE OR REPLACE FUNCTION ST_InteriorRingN(geometry,integer)
4915 RETURNS geometry
4916 AS 'MODULE_PATHNAME','LWGEOM_interiorringn_polygon'
4917 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4918 _COST_LOW;
4919
4920-- Deprecation in 1.2.3 -- this should not be deprecated (2011-01-04 robe)
4921CREATE OR REPLACE FUNCTION GeometryType(geometry)
4922 RETURNS text
4923 AS 'MODULE_PATHNAME', 'LWGEOM_getTYPE'
4924 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4925 _COST_LOW;
4926
4927-- Not quite equivalent to GeometryType
4928CREATE OR REPLACE FUNCTION ST_GeometryType(geometry)
4929 RETURNS text
4930 AS 'MODULE_PATHNAME', 'geometry_geometrytype'
4931 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4932 _COST_LOW;
4933
4934-- PostGIS equivalent function: PointN(geometry,integer)
4935CREATE OR REPLACE FUNCTION ST_PointN(geometry,integer)
4936 RETURNS geometry
4937 AS 'MODULE_PATHNAME','LWGEOM_pointn_linestring'
4938 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4939 _COST_LOW;
4940
4941-- Availability: 2.0.0
4942CREATE OR REPLACE FUNCTION ST_NumPatches(geometry)
4943 RETURNS int4
4944 AS '
4945 SELECT CASE WHEN @extschema@.ST_GeometryType($1) = ''ST_PolyhedralSurface''
4946 THEN @extschema@.ST_NumGeometries($1)
4947 ELSE NULL END
4948 '
4949 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
4950
4951-- Availability: 2.0.0
4952CREATE OR REPLACE FUNCTION ST_PatchN(geometry, integer)
4953 RETURNS geometry
4954 AS '
4955 SELECT CASE WHEN @extschema@.ST_GeometryType($1) = ''ST_PolyhedralSurface''
4956 THEN @extschema@.ST_GeometryN($1, $2)
4957 ELSE NULL END
4958 '
4959 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
4960
4961-- PostGIS equivalent function of old StartPoint(geometry))
4962CREATE OR REPLACE FUNCTION ST_StartPoint(geometry)
4963 RETURNS geometry
4964 AS 'MODULE_PATHNAME', 'LWGEOM_startpoint_linestring'
4965 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4966 _COST_LOW;
4967
4968-- PostGIS equivalent function of old EndPoint(geometry)
4969CREATE OR REPLACE FUNCTION ST_EndPoint(geometry)
4970 RETURNS geometry
4971 AS 'MODULE_PATHNAME', 'LWGEOM_endpoint_linestring'
4972 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4973 _COST_LOW;
4974
4975-- PostGIS equivalent function: IsClosed(geometry)
4976CREATE OR REPLACE FUNCTION ST_IsClosed(geometry)
4977 RETURNS boolean
4978 AS 'MODULE_PATHNAME', 'LWGEOM_isclosed'
4979 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4980 _COST_LOW;
4981
4982-- PostGIS equivalent function: IsEmpty(geometry)
4983CREATE OR REPLACE FUNCTION ST_IsEmpty(geometry)
4984 RETURNS boolean
4985 AS 'MODULE_PATHNAME', 'LWGEOM_isempty'
4986 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4987 _COST_LOW;
4988
4989-- Availability: 1.2.2
4990CREATE OR REPLACE FUNCTION ST_AsBinary(geometry,text)
4991 RETURNS bytea
4992 AS 'MODULE_PATHNAME','LWGEOM_asBinary'
4993 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
4994 _COST_LOW;
4995
4996-- PostGIS equivalent of old function: AsBinary(geometry)
4997CREATE OR REPLACE FUNCTION ST_AsBinary(geometry)
4998 RETURNS bytea
4999 AS 'MODULE_PATHNAME','LWGEOM_asBinary'
5000 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5001 _COST_LOW;
5002
5003-- PostGIS equivalent function: AsText(geometry)
5004CREATE OR REPLACE FUNCTION ST_AsText(geometry)
5005 RETURNS TEXT
5006 AS 'MODULE_PATHNAME','LWGEOM_asText'
5007 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5008 _COST_MEDIUM;
5009
5010-- Availability: 2.5.0
5011-- PostGIS equivalent function: AsText(geometry, int4)
5012CREATE OR REPLACE FUNCTION ST_AsText(geometry, int4)
5013 RETURNS TEXT
5014 AS 'MODULE_PATHNAME','LWGEOM_asText'
5015 LANGUAGE 'c' IMMUTABLE STRICT
5016 _COST_MEDIUM;
5017
5018-- Availability: 1.2.2
5019CREATE OR REPLACE FUNCTION ST_GeometryFromText(text)
5020 RETURNS geometry
5021 AS 'MODULE_PATHNAME','LWGEOM_from_text'
5022 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5023 _COST_MEDIUM;
5024
5025-- Availability: 1.2.2
5026CREATE OR REPLACE FUNCTION ST_GeometryFromText(text, int4)
5027 RETURNS geometry
5028 AS 'MODULE_PATHNAME','LWGEOM_from_text'
5029 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5030 _COST_MEDIUM;
5031
5032-- Availability: 1.2.2
5033CREATE OR REPLACE FUNCTION ST_GeomFromText(text)
5034 RETURNS geometry
5035 AS 'MODULE_PATHNAME','LWGEOM_from_text'
5036 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5037 _COST_MEDIUM;
5038
5039-- PostGIS equivalent function: ST_GeometryFromText(text, int4)
5040CREATE OR REPLACE FUNCTION ST_GeomFromText(text, int4)
5041 RETURNS geometry
5042 AS 'MODULE_PATHNAME','LWGEOM_from_text'
5043 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5044 _COST_MEDIUM;
5045
5046-- PostGIS equivalent function: ST_GeometryFromText(text)
5047-- SQL/MM alias for ST_GeomFromText
5048CREATE OR REPLACE FUNCTION ST_WKTToSQL(text)
5049 RETURNS geometry
5050 AS 'MODULE_PATHNAME','LWGEOM_from_text'
5051 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5052 _COST_MEDIUM;
5053
5054-- Availability: 1.2.2
5055CREATE OR REPLACE FUNCTION ST_PointFromText(text)
5056 RETURNS geometry
5057 AS '
5058 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromText($1)) = ''POINT''
5059 THEN @extschema@.ST_GeomFromText($1)
5060 ELSE NULL END
5061 '
5062 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5063
5064-- PostGIS equivalent function: PointFromText(text, int4)
5065-- TODO: improve this ... by not duplicating constructor time.
5066CREATE OR REPLACE FUNCTION ST_PointFromText(text, int4)
5067 RETURNS geometry
5068 AS '
5069 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromText($1, $2)) = ''POINT''
5070 THEN @extschema@.ST_GeomFromText($1, $2)
5071 ELSE NULL END
5072 '
5073 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5074
5075-- Availability: 1.2.2
5076CREATE OR REPLACE FUNCTION ST_LineFromText(text)
5077 RETURNS geometry
5078 AS '
5079 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromText($1)) = ''LINESTRING''
5080 THEN @extschema@.ST_GeomFromText($1)
5081 ELSE NULL END
5082 '
5083 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5084
5085-- PostGIS equivalent function: LineFromText(text, int4)
5086CREATE OR REPLACE FUNCTION ST_LineFromText(text, int4)
5087 RETURNS geometry
5088 AS '
5089 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromText($1, $2)) = ''LINESTRING''
5090 THEN @extschema@.ST_GeomFromText($1,$2)
5091 ELSE NULL END
5092 '
5093 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5094
5095-- Availability: 1.2.2
5096CREATE OR REPLACE FUNCTION ST_PolyFromText(text)
5097 RETURNS geometry
5098 AS '
5099 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromText($1)) = ''POLYGON''
5100 THEN @extschema@.ST_GeomFromText($1)
5101 ELSE NULL END
5102 '
5103 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5104
5105-- PostGIS equivalent function: ST_PolygonFromText(text, int4)
5106CREATE OR REPLACE FUNCTION ST_PolyFromText(text, int4)
5107 RETURNS geometry
5108 AS '
5109 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromText($1, $2)) = ''POLYGON''
5110 THEN @extschema@.ST_GeomFromText($1, $2)
5111 ELSE NULL END
5112 '
5113 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5114
5115-- Availability: 1.2.2
5116CREATE OR REPLACE FUNCTION ST_PolygonFromText(text, int4)
5117 RETURNS geometry
5118 AS 'SELECT @extschema@.ST_PolyFromText($1, $2)'
5119 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5120
5121-- Availability: 1.2.2
5122CREATE OR REPLACE FUNCTION ST_PolygonFromText(text)
5123 RETURNS geometry
5124 AS 'SELECT @extschema@.ST_PolyFromText($1)'
5125 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5126
5127-- PostGIS equivalent function: MLineFromText(text, int4)
5128CREATE OR REPLACE FUNCTION ST_MLineFromText(text, int4)
5129 RETURNS geometry
5130 AS '
5131 SELECT CASE
5132 WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromText($1, $2)) = ''MULTILINESTRING''
5133 THEN @extschema@.ST_GeomFromText($1,$2)
5134 ELSE NULL END
5135 '
5136 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5137
5138-- Availability: 1.2.2
5139CREATE OR REPLACE FUNCTION ST_MLineFromText(text)
5140 RETURNS geometry
5141 AS '
5142 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromText($1)) = ''MULTILINESTRING''
5143 THEN @extschema@.ST_GeomFromText($1)
5144 ELSE NULL END
5145 '
5146 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5147
5148-- Availability: 1.2.2
5149CREATE OR REPLACE FUNCTION ST_MultiLineStringFromText(text)
5150 RETURNS geometry
5151 AS 'SELECT @extschema@.ST_MLineFromText($1)'
5152 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5153
5154-- Availability: 1.2.2
5155CREATE OR REPLACE FUNCTION ST_MultiLineStringFromText(text, int4)
5156 RETURNS geometry
5157 AS 'SELECT @extschema@.ST_MLineFromText($1, $2)'
5158 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5159
5160-- PostGIS equivalent function: MPointFromText(text, int4)
5161CREATE OR REPLACE FUNCTION ST_MPointFromText(text, int4)
5162 RETURNS geometry
5163 AS '
5164 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromText($1, $2)) = ''MULTIPOINT''
5165 THEN ST_GeomFromText($1, $2)
5166 ELSE NULL END
5167 '
5168 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5169
5170-- Availability: 1.2.2
5171CREATE OR REPLACE FUNCTION ST_MPointFromText(text)
5172 RETURNS geometry
5173 AS '
5174 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromText($1)) = ''MULTIPOINT''
5175 THEN @extschema@.ST_GeomFromText($1)
5176 ELSE NULL END
5177 '
5178 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5179
5180-- Availability: 1.2.2
5181CREATE OR REPLACE FUNCTION ST_MultiPointFromText(text)
5182 RETURNS geometry
5183 AS 'SELECT @extschema@.ST_MPointFromText($1)'
5184 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5185
5186-- PostGIS equivalent function: MPolyFromText(text, int4)
5187CREATE OR REPLACE FUNCTION ST_MPolyFromText(text, int4)
5188 RETURNS geometry
5189 AS '
5190 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromText($1, $2)) = ''MULTIPOLYGON''
5191 THEN @extschema@.ST_GeomFromText($1,$2)
5192 ELSE NULL END
5193 '
5194 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5195
5196--Availability: 1.2.2
5197CREATE OR REPLACE FUNCTION ST_MPolyFromText(text)
5198 RETURNS geometry
5199 AS '
5200 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromText($1)) = ''MULTIPOLYGON''
5201 THEN @extschema@.ST_GeomFromText($1)
5202 ELSE NULL END
5203 '
5204 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5205
5206-- Availability: 1.2.2
5207CREATE OR REPLACE FUNCTION ST_MultiPolygonFromText(text, int4)
5208 RETURNS geometry
5209 AS 'SELECT @extschema@.ST_MPolyFromText($1, $2)'
5210 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5211
5212-- Availability: 1.2.2
5213CREATE OR REPLACE FUNCTION ST_MultiPolygonFromText(text)
5214 RETURNS geometry
5215 AS 'SELECT @extschema@.ST_MPolyFromText($1)'
5216 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5217
5218-- Availability: 1.2.2
5219CREATE OR REPLACE FUNCTION ST_GeomCollFromText(text, int4)
5220 RETURNS geometry
5221 AS '
5222 SELECT CASE
5223 WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromText($1, $2)) = ''GEOMETRYCOLLECTION''
5224 THEN @extschema@.ST_GeomFromText($1,$2)
5225 ELSE NULL END
5226 '
5227 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5228
5229-- Availability: 1.2.2
5230CREATE OR REPLACE FUNCTION ST_GeomCollFromText(text)
5231 RETURNS geometry
5232 AS '
5233 SELECT CASE
5234 WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromText($1)) = ''GEOMETRYCOLLECTION''
5235 THEN @extschema@.ST_GeomFromText($1)
5236 ELSE NULL END
5237 '
5238 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5239
5240-- Availability: 1.2.2
5241CREATE OR REPLACE FUNCTION ST_GeomFromWKB(bytea)
5242 RETURNS geometry
5243 AS 'MODULE_PATHNAME','LWGEOM_from_WKB'
5244 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
5245
5246-- PostGIS equivalent function: GeomFromWKB(bytea, int)
5247CREATE OR REPLACE FUNCTION ST_GeomFromWKB(bytea, int)
5248 RETURNS geometry
5249 AS 'SELECT @extschema@.ST_SetSRID(@extschema@.ST_GeomFromWKB($1), $2)'
5250 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5251
5252-- PostGIS equivalent function: PointFromWKB(bytea, int)
5253CREATE OR REPLACE FUNCTION ST_PointFromWKB(bytea, int)
5254 RETURNS geometry
5255 AS '
5256 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1, $2)) = ''POINT''
5257 THEN @extschema@.ST_GeomFromWKB($1, $2)
5258 ELSE NULL END
5259 '
5260 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5261
5262-- Availability: 1.2.2
5263CREATE OR REPLACE FUNCTION ST_PointFromWKB(bytea)
5264 RETURNS geometry
5265 AS '
5266 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1)) = ''POINT''
5267 THEN @extschema@.ST_GeomFromWKB($1)
5268 ELSE NULL END
5269 '
5270 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5271
5272-- PostGIS equivalent function: LineFromWKB(bytea, int)
5273CREATE OR REPLACE FUNCTION ST_LineFromWKB(bytea, int)
5274 RETURNS geometry
5275 AS '
5276 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1, $2)) = ''LINESTRING''
5277 THEN @extschema@.ST_GeomFromWKB($1, $2)
5278 ELSE NULL END
5279 '
5280 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5281
5282-- Availability: 1.2.2
5283CREATE OR REPLACE FUNCTION ST_LineFromWKB(bytea)
5284 RETURNS geometry
5285 AS '
5286 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1)) = ''LINESTRING''
5287 THEN @extschema@.ST_GeomFromWKB($1)
5288 ELSE NULL END
5289 '
5290 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5291
5292-- Availability: 1.2.2
5293CREATE OR REPLACE FUNCTION ST_LinestringFromWKB(bytea, int)
5294 RETURNS geometry
5295 AS '
5296 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1, $2)) = ''LINESTRING''
5297 THEN @extschema@.ST_GeomFromWKB($1, $2)
5298 ELSE NULL END
5299 '
5300 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5301
5302-- Availability: 1.2.2
5303CREATE OR REPLACE FUNCTION ST_LinestringFromWKB(bytea)
5304 RETURNS geometry
5305 AS '
5306 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1)) = ''LINESTRING''
5307 THEN @extschema@.ST_GeomFromWKB($1)
5308 ELSE NULL END
5309 '
5310 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5311
5312-- PostGIS equivalent function: PolyFromWKB(text, int)
5313CREATE OR REPLACE FUNCTION ST_PolyFromWKB(bytea, int)
5314 RETURNS geometry
5315 AS '
5316 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1, $2)) = ''POLYGON''
5317 THEN @extschema@.ST_GeomFromWKB($1, $2)
5318 ELSE NULL END
5319 '
5320 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5321
5322-- Availability: 1.2.2
5323CREATE OR REPLACE FUNCTION ST_PolyFromWKB(bytea)
5324 RETURNS geometry
5325 AS '
5326 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1)) = ''POLYGON''
5327 THEN @extschema@.ST_GeomFromWKB($1)
5328 ELSE NULL END
5329 '
5330 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5331
5332-- Availability: 1.2.2
5333CREATE OR REPLACE FUNCTION ST_PolygonFromWKB(bytea, int)
5334 RETURNS geometry
5335 AS '
5336 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1,$2)) = ''POLYGON''
5337 THEN @extschema@.ST_GeomFromWKB($1, $2)
5338 ELSE NULL END
5339 '
5340 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5341
5342-- Availability: 1.2.2
5343CREATE OR REPLACE FUNCTION ST_PolygonFromWKB(bytea)
5344 RETURNS geometry
5345 AS '
5346 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1)) = ''POLYGON''
5347 THEN @extschema@.ST_GeomFromWKB($1)
5348 ELSE NULL END
5349 '
5350 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5351
5352-- PostGIS equivalent function: MPointFromWKB(text, int)
5353CREATE OR REPLACE FUNCTION ST_MPointFromWKB(bytea, int)
5354 RETURNS geometry
5355 AS '
5356 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1, $2)) = ''MULTIPOINT''
5357 THEN @extschema@.ST_GeomFromWKB($1, $2)
5358 ELSE NULL END
5359 '
5360 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5361
5362-- Availability: 1.2.2
5363CREATE OR REPLACE FUNCTION ST_MPointFromWKB(bytea)
5364 RETURNS geometry
5365 AS '
5366 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1)) = ''MULTIPOINT''
5367 THEN @extschema@.ST_GeomFromWKB($1)
5368 ELSE NULL END
5369 '
5370 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5371
5372-- Availability: 1.2.2
5373CREATE OR REPLACE FUNCTION ST_MultiPointFromWKB(bytea, int)
5374 RETURNS geometry
5375 AS '
5376 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1,$2)) = ''MULTIPOINT''
5377 THEN @extschema@.ST_GeomFromWKB($1, $2)
5378 ELSE NULL END
5379 '
5380 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5381
5382-- Availability: 1.2.2
5383CREATE OR REPLACE FUNCTION ST_MultiPointFromWKB(bytea)
5384 RETURNS geometry
5385 AS '
5386 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1)) = ''MULTIPOINT''
5387 THEN @extschema@.ST_GeomFromWKB($1)
5388 ELSE NULL END
5389 '
5390 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5391
5392-- Availability: 1.2.2
5393CREATE OR REPLACE FUNCTION ST_MultiLineFromWKB(bytea)
5394 RETURNS geometry
5395 AS '
5396 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1)) = ''MULTILINESTRING''
5397 THEN @extschema@.ST_GeomFromWKB($1)
5398 ELSE NULL END
5399 '
5400 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5401
5402-- PostGIS equivalent function: MLineFromWKB(text, int)
5403CREATE OR REPLACE FUNCTION ST_MLineFromWKB(bytea, int)
5404 RETURNS geometry
5405 AS '
5406 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1, $2)) = ''MULTILINESTRING''
5407 THEN @extschema@.ST_GeomFromWKB($1, $2)
5408 ELSE NULL END
5409 '
5410 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5411
5412-- Availability: 1.2.2
5413CREATE OR REPLACE FUNCTION ST_MLineFromWKB(bytea)
5414 RETURNS geometry
5415 AS '
5416 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1)) = ''MULTILINESTRING''
5417 THEN @extschema@.ST_GeomFromWKB($1)
5418 ELSE NULL END
5419 '
5420 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5421
5422-- Availability: 1.2.2
5423-- PostGIS equivalent function: MPolyFromWKB(bytea, int)
5424CREATE OR REPLACE FUNCTION ST_MPolyFromWKB(bytea, int)
5425 RETURNS geometry
5426 AS '
5427 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1, $2)) = ''MULTIPOLYGON''
5428 THEN @extschema@.ST_GeomFromWKB($1, $2)
5429 ELSE NULL END
5430 '
5431 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5432
5433-- Availability: 1.2.2
5434CREATE OR REPLACE FUNCTION ST_MPolyFromWKB(bytea)
5435 RETURNS geometry
5436 AS '
5437 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1)) = ''MULTIPOLYGON''
5438 THEN @extschema@.ST_GeomFromWKB($1)
5439 ELSE NULL END
5440 '
5441 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5442
5443-- Availability: 1.2.2
5444CREATE OR REPLACE FUNCTION ST_MultiPolyFromWKB(bytea, int)
5445 RETURNS geometry
5446 AS '
5447 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1, $2)) = ''MULTIPOLYGON''
5448 THEN @extschema@.ST_GeomFromWKB($1, $2)
5449 ELSE NULL END
5450 '
5451 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5452
5453-- Availability: 1.2.2
5454CREATE OR REPLACE FUNCTION ST_MultiPolyFromWKB(bytea)
5455 RETURNS geometry
5456 AS '
5457 SELECT CASE WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1)) = ''MULTIPOLYGON''
5458 THEN @extschema@.ST_GeomFromWKB($1)
5459 ELSE NULL END
5460 '
5461 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5462
5463-- Availability: 1.2.2
5464CREATE OR REPLACE FUNCTION ST_GeomCollFromWKB(bytea, int)
5465 RETURNS geometry
5466 AS '
5467 SELECT CASE
5468 WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1, $2)) = ''GEOMETRYCOLLECTION''
5469 THEN @extschema@.ST_GeomFromWKB($1, $2)
5470 ELSE NULL END
5471 '
5472 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5473
5474-- Availability: 1.2.2
5475CREATE OR REPLACE FUNCTION ST_GeomCollFromWKB(bytea)
5476 RETURNS geometry
5477 AS '
5478 SELECT CASE
5479 WHEN @extschema@.geometrytype(@extschema@.ST_GeomFromWKB($1)) = ''GEOMETRYCOLLECTION''
5480 THEN @extschema@.ST_GeomFromWKB($1)
5481 ELSE NULL END
5482 '
5483 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5484
5485
5486-- Maximum distance between linestrings.
5487-- Availability: 1.5.0
5488CREATE OR REPLACE FUNCTION _ST_MaxDistance(geom1 geometry, geom2 geometry)
5489 RETURNS float8
5490 AS 'MODULE_PATHNAME', 'LWGEOM_maxdistance2d_linestring'
5491 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5492 _COST_MEDIUM;
5493
5494-- Availability: 1.5.0
5495CREATE OR REPLACE FUNCTION ST_MaxDistance(geom1 geometry, geom2 geometry)
5496 RETURNS float8
5497 AS 'SELECT @extschema@._ST_MaxDistance(@extschema@.ST_ConvexHull($1), @extschema@.ST_ConvexHull($2))'
5498 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5499
5500CREATE OR REPLACE FUNCTION ST_ClosestPoint(geom1 geometry, geom2 geometry)
5501 RETURNS geometry
5502 AS 'MODULE_PATHNAME', 'LWGEOM_closestpoint'
5503 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5504 _COST_MEDIUM;
5505
5506CREATE OR REPLACE FUNCTION ST_ShortestLine(geom1 geometry, geom2 geometry)
5507 RETURNS geometry
5508 AS 'MODULE_PATHNAME', 'LWGEOM_shortestline2d'
5509 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5510 _COST_MEDIUM;
5511
5512CREATE OR REPLACE FUNCTION _ST_LongestLine(geom1 geometry, geom2 geometry)
5513 RETURNS geometry
5514 AS 'MODULE_PATHNAME', 'LWGEOM_longestline2d'
5515 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5516 _COST_MEDIUM;
5517
5518CREATE OR REPLACE FUNCTION ST_LongestLine(geom1 geometry, geom2 geometry)
5519 RETURNS geometry
5520 AS 'SELECT @extschema@._ST_LongestLine(@extschema@.ST_ConvexHull($1), @extschema@.ST_ConvexHull($2))'
5521 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5522
5523-- Availability: 2.2.0
5524CREATE OR REPLACE FUNCTION ST_SwapOrdinates(geom geometry, ords cstring)
5525 RETURNS geometry
5526 AS 'MODULE_PATHNAME', 'ST_SwapOrdinates'
5527 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5528 _COST_LOW;
5529
5530-- NOTE: same as ST_SwapOrdinates(geometry, 'xy')
5531-- but slightly faster in that it doesn't need to parse ordinate
5532-- spec strings
5533CREATE OR REPLACE FUNCTION ST_FlipCoordinates(geometry)
5534 RETURNS geometry
5535 AS 'MODULE_PATHNAME', 'ST_FlipCoordinates'
5536 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5537 _COST_MEDIUM;
5538
5539--
5540-- SFSQL 1.1
5541--
5542-- BdPolyFromText(multiLineStringTaggedText String, SRID Integer): Polygon
5543--
5544-- Construct a Polygon given an arbitrary
5545-- collection of closed linestrings as a
5546-- MultiLineString text representation.
5547--
5548-- This is a PLPGSQL function rather then an SQL function
5549-- To avoid double call of BuildArea (one to get GeometryType
5550-- and another to actual return, in a CASE WHEN construct).
5551-- Also, we profit from plpgsql to RAISE exceptions.
5552--
5553
5554-- Availability: 1.2.2
5555CREATE OR REPLACE FUNCTION ST_BdPolyFromText(text, integer)
5556RETURNS geometry
5557AS $$
5558DECLARE
5559 geomtext alias for $1;
5560 srid alias for $2;
5561 mline @extschema@.geometry;
5562 geom @extschema@.geometry;
5563BEGIN
5564 mline := @extschema@.ST_MultiLineStringFromText(geomtext, srid);
5565
5566 IF mline IS NULL
5567 THEN
5568 RAISE EXCEPTION 'Input is not a MultiLinestring';
5569 END IF;
5570
5571 geom := @extschema@.ST_BuildArea(mline);
5572
5573 IF @extschema@.GeometryType(geom) != 'POLYGON'
5574 THEN
5575 RAISE EXCEPTION 'Input returns more then a single polygon, try using BdMPolyFromText instead';
5576 END IF;
5577
5578 RETURN geom;
5579END;
5580$$
5581LANGUAGE 'plpgsql' IMMUTABLE STRICT _PARALLEL;
5582
5583--
5584-- SFSQL 1.1
5585--
5586-- BdMPolyFromText(multiLineStringTaggedText String, SRID Integer): MultiPolygon
5587--
5588-- Construct a MultiPolygon given an arbitrary
5589-- collection of closed linestrings as a
5590-- MultiLineString text representation.
5591--
5592-- This is a PLPGSQL function rather then an SQL function
5593-- To raise an exception in case of invalid input.
5594--
5595
5596-- Availability: 1.2.2
5597CREATE OR REPLACE FUNCTION ST_BdMPolyFromText(text, integer)
5598RETURNS geometry
5599AS $$
5600DECLARE
5601 geomtext alias for $1;
5602 srid alias for $2;
5603 mline @extschema@.geometry;
5604 geom @extschema@.geometry;
5605BEGIN
5606 mline := @extschema@.ST_MultiLineStringFromText(geomtext, srid);
5607
5608 IF mline IS NULL
5609 THEN
5610 RAISE EXCEPTION 'Input is not a MultiLinestring';
5611 END IF;
5612
5613 geom := @extschema@.ST_Multi(@extschema@.ST_BuildArea(mline));
5614
5615 RETURN geom;
5616END;
5617$$
5618LANGUAGE 'plpgsql' IMMUTABLE STRICT _PARALLEL;
5619
5620/* Should we include the .sql directly here ? */
5621#include "long_xact.sql.in"
5622#include "geography.sql.in"
5623
5624-- Availability: 2.2.0
5625CREATE OR REPLACE FUNCTION ST_DistanceSphere(geom1 geometry, geom2 geometry)
5626 RETURNS FLOAT8 AS
5627 'select @extschema@.ST_distance( @extschema@.geography($1), @extschema@.geography($2),false)'
5628 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5629
5630---------------------------------------------------------------
5631-- GEOMETRY_COLUMNS view support functions
5632---------------------------------------------------------------
5633-- New helper function so we can keep list of valid geometry types in one place --
5634-- Maps old names to pramsey beautiful names but can take old name or new name as input
5635-- By default returns new name but can be overridden to return old name for old constraint like support
5636CREATE OR REPLACE FUNCTION postgis_type_name(geomname varchar, coord_dimension integer, use_new_name boolean DEFAULT true)
5637 RETURNS varchar
5638AS
5639$$
5640 SELECT CASE WHEN $3 THEN new_name ELSE old_name END As geomname
5641 FROM
5642 ( VALUES
5643 ('GEOMETRY', 'Geometry', 2),
5644 ('GEOMETRY', 'GeometryZ', 3),
5645 ('GEOMETRYM', 'GeometryM', 3),
5646 ('GEOMETRY', 'GeometryZM', 4),
5647
5648 ('GEOMETRYCOLLECTION', 'GeometryCollection', 2),
5649 ('GEOMETRYCOLLECTION', 'GeometryCollectionZ', 3),
5650 ('GEOMETRYCOLLECTIONM', 'GeometryCollectionM', 3),
5651 ('GEOMETRYCOLLECTION', 'GeometryCollectionZM', 4),
5652
5653 ('POINT', 'Point', 2),
5654 ('POINT', 'PointZ', 3),
5655 ('POINTM','PointM', 3),
5656 ('POINT', 'PointZM', 4),
5657
5658 ('MULTIPOINT','MultiPoint', 2),
5659 ('MULTIPOINT','MultiPointZ', 3),
5660 ('MULTIPOINTM','MultiPointM', 3),
5661 ('MULTIPOINT','MultiPointZM', 4),
5662
5663 ('POLYGON', 'Polygon', 2),
5664 ('POLYGON', 'PolygonZ', 3),
5665 ('POLYGONM', 'PolygonM', 3),
5666 ('POLYGON', 'PolygonZM', 4),
5667
5668 ('MULTIPOLYGON', 'MultiPolygon', 2),
5669 ('MULTIPOLYGON', 'MultiPolygonZ', 3),
5670 ('MULTIPOLYGONM', 'MultiPolygonM', 3),
5671 ('MULTIPOLYGON', 'MultiPolygonZM', 4),
5672
5673 ('MULTILINESTRING', 'MultiLineString', 2),
5674 ('MULTILINESTRING', 'MultiLineStringZ', 3),
5675 ('MULTILINESTRINGM', 'MultiLineStringM', 3),
5676 ('MULTILINESTRING', 'MultiLineStringZM', 4),
5677
5678 ('LINESTRING', 'LineString', 2),
5679 ('LINESTRING', 'LineStringZ', 3),
5680 ('LINESTRINGM', 'LineStringM', 3),
5681 ('LINESTRING', 'LineStringZM', 4),
5682
5683 ('CIRCULARSTRING', 'CircularString', 2),
5684 ('CIRCULARSTRING', 'CircularStringZ', 3),
5685 ('CIRCULARSTRINGM', 'CircularStringM' ,3),
5686 ('CIRCULARSTRING', 'CircularStringZM', 4),
5687
5688 ('COMPOUNDCURVE', 'CompoundCurve', 2),
5689 ('COMPOUNDCURVE', 'CompoundCurveZ', 3),
5690 ('COMPOUNDCURVEM', 'CompoundCurveM', 3),
5691 ('COMPOUNDCURVE', 'CompoundCurveZM', 4),
5692
5693 ('CURVEPOLYGON', 'CurvePolygon', 2),
5694 ('CURVEPOLYGON', 'CurvePolygonZ', 3),
5695 ('CURVEPOLYGONM', 'CurvePolygonM', 3),
5696 ('CURVEPOLYGON', 'CurvePolygonZM', 4),
5697
5698 ('MULTICURVE', 'MultiCurve', 2),
5699 ('MULTICURVE', 'MultiCurveZ', 3),
5700 ('MULTICURVEM', 'MultiCurveM', 3),
5701 ('MULTICURVE', 'MultiCurveZM', 4),
5702
5703 ('MULTISURFACE', 'MultiSurface', 2),
5704 ('MULTISURFACE', 'MultiSurfaceZ', 3),
5705 ('MULTISURFACEM', 'MultiSurfaceM', 3),
5706 ('MULTISURFACE', 'MultiSurfaceZM', 4),
5707
5708 ('POLYHEDRALSURFACE', 'PolyhedralSurface', 2),
5709 ('POLYHEDRALSURFACE', 'PolyhedralSurfaceZ', 3),
5710 ('POLYHEDRALSURFACEM', 'PolyhedralSurfaceM', 3),
5711 ('POLYHEDRALSURFACE', 'PolyhedralSurfaceZM', 4),
5712
5713 ('TRIANGLE', 'Triangle', 2),
5714 ('TRIANGLE', 'TriangleZ', 3),
5715 ('TRIANGLEM', 'TriangleM', 3),
5716 ('TRIANGLE', 'TriangleZM', 4),
5717
5718 ('TIN', 'Tin', 2),
5719 ('TIN', 'TinZ', 3),
5720 ('TINM', 'TinM', 3),
5721 ('TIN', 'TinZM', 4) )
5722 As g(old_name, new_name, coord_dimension)
5723 WHERE (upper(old_name) = upper($1) OR upper(new_name) = upper($1))
5724 AND coord_dimension = $2;
5725$$
5726LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL _COST_HIGH;
5727
5728-- Availability: 2.0.0
5729-- TODO: Can't deprecate this because UpdateGeometrySRID still uses them
5730CREATE OR REPLACE FUNCTION postgis_constraint_srid(geomschema text, geomtable text, geomcolumn text) RETURNS integer AS
5731$$
5732SELECT replace(replace(split_part(s.consrc, ' = ', 2), ')', ''), '(', '')::integer
5733 FROM pg_class c, pg_namespace n, pg_attribute a
5734 , (SELECT connamespace, conrelid, conkey, pg_get_constraintdef(oid) As consrc
5735 FROM pg_constraint) AS s
5736 WHERE n.nspname = $1
5737 AND c.relname = $2
5738 AND a.attname = $3
5739 AND a.attrelid = c.oid
5740 AND s.connamespace = n.oid
5741 AND s.conrelid = c.oid
5742 AND a.attnum = ANY (s.conkey)
5743 AND s.consrc LIKE '%srid(% = %';
5744$$
5745LANGUAGE 'sql' STABLE STRICT _PARALLEL _COST_MEDIUM;
5746
5747-- Availability: 2.0.0
5748-- TODO: Can't deprecate this because UpdateGeometrySRID still uses them
5749CREATE OR REPLACE FUNCTION postgis_constraint_dims(geomschema text, geomtable text, geomcolumn text) RETURNS integer AS
5750$$
5751SELECT replace(split_part(s.consrc, ' = ', 2), ')', '')::integer
5752 FROM pg_class c, pg_namespace n, pg_attribute a
5753 , (SELECT connamespace, conrelid, conkey, pg_get_constraintdef(oid) As consrc
5754 FROM pg_constraint) AS s
5755 WHERE n.nspname = $1
5756 AND c.relname = $2
5757 AND a.attname = $3
5758 AND a.attrelid = c.oid
5759 AND s.connamespace = n.oid
5760 AND s.conrelid = c.oid
5761 AND a.attnum = ANY (s.conkey)
5762 AND s.consrc LIKE '%ndims(% = %';
5763$$
5764LANGUAGE 'sql' STABLE STRICT _PARALLEL _COST_MEDIUM;
5765
5766-- support function to pull out geometry type from constraint check
5767-- will return pretty name instead of ugly name
5768-- Availability: 2.0.0
5769-- TODO: Can't deprecate this because UpdateGeometrySRID still uses them
5770CREATE OR REPLACE FUNCTION postgis_constraint_type(geomschema text, geomtable text, geomcolumn text) RETURNS varchar AS
5771$$
5772SELECT replace(split_part(s.consrc, '''', 2), ')', '')::varchar
5773 FROM pg_class c, pg_namespace n, pg_attribute a
5774 , (SELECT connamespace, conrelid, conkey, pg_get_constraintdef(oid) As consrc
5775 FROM pg_constraint) AS s
5776 WHERE n.nspname = $1
5777 AND c.relname = $2
5778 AND a.attname = $3
5779 AND a.attrelid = c.oid
5780 AND s.connamespace = n.oid
5781 AND s.conrelid = c.oid
5782 AND a.attnum = ANY (s.conkey)
5783 AND s.consrc LIKE '%geometrytype(% = %';
5784$$
5785LANGUAGE 'sql' STABLE STRICT _PARALLEL _COST_MEDIUM;
5786
5787-- Availability: 2.0.0
5788-- Changed: 2.1.8 significant performance improvement for constraint based columns
5789-- Changed: 2.2.0 get rid of schema, table, column cast to improve performance
5790-- Changed: 2.4.0 List also Parent partitioned tables
5791-- Changed: 2.5.2 replace use of pg_constraint.consrc with pg_get_constraintdef, consrc removed pg12
5792
5793CREATE OR REPLACE VIEW geometry_columns AS
5794 SELECT current_database()::character varying(256) AS f_table_catalog,
5795 n.nspname AS f_table_schema,
5796 c.relname AS f_table_name,
5797 a.attname AS f_geometry_column,
5798 COALESCE(postgis_typmod_dims(a.atttypmod), sn.ndims, 2) AS coord_dimension,
5799 COALESCE(NULLIF(postgis_typmod_srid(a.atttypmod), 0), sr.srid, 0) AS srid,
5800 replace(replace(COALESCE(NULLIF(upper(postgis_typmod_type(a.atttypmod)), 'GEOMETRY'::text), st.type, 'GEOMETRY'::text), 'ZM'::text, ''::text), 'Z'::text, ''::text)::character varying(30) AS type
5801 FROM pg_class c
5802 JOIN pg_attribute a ON a.attrelid = c.oid AND NOT a.attisdropped
5803 JOIN pg_namespace n ON c.relnamespace = n.oid
5804 JOIN pg_type t ON a.atttypid = t.oid
5805 LEFT JOIN ( SELECT s.connamespace,
5806 s.conrelid,
5807 s.conkey, replace(split_part(s.consrc, ''''::text, 2), ')'::text, ''::text) As type
5808 FROM (SELECT connamespace, conrelid, conkey, pg_get_constraintdef(oid) As consrc
5809 FROM pg_constraint) AS s
5810 WHERE s.consrc ~~* '%geometrytype(% = %'::text
5811
5812) st ON st.connamespace = n.oid AND st.conrelid = c.oid AND (a.attnum = ANY (st.conkey))
5813 LEFT JOIN ( SELECT s.connamespace,
5814 s.conrelid,
5815 s.conkey, replace(split_part(s.consrc, ' = '::text, 2), ')'::text, ''::text)::integer As ndims
5816 FROM (SELECT connamespace, conrelid, conkey, pg_get_constraintdef(oid) As consrc
5817 FROM pg_constraint) AS s
5818 WHERE s.consrc ~~* '%ndims(% = %'::text
5819
5820) sn ON sn.connamespace = n.oid AND sn.conrelid = c.oid AND (a.attnum = ANY (sn.conkey))
5821 LEFT JOIN ( SELECT s.connamespace,
5822 s.conrelid,
5823 s.conkey, replace(replace(split_part(s.consrc, ' = '::text, 2), ')'::text, ''::text), '('::text, ''::text)::integer As srid
5824 FROM (SELECT connamespace, conrelid, conkey, pg_get_constraintdef(oid) As consrc
5825 FROM pg_constraint) AS s
5826 WHERE s.consrc ~~* '%srid(% = %'::text
5827
5828) sr ON sr.connamespace = n.oid AND sr.conrelid = c.oid AND (a.attnum = ANY (sr.conkey))
5829 WHERE (c.relkind = ANY (ARRAY['r'::"char", 'v'::"char", 'm'::"char", 'f'::"char", 'p'::"char"]))
5830 AND NOT c.relname = 'raster_columns'::name AND t.typname = 'geometry'::name
5831 AND NOT pg_is_other_temp_schema(c.relnamespace) AND has_table_privilege(c.oid, 'SELECT'::text);
5832
5833-- TODO: support RETURNING and raise a WARNING
5834CREATE OR REPLACE RULE geometry_columns_insert AS
5835 ON INSERT TO geometry_columns
5836 DO INSTEAD NOTHING;
5837
5838-- TODO: raise a WARNING
5839CREATE OR REPLACE RULE geometry_columns_update AS
5840 ON UPDATE TO geometry_columns
5841 DO INSTEAD NOTHING;
5842
5843-- TODO: raise a WARNING
5844CREATE OR REPLACE RULE geometry_columns_delete AS
5845 ON DELETE TO geometry_columns
5846 DO INSTEAD NOTHING;
5847
5848---------------------------------------------------------------
5849-- 3D-functions
5850---------------------------------------------------------------
5851
5852CREATE OR REPLACE FUNCTION ST_3DDistance(geom1 geometry, geom2 geometry)
5853 RETURNS float8
5854 AS 'MODULE_PATHNAME', 'ST_3DDistance'
5855 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5856 _COST_MEDIUM;
5857
5858CREATE OR REPLACE FUNCTION ST_3DMaxDistance(geom1 geometry, geom2 geometry)
5859 RETURNS float8
5860 AS 'MODULE_PATHNAME', 'LWGEOM_maxdistance3d'
5861 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5862 _COST_MEDIUM;
5863
5864CREATE OR REPLACE FUNCTION ST_3DClosestPoint(geom1 geometry, geom2 geometry)
5865 RETURNS geometry
5866 AS 'MODULE_PATHNAME', 'LWGEOM_closestpoint3d'
5867 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5868 _COST_MEDIUM;
5869
5870CREATE OR REPLACE FUNCTION ST_3DShortestLine(geom1 geometry, geom2 geometry)
5871 RETURNS geometry
5872 AS 'MODULE_PATHNAME', 'LWGEOM_shortestline3d'
5873 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5874 _COST_MEDIUM;
5875
5876CREATE OR REPLACE FUNCTION ST_3DLongestLine(geom1 geometry, geom2 geometry)
5877 RETURNS geometry
5878 AS 'MODULE_PATHNAME', 'LWGEOM_longestline3d'
5879 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5880 _COST_MEDIUM;
5881
5882---------------------------------------------------------------
5883-- SQL-MM
5884---------------------------------------------------------------
5885-- PostGIS equivalent function: ST_ndims(geometry)
5886CREATE OR REPLACE FUNCTION ST_CoordDim(Geometry geometry)
5887 RETURNS smallint
5888 AS 'MODULE_PATHNAME', 'LWGEOM_ndims'
5889 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5890 _COST_LOW;
5891
5892--
5893-- SQL-MM
5894--
5895-- ST_CurveToLine(Geometry geometry, Tolerance float8, ToleranceType integer, Flags integer)
5896--
5897-- Converts a given geometry to a linear geometry. Each curveed
5898-- geometry or segment is converted into a linear approximation using
5899-- the given tolerance.
5900--
5901-- Semantic of tolerance depends on the `toltype` argument, which can be:
5902-- 0: Tolerance is number of segments per quadrant
5903-- 1: Tolerance is max distance between curve and line
5904-- 2: Tolerance is max angle between radii defining line vertices
5905--
5906-- Supported flags:
5907-- 1: Symmetric output (result in same vertices when inverting the curve)
5908--
5909-- Availability: 2.4.0
5910--
5911CREATE OR REPLACE FUNCTION ST_CurveToLine(geom geometry, tol float8 DEFAULT 32, toltype integer DEFAULT 0, flags integer DEFAULT 0)
5912 RETURNS geometry
5913 AS 'MODULE_PATHNAME', 'ST_CurveToLine'
5914 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5915 _COST_HIGH;
5916
5917CREATE OR REPLACE FUNCTION ST_HasArc(Geometry geometry)
5918 RETURNS boolean
5919 AS 'MODULE_PATHNAME', 'LWGEOM_has_arc'
5920 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5921 _COST_LOW;
5922
5923CREATE OR REPLACE FUNCTION ST_LineToCurve(Geometry geometry)
5924 RETURNS geometry
5925 AS 'MODULE_PATHNAME', 'LWGEOM_line_desegmentize'
5926 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5927 _COST_HIGH;
5928
5929-------------------------------------------------------------------------------
5930-- SQL/MM - SQL Functions on type ST_Point
5931-------------------------------------------------------------------------------
5932
5933-- PostGIS equivalent function: ST_MakePoint(XCoordinate float8,YCoordinate float8)
5934CREATE OR REPLACE FUNCTION ST_Point(float8, float8)
5935 RETURNS geometry
5936 AS 'MODULE_PATHNAME', 'LWGEOM_makepoint'
5937 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL _COST_LOW;
5938
5939-- PostGIS equivalent function: ST_MakePolygon(Geometry geometry)
5940CREATE OR REPLACE FUNCTION ST_Polygon(geometry, int)
5941 RETURNS geometry
5942 AS $$
5943 SELECT @extschema@.ST_SetSRID(@extschema@.ST_MakePolygon($1), $2)
5944 $$
5945 LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
5946
5947-- PostGIS equivalent function: GeomFromWKB(WKB bytea))
5948-- Note: Defaults to an SRID=-1, not 0 as per SQL/MM specs.
5949CREATE OR REPLACE FUNCTION ST_WKBToSQL(WKB bytea)
5950 RETURNS geometry
5951 AS 'MODULE_PATHNAME','LWGEOM_from_WKB'
5952 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5953 _COST_LOW;
5954
5955---
5956-- Linear referencing functions
5957---
5958-- Availability: 2.0.0
5959CREATE OR REPLACE FUNCTION ST_LocateBetween(Geometry geometry, FromMeasure float8, ToMeasure float8, LeftRightOffset float8 default 0.0)
5960 RETURNS geometry
5961 AS 'MODULE_PATHNAME', 'ST_LocateBetween'
5962 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5963 _COST_MEDIUM;
5964
5965-- Availability: 2.0.0
5966CREATE OR REPLACE FUNCTION ST_LocateAlong(Geometry geometry, Measure float8, LeftRightOffset float8 default 0.0)
5967 RETURNS geometry
5968 AS 'MODULE_PATHNAME', 'ST_LocateAlong'
5969 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5970 _COST_MEDIUM;
5971
5972-- Only accepts LINESTRING as parameters.
5973-- Availability: 1.4.0
5974CREATE OR REPLACE FUNCTION ST_LocateBetweenElevations(Geometry geometry, FromElevation float8, ToElevation float8)
5975 RETURNS geometry
5976 AS 'MODULE_PATHNAME', 'ST_LocateBetweenElevations'
5977 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5978 _COST_MEDIUM;
5979
5980-- Availability: 2.0.0
5981CREATE OR REPLACE FUNCTION ST_InterpolatePoint(Line geometry, Point geometry)
5982 RETURNS float8
5983 AS 'MODULE_PATHNAME', 'ST_InterpolatePoint'
5984 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
5985 _COST_MEDIUM;
5986
5987-- moved to separate file cause its invovled
5988#include "postgis_brin.sql.in"
5989
5990---------------------------------------------------------------
5991-- USER CONTRIBUTED
5992---------------------------------------------------------------
5993
5994-- ST_ConcaveHull and Helper functions starts here --
5995-----------------------------------------------------------------------
5996-- Contributed by Regina Obe and Leo Hsu
5997-- Availability: 2.0.0
5998-- Changed: 2.5.0
5999-----------------------------------------------------------------------
6000CREATE OR REPLACE FUNCTION _st_concavehull(param_inputgeom geometry)
6001 RETURNS geometry AS
6002$$
6003 DECLARE
6004 vexhull @extschema@.geometry;
6005 var_resultgeom @extschema@.geometry;
6006 var_inputgeom @extschema@.geometry;
6007 vexring @extschema@.geometry;
6008 cavering @extschema@.geometry;
6009 cavept @extschema@.geometry[];
6010 seglength double precision;
6011 var_tempgeom @extschema@.geometry;
6012 scale_factor float := 1;
6013 i integer;
6014 BEGIN
6015 -- First compute the ConvexHull of the geometry
6016 vexhull := @extschema@.ST_ConvexHull(param_inputgeom);
6017 var_inputgeom := param_inputgeom;
6018 --A point really has no concave hull
6019 IF @extschema@.ST_GeometryType(vexhull) = 'ST_Point' OR @extschema@.ST_GeometryType(vexHull) = 'ST_LineString' THEN
6020 RETURN vexhull;
6021 END IF;
6022
6023 -- convert the hull perimeter to a linestring so we can manipulate individual points
6024 vexring := CASE WHEN @extschema@.ST_GeometryType(vexhull) = 'ST_LineString' THEN vexhull ELSE @extschema@.ST_ExteriorRing(vexhull) END;
6025 IF abs(@extschema@.ST_X(@extschema@.ST_PointN(vexring,1))) < 1 THEN --scale the geometry to prevent stupid precision errors - not sure it works so make low for now
6026 scale_factor := 100;
6027 vexring := @extschema@.ST_Scale(vexring, scale_factor,scale_factor);
6028 var_inputgeom := @extschema@.ST_Scale(var_inputgeom, scale_factor, scale_factor);
6029 --RAISE NOTICE 'Scaling';
6030 END IF;
6031 seglength := @extschema@.ST_Length(vexring)/least(@extschema@.ST_NPoints(vexring)*2,1000) ;
6032
6033 vexring := @extschema@.ST_Segmentize(vexring, seglength);
6034 -- find the point on the original geom that is closest to each point of the convex hull and make a new linestring out of it.
6035 cavering := @extschema@.ST_Collect(
6036 ARRAY(
6037
6038 SELECT
6039 @extschema@.ST_ClosestPoint(var_inputgeom, pt ) As the_geom
6040 FROM (
6041 SELECT @extschema@.ST_PointN(vexring, n ) As pt, n
6042 FROM
6043 generate_series(1, @extschema@.ST_NPoints(vexring) ) As n
6044 ) As pt
6045
6046 )
6047 )
6048 ;
6049
6050 var_resultgeom := @extschema@.ST_MakeLine(geom)
6051 FROM @extschema@.ST_Dump(cavering) As foo;
6052
6053 IF @extschema@.ST_IsSimple(var_resultgeom) THEN
6054 var_resultgeom := @extschema@.ST_MakePolygon(var_resultgeom);
6055 --RAISE NOTICE 'is Simple: %', var_resultgeom;
6056 ELSE /** will not result in a valid polygon -- just return convex hull **/
6057 --RAISE NOTICE 'is not Simple: %', var_resultgeom;
6058 var_resultgeom := @extschema@.ST_ConvexHull(var_resultgeom);
6059 END IF;
6060
6061 IF scale_factor > 1 THEN -- scale the result back
6062 var_resultgeom := @extschema@.ST_Scale(var_resultgeom, 1/scale_factor, 1/scale_factor);
6063 END IF;
6064
6065 -- make sure result covers original (#3638)
6066 -- Using ST_UnaryUnion since SFCGAL doesn't replace with its own implementation
6067 -- and SFCGAL one chokes for some reason
6068 var_resultgeom := @extschema@.ST_UnaryUnion(@extschema@.ST_Collect(param_inputgeom, var_resultgeom) );
6069 RETURN var_resultgeom;
6070
6071 END;
6072$$
6073LANGUAGE 'plpgsql' IMMUTABLE STRICT _PARALLEL _COST_HIGH;
6074
6075-- Availability: 2.0.0
6076-- Changed: 2.5.0
6077CREATE OR REPLACE FUNCTION ST_ConcaveHull(param_geom geometry, param_pctconvex float, param_allow_holes boolean DEFAULT false) RETURNS geometry AS
6078$$
6079 DECLARE
6080 var_convhull @extschema@.geometry := @extschema@.ST_ForceSFS(@extschema@.ST_ConvexHull(param_geom));
6081 var_param_geom @extschema@.geometry := @extschema@.ST_ForceSFS(param_geom);
6082 var_initarea float := @extschema@.ST_Area(var_convhull);
6083 var_newarea float := var_initarea;
6084 var_div integer := 6; /** this is the 1/var_div is the percent increase we will allow per geometry to keep speed decent **/
6085 var_tempgeom @extschema@.geometry;
6086 var_tempgeom2 @extschema@.geometry;
6087 var_cent @extschema@.geometry;
6088 var_geoms @extschema@.geometry[4]; /** We will cut the current geometry into 4 triangular quadrants along the centroid/extent **/
6089 var_enline @extschema@.geometry;
6090 var_resultgeom @extschema@.geometry;
6091 var_atempgeoms @extschema@.geometry[];
6092 var_buf float := 1; /** tolerance so that geometries that are right on the extent don't get accidentally clipped off **/
6093 BEGIN
6094 -- We start with convex hull as our base
6095 var_resultgeom := var_convhull;
6096
6097 IF param_pctconvex = 1 THEN
6098 -- this is the same as asking for the convex hull
6099 return var_resultgeom;
6100 ELSIF @extschema@.ST_GeometryType(var_param_geom) = 'ST_Polygon' THEN -- it is as concave as it is going to get
6101 IF param_allow_holes THEN -- leave the holes
6102 RETURN var_param_geom;
6103 ELSE -- remove the holes
6104 var_resultgeom := @extschema@.ST_MakePolygon(@extschema@.ST_ExteriorRing(var_param_geom));
6105 RETURN var_resultgeom;
6106 END IF;
6107 END IF;
6108 IF @extschema@.ST_Dimension(var_resultgeom) > 1 AND param_pctconvex BETWEEN 0 and 0.98 THEN
6109 -- get linestring that forms envelope of geometry
6110 var_enline := @extschema@.ST_Boundary(@extschema@.ST_Envelope(var_param_geom));
6111 var_buf := @extschema@.ST_Length(var_enline)/1000.0;
6112 IF @extschema@.ST_GeometryType(var_param_geom) = 'ST_MultiPoint' AND @extschema@.ST_NumGeometries(var_param_geom) BETWEEN 4 and 200 THEN
6113 -- we make polygons out of points since they are easier to cave in.
6114 -- Note we limit to between 4 and 200 points because this process is slow and gets quadratically slow
6115 var_buf := sqrt(@extschema@.ST_Area(var_convhull)*0.8/(@extschema@.ST_NumGeometries(var_param_geom)*@extschema@.ST_NumGeometries(var_param_geom)));
6116 var_atempgeoms := ARRAY(SELECT geom FROM @extschema@.ST_DumpPoints(var_param_geom));
6117 -- 5 and 10 and just fudge factors
6118 var_tempgeom := @extschema@.ST_Union(ARRAY(SELECT geom
6119 FROM (
6120 -- fuse near neighbors together
6121 SELECT DISTINCT ON (i) i, @extschema@.ST_Distance(var_atempgeoms[i],var_atempgeoms[j]), @extschema@.ST_Buffer(@extschema@.ST_MakeLine(var_atempgeoms[i], var_atempgeoms[j]) , var_buf*5, 'quad_segs=3') As geom
6122 FROM generate_series(1,array_upper(var_atempgeoms, 1)) As i
6123 INNER JOIN generate_series(1,array_upper(var_atempgeoms, 1)) As j
6124 ON (
6125 NOT @extschema@.ST_Intersects(var_atempgeoms[i],var_atempgeoms[j])
6126 AND @extschema@.ST_DWithin(var_atempgeoms[i],var_atempgeoms[j], var_buf*10)
6127 )
6128 UNION ALL
6129 -- catch the ones with no near neighbors
6130 SELECT i, 0, @extschema@.ST_Buffer(var_atempgeoms[i] , var_buf*10, 'quad_segs=3') As geom
6131 FROM generate_series(1,array_upper(var_atempgeoms, 1)) As i
6132 LEFT JOIN generate_series(ceiling(array_upper(var_atempgeoms,1)/2)::integer,array_upper(var_atempgeoms, 1)) As j
6133 ON (
6134 NOT @extschema@.ST_Intersects(var_atempgeoms[i],var_atempgeoms[j])
6135 AND @extschema@.ST_DWithin(var_atempgeoms[i],var_atempgeoms[j], var_buf*10)
6136 )
6137 WHERE j IS NULL
6138 ORDER BY 1, 2
6139 ) As foo ) );
6140 IF @extschema@.ST_IsValid(var_tempgeom) AND @extschema@.ST_GeometryType(var_tempgeom) = 'ST_Polygon' THEN
6141 var_tempgeom := @extschema@.ST_ForceSFS(@extschema@.ST_Intersection(var_tempgeom, var_convhull));
6142 IF param_allow_holes THEN
6143 var_param_geom := var_tempgeom;
6144 ELSIF @extschema@.ST_GeometryType(var_tempgeom) = 'ST_Polygon' THEN
6145 var_param_geom := @extschema@.ST_ForceSFS(@extschema@.ST_MakePolygon(@extschema@.ST_ExteriorRing(var_tempgeom)));
6146 ELSE
6147 var_param_geom := @extschema@.ST_ForceSFS(@extschema@.ST_ConvexHull(var_param_geom));
6148 END IF;
6149 -- make sure result covers original (#3638)
6150 var_param_geom := @extschema@.ST_Union(param_geom, var_param_geom);
6151 return var_param_geom;
6152 ELSIF @extschema@.ST_IsValid(var_tempgeom) THEN
6153 var_param_geom := @extschema@.ST_ForceSFS(@extschema@.ST_Intersection(var_tempgeom, var_convhull));
6154 END IF;
6155 END IF;
6156
6157 IF @extschema@.ST_GeometryType(var_param_geom) = 'ST_Polygon' THEN
6158 IF NOT param_allow_holes THEN
6159 var_param_geom := @extschema@.ST_ForceSFS(@extschema@.ST_MakePolygon(@extschema@.ST_ExteriorRing(var_param_geom)));
6160 END IF;
6161 -- make sure result covers original (#3638)
6162 --var_param_geom := @extschema@.ST_Union(param_geom, var_param_geom);
6163 return var_param_geom;
6164 END IF;
6165 var_cent := @extschema@.ST_Centroid(var_param_geom);
6166 IF (@extschema@.ST_XMax(var_enline) - @extschema@.ST_XMin(var_enline) ) > var_buf AND (@extschema@.ST_YMax(var_enline) - @extschema@.ST_YMin(var_enline) ) > var_buf THEN
6167 IF @extschema@.ST_Dwithin(@extschema@.ST_Centroid(var_convhull) , @extschema@.ST_Centroid(@extschema@.ST_Envelope(var_param_geom)), var_buf/2) THEN
6168 -- If the geometric dimension is > 1 and the object is symettric (cutting at centroid will not work -- offset a bit)
6169 var_cent := @extschema@.ST_Translate(var_cent, (@extschema@.ST_XMax(var_enline) - @extschema@.ST_XMin(var_enline))/1000, (@extschema@.ST_YMAX(var_enline) - @extschema@.ST_YMin(var_enline))/1000);
6170 ELSE
6171 -- uses closest point on geometry to centroid. I can't explain why we are doing this
6172 var_cent := @extschema@.ST_ClosestPoint(var_param_geom,var_cent);
6173 END IF;
6174 IF @extschema@.ST_DWithin(var_cent, var_enline,var_buf) THEN
6175 var_cent := @extschema@.ST_centroid(@extschema@.ST_Envelope(var_param_geom));
6176 END IF;
6177 -- break envelope into 4 triangles about the centroid of the geometry and returned the clipped geometry in each quadrant
6178 FOR i in 1 .. 4 LOOP
6179 var_geoms[i] := @extschema@.ST_MakePolygon(@extschema@.ST_MakeLine(ARRAY[@extschema@.ST_PointN(var_enline,i), @extschema@.ST_PointN(var_enline,i+1), var_cent, @extschema@.ST_PointN(var_enline,i)]));
6180 var_geoms[i] := @extschema@.ST_ForceSFS(@extschema@.ST_Intersection(var_param_geom, @extschema@.ST_Buffer(var_geoms[i],var_buf)));
6181 IF @extschema@.ST_IsValid(var_geoms[i]) THEN
6182
6183 ELSE
6184 var_geoms[i] := @extschema@.ST_BuildArea(@extschema@.ST_MakeLine(ARRAY[@extschema@.ST_PointN(var_enline,i), @extschema@.ST_PointN(var_enline,i+1), var_cent, @extschema@.ST_PointN(var_enline,i)]));
6185 END IF;
6186 END LOOP;
6187 var_tempgeom := @extschema@.ST_Union(ARRAY[@extschema@.ST_ConvexHull(var_geoms[1]), @extschema@.ST_ConvexHull(var_geoms[2]) , @extschema@.ST_ConvexHull(var_geoms[3]), @extschema@.ST_ConvexHull(var_geoms[4])]);
6188 --RAISE NOTICE 'Curr vex % ', @extschema@.ST_AsText(var_tempgeom);
6189 IF @extschema@.ST_Area(var_tempgeom) <= var_newarea AND @extschema@.ST_IsValid(var_tempgeom) THEN --AND @extschema@.ST_GeometryType(var_tempgeom) ILIKE '%Polygon'
6190
6191 var_tempgeom := @extschema@.ST_Buffer(@extschema@.ST_ConcaveHull(var_geoms[1],least(param_pctconvex + param_pctconvex/var_div),true),var_buf, 'quad_segs=2');
6192 FOR i IN 1 .. 4 LOOP
6193 var_geoms[i] := @extschema@.ST_Buffer(@extschema@.ST_ConcaveHull(var_geoms[i],least(param_pctconvex + param_pctconvex/var_div),true), var_buf, 'quad_segs=2');
6194 IF @extschema@.ST_IsValid(var_geoms[i]) Then
6195 var_tempgeom := @extschema@.ST_Union(var_tempgeom, var_geoms[i]);
6196 ELSE
6197 RAISE NOTICE 'Not valid % %', i, @extschema@.ST_AsText(var_tempgeom);
6198 var_tempgeom := @extschema@.ST_Union(var_tempgeom, @extschema@.ST_ConvexHull(var_geoms[i]));
6199 END IF;
6200 END LOOP;
6201
6202 --RAISE NOTICE 'Curr concave % ', @extschema@.ST_AsText(var_tempgeom);
6203 IF @extschema@.ST_IsValid(var_tempgeom) THEN
6204 var_resultgeom := var_tempgeom;
6205 END IF;
6206 var_newarea := @extschema@.ST_Area(var_resultgeom);
6207 ELSIF @extschema@.ST_IsValid(var_tempgeom) THEN
6208 var_resultgeom := var_tempgeom;
6209 END IF;
6210
6211 IF @extschema@.ST_NumGeometries(var_resultgeom) > 1 THEN
6212 var_tempgeom := @extschema@._ST_ConcaveHull(var_resultgeom);
6213 IF @extschema@.ST_IsValid(var_tempgeom) AND @extschema@.ST_GeometryType(var_tempgeom) ILIKE 'ST_Polygon' THEN
6214 var_resultgeom := var_tempgeom;
6215 ELSE
6216 var_resultgeom := @extschema@.ST_Buffer(var_tempgeom,var_buf, 'quad_segs=2');
6217 END IF;
6218 END IF;
6219 IF param_allow_holes = false THEN
6220 -- only keep exterior ring since we do not want holes
6221 var_resultgeom := @extschema@.ST_MakePolygon(@extschema@.ST_ExteriorRing(var_resultgeom));
6222 END IF;
6223 ELSE
6224 var_resultgeom := @extschema@.ST_Buffer(var_resultgeom,var_buf);
6225 END IF;
6226 var_resultgeom := @extschema@.ST_ForceSFS(@extschema@.ST_Intersection(var_resultgeom, @extschema@.ST_ConvexHull(var_param_geom)));
6227 ELSE
6228 -- dimensions are too small to cut
6229 var_resultgeom := @extschema@._ST_ConcaveHull(var_param_geom);
6230 END IF;
6231
6232 RETURN var_resultgeom;
6233 END;
6234$$
6235LANGUAGE 'plpgsql' IMMUTABLE STRICT _PARALLEL _COST_HIGH;
6236-- ST_ConcaveHull and Helper functions end here --
6237
6238-----------------------------------------------------------------------
6239-- X3D OUTPUT
6240-----------------------------------------------------------------------
6241-- _ST_AsX3D(version, geom, precision, option, attribs)
6242CREATE OR REPLACE FUNCTION _ST_AsX3D(int4, geometry, int4, int4, text)
6243 RETURNS TEXT
6244 AS 'MODULE_PATHNAME','LWGEOM_asX3D'
6245 LANGUAGE 'c' IMMUTABLE _PARALLEL;
6246
6247-- ST_AsX3D(geom, precision, options)
6248CREATE OR REPLACE FUNCTION ST_AsX3D(geom geometry, maxdecimaldigits integer DEFAULT 15, options integer DEFAULT 0)
6249 RETURNS TEXT
6250 AS $$SELECT @extschema@._ST_AsX3D(3,$1,$2,$3,'');$$
6251 LANGUAGE 'sql' IMMUTABLE _PARALLEL;
6252
6253-----------------------------------------------------------------------
6254-- ST_Angle
6255-----------------------------------------------------------------------
6256-- Availability: 2.3.0
6257-- has to be here because need ST_StartPoint
6258CREATE OR REPLACE FUNCTION ST_Angle(line1 geometry, line2 geometry)
6259 RETURNS float8 AS 'SELECT ST_Angle(St_StartPoint($1), ST_EndPoint($1), St_StartPoint($2), ST_EndPoint($2))'
6260 LANGUAGE 'sql' IMMUTABLE STRICT;
6261
6262-- make views and spatial_ref_sys public viewable --
6263GRANT SELECT ON TABLE geography_columns TO public;
6264GRANT SELECT ON TABLE geometry_columns TO public;
6265GRANT SELECT ON TABLE spatial_ref_sys TO public;
6266
6267-- Availability: 3.0.0
6268CREATE OR REPLACE FUNCTION ST_3DLineInterpolatePoint(geometry, float8)
6269 RETURNS geometry
6270 AS 'MODULE_PATHNAME', 'ST_3DLineInterpolatePoint'
6271 LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
6272
6273
6274-- moved to separate file cause its invovled
6275#include "postgis_spgist.sql.in"
6276
6277COMMIT;
Note: See TracBrowser for help on using the repository browser.