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