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