pgLatLon

changeset 83:037e28f426e7 v0.16

Set version to 0.16
author jbe
date Thu Oct 23 15:31:50 2025 +0200 (38 hours ago)
parents 8a08dc69de98
children 8453a4a84555
files GNUmakefile README.html README.md latlon--0.14--0.15.sql latlon--0.15--0.16.sql latlon--0.15.sql latlon--0.16.sql latlon.control
line diff
     1.1 --- a/GNUmakefile	Thu Oct 23 15:19:13 2025 +0200
     1.2 +++ b/GNUmakefile	Thu Oct 23 15:31:50 2025 +0200
     1.3 @@ -1,5 +1,5 @@
     1.4  EXTENSION = latlon
     1.5 -DATA = latlon--0.14--0.15.sql latlon--0.15.sql
     1.6 +DATA = latlon--0.15--0.16.sql latlon--0.16.sql
     1.7  MODULES = latlon-v0010
     1.8  
     1.9  PG_CONFIG = pg_config
     2.1 --- a/README.html	Thu Oct 23 15:19:13 2025 +0200
     2.2 +++ b/README.html	Thu Oct 23 15:31:50 2025 +0200
     2.3 @@ -1,5 +1,5 @@
     2.4 -<html><head><title>pgLatLon v0.15 documentation</title></head><body>
     2.5 -<h1>pgLatLon v0.15 documentation</h1>
     2.6 +<html><head><title>pgLatLon v0.16 documentation</title></head><body>
     2.7 +<h1>pgLatLon v0.16 documentation</h1>
     2.8  <p>pgLatLon is a spatial database extension for the PostgreSQL object-relational
     2.9  database management system providing geographic data types and spatial indexing
    2.10  for the WGS-84 spheroid.</p>
     3.1 --- a/README.md	Thu Oct 23 15:19:13 2025 +0200
     3.2 +++ b/README.md	Thu Oct 23 15:31:50 2025 +0200
     3.3 @@ -1,4 +1,4 @@
     3.4 -pgLatLon v0.15 documentation
     3.5 +pgLatLon v0.16 documentation
     3.6  ============================
     3.7  
     3.8  pgLatLon is a spatial database extension for the PostgreSQL object-relational
     4.1 --- a/latlon--0.14--0.15.sql	Thu Oct 23 15:19:13 2025 +0200
     4.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.3 @@ -1,1016 +0,0 @@
     4.4 -SET LOCAL search_path TO @extschema@;
     4.5 -
     4.6 -
     4.7 -------------------------------------------------------------
     4.8 --- dummy input/output functions for dummy index key types --
     4.9 -------------------------------------------------------------
    4.10 -
    4.11 -CREATE OR REPLACE FUNCTION ekey_point_in_dummy(cstring)
    4.12 -  RETURNS ekey_point
    4.13 -  LANGUAGE C IMMUTABLE STRICT
    4.14 -  AS '$libdir/latlon-v0010', 'pgl_notimpl';
    4.15 -
    4.16 -CREATE OR REPLACE FUNCTION ekey_point_out_dummy(ekey_point)
    4.17 -  RETURNS cstring
    4.18 -  LANGUAGE C IMMUTABLE STRICT
    4.19 -  AS '$libdir/latlon-v0010', 'pgl_notimpl';
    4.20 -
    4.21 -CREATE OR REPLACE FUNCTION ekey_area_in_dummy(cstring)
    4.22 -  RETURNS ekey_area
    4.23 -  LANGUAGE C IMMUTABLE STRICT
    4.24 -  AS '$libdir/latlon-v0010', 'pgl_notimpl';
    4.25 -
    4.26 -CREATE OR REPLACE FUNCTION ekey_area_out_dummy(ekey_area)
    4.27 -  RETURNS cstring
    4.28 -  LANGUAGE C IMMUTABLE STRICT
    4.29 -  AS '$libdir/latlon-v0010', 'pgl_notimpl';
    4.30 -
    4.31 -
    4.32 ---------------------------
    4.33 --- text input functions --
    4.34 ---------------------------
    4.35 -
    4.36 -CREATE OR REPLACE FUNCTION epoint_in(cstring)
    4.37 -  RETURNS epoint
    4.38 -  LANGUAGE C IMMUTABLE STRICT
    4.39 -  AS '$libdir/latlon-v0010', 'pgl_epoint_in';
    4.40 -
    4.41 -CREATE OR REPLACE FUNCTION epoint_with_sample_count_in(cstring)
    4.42 -  RETURNS epoint_with_sample_count
    4.43 -  LANGUAGE C IMMUTABLE STRICT
    4.44 -  AS '$libdir/latlon-v0010', 'pgl_epoint_with_sample_count_in';
    4.45 -
    4.46 -CREATE OR REPLACE FUNCTION ebox_in(cstring)
    4.47 -  RETURNS ebox
    4.48 -  LANGUAGE C IMMUTABLE STRICT
    4.49 -  AS '$libdir/latlon-v0010', 'pgl_ebox_in';
    4.50 -
    4.51 -CREATE OR REPLACE FUNCTION ecircle_in(cstring)
    4.52 -  RETURNS ecircle
    4.53 -  LANGUAGE C IMMUTABLE STRICT
    4.54 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_in';
    4.55 -
    4.56 -CREATE OR REPLACE FUNCTION ecluster_in(cstring)
    4.57 -  RETURNS ecluster
    4.58 -  LANGUAGE C IMMUTABLE STRICT
    4.59 -  AS '$libdir/latlon-v0010', 'pgl_ecluster_in';
    4.60 -
    4.61 -
    4.62 ----------------------------
    4.63 --- text output functions --
    4.64 ----------------------------
    4.65 -
    4.66 -CREATE OR REPLACE FUNCTION epoint_out(epoint)
    4.67 -  RETURNS cstring
    4.68 -  LANGUAGE C IMMUTABLE STRICT
    4.69 -  AS '$libdir/latlon-v0010', 'pgl_epoint_out';
    4.70 -
    4.71 -CREATE OR REPLACE FUNCTION epoint_with_sample_count_out(epoint_with_sample_count)
    4.72 -  RETURNS cstring
    4.73 -  LANGUAGE C IMMUTABLE STRICT
    4.74 -  AS '$libdir/latlon-v0010', 'pgl_epoint_with_sample_count_out';
    4.75 -
    4.76 -CREATE OR REPLACE FUNCTION ebox_out(ebox)
    4.77 -  RETURNS cstring
    4.78 -  LANGUAGE C IMMUTABLE STRICT
    4.79 -  AS '$libdir/latlon-v0010', 'pgl_ebox_out';
    4.80 -
    4.81 -CREATE OR REPLACE FUNCTION ecircle_out(ecircle)
    4.82 -  RETURNS cstring
    4.83 -  LANGUAGE C IMMUTABLE STRICT
    4.84 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_out';
    4.85 -
    4.86 -CREATE OR REPLACE FUNCTION ecluster_out(ecluster)
    4.87 -  RETURNS cstring
    4.88 -  LANGUAGE C IMMUTABLE STRICT
    4.89 -  AS '$libdir/latlon-v0010', 'pgl_ecluster_out';
    4.90 -
    4.91 -
    4.92 ---------------------------
    4.93 --- binary I/O functions --
    4.94 ---------------------------
    4.95 -
    4.96 -CREATE OR REPLACE FUNCTION epoint_recv(internal)
    4.97 -  RETURNS epoint
    4.98 -  LANGUAGE C IMMUTABLE STRICT
    4.99 -  AS '$libdir/latlon-v0010', 'pgl_epoint_recv';
   4.100 -
   4.101 -CREATE OR REPLACE FUNCTION ebox_recv(internal)
   4.102 -  RETURNS ebox
   4.103 -  LANGUAGE C IMMUTABLE STRICT
   4.104 -  AS '$libdir/latlon-v0010', 'pgl_ebox_recv';
   4.105 -
   4.106 -CREATE OR REPLACE FUNCTION ecircle_recv(internal)
   4.107 -  RETURNS ecircle
   4.108 -  LANGUAGE C IMMUTABLE STRICT
   4.109 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_recv';
   4.110 -
   4.111 -CREATE OR REPLACE FUNCTION epoint_send(epoint)
   4.112 -  RETURNS bytea
   4.113 -  LANGUAGE C IMMUTABLE STRICT
   4.114 -  AS '$libdir/latlon-v0010', 'pgl_epoint_send';
   4.115 -
   4.116 -CREATE OR REPLACE FUNCTION ebox_send(ebox)
   4.117 -  RETURNS bytea
   4.118 -  LANGUAGE C IMMUTABLE STRICT
   4.119 -  AS '$libdir/latlon-v0010', 'pgl_ebox_send';
   4.120 -
   4.121 -CREATE OR REPLACE FUNCTION ecircle_send(ecircle)
   4.122 -  RETURNS bytea
   4.123 -  LANGUAGE C IMMUTABLE STRICT
   4.124 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_send';
   4.125 -
   4.126 -
   4.127 ---------------------
   4.128 --- B-tree support --
   4.129 ---------------------
   4.130 -
   4.131 --- begin of B-tree support for epoint
   4.132 -
   4.133 -CREATE OR REPLACE FUNCTION epoint_btree_lt(epoint, epoint)
   4.134 -  RETURNS boolean
   4.135 -  LANGUAGE C IMMUTABLE STRICT
   4.136 -  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_lt';
   4.137 -
   4.138 -CREATE OR REPLACE FUNCTION epoint_btree_le(epoint, epoint)
   4.139 -  RETURNS boolean
   4.140 -  LANGUAGE C IMMUTABLE STRICT
   4.141 -  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_le';
   4.142 -
   4.143 -CREATE OR REPLACE FUNCTION epoint_btree_eq(epoint, epoint)
   4.144 -  RETURNS boolean
   4.145 -  LANGUAGE C IMMUTABLE STRICT
   4.146 -  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_eq';
   4.147 -
   4.148 -CREATE OR REPLACE FUNCTION epoint_btree_ne(epoint, epoint)
   4.149 -  RETURNS boolean
   4.150 -  LANGUAGE C IMMUTABLE STRICT
   4.151 -  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_ne';
   4.152 -
   4.153 -CREATE OR REPLACE FUNCTION epoint_btree_ge(epoint, epoint)
   4.154 -  RETURNS boolean
   4.155 -  LANGUAGE C IMMUTABLE STRICT
   4.156 -  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_ge';
   4.157 -
   4.158 -CREATE OR REPLACE FUNCTION epoint_btree_gt(epoint, epoint)
   4.159 -  RETURNS boolean
   4.160 -  LANGUAGE C IMMUTABLE STRICT
   4.161 -  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_gt';
   4.162 -
   4.163 -CREATE OR REPLACE FUNCTION epoint_btree_cmp(epoint, epoint)
   4.164 -  RETURNS int4
   4.165 -  LANGUAGE C IMMUTABLE STRICT
   4.166 -  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_cmp';
   4.167 -
   4.168 --- end of B-tree support for epoint
   4.169 -
   4.170 --- begin of B-tree support for ebox
   4.171 -
   4.172 -CREATE OR REPLACE FUNCTION ebox_btree_lt(ebox, ebox)
   4.173 -  RETURNS boolean
   4.174 -  LANGUAGE C IMMUTABLE STRICT
   4.175 -  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_lt';
   4.176 -
   4.177 -CREATE OR REPLACE FUNCTION ebox_btree_le(ebox, ebox)
   4.178 -  RETURNS boolean
   4.179 -  LANGUAGE C IMMUTABLE STRICT
   4.180 -  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_le';
   4.181 -
   4.182 -CREATE OR REPLACE FUNCTION ebox_btree_eq(ebox, ebox)
   4.183 -  RETURNS boolean
   4.184 -  LANGUAGE C IMMUTABLE STRICT
   4.185 -  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_eq';
   4.186 -
   4.187 -CREATE OR REPLACE FUNCTION ebox_btree_ne(ebox, ebox)
   4.188 -  RETURNS boolean
   4.189 -  LANGUAGE C IMMUTABLE STRICT
   4.190 -  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_ne';
   4.191 -
   4.192 -CREATE OR REPLACE FUNCTION ebox_btree_ge(ebox, ebox)
   4.193 -  RETURNS boolean
   4.194 -  LANGUAGE C IMMUTABLE STRICT
   4.195 -  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_ge';
   4.196 -
   4.197 -CREATE OR REPLACE FUNCTION ebox_btree_gt(ebox, ebox)
   4.198 -  RETURNS boolean
   4.199 -  LANGUAGE C IMMUTABLE STRICT
   4.200 -  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_gt';
   4.201 -
   4.202 -CREATE OR REPLACE FUNCTION ebox_btree_cmp(ebox, ebox)
   4.203 -  RETURNS int4
   4.204 -  LANGUAGE C IMMUTABLE STRICT
   4.205 -  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_cmp';
   4.206 -
   4.207 --- end of B-tree support for ebox
   4.208 -
   4.209 --- begin of B-tree support for ecircle
   4.210 -
   4.211 -CREATE OR REPLACE FUNCTION ecircle_btree_lt(ecircle, ecircle)
   4.212 -  RETURNS boolean
   4.213 -  LANGUAGE C IMMUTABLE STRICT
   4.214 -  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_lt';
   4.215 -
   4.216 -CREATE OR REPLACE FUNCTION ecircle_btree_le(ecircle, ecircle)
   4.217 -  RETURNS boolean
   4.218 -  LANGUAGE C IMMUTABLE STRICT
   4.219 -  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_le';
   4.220 -
   4.221 -CREATE OR REPLACE FUNCTION ecircle_btree_eq(ecircle, ecircle)
   4.222 -  RETURNS boolean
   4.223 -  LANGUAGE C IMMUTABLE STRICT
   4.224 -  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_eq';
   4.225 -
   4.226 -CREATE OR REPLACE FUNCTION ecircle_btree_ne(ecircle, ecircle)
   4.227 -  RETURNS boolean
   4.228 -  LANGUAGE C IMMUTABLE STRICT
   4.229 -  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_ne';
   4.230 -
   4.231 -CREATE OR REPLACE FUNCTION ecircle_btree_ge(ecircle, ecircle)
   4.232 -  RETURNS boolean
   4.233 -  LANGUAGE C IMMUTABLE STRICT
   4.234 -  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_ge';
   4.235 -
   4.236 -CREATE OR REPLACE FUNCTION ecircle_btree_gt(ecircle, ecircle)
   4.237 -  RETURNS boolean
   4.238 -  LANGUAGE C IMMUTABLE STRICT
   4.239 -  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_gt';
   4.240 -
   4.241 -CREATE OR REPLACE FUNCTION ecircle_btree_cmp(ecircle, ecircle)
   4.242 -  RETURNS int4
   4.243 -  LANGUAGE C IMMUTABLE STRICT
   4.244 -  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_cmp';
   4.245 -
   4.246 --- end of B-tree support for ecircle
   4.247 -
   4.248 -
   4.249 -----------------
   4.250 --- type casts --
   4.251 -----------------
   4.252 -
   4.253 -CREATE OR REPLACE FUNCTION cast_epoint_to_ebox(epoint)
   4.254 -  RETURNS ebox
   4.255 -  LANGUAGE C IMMUTABLE STRICT
   4.256 -  AS '$libdir/latlon-v0010', 'pgl_epoint_to_ebox';
   4.257 -
   4.258 -CREATE OR REPLACE FUNCTION cast_epoint_to_ecircle(epoint)
   4.259 -  RETURNS ecircle
   4.260 -  LANGUAGE C IMMUTABLE STRICT
   4.261 -  AS '$libdir/latlon-v0010', 'pgl_epoint_to_ecircle';
   4.262 -
   4.263 -CREATE OR REPLACE FUNCTION cast_epoint_to_ecluster(epoint)
   4.264 -  RETURNS ecluster
   4.265 -  LANGUAGE C IMMUTABLE STRICT
   4.266 -  AS '$libdir/latlon-v0010', 'pgl_epoint_to_ecluster';
   4.267 -
   4.268 -CREATE OR REPLACE FUNCTION cast_ebox_to_ecluster(ebox)
   4.269 -  RETURNS ecluster
   4.270 -  LANGUAGE C IMMUTABLE STRICT
   4.271 -  AS '$libdir/latlon-v0010', 'pgl_ebox_to_ecluster';
   4.272 -
   4.273 -
   4.274 ----------------------------
   4.275 --- constructor functions --
   4.276 ----------------------------
   4.277 -
   4.278 -CREATE OR REPLACE FUNCTION epoint(float8, float8)
   4.279 -  RETURNS epoint
   4.280 -  LANGUAGE C IMMUTABLE STRICT
   4.281 -  AS '$libdir/latlon-v0010', 'pgl_create_epoint';
   4.282 -
   4.283 -CREATE OR REPLACE FUNCTION epoint_latlon(float8, float8)
   4.284 -  RETURNS epoint
   4.285 -  LANGUAGE SQL IMMUTABLE STRICT AS $$
   4.286 -    SELECT @extschema@.epoint($1, $2)
   4.287 -  $$;
   4.288 -
   4.289 -CREATE OR REPLACE FUNCTION epoint_lonlat(float8, float8)
   4.290 -  RETURNS epoint
   4.291 -  LANGUAGE SQL IMMUTABLE STRICT AS $$
   4.292 -    SELECT @extschema@.epoint($2, $1)
   4.293 -  $$;
   4.294 -
   4.295 -CREATE OR REPLACE FUNCTION epoint_with_sample_count(epoint, int4)
   4.296 -  RETURNS epoint_with_sample_count
   4.297 -  LANGUAGE C IMMUTABLE STRICT
   4.298 -  AS '$libdir/latlon-v0010', 'pgl_create_epoint_with_sample_count';
   4.299 -
   4.300 -CREATE OR REPLACE FUNCTION empty_ebox()
   4.301 -  RETURNS ebox
   4.302 -  LANGUAGE C IMMUTABLE STRICT
   4.303 -  AS '$libdir/latlon-v0010', 'pgl_create_empty_ebox';
   4.304 -
   4.305 -CREATE OR REPLACE FUNCTION ebox(float8, float8, float8, float8)
   4.306 -  RETURNS ebox
   4.307 -  LANGUAGE C IMMUTABLE STRICT
   4.308 -  AS '$libdir/latlon-v0010', 'pgl_create_ebox';
   4.309 -
   4.310 -CREATE OR REPLACE FUNCTION ebox(epoint, epoint)
   4.311 -  RETURNS ebox
   4.312 -  LANGUAGE C IMMUTABLE STRICT
   4.313 -  AS '$libdir/latlon-v0010', 'pgl_create_ebox_from_epoints';
   4.314 -
   4.315 -CREATE OR REPLACE FUNCTION ecircle(float8, float8, float8)
   4.316 -  RETURNS ecircle
   4.317 -  LANGUAGE C IMMUTABLE STRICT
   4.318 -  AS '$libdir/latlon-v0010', 'pgl_create_ecircle';
   4.319 -
   4.320 -CREATE OR REPLACE FUNCTION ecircle(epoint, float8)
   4.321 -  RETURNS ecircle
   4.322 -  LANGUAGE C IMMUTABLE STRICT
   4.323 -  AS '$libdir/latlon-v0010', 'pgl_create_ecircle_from_epoint';
   4.324 -
   4.325 -CREATE OR REPLACE FUNCTION ecluster_concat(ecluster[])
   4.326 -  RETURNS ecluster
   4.327 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   4.328 -    SELECT pg_catalog.array_to_string($1, ' ')::@extschema@.ecluster
   4.329 -  $$;
   4.330 -
   4.331 -CREATE OR REPLACE FUNCTION ecluster_concat(ecluster, ecluster)
   4.332 -  RETURNS ecluster
   4.333 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   4.334 -    SELECT (
   4.335 -      $1::pg_catalog.text OPERATOR(pg_catalog.||) ' ' OPERATOR(pg_catalog.||)
   4.336 -      $2::pg_catalog.text
   4.337 -    )::@extschema@.ecluster
   4.338 -  $$;
   4.339 -
   4.340 -CREATE OR REPLACE FUNCTION ecluster_create_multipoint(epoint[])
   4.341 -  RETURNS ecluster
   4.342 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   4.343 -    SELECT
   4.344 -      pg_catalog.array_to_string(
   4.345 -        pg_catalog.array_agg(
   4.346 -          'point (' OPERATOR(pg_catalog.||) unnest OPERATOR(pg_catalog.||) ')'
   4.347 -        ),
   4.348 -        ' '
   4.349 -      )::@extschema@.ecluster
   4.350 -    FROM pg_catalog.unnest($1)
   4.351 -  $$;
   4.352 -
   4.353 -CREATE OR REPLACE FUNCTION ecluster_create_path(epoint[])
   4.354 -  RETURNS ecluster
   4.355 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   4.356 -    SELECT CASE WHEN "str" OPERATOR(pg_catalog.=) '' THEN
   4.357 -      'empty'::@extschema@.ecluster
   4.358 -    ELSE
   4.359 -      (
   4.360 -        'path (' OPERATOR(pg_catalog.||) "str" OPERATOR(pg_catalog.||) ')'
   4.361 -      )::@extschema@.ecluster
   4.362 -    END
   4.363 -    FROM pg_catalog.array_to_string($1, ' ') AS "str"
   4.364 -  $$;
   4.365 -
   4.366 -CREATE OR REPLACE FUNCTION ecluster_create_outline(epoint[])
   4.367 -  RETURNS ecluster
   4.368 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   4.369 -    SELECT CASE WHEN "str" OPERATOR(pg_catalog.=) '' THEN
   4.370 -      'empty'::@extschema@.ecluster
   4.371 -    ELSE
   4.372 -      (
   4.373 -        'outline (' OPERATOR(pg_catalog.||) "str" OPERATOR(pg_catalog.||) ')'
   4.374 -      )::@extschema@.ecluster
   4.375 -    END
   4.376 -    FROM pg_catalog.array_to_string($1, ' ') AS "str"
   4.377 -  $$;
   4.378 -
   4.379 -CREATE OR REPLACE FUNCTION ecluster_create_polygon(epoint[])
   4.380 -  RETURNS ecluster
   4.381 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   4.382 -    SELECT CASE WHEN "str" OPERATOR(pg_catalog.=) '' THEN
   4.383 -      'empty'::@extschema@.ecluster
   4.384 -    ELSE
   4.385 -      (
   4.386 -        'polygon (' OPERATOR(pg_catalog.||) pg_catalog.array_to_string($1, ' ')
   4.387 -        OPERATOR(pg_catalog.||) ')'
   4.388 -      )::@extschema@.ecluster
   4.389 -    END
   4.390 -    FROM pg_catalog.array_to_string($1, ' ') AS "str"
   4.391 -  $$;
   4.392 -
   4.393 -
   4.394 -----------------------
   4.395 --- getter functions --
   4.396 -----------------------
   4.397 -
   4.398 -CREATE OR REPLACE FUNCTION latitude(epoint)
   4.399 -  RETURNS float8
   4.400 -  LANGUAGE C IMMUTABLE STRICT
   4.401 -  AS '$libdir/latlon-v0010', 'pgl_epoint_lat';
   4.402 -
   4.403 -CREATE OR REPLACE FUNCTION longitude(epoint)
   4.404 -  RETURNS float8
   4.405 -  LANGUAGE C IMMUTABLE STRICT
   4.406 -  AS '$libdir/latlon-v0010', 'pgl_epoint_lon';
   4.407 -
   4.408 -CREATE OR REPLACE FUNCTION min_latitude(ebox)
   4.409 -  RETURNS float8
   4.410 -  LANGUAGE C IMMUTABLE STRICT
   4.411 -  AS '$libdir/latlon-v0010', 'pgl_ebox_lat_min';
   4.412 -
   4.413 -CREATE OR REPLACE FUNCTION max_latitude(ebox)
   4.414 -  RETURNS float8
   4.415 -  LANGUAGE C IMMUTABLE STRICT
   4.416 -  AS '$libdir/latlon-v0010', 'pgl_ebox_lat_max';
   4.417 -
   4.418 -CREATE OR REPLACE FUNCTION min_longitude(ebox)
   4.419 -  RETURNS float8
   4.420 -  LANGUAGE C IMMUTABLE STRICT
   4.421 -  AS '$libdir/latlon-v0010', 'pgl_ebox_lon_min';
   4.422 -
   4.423 -CREATE OR REPLACE FUNCTION max_longitude(ebox)
   4.424 -  RETURNS float8
   4.425 -  LANGUAGE C IMMUTABLE STRICT
   4.426 -  AS '$libdir/latlon-v0010', 'pgl_ebox_lon_max';
   4.427 -
   4.428 -CREATE OR REPLACE FUNCTION center(ecircle)
   4.429 -  RETURNS epoint
   4.430 -  LANGUAGE C IMMUTABLE STRICT
   4.431 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_center';
   4.432 -
   4.433 -CREATE OR REPLACE FUNCTION radius(ecircle)
   4.434 -  RETURNS float8
   4.435 -  LANGUAGE C IMMUTABLE STRICT
   4.436 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_radius';
   4.437 -
   4.438 -CREATE OR REPLACE FUNCTION ecluster_extract_points(ecluster)
   4.439 -  RETURNS SETOF epoint
   4.440 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   4.441 -    SELECT "match"[2]::@extschema@.epoint
   4.442 -    FROM pg_catalog.regexp_matches(
   4.443 -      $1::pg_catalog.text, e'(^| )point \\(([^)]+)\\)', 'g'
   4.444 -    ) AS "match"
   4.445 -  $$;
   4.446 -
   4.447 -CREATE OR REPLACE FUNCTION ecluster_extract_paths(ecluster)
   4.448 -  RETURNS SETOF epoint[]
   4.449 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   4.450 -    SELECT (
   4.451 -      SELECT pg_catalog.array_agg("m2"[1]::@extschema@.epoint)
   4.452 -      FROM pg_catalog.regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
   4.453 -    )
   4.454 -    FROM pg_catalog.regexp_matches(
   4.455 -      $1::pg_catalog.text, e'(^| )path \\(([^)]+)\\)', 'g'
   4.456 -    ) AS "m1"
   4.457 -  $$;
   4.458 -
   4.459 -CREATE OR REPLACE FUNCTION ecluster_extract_outlines(ecluster)
   4.460 -  RETURNS SETOF epoint[]
   4.461 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   4.462 -    SELECT (
   4.463 -      SELECT pg_catalog.array_agg("m2"[1]::@extschema@.epoint)
   4.464 -      FROM pg_catalog.regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
   4.465 -    )
   4.466 -    FROM pg_catalog.regexp_matches(
   4.467 -      $1::pg_catalog.text, e'(^| )outline \\(([^)]+)\\)', 'g'
   4.468 -    ) AS "m1"
   4.469 -  $$;
   4.470 -
   4.471 -CREATE OR REPLACE FUNCTION ecluster_extract_polygons(ecluster)
   4.472 -  RETURNS SETOF epoint[]
   4.473 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   4.474 -    SELECT (
   4.475 -      SELECT pg_catalog.array_agg("m2"[1]::@extschema@.epoint)
   4.476 -      FROM pg_catalog.regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
   4.477 -    )
   4.478 -    FROM pg_catalog.regexp_matches(
   4.479 -      $1::pg_catalog.text, e'(^| )polygon \\(([^)]+)\\)', 'g'
   4.480 -    ) AS "m1"
   4.481 -  $$;
   4.482 -
   4.483 -
   4.484 ----------------
   4.485 --- operators --
   4.486 ----------------
   4.487 -
   4.488 -CREATE OR REPLACE FUNCTION epoint_ebox_overlap_proc(epoint, ebox)
   4.489 -  RETURNS boolean
   4.490 -  LANGUAGE C IMMUTABLE STRICT
   4.491 -  AS '$libdir/latlon-v0010', 'pgl_epoint_ebox_overlap';
   4.492 -
   4.493 -CREATE OR REPLACE FUNCTION epoint_ecircle_overlap_proc(epoint, ecircle)
   4.494 -  RETURNS boolean
   4.495 -  LANGUAGE C IMMUTABLE STRICT
   4.496 -  AS '$libdir/latlon-v0010', 'pgl_epoint_ecircle_overlap';
   4.497 -
   4.498 -CREATE OR REPLACE FUNCTION epoint_ecluster_overlap_proc(epoint, ecluster)
   4.499 -  RETURNS boolean
   4.500 -  LANGUAGE C IMMUTABLE STRICT
   4.501 -  AS '$libdir/latlon-v0010', 'pgl_epoint_ecluster_overlap';
   4.502 -
   4.503 -CREATE OR REPLACE FUNCTION epoint_ecluster_may_overlap_proc(epoint, ecluster)
   4.504 -  RETURNS boolean
   4.505 -  LANGUAGE C IMMUTABLE STRICT
   4.506 -  AS '$libdir/latlon-v0010', 'pgl_epoint_ecluster_may_overlap';
   4.507 -
   4.508 -CREATE OR REPLACE FUNCTION ebox_overlap_proc(ebox, ebox)
   4.509 -  RETURNS boolean
   4.510 -  LANGUAGE C IMMUTABLE STRICT
   4.511 -  AS '$libdir/latlon-v0010', 'pgl_ebox_overlap';
   4.512 -
   4.513 -CREATE OR REPLACE FUNCTION ebox_ecircle_may_overlap_proc(ebox, ecircle)
   4.514 -  RETURNS boolean
   4.515 -  LANGUAGE C IMMUTABLE STRICT
   4.516 -  AS '$libdir/latlon-v0010', 'pgl_ebox_ecircle_may_overlap';
   4.517 -
   4.518 -CREATE OR REPLACE FUNCTION ebox_ecluster_may_overlap_proc(ebox, ecluster)
   4.519 -  RETURNS boolean
   4.520 -  LANGUAGE C IMMUTABLE STRICT
   4.521 -  AS '$libdir/latlon-v0010', 'pgl_ebox_ecluster_may_overlap';
   4.522 -
   4.523 -CREATE OR REPLACE FUNCTION ecircle_overlap_proc(ecircle, ecircle)
   4.524 -  RETURNS boolean
   4.525 -  LANGUAGE C IMMUTABLE STRICT
   4.526 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_overlap';
   4.527 -
   4.528 -CREATE OR REPLACE FUNCTION ecircle_ecluster_overlap_proc(ecircle, ecluster)
   4.529 -  RETURNS boolean
   4.530 -  LANGUAGE C IMMUTABLE STRICT
   4.531 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_ecluster_overlap';
   4.532 -
   4.533 -CREATE OR REPLACE FUNCTION ecircle_ecluster_may_overlap_proc(ecircle, ecluster)
   4.534 -  RETURNS boolean
   4.535 -  LANGUAGE C IMMUTABLE STRICT
   4.536 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_ecluster_may_overlap';
   4.537 -
   4.538 -CREATE OR REPLACE FUNCTION ecluster_overlap_proc(ecluster, ecluster)
   4.539 -  RETURNS boolean
   4.540 -  LANGUAGE C IMMUTABLE STRICT
   4.541 -  AS '$libdir/latlon-v0010', 'pgl_ecluster_overlap';
   4.542 -
   4.543 -CREATE OR REPLACE FUNCTION ecluster_may_overlap_proc(ecluster, ecluster)
   4.544 -  RETURNS boolean
   4.545 -  LANGUAGE C IMMUTABLE STRICT
   4.546 -  AS '$libdir/latlon-v0010', 'pgl_ecluster_may_overlap';
   4.547 -
   4.548 -CREATE OR REPLACE FUNCTION ecluster_contains_proc(ecluster, ecluster)
   4.549 -  RETURNS boolean
   4.550 -  LANGUAGE C IMMUTABLE STRICT
   4.551 -  AS '$libdir/latlon-v0010', 'pgl_ecluster_contains';
   4.552 -
   4.553 -CREATE OR REPLACE FUNCTION epoint_distance_proc(epoint, epoint)
   4.554 -  RETURNS float8
   4.555 -  LANGUAGE C IMMUTABLE STRICT
   4.556 -  AS '$libdir/latlon-v0010', 'pgl_epoint_distance';
   4.557 -
   4.558 -CREATE OR REPLACE FUNCTION epoint_ecircle_distance_proc(epoint, ecircle)
   4.559 -  RETURNS float8
   4.560 -  LANGUAGE C IMMUTABLE STRICT
   4.561 -  AS '$libdir/latlon-v0010', 'pgl_epoint_ecircle_distance';
   4.562 -
   4.563 -CREATE OR REPLACE FUNCTION epoint_ecluster_distance_proc(epoint, ecluster)
   4.564 -  RETURNS float8
   4.565 -  LANGUAGE C IMMUTABLE STRICT
   4.566 -  AS '$libdir/latlon-v0010', 'pgl_epoint_ecluster_distance';
   4.567 -
   4.568 -CREATE OR REPLACE FUNCTION ecircle_distance_proc(ecircle, ecircle)
   4.569 -  RETURNS float8
   4.570 -  LANGUAGE C IMMUTABLE STRICT
   4.571 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_distance';
   4.572 -
   4.573 -CREATE OR REPLACE FUNCTION ecircle_ecluster_distance_proc(ecircle, ecluster)
   4.574 -  RETURNS float8
   4.575 -  LANGUAGE C IMMUTABLE STRICT
   4.576 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_ecluster_distance';
   4.577 -
   4.578 -CREATE OR REPLACE FUNCTION ecluster_distance_proc(ecluster, ecluster)
   4.579 -  RETURNS float8
   4.580 -  LANGUAGE C IMMUTABLE STRICT
   4.581 -  AS '$libdir/latlon-v0010', 'pgl_ecluster_distance';
   4.582 -
   4.583 -CREATE OR REPLACE FUNCTION fair_distance_operator_proc(ecluster, epoint_with_sample_count)
   4.584 -  RETURNS float8
   4.585 -  LANGUAGE C IMMUTABLE STRICT
   4.586 -  AS '$libdir/latlon-v0010', 'pgl_ecluster_epoint_sc_fair_distance';
   4.587 -
   4.588 -CREATE OR REPLACE FUNCTION epoint_ebox_overlap_commutator(ebox, epoint)
   4.589 -  RETURNS boolean
   4.590 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&) $1';
   4.591 -
   4.592 -CREATE OR REPLACE FUNCTION epoint_ecircle_overlap_commutator(ecircle, epoint)
   4.593 -  RETURNS boolean
   4.594 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&) $1';
   4.595 -
   4.596 -CREATE OR REPLACE FUNCTION epoint_ecluster_overlap_commutator(ecluster, epoint)
   4.597 -  RETURNS boolean
   4.598 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&) $1';
   4.599 -
   4.600 -CREATE OR REPLACE FUNCTION ecircle_ecluster_overlap_commutator(ecluster, ecircle)
   4.601 -  RETURNS boolean
   4.602 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&) $1';
   4.603 -
   4.604 -CREATE OR REPLACE FUNCTION ebox_ecircle_overlap_castwrap(ebox, ecircle)
   4.605 -  RETURNS boolean
   4.606 -  LANGUAGE sql IMMUTABLE
   4.607 -  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.&&) $2';
   4.608 -
   4.609 -CREATE OR REPLACE FUNCTION ebox_ecircle_overlap_castwrap(ecircle, ebox)
   4.610 -  RETURNS boolean
   4.611 -  LANGUAGE sql IMMUTABLE
   4.612 -  AS 'SELECT $1 OPERATOR(@extschema@.&&) $2::@extschema@.ecluster';
   4.613 -
   4.614 -CREATE OR REPLACE FUNCTION ebox_ecluster_overlap_castwrap(ebox, ecluster)
   4.615 -  RETURNS boolean
   4.616 -  LANGUAGE sql IMMUTABLE
   4.617 -  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.&&) $2';
   4.618 -
   4.619 -CREATE OR REPLACE FUNCTION ebox_ecluster_overlap_castwrap(ecluster, ebox)
   4.620 -  RETURNS boolean
   4.621 -  LANGUAGE sql IMMUTABLE
   4.622 -  AS 'SELECT $1 OPERATOR(@extschema@.&&) $2::@extschema@.ecluster';
   4.623 -
   4.624 -CREATE OR REPLACE FUNCTION epoint_ecluster_may_overlap_commutator(ecluster, epoint)
   4.625 -  RETURNS boolean
   4.626 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&+) $1';
   4.627 -
   4.628 -CREATE OR REPLACE FUNCTION ebox_ecircle_may_overlap_commutator(ecircle, ebox)
   4.629 -  RETURNS boolean
   4.630 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&+) $1';
   4.631 -
   4.632 -CREATE OR REPLACE FUNCTION ebox_ecluster_may_overlap_commutator(ecluster, ebox)
   4.633 -  RETURNS boolean
   4.634 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&+) $1';
   4.635 -
   4.636 -CREATE OR REPLACE FUNCTION ecircle_ecluster_may_overlap_commutator(ecluster, ecircle)
   4.637 -  RETURNS boolean
   4.638 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&+) $1';
   4.639 -
   4.640 -CREATE OR REPLACE FUNCTION ecluster_contains_commutator(ecluster, ecluster)
   4.641 -  RETURNS boolean
   4.642 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.@>) $1';
   4.643 -
   4.644 -CREATE OR REPLACE FUNCTION ebox_contains_castwrap(ebox, ebox)
   4.645 -  RETURNS boolean
   4.646 -  LANGUAGE sql IMMUTABLE AS $$
   4.647 -    SELECT
   4.648 -    $1::@extschema@.ecluster OPERATOR(@extschema@.@>) $2::@extschema@.ecluster
   4.649 -  $$;
   4.650 -
   4.651 -CREATE OR REPLACE FUNCTION ebox_contains_swapped_castwrap(ebox, ebox)
   4.652 -  RETURNS boolean
   4.653 -  LANGUAGE sql IMMUTABLE AS $$
   4.654 -    SELECT
   4.655 -    $2::@extschema@.ecluster OPERATOR(@extschema@.@>) $1::@extschema@.ecluster
   4.656 -  $$;
   4.657 -
   4.658 -CREATE OR REPLACE FUNCTION ebox_ecluster_contains_castwrap(ebox, ecluster)
   4.659 -  RETURNS boolean
   4.660 -  LANGUAGE sql IMMUTABLE
   4.661 -  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.@>) $2';
   4.662 -
   4.663 -CREATE OR REPLACE FUNCTION ebox_ecluster_contains_castwrap(ecluster, ebox)
   4.664 -  RETURNS boolean
   4.665 -  LANGUAGE sql IMMUTABLE
   4.666 -  AS 'SELECT $2::@extschema@.ecluster OPERATOR(@extschema@.@>) $1';
   4.667 -
   4.668 -CREATE OR REPLACE FUNCTION ecluster_ebox_contains_castwrap(ecluster, ebox)
   4.669 -  RETURNS boolean
   4.670 -  LANGUAGE sql IMMUTABLE
   4.671 -  AS 'SELECT $1 OPERATOR(@extschema@.@>) $2::@extschema@.ecluster';
   4.672 -
   4.673 -CREATE OR REPLACE FUNCTION ecluster_ebox_contains_castwrap(ebox, ecluster)
   4.674 -  RETURNS boolean
   4.675 -  LANGUAGE sql IMMUTABLE
   4.676 -  AS 'SELECT $2 OPERATOR(@extschema@.@>) $1::@extschema@.ecluster';
   4.677 -
   4.678 -CREATE OR REPLACE FUNCTION epoint_ecircle_distance_commutator(ecircle, epoint)
   4.679 -  RETURNS float8
   4.680 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.<->) $1';
   4.681 -
   4.682 -CREATE OR REPLACE FUNCTION epoint_ecluster_distance_commutator(ecluster, epoint)
   4.683 -  RETURNS float8
   4.684 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.<->) $1';
   4.685 -
   4.686 -CREATE OR REPLACE FUNCTION ecircle_ecluster_distance_commutator(ecluster, ecircle)
   4.687 -  RETURNS float8
   4.688 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.<->) $1';
   4.689 -
   4.690 -CREATE OR REPLACE FUNCTION epoint_ebox_distance_castwrap(epoint, ebox)
   4.691 -  RETURNS float8
   4.692 -  LANGUAGE sql IMMUTABLE
   4.693 -  AS 'SELECT $1 OPERATOR(@extschema@.<->) $2::@extschema@.ecluster';
   4.694 -
   4.695 -CREATE OR REPLACE FUNCTION epoint_ebox_distance_castwrap(ebox, epoint)
   4.696 -  RETURNS float8
   4.697 -  LANGUAGE sql IMMUTABLE
   4.698 -  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.<->) $2';
   4.699 -
   4.700 -CREATE OR REPLACE FUNCTION ebox_distance_castwrap(ebox, ebox)
   4.701 -  RETURNS float8
   4.702 -  LANGUAGE sql IMMUTABLE AS $$
   4.703 -    SELECT
   4.704 -    $1::@extschema@.ecluster OPERATOR(@extschema@.<->) $2::@extschema@.ecluster
   4.705 -  $$;
   4.706 -
   4.707 -CREATE OR REPLACE FUNCTION ebox_ecircle_distance_castwrap(ebox, ecircle)
   4.708 -  RETURNS float8
   4.709 -  LANGUAGE sql IMMUTABLE
   4.710 -  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.<->) $2';
   4.711 -
   4.712 -CREATE OR REPLACE FUNCTION ebox_ecircle_distance_castwrap(ecircle, ebox)
   4.713 -  RETURNS float8
   4.714 -  LANGUAGE sql IMMUTABLE
   4.715 -  AS 'SELECT $1 OPERATOR(@extschema@.<->) $2::@extschema@.ecluster';
   4.716 -
   4.717 -CREATE OR REPLACE FUNCTION ebox_ecluster_distance_castwrap(ebox, ecluster)
   4.718 -  RETURNS float8
   4.719 -  LANGUAGE sql IMMUTABLE
   4.720 -  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.<->) $2';
   4.721 -
   4.722 -CREATE OR REPLACE FUNCTION ebox_ecluster_distance_castwrap(ecluster, ebox)
   4.723 -  RETURNS float8
   4.724 -  LANGUAGE sql IMMUTABLE
   4.725 -  AS 'SELECT $1 OPERATOR(@extschema@.<->) $2::@extschema@.ecluster';
   4.726 -
   4.727 -
   4.728 -----------------
   4.729 --- GiST index --
   4.730 -----------------
   4.731 -
   4.732 -CREATE OR REPLACE FUNCTION pgl_gist_consistent(internal, internal, smallint, oid, internal)
   4.733 -  RETURNS boolean
   4.734 -  LANGUAGE C STRICT
   4.735 -  AS '$libdir/latlon-v0010', 'pgl_gist_consistent';
   4.736 -
   4.737 -CREATE OR REPLACE FUNCTION pgl_gist_union(internal, internal)
   4.738 -  RETURNS internal
   4.739 -  LANGUAGE C STRICT
   4.740 -  AS '$libdir/latlon-v0010', 'pgl_gist_union';
   4.741 -
   4.742 -CREATE OR REPLACE FUNCTION pgl_gist_compress_epoint(internal)
   4.743 -  RETURNS internal
   4.744 -  LANGUAGE C STRICT
   4.745 -  AS '$libdir/latlon-v0010', 'pgl_gist_compress_epoint';
   4.746 -
   4.747 -CREATE OR REPLACE FUNCTION pgl_gist_compress_ecircle(internal)
   4.748 -  RETURNS internal
   4.749 -  LANGUAGE C STRICT
   4.750 -  AS '$libdir/latlon-v0010', 'pgl_gist_compress_ecircle';
   4.751 -
   4.752 -CREATE OR REPLACE FUNCTION pgl_gist_compress_ecluster(internal)
   4.753 -  RETURNS internal
   4.754 -  LANGUAGE C STRICT
   4.755 -  AS '$libdir/latlon-v0010', 'pgl_gist_compress_ecluster';
   4.756 -
   4.757 -CREATE OR REPLACE FUNCTION pgl_gist_decompress(internal)
   4.758 -  RETURNS internal
   4.759 -  LANGUAGE C STRICT
   4.760 -  AS '$libdir/latlon-v0010', 'pgl_gist_decompress';
   4.761 -
   4.762 -CREATE OR REPLACE FUNCTION pgl_gist_penalty(internal, internal, internal)
   4.763 -  RETURNS internal
   4.764 -  LANGUAGE C STRICT
   4.765 -  AS '$libdir/latlon-v0010', 'pgl_gist_penalty';
   4.766 -
   4.767 -CREATE OR REPLACE FUNCTION pgl_gist_picksplit(internal, internal)
   4.768 -  RETURNS internal
   4.769 -  LANGUAGE C STRICT
   4.770 -  AS '$libdir/latlon-v0010', 'pgl_gist_picksplit';
   4.771 -
   4.772 -CREATE OR REPLACE FUNCTION pgl_gist_same(internal, internal, internal)
   4.773 -  RETURNS internal
   4.774 -  LANGUAGE C STRICT
   4.775 -  AS '$libdir/latlon-v0010', 'pgl_gist_same';
   4.776 -
   4.777 -CREATE OR REPLACE FUNCTION pgl_gist_distance(internal, internal, smallint, oid)
   4.778 -  RETURNS internal
   4.779 -  LANGUAGE C STRICT
   4.780 -  AS '$libdir/latlon-v0010', 'pgl_gist_distance';
   4.781 -
   4.782 -
   4.783 ----------------------
   4.784 --- alias functions --
   4.785 ----------------------
   4.786 -
   4.787 -CREATE OR REPLACE FUNCTION distance(epoint, epoint)
   4.788 -  RETURNS float8
   4.789 -  LANGUAGE sql IMMUTABLE AS 'SELECT $1 OPERATOR(@extschema@.<->) $2';
   4.790 -
   4.791 -CREATE OR REPLACE FUNCTION distance(ecluster, epoint)
   4.792 -  RETURNS float8
   4.793 -  LANGUAGE sql IMMUTABLE AS 'SELECT $1 OPERATOR(@extschema@.<->) $2';
   4.794 -
   4.795 -CREATE OR REPLACE FUNCTION distance_within(epoint, epoint, float8)
   4.796 -  RETURNS boolean
   4.797 -  LANGUAGE sql IMMUTABLE
   4.798 -  AS 'SELECT $1 OPERATOR(@extschema@.&&) @extschema@.ecircle($2, $3)';
   4.799 -
   4.800 -CREATE OR REPLACE FUNCTION distance_within(ecluster, epoint, float8)
   4.801 -  RETURNS boolean
   4.802 -  LANGUAGE sql IMMUTABLE
   4.803 -  AS 'SELECT $1 OPERATOR(@extschema@.&&) @extschema@.ecircle($2, $3)';
   4.804 -
   4.805 -CREATE OR REPLACE FUNCTION fair_distance(ecluster, epoint, int4 = 10000)
   4.806 -  RETURNS float8
   4.807 -  LANGUAGE sql IMMUTABLE AS $$
   4.808 -    SELECT
   4.809 -    $1 OPERATOR(@extschema@.<=>) @extschema@.epoint_with_sample_count($2, $3)
   4.810 -  $$;
   4.811 -
   4.812 -
   4.813 ---------------------------------
   4.814 --- other data storage formats --
   4.815 ---------------------------------
   4.816 -
   4.817 -CREATE OR REPLACE FUNCTION coords_to_epoint(float8, float8, text = 'epoint')
   4.818 -  RETURNS epoint
   4.819 -  LANGUAGE plpgsql IMMUTABLE STRICT AS $$
   4.820 -    DECLARE
   4.821 -      "result" @extschema@.epoint;
   4.822 -    BEGIN
   4.823 -      IF $3 OPERATOR(pg_catalog.=) 'epoint_lonlat' THEN
   4.824 -        -- avoid dynamic command execution for better performance
   4.825 -        RETURN @extschema@.epoint($2, $1);
   4.826 -      END IF;
   4.827 -      IF
   4.828 -        $3 OPERATOR(pg_catalog.=) 'epoint' OR
   4.829 -        $3 OPERATOR(pg_catalog.=) 'epoint_latlon'
   4.830 -      THEN
   4.831 -        -- avoid dynamic command execution for better performance
   4.832 -        RETURN @extschema@.epoint($1, $2);
   4.833 -      END IF;
   4.834 -      EXECUTE
   4.835 -        'SELECT ' OPERATOR(pg_catalog.||) $3 OPERATOR(pg_catalog.||) '($1, $2)'         INTO STRICT "result" USING $1, $2;
   4.836 -      RETURN "result";
   4.837 -    END;
   4.838 -  $$;
   4.839 -
   4.840 -CREATE OR REPLACE FUNCTION GeoJSON_LinearRing_vertices(jsonb, text = 'epoint_lonlat')
   4.841 -  RETURNS SETOF jsonb
   4.842 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   4.843 -    SELECT "result" FROM
   4.844 -      ( SELECT pg_catalog.jsonb_array_length($1) - 1 )
   4.845 -      AS "lastindex_row" ("lastindex")
   4.846 -      CROSS JOIN LATERAL pg_catalog.jsonb_array_elements(
   4.847 -        CASE WHEN
   4.848 -          @extschema@.coords_to_epoint(
   4.849 -            ($1 OPERATOR(pg_catalog.->) 0 OPERATOR(pg_catalog.->>) 0)
   4.850 -            ::pg_catalog.float8,
   4.851 -            ($1 OPERATOR(pg_catalog.->) 0 OPERATOR(pg_catalog.->>) 1)
   4.852 -            ::pg_catalog.float8,
   4.853 -            $2
   4.854 -          ) OPERATOR(pg_catalog.=) @extschema@.coords_to_epoint(
   4.855 -            ($1 OPERATOR(pg_catalog.->) "lastindex" OPERATOR(pg_catalog.->>) 0)
   4.856 -            ::pg_catalog.float8,
   4.857 -            ($1 OPERATOR(pg_catalog.->) "lastindex" OPERATOR(pg_catalog.->>) 1)
   4.858 -            ::pg_catalog.float8,
   4.859 -            $2
   4.860 -          )
   4.861 -        THEN
   4.862 -          $1 - "lastindex"
   4.863 -        ELSE
   4.864 -          $1
   4.865 -        END
   4.866 -      ) AS "result_row" ("result")
   4.867 -  $$;
   4.868 -
   4.869 -CREATE OR REPLACE FUNCTION GeoJSON_to_epoint(jsonb, text = 'epoint_lonlat')
   4.870 -  RETURNS epoint
   4.871 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   4.872 -    SELECT CASE
   4.873 -    WHEN $1 OPERATOR(pg_catalog.->>) 'type' OPERATOR(pg_catalog.=) 'Point' THEN
   4.874 -      @extschema@.coords_to_epoint(
   4.875 -        ($1 OPERATOR(pg_catalog.->) 'coordinates' OPERATOR(pg_catalog.->>) 0)
   4.876 -        ::pg_catalog.float8,
   4.877 -        ($1 OPERATOR(pg_catalog.->) 'coordinates' OPERATOR(pg_catalog.->>) 1)
   4.878 -        ::pg_catalog.float8,
   4.879 -        $2
   4.880 -      )
   4.881 -    WHEN $1->>'type' = 'Feature' THEN
   4.882 -      @extschema@.GeoJSON_to_epoint($1 OPERATOR(pg_catalog.->) 'geometry', $2)
   4.883 -    ELSE
   4.884 -      NULL
   4.885 -    END
   4.886 -  $$;
   4.887 -
   4.888 -CREATE OR REPLACE FUNCTION GeoJSON_to_ecluster(jsonb, text = 'epoint_lonlat')
   4.889 -  RETURNS ecluster
   4.890 -  LANGUAGE plpgsql IMMUTABLE STRICT AS $$
   4.891 -    DECLARE
   4.892 -      "tp" TEXT = $1 OPERATOR(pg_catalog.->>) 'type';
   4.893 -    BEGIN
   4.894 -      IF "tp" = 'Point' THEN RETURN
   4.895 -        @extschema@.coords_to_epoint(
   4.896 -          ($1 OPERATOR(pg_catalog.->) 'coordinates' OPERATOR(pg_catalog.->>) 0)
   4.897 -          ::pg_catalog.float8,
   4.898 -          ($1 OPERATOR(pg_catalog.->) 'coordinates' OPERATOR(pg_catalog.->>) 1)
   4.899 -          ::pg_catalog.float8,
   4.900 -          $2
   4.901 -        )::@extschema@.ecluster;
   4.902 -      END IF;
   4.903 -      raise notice 'DEBUG2';
   4.904 -      IF "tp" = 'MultiPoint' THEN RETURN
   4.905 -        ( SELECT @extschema@.ecluster_create_multipoint(pg_catalog.array_agg(
   4.906 -            @extschema@.coords_to_epoint(
   4.907 -              ("coord" OPERATOR(pg_catalog.->>) 0)::pg_catalog.float8,
   4.908 -              ("coord" OPERATOR(pg_catalog.->>) 1)::pg_catalog.float8,
   4.909 -              $2
   4.910 -            )
   4.911 -          ))
   4.912 -          FROM pg_catalog.jsonb_array_elements(
   4.913 -            $1 OPERATOR(pg_catalog.->) 'coordinates'
   4.914 -          ) AS "coord"
   4.915 -        );
   4.916 -      END IF;
   4.917 -      IF "tp" = 'LineString' THEN RETURN
   4.918 -        ( SELECT @extschema@.ecluster_create_path(pg_catalog.array_agg(
   4.919 -            @extschema@.coords_to_epoint(
   4.920 -              ("coord" OPERATOR(pg_catalog.->>) 0)::pg_catalog.float8,
   4.921 -              ("coord" OPERATOR(pg_catalog.->>) 1)::pg_catalog.float8,
   4.922 -              $2
   4.923 -            )
   4.924 -          ))
   4.925 -          FROM pg_catalog.jsonb_array_elements(
   4.926 -            $1 OPERATOR(pg_catalog.->) 'coordinates'
   4.927 -          ) AS "coord"
   4.928 -        );
   4.929 -      END IF;
   4.930 -      IF "tp" = 'MultiLineString' THEN RETURN
   4.931 -        ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
   4.932 -            ( SELECT @extschema@.ecluster_create_path(pg_catalog.array_agg(
   4.933 -                @extschema@.coords_to_epoint(
   4.934 -                  ("coord" OPERATOR(pg_catalog.->>) 0)::pg_catalog.float8,
   4.935 -                  ("coord" OPERATOR(pg_catalog.->>) 1)::pg_catalog.float8,
   4.936 -                  $2
   4.937 -                )
   4.938 -              ))
   4.939 -              FROM pg_catalog.jsonb_array_elements("coord_array") AS "coord"
   4.940 -            )
   4.941 -          ))
   4.942 -          FROM pg_catalog.jsonb_array_elements(
   4.943 -            $1 OPERATOR(pg_catalog.->) 'coordinates'
   4.944 -          ) AS "coord_array"
   4.945 -        );
   4.946 -      END IF;
   4.947 -      IF "tp" = 'Polygon' THEN RETURN
   4.948 -        ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
   4.949 -            ( SELECT @extschema@.ecluster_create_polygon(pg_catalog.array_agg(
   4.950 -                @extschema@.coords_to_epoint(
   4.951 -                  ("coord" OPERATOR(pg_catalog.->>) 0)::pg_catalog.float8,
   4.952 -                  ("coord" OPERATOR(pg_catalog.->>) 1)::pg_catalog.float8,
   4.953 -                  $2
   4.954 -                )
   4.955 -              ))
   4.956 -              FROM @extschema@.GeoJSON_LinearRing_vertices("coord_array", $2)
   4.957 -              AS "coord"
   4.958 -            )
   4.959 -          ))
   4.960 -          FROM pg_catalog.jsonb_array_elements(
   4.961 -            $1 OPERATOR(pg_catalog.->) 'coordinates'
   4.962 -          ) AS "coord_array"
   4.963 -        );
   4.964 -      END IF;
   4.965 -      IF "tp" = 'MultiPolygon' THEN RETURN
   4.966 -        ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
   4.967 -            ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
   4.968 -                ( SELECT @extschema@.ecluster_create_polygon(
   4.969 -                    pg_catalog.array_agg(
   4.970 -                      @extschema@.coords_to_epoint(
   4.971 -                        ("coord" OPERATOR(pg_catalog.->>) 0)
   4.972 -                        ::pg_catalog.float8,
   4.973 -                        ("coord" OPERATOR(pg_catalog.->>) 1)
   4.974 -                        ::pg_catalog.float8,
   4.975 -                        $2
   4.976 -                      )
   4.977 -                    )
   4.978 -                  )
   4.979 -                  FROM @extschema@.GeoJSON_LinearRing_vertices(
   4.980 -                    "coord_array", $2
   4.981 -                  ) AS "coord"
   4.982 -                )
   4.983 -              ))
   4.984 -              FROM pg_catalog.jsonb_array_elements("coord_array_array")
   4.985 -              AS "coord_array"
   4.986 -            )
   4.987 -          ))
   4.988 -          FROM jsonb_array_elements(
   4.989 -            $1 OPERATOR(pg_catalog.->) 'coordinates'
   4.990 -          ) AS "coord_array_array"
   4.991 -        );
   4.992 -      END IF;
   4.993 -      IF "tp" = 'GeometryCollection' THEN RETURN
   4.994 -        ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
   4.995 -            @extschema@.GeoJSON_to_ecluster("geometry", $2)
   4.996 -          ))
   4.997 -          FROM pg_catalog.jsonb_array_elements(
   4.998 -            $1 OPERATOR(pg_catalog.->) 'geometries'
   4.999 -          ) AS "geometry"
  4.1000 -        );
  4.1001 -      END IF;
  4.1002 -      IF "tp" = 'Feature' THEN RETURN
  4.1003 -        @extschema@.GeoJSON_to_ecluster(
  4.1004 -          $1 OPERATOR(pg_catalog.->) 'geometry', $2
  4.1005 -        );
  4.1006 -      END IF;
  4.1007 -      IF "tp" = 'FeatureCollection' THEN RETURN
  4.1008 -        ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
  4.1009 -            @extschema@.GeoJSON_to_ecluster("feature", $2)
  4.1010 -          ))
  4.1011 -          FROM pg_catalog.jsonb_array_elements(
  4.1012 -            $1 OPERATOR(pg_catalog.->) 'features'
  4.1013 -          ) AS "feature"
  4.1014 -        );
  4.1015 -      END IF;
  4.1016 -      RETURN NULL;
  4.1017 -    END;
  4.1018 -  $$;
  4.1019 -
     6.1 --- a/latlon--0.15.sql	Thu Oct 23 15:19:13 2025 +0200
     6.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.3 @@ -1,1821 +0,0 @@
     6.4 -----------------------------------------
     6.5 --- forward declarations (shell types) --
     6.6 -----------------------------------------
     6.7 -
     6.8 -CREATE TYPE ekey_point;
     6.9 -CREATE TYPE ekey_area;
    6.10 -CREATE TYPE epoint;
    6.11 -CREATE TYPE epoint_with_sample_count;
    6.12 -CREATE TYPE ebox;
    6.13 -CREATE TYPE ecircle;
    6.14 -CREATE TYPE ecluster;
    6.15 -
    6.16 -
    6.17 -------------------------------------------------------------
    6.18 --- dummy input/output functions for dummy index key types --
    6.19 -------------------------------------------------------------
    6.20 -
    6.21 -CREATE FUNCTION ekey_point_in_dummy(cstring)
    6.22 -  RETURNS ekey_point
    6.23 -  LANGUAGE C IMMUTABLE STRICT
    6.24 -  AS '$libdir/latlon-v0010', 'pgl_notimpl';
    6.25 -
    6.26 -CREATE FUNCTION ekey_point_out_dummy(ekey_point)
    6.27 -  RETURNS cstring
    6.28 -  LANGUAGE C IMMUTABLE STRICT
    6.29 -  AS '$libdir/latlon-v0010', 'pgl_notimpl';
    6.30 -
    6.31 -CREATE FUNCTION ekey_area_in_dummy(cstring)
    6.32 -  RETURNS ekey_area
    6.33 -  LANGUAGE C IMMUTABLE STRICT
    6.34 -  AS '$libdir/latlon-v0010', 'pgl_notimpl';
    6.35 -
    6.36 -CREATE FUNCTION ekey_area_out_dummy(ekey_area)
    6.37 -  RETURNS cstring
    6.38 -  LANGUAGE C IMMUTABLE STRICT
    6.39 -  AS '$libdir/latlon-v0010', 'pgl_notimpl';
    6.40 -
    6.41 -
    6.42 ---------------------------
    6.43 --- text input functions --
    6.44 ---------------------------
    6.45 -
    6.46 -CREATE FUNCTION epoint_in(cstring)
    6.47 -  RETURNS epoint
    6.48 -  LANGUAGE C IMMUTABLE STRICT
    6.49 -  AS '$libdir/latlon-v0010', 'pgl_epoint_in';
    6.50 -
    6.51 -CREATE FUNCTION epoint_with_sample_count_in(cstring)
    6.52 -  RETURNS epoint_with_sample_count
    6.53 -  LANGUAGE C IMMUTABLE STRICT
    6.54 -  AS '$libdir/latlon-v0010', 'pgl_epoint_with_sample_count_in';
    6.55 -
    6.56 -CREATE FUNCTION ebox_in(cstring)
    6.57 -  RETURNS ebox
    6.58 -  LANGUAGE C IMMUTABLE STRICT
    6.59 -  AS '$libdir/latlon-v0010', 'pgl_ebox_in';
    6.60 -
    6.61 -CREATE FUNCTION ecircle_in(cstring)
    6.62 -  RETURNS ecircle
    6.63 -  LANGUAGE C IMMUTABLE STRICT
    6.64 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_in';
    6.65 -
    6.66 -CREATE FUNCTION ecluster_in(cstring)
    6.67 -  RETURNS ecluster
    6.68 -  LANGUAGE C IMMUTABLE STRICT
    6.69 -  AS '$libdir/latlon-v0010', 'pgl_ecluster_in';
    6.70 -
    6.71 -
    6.72 ----------------------------
    6.73 --- text output functions --
    6.74 ----------------------------
    6.75 -
    6.76 -CREATE FUNCTION epoint_out(epoint)
    6.77 -  RETURNS cstring
    6.78 -  LANGUAGE C IMMUTABLE STRICT
    6.79 -  AS '$libdir/latlon-v0010', 'pgl_epoint_out';
    6.80 -
    6.81 -CREATE FUNCTION epoint_with_sample_count_out(epoint_with_sample_count)
    6.82 -  RETURNS cstring
    6.83 -  LANGUAGE C IMMUTABLE STRICT
    6.84 -  AS '$libdir/latlon-v0010', 'pgl_epoint_with_sample_count_out';
    6.85 -
    6.86 -CREATE FUNCTION ebox_out(ebox)
    6.87 -  RETURNS cstring
    6.88 -  LANGUAGE C IMMUTABLE STRICT
    6.89 -  AS '$libdir/latlon-v0010', 'pgl_ebox_out';
    6.90 -
    6.91 -CREATE FUNCTION ecircle_out(ecircle)
    6.92 -  RETURNS cstring
    6.93 -  LANGUAGE C IMMUTABLE STRICT
    6.94 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_out';
    6.95 -
    6.96 -CREATE FUNCTION ecluster_out(ecluster)
    6.97 -  RETURNS cstring
    6.98 -  LANGUAGE C IMMUTABLE STRICT
    6.99 -  AS '$libdir/latlon-v0010', 'pgl_ecluster_out';
   6.100 -
   6.101 -
   6.102 ---------------------------
   6.103 --- binary I/O functions --
   6.104 ---------------------------
   6.105 -
   6.106 -CREATE FUNCTION epoint_recv(internal)
   6.107 -  RETURNS epoint
   6.108 -  LANGUAGE C IMMUTABLE STRICT
   6.109 -  AS '$libdir/latlon-v0010', 'pgl_epoint_recv';
   6.110 -
   6.111 -CREATE FUNCTION ebox_recv(internal)
   6.112 -  RETURNS ebox
   6.113 -  LANGUAGE C IMMUTABLE STRICT
   6.114 -  AS '$libdir/latlon-v0010', 'pgl_ebox_recv';
   6.115 -
   6.116 -CREATE FUNCTION ecircle_recv(internal)
   6.117 -  RETURNS ecircle
   6.118 -  LANGUAGE C IMMUTABLE STRICT
   6.119 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_recv';
   6.120 -
   6.121 -CREATE FUNCTION epoint_send(epoint)
   6.122 -  RETURNS bytea
   6.123 -  LANGUAGE C IMMUTABLE STRICT
   6.124 -  AS '$libdir/latlon-v0010', 'pgl_epoint_send';
   6.125 -
   6.126 -CREATE FUNCTION ebox_send(ebox)
   6.127 -  RETURNS bytea
   6.128 -  LANGUAGE C IMMUTABLE STRICT
   6.129 -  AS '$libdir/latlon-v0010', 'pgl_ebox_send';
   6.130 -
   6.131 -CREATE FUNCTION ecircle_send(ecircle)
   6.132 -  RETURNS bytea
   6.133 -  LANGUAGE C IMMUTABLE STRICT
   6.134 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_send';
   6.135 -
   6.136 -
   6.137 ------------------------------------------------
   6.138 --- type definitions of dummy index key types --
   6.139 ------------------------------------------------
   6.140 -
   6.141 -CREATE TYPE ekey_point (
   6.142 -  internallength = 8,
   6.143 -  input = ekey_point_in_dummy,
   6.144 -  output = ekey_point_out_dummy,
   6.145 -  alignment = char );
   6.146 -
   6.147 -CREATE TYPE ekey_area (
   6.148 -  internallength = 9,
   6.149 -  input = ekey_area_in_dummy,
   6.150 -  output = ekey_area_out_dummy,
   6.151 -  alignment = char );
   6.152 -
   6.153 -
   6.154 -------------------------------------------
   6.155 --- definitions of geographic data types --
   6.156 -------------------------------------------
   6.157 -
   6.158 -CREATE TYPE epoint (
   6.159 -  internallength = 16,
   6.160 -  input = epoint_in,
   6.161 -  output = epoint_out,
   6.162 -  receive = epoint_recv,
   6.163 -  send = epoint_send,
   6.164 -  alignment = double );
   6.165 -
   6.166 -CREATE TYPE epoint_with_sample_count (
   6.167 -  internallength = 20,
   6.168 -  input = epoint_with_sample_count_in,
   6.169 -  output = epoint_with_sample_count_out,
   6.170 -  alignment = double );
   6.171 -
   6.172 -CREATE TYPE ebox (
   6.173 -  internallength = 32,
   6.174 -  input = ebox_in,
   6.175 -  output = ebox_out,
   6.176 -  receive = ebox_recv,
   6.177 -  send = ebox_send,
   6.178 -  alignment = double );
   6.179 -
   6.180 -CREATE TYPE ecircle (
   6.181 -  internallength = 24,
   6.182 -  input = ecircle_in,
   6.183 -  output = ecircle_out,
   6.184 -  receive = ecircle_recv,
   6.185 -  send = ecircle_send,
   6.186 -  alignment = double );
   6.187 -
   6.188 -CREATE TYPE ecluster (
   6.189 -  internallength = VARIABLE,
   6.190 -  input = ecluster_in,
   6.191 -  output = ecluster_out,
   6.192 -  alignment = double,
   6.193 -  storage = external );
   6.194 -
   6.195 -
   6.196 ---------------------
   6.197 --- B-tree support --
   6.198 ---------------------
   6.199 -
   6.200 --- begin of B-tree support for epoint
   6.201 -
   6.202 -CREATE FUNCTION epoint_btree_lt(epoint, epoint)
   6.203 -  RETURNS boolean
   6.204 -  LANGUAGE C IMMUTABLE STRICT
   6.205 -  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_lt';
   6.206 -
   6.207 -CREATE FUNCTION epoint_btree_le(epoint, epoint)
   6.208 -  RETURNS boolean
   6.209 -  LANGUAGE C IMMUTABLE STRICT
   6.210 -  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_le';
   6.211 -
   6.212 -CREATE FUNCTION epoint_btree_eq(epoint, epoint)
   6.213 -  RETURNS boolean
   6.214 -  LANGUAGE C IMMUTABLE STRICT
   6.215 -  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_eq';
   6.216 -
   6.217 -CREATE FUNCTION epoint_btree_ne(epoint, epoint)
   6.218 -  RETURNS boolean
   6.219 -  LANGUAGE C IMMUTABLE STRICT
   6.220 -  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_ne';
   6.221 -
   6.222 -CREATE FUNCTION epoint_btree_ge(epoint, epoint)
   6.223 -  RETURNS boolean
   6.224 -  LANGUAGE C IMMUTABLE STRICT
   6.225 -  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_ge';
   6.226 -
   6.227 -CREATE FUNCTION epoint_btree_gt(epoint, epoint)
   6.228 -  RETURNS boolean
   6.229 -  LANGUAGE C IMMUTABLE STRICT
   6.230 -  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_gt';
   6.231 -
   6.232 -CREATE OPERATOR <<< (
   6.233 -  leftarg = epoint,
   6.234 -  rightarg = epoint,
   6.235 -  procedure = epoint_btree_lt,
   6.236 -  commutator = >>>,
   6.237 -  negator = >>>=,
   6.238 -  restrict = scalarltsel,
   6.239 -  join = scalarltjoinsel
   6.240 -);
   6.241 -
   6.242 -CREATE OPERATOR <<<= (
   6.243 -  leftarg = epoint,
   6.244 -  rightarg = epoint,
   6.245 -  procedure = epoint_btree_le,
   6.246 -  commutator = >>>=,
   6.247 -  negator = >>>,
   6.248 -  restrict = scalarltsel,
   6.249 -  join = scalarltjoinsel
   6.250 -);
   6.251 -
   6.252 -CREATE OPERATOR = (
   6.253 -  leftarg = epoint,
   6.254 -  rightarg = epoint,
   6.255 -  procedure = epoint_btree_eq,
   6.256 -  commutator = =,
   6.257 -  negator = <>,
   6.258 -  restrict = eqsel,
   6.259 -  join = eqjoinsel,
   6.260 -  merges
   6.261 -);
   6.262 -
   6.263 -CREATE OPERATOR <> (
   6.264 -  leftarg = epoint,
   6.265 -  rightarg = epoint,
   6.266 -  procedure = epoint_btree_ne,
   6.267 -  commutator = <>,
   6.268 -  negator = =,
   6.269 -  restrict = neqsel,
   6.270 -  join = neqjoinsel
   6.271 -);
   6.272 -
   6.273 -CREATE OPERATOR >>>= (
   6.274 -  leftarg = epoint,
   6.275 -  rightarg = epoint,
   6.276 -  procedure = epoint_btree_ge,
   6.277 -  commutator = <<<=,
   6.278 -  negator = <<<,
   6.279 -  restrict = scalargtsel,
   6.280 -  join = scalargtjoinsel
   6.281 -);
   6.282 -
   6.283 -CREATE OPERATOR >>> (
   6.284 -  leftarg = epoint,
   6.285 -  rightarg = epoint,
   6.286 -  procedure = epoint_btree_gt,
   6.287 -  commutator = <<<,
   6.288 -  negator = <<<=,
   6.289 -  restrict = scalargtsel,
   6.290 -  join = scalargtjoinsel
   6.291 -);
   6.292 -
   6.293 -CREATE FUNCTION epoint_btree_cmp(epoint, epoint)
   6.294 -  RETURNS int4
   6.295 -  LANGUAGE C IMMUTABLE STRICT
   6.296 -  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_cmp';
   6.297 -
   6.298 -CREATE OPERATOR CLASS epoint_btree_ops
   6.299 -  DEFAULT FOR TYPE epoint USING btree AS
   6.300 -  OPERATOR 1 <<< ,
   6.301 -  OPERATOR 2 <<<= ,
   6.302 -  OPERATOR 3 = ,
   6.303 -  OPERATOR 4 >>>= ,
   6.304 -  OPERATOR 5 >>> ,
   6.305 -  FUNCTION 1 epoint_btree_cmp(epoint, epoint);
   6.306 -
   6.307 --- end of B-tree support for epoint
   6.308 -
   6.309 --- begin of B-tree support for ebox
   6.310 -
   6.311 -CREATE FUNCTION ebox_btree_lt(ebox, ebox)
   6.312 -  RETURNS boolean
   6.313 -  LANGUAGE C IMMUTABLE STRICT
   6.314 -  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_lt';
   6.315 -
   6.316 -CREATE FUNCTION ebox_btree_le(ebox, ebox)
   6.317 -  RETURNS boolean
   6.318 -  LANGUAGE C IMMUTABLE STRICT
   6.319 -  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_le';
   6.320 -
   6.321 -CREATE FUNCTION ebox_btree_eq(ebox, ebox)
   6.322 -  RETURNS boolean
   6.323 -  LANGUAGE C IMMUTABLE STRICT
   6.324 -  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_eq';
   6.325 -
   6.326 -CREATE FUNCTION ebox_btree_ne(ebox, ebox)
   6.327 -  RETURNS boolean
   6.328 -  LANGUAGE C IMMUTABLE STRICT
   6.329 -  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_ne';
   6.330 -
   6.331 -CREATE FUNCTION ebox_btree_ge(ebox, ebox)
   6.332 -  RETURNS boolean
   6.333 -  LANGUAGE C IMMUTABLE STRICT
   6.334 -  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_ge';
   6.335 -
   6.336 -CREATE FUNCTION ebox_btree_gt(ebox, ebox)
   6.337 -  RETURNS boolean
   6.338 -  LANGUAGE C IMMUTABLE STRICT
   6.339 -  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_gt';
   6.340 -
   6.341 -CREATE OPERATOR <<< (
   6.342 -  leftarg = ebox,
   6.343 -  rightarg = ebox,
   6.344 -  procedure = ebox_btree_lt,
   6.345 -  commutator = >>>,
   6.346 -  negator = >>>=,
   6.347 -  restrict = scalarltsel,
   6.348 -  join = scalarltjoinsel
   6.349 -);
   6.350 -
   6.351 -CREATE OPERATOR <<<= (
   6.352 -  leftarg = ebox,
   6.353 -  rightarg = ebox,
   6.354 -  procedure = ebox_btree_le,
   6.355 -  commutator = >>>=,
   6.356 -  negator = >>>,
   6.357 -  restrict = scalarltsel,
   6.358 -  join = scalarltjoinsel
   6.359 -);
   6.360 -
   6.361 -CREATE OPERATOR = (
   6.362 -  leftarg = ebox,
   6.363 -  rightarg = ebox,
   6.364 -  procedure = ebox_btree_eq,
   6.365 -  commutator = =,
   6.366 -  negator = <>,
   6.367 -  restrict = eqsel,
   6.368 -  join = eqjoinsel,
   6.369 -  merges
   6.370 -);
   6.371 -
   6.372 -CREATE OPERATOR <> (
   6.373 -  leftarg = ebox,
   6.374 -  rightarg = ebox,
   6.375 -  procedure = ebox_btree_ne,
   6.376 -  commutator = <>,
   6.377 -  negator = =,
   6.378 -  restrict = neqsel,
   6.379 -  join = neqjoinsel
   6.380 -);
   6.381 -
   6.382 -CREATE OPERATOR >>>= (
   6.383 -  leftarg = ebox,
   6.384 -  rightarg = ebox,
   6.385 -  procedure = ebox_btree_ge,
   6.386 -  commutator = <<<=,
   6.387 -  negator = <<<,
   6.388 -  restrict = scalargtsel,
   6.389 -  join = scalargtjoinsel
   6.390 -);
   6.391 -
   6.392 -CREATE OPERATOR >>> (
   6.393 -  leftarg = ebox,
   6.394 -  rightarg = ebox,
   6.395 -  procedure = ebox_btree_gt,
   6.396 -  commutator = <<<,
   6.397 -  negator = <<<=,
   6.398 -  restrict = scalargtsel,
   6.399 -  join = scalargtjoinsel
   6.400 -);
   6.401 -
   6.402 -CREATE FUNCTION ebox_btree_cmp(ebox, ebox)
   6.403 -  RETURNS int4
   6.404 -  LANGUAGE C IMMUTABLE STRICT
   6.405 -  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_cmp';
   6.406 -
   6.407 -CREATE OPERATOR CLASS ebox_btree_ops
   6.408 -  DEFAULT FOR TYPE ebox USING btree AS
   6.409 -  OPERATOR 1 <<< ,
   6.410 -  OPERATOR 2 <<<= ,
   6.411 -  OPERATOR 3 = ,
   6.412 -  OPERATOR 4 >>>= ,
   6.413 -  OPERATOR 5 >>> ,
   6.414 -  FUNCTION 1 ebox_btree_cmp(ebox, ebox);
   6.415 -
   6.416 --- end of B-tree support for ebox
   6.417 -
   6.418 --- begin of B-tree support for ecircle
   6.419 -
   6.420 -CREATE FUNCTION ecircle_btree_lt(ecircle, ecircle)
   6.421 -  RETURNS boolean
   6.422 -  LANGUAGE C IMMUTABLE STRICT
   6.423 -  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_lt';
   6.424 -
   6.425 -CREATE FUNCTION ecircle_btree_le(ecircle, ecircle)
   6.426 -  RETURNS boolean
   6.427 -  LANGUAGE C IMMUTABLE STRICT
   6.428 -  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_le';
   6.429 -
   6.430 -CREATE FUNCTION ecircle_btree_eq(ecircle, ecircle)
   6.431 -  RETURNS boolean
   6.432 -  LANGUAGE C IMMUTABLE STRICT
   6.433 -  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_eq';
   6.434 -
   6.435 -CREATE FUNCTION ecircle_btree_ne(ecircle, ecircle)
   6.436 -  RETURNS boolean
   6.437 -  LANGUAGE C IMMUTABLE STRICT
   6.438 -  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_ne';
   6.439 -
   6.440 -CREATE FUNCTION ecircle_btree_ge(ecircle, ecircle)
   6.441 -  RETURNS boolean
   6.442 -  LANGUAGE C IMMUTABLE STRICT
   6.443 -  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_ge';
   6.444 -
   6.445 -CREATE FUNCTION ecircle_btree_gt(ecircle, ecircle)
   6.446 -  RETURNS boolean
   6.447 -  LANGUAGE C IMMUTABLE STRICT
   6.448 -  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_gt';
   6.449 -
   6.450 -CREATE OPERATOR <<< (
   6.451 -  leftarg = ecircle,
   6.452 -  rightarg = ecircle,
   6.453 -  procedure = ecircle_btree_lt,
   6.454 -  commutator = >>>,
   6.455 -  negator = >>>=,
   6.456 -  restrict = scalarltsel,
   6.457 -  join = scalarltjoinsel
   6.458 -);
   6.459 -
   6.460 -CREATE OPERATOR <<<= (
   6.461 -  leftarg = ecircle,
   6.462 -  rightarg = ecircle,
   6.463 -  procedure = ecircle_btree_le,
   6.464 -  commutator = >>>=,
   6.465 -  negator = >>>,
   6.466 -  restrict = scalarltsel,
   6.467 -  join = scalarltjoinsel
   6.468 -);
   6.469 -
   6.470 -CREATE OPERATOR = (
   6.471 -  leftarg = ecircle,
   6.472 -  rightarg = ecircle,
   6.473 -  procedure = ecircle_btree_eq,
   6.474 -  commutator = =,
   6.475 -  negator = <>,
   6.476 -  restrict = eqsel,
   6.477 -  join = eqjoinsel,
   6.478 -  merges
   6.479 -);
   6.480 -
   6.481 -CREATE OPERATOR <> (
   6.482 -  leftarg = ecircle,
   6.483 -  rightarg = ecircle,
   6.484 -  procedure = ecircle_btree_ne,
   6.485 -  commutator = <>,
   6.486 -  negator = =,
   6.487 -  restrict = neqsel,
   6.488 -  join = neqjoinsel
   6.489 -);
   6.490 -
   6.491 -CREATE OPERATOR >>>= (
   6.492 -  leftarg = ecircle,
   6.493 -  rightarg = ecircle,
   6.494 -  procedure = ecircle_btree_ge,
   6.495 -  commutator = <<<=,
   6.496 -  negator = <<<,
   6.497 -  restrict = scalargtsel,
   6.498 -  join = scalargtjoinsel
   6.499 -);
   6.500 -
   6.501 -CREATE OPERATOR >>> (
   6.502 -  leftarg = ecircle,
   6.503 -  rightarg = ecircle,
   6.504 -  procedure = ecircle_btree_gt,
   6.505 -  commutator = <<<,
   6.506 -  negator = <<<=,
   6.507 -  restrict = scalargtsel,
   6.508 -  join = scalargtjoinsel
   6.509 -);
   6.510 -
   6.511 -CREATE FUNCTION ecircle_btree_cmp(ecircle, ecircle)
   6.512 -  RETURNS int4
   6.513 -  LANGUAGE C IMMUTABLE STRICT
   6.514 -  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_cmp';
   6.515 -
   6.516 -CREATE OPERATOR CLASS ecircle_btree_ops
   6.517 -  DEFAULT FOR TYPE ecircle USING btree AS
   6.518 -  OPERATOR 1 <<< ,
   6.519 -  OPERATOR 2 <<<= ,
   6.520 -  OPERATOR 3 = ,
   6.521 -  OPERATOR 4 >>>= ,
   6.522 -  OPERATOR 5 >>> ,
   6.523 -  FUNCTION 1 ecircle_btree_cmp(ecircle, ecircle);
   6.524 -
   6.525 --- end of B-tree support for ecircle
   6.526 -
   6.527 -
   6.528 -----------------
   6.529 --- type casts --
   6.530 -----------------
   6.531 -
   6.532 -CREATE FUNCTION cast_epoint_to_ebox(epoint)
   6.533 -  RETURNS ebox
   6.534 -  LANGUAGE C IMMUTABLE STRICT
   6.535 -  AS '$libdir/latlon-v0010', 'pgl_epoint_to_ebox';
   6.536 -
   6.537 -CREATE CAST (epoint AS ebox) WITH FUNCTION cast_epoint_to_ebox(epoint);
   6.538 -
   6.539 -CREATE FUNCTION cast_epoint_to_ecircle(epoint)
   6.540 -  RETURNS ecircle
   6.541 -  LANGUAGE C IMMUTABLE STRICT
   6.542 -  AS '$libdir/latlon-v0010', 'pgl_epoint_to_ecircle';
   6.543 -
   6.544 -CREATE CAST (epoint AS ecircle) WITH FUNCTION cast_epoint_to_ecircle(epoint);
   6.545 -
   6.546 -CREATE FUNCTION cast_epoint_to_ecluster(epoint)
   6.547 -  RETURNS ecluster
   6.548 -  LANGUAGE C IMMUTABLE STRICT
   6.549 -  AS '$libdir/latlon-v0010', 'pgl_epoint_to_ecluster';
   6.550 -
   6.551 -CREATE CAST (epoint AS ecluster) WITH FUNCTION cast_epoint_to_ecluster(epoint);
   6.552 -
   6.553 -CREATE FUNCTION cast_ebox_to_ecluster(ebox)
   6.554 -  RETURNS ecluster
   6.555 -  LANGUAGE C IMMUTABLE STRICT
   6.556 -  AS '$libdir/latlon-v0010', 'pgl_ebox_to_ecluster';
   6.557 -
   6.558 -CREATE CAST (ebox AS ecluster) WITH FUNCTION cast_ebox_to_ecluster(ebox);
   6.559 -
   6.560 -
   6.561 ----------------------------
   6.562 --- constructor functions --
   6.563 ----------------------------
   6.564 -
   6.565 -CREATE FUNCTION epoint(float8, float8)
   6.566 -  RETURNS epoint
   6.567 -  LANGUAGE C IMMUTABLE STRICT
   6.568 -  AS '$libdir/latlon-v0010', 'pgl_create_epoint';
   6.569 -
   6.570 -CREATE FUNCTION epoint_latlon(float8, float8)
   6.571 -  RETURNS epoint
   6.572 -  LANGUAGE SQL IMMUTABLE STRICT AS $$
   6.573 -    SELECT @extschema@.epoint($1, $2)
   6.574 -  $$;
   6.575 -
   6.576 -CREATE FUNCTION epoint_lonlat(float8, float8)
   6.577 -  RETURNS epoint
   6.578 -  LANGUAGE SQL IMMUTABLE STRICT AS $$
   6.579 -    SELECT @extschema@.epoint($2, $1)
   6.580 -  $$;
   6.581 -
   6.582 -CREATE FUNCTION epoint_with_sample_count(epoint, int4)
   6.583 -  RETURNS epoint_with_sample_count
   6.584 -  LANGUAGE C IMMUTABLE STRICT
   6.585 -  AS '$libdir/latlon-v0010', 'pgl_create_epoint_with_sample_count';
   6.586 -
   6.587 -CREATE FUNCTION empty_ebox()
   6.588 -  RETURNS ebox
   6.589 -  LANGUAGE C IMMUTABLE STRICT
   6.590 -  AS '$libdir/latlon-v0010', 'pgl_create_empty_ebox';
   6.591 -
   6.592 -CREATE FUNCTION ebox(float8, float8, float8, float8)
   6.593 -  RETURNS ebox
   6.594 -  LANGUAGE C IMMUTABLE STRICT
   6.595 -  AS '$libdir/latlon-v0010', 'pgl_create_ebox';
   6.596 -
   6.597 -CREATE FUNCTION ebox(epoint, epoint)
   6.598 -  RETURNS ebox
   6.599 -  LANGUAGE C IMMUTABLE STRICT
   6.600 -  AS '$libdir/latlon-v0010', 'pgl_create_ebox_from_epoints';
   6.601 -
   6.602 -CREATE FUNCTION ecircle(float8, float8, float8)
   6.603 -  RETURNS ecircle
   6.604 -  LANGUAGE C IMMUTABLE STRICT
   6.605 -  AS '$libdir/latlon-v0010', 'pgl_create_ecircle';
   6.606 -
   6.607 -CREATE FUNCTION ecircle(epoint, float8)
   6.608 -  RETURNS ecircle
   6.609 -  LANGUAGE C IMMUTABLE STRICT
   6.610 -  AS '$libdir/latlon-v0010', 'pgl_create_ecircle_from_epoint';
   6.611 -
   6.612 -CREATE FUNCTION ecluster_concat(ecluster[])
   6.613 -  RETURNS ecluster
   6.614 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   6.615 -    SELECT pg_catalog.array_to_string($1, ' ')::@extschema@.ecluster
   6.616 -  $$;
   6.617 -
   6.618 -CREATE FUNCTION ecluster_concat(ecluster, ecluster)
   6.619 -  RETURNS ecluster
   6.620 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   6.621 -    SELECT (
   6.622 -      $1::pg_catalog.text OPERATOR(pg_catalog.||) ' ' OPERATOR(pg_catalog.||)
   6.623 -      $2::pg_catalog.text
   6.624 -    )::@extschema@.ecluster
   6.625 -  $$;
   6.626 -
   6.627 -CREATE FUNCTION ecluster_create_multipoint(epoint[])
   6.628 -  RETURNS ecluster
   6.629 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   6.630 -    SELECT
   6.631 -      pg_catalog.array_to_string(
   6.632 -        pg_catalog.array_agg(
   6.633 -          'point (' OPERATOR(pg_catalog.||) unnest OPERATOR(pg_catalog.||) ')'
   6.634 -        ),
   6.635 -        ' '
   6.636 -      )::@extschema@.ecluster
   6.637 -    FROM pg_catalog.unnest($1)
   6.638 -  $$;
   6.639 -
   6.640 -CREATE FUNCTION ecluster_create_path(epoint[])
   6.641 -  RETURNS ecluster
   6.642 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   6.643 -    SELECT CASE WHEN "str" OPERATOR(pg_catalog.=) '' THEN
   6.644 -      'empty'::@extschema@.ecluster
   6.645 -    ELSE
   6.646 -      (
   6.647 -        'path (' OPERATOR(pg_catalog.||) "str" OPERATOR(pg_catalog.||) ')'
   6.648 -      )::@extschema@.ecluster
   6.649 -    END
   6.650 -    FROM pg_catalog.array_to_string($1, ' ') AS "str"
   6.651 -  $$;
   6.652 -
   6.653 -CREATE FUNCTION ecluster_create_outline(epoint[])
   6.654 -  RETURNS ecluster
   6.655 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   6.656 -    SELECT CASE WHEN "str" OPERATOR(pg_catalog.=) '' THEN
   6.657 -      'empty'::@extschema@.ecluster
   6.658 -    ELSE
   6.659 -      (
   6.660 -        'outline (' OPERATOR(pg_catalog.||) "str" OPERATOR(pg_catalog.||) ')'
   6.661 -      )::@extschema@.ecluster
   6.662 -    END
   6.663 -    FROM pg_catalog.array_to_string($1, ' ') AS "str"
   6.664 -  $$;
   6.665 -
   6.666 -CREATE FUNCTION ecluster_create_polygon(epoint[])
   6.667 -  RETURNS ecluster
   6.668 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   6.669 -    SELECT CASE WHEN "str" OPERATOR(pg_catalog.=) '' THEN
   6.670 -      'empty'::@extschema@.ecluster
   6.671 -    ELSE
   6.672 -      (
   6.673 -        'polygon (' OPERATOR(pg_catalog.||) pg_catalog.array_to_string($1, ' ')
   6.674 -        OPERATOR(pg_catalog.||) ')'
   6.675 -      )::@extschema@.ecluster
   6.676 -    END
   6.677 -    FROM pg_catalog.array_to_string($1, ' ') AS "str"
   6.678 -  $$;
   6.679 -
   6.680 -
   6.681 -----------------------
   6.682 --- getter functions --
   6.683 -----------------------
   6.684 -
   6.685 -CREATE FUNCTION latitude(epoint)
   6.686 -  RETURNS float8
   6.687 -  LANGUAGE C IMMUTABLE STRICT
   6.688 -  AS '$libdir/latlon-v0010', 'pgl_epoint_lat';
   6.689 -
   6.690 -CREATE FUNCTION longitude(epoint)
   6.691 -  RETURNS float8
   6.692 -  LANGUAGE C IMMUTABLE STRICT
   6.693 -  AS '$libdir/latlon-v0010', 'pgl_epoint_lon';
   6.694 -
   6.695 -CREATE FUNCTION min_latitude(ebox)
   6.696 -  RETURNS float8
   6.697 -  LANGUAGE C IMMUTABLE STRICT
   6.698 -  AS '$libdir/latlon-v0010', 'pgl_ebox_lat_min';
   6.699 -
   6.700 -CREATE FUNCTION max_latitude(ebox)
   6.701 -  RETURNS float8
   6.702 -  LANGUAGE C IMMUTABLE STRICT
   6.703 -  AS '$libdir/latlon-v0010', 'pgl_ebox_lat_max';
   6.704 -
   6.705 -CREATE FUNCTION min_longitude(ebox)
   6.706 -  RETURNS float8
   6.707 -  LANGUAGE C IMMUTABLE STRICT
   6.708 -  AS '$libdir/latlon-v0010', 'pgl_ebox_lon_min';
   6.709 -
   6.710 -CREATE FUNCTION max_longitude(ebox)
   6.711 -  RETURNS float8
   6.712 -  LANGUAGE C IMMUTABLE STRICT
   6.713 -  AS '$libdir/latlon-v0010', 'pgl_ebox_lon_max';
   6.714 -
   6.715 -CREATE FUNCTION center(ecircle)
   6.716 -  RETURNS epoint
   6.717 -  LANGUAGE C IMMUTABLE STRICT
   6.718 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_center';
   6.719 -
   6.720 -CREATE FUNCTION radius(ecircle)
   6.721 -  RETURNS float8
   6.722 -  LANGUAGE C IMMUTABLE STRICT
   6.723 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_radius';
   6.724 -
   6.725 -CREATE FUNCTION ecluster_extract_points(ecluster)
   6.726 -  RETURNS SETOF epoint
   6.727 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   6.728 -    SELECT "match"[2]::@extschema@.epoint
   6.729 -    FROM pg_catalog.regexp_matches(
   6.730 -      $1::pg_catalog.text, e'(^| )point \\(([^)]+)\\)', 'g'
   6.731 -    ) AS "match"
   6.732 -  $$;
   6.733 -
   6.734 -CREATE FUNCTION ecluster_extract_paths(ecluster)
   6.735 -  RETURNS SETOF epoint[]
   6.736 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   6.737 -    SELECT (
   6.738 -      SELECT pg_catalog.array_agg("m2"[1]::@extschema@.epoint)
   6.739 -      FROM pg_catalog.regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
   6.740 -    )
   6.741 -    FROM pg_catalog.regexp_matches(
   6.742 -      $1::pg_catalog.text, e'(^| )path \\(([^)]+)\\)', 'g'
   6.743 -    ) AS "m1"
   6.744 -  $$;
   6.745 -
   6.746 -CREATE FUNCTION ecluster_extract_outlines(ecluster)
   6.747 -  RETURNS SETOF epoint[]
   6.748 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   6.749 -    SELECT (
   6.750 -      SELECT pg_catalog.array_agg("m2"[1]::@extschema@.epoint)
   6.751 -      FROM pg_catalog.regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
   6.752 -    )
   6.753 -    FROM pg_catalog.regexp_matches(
   6.754 -      $1::pg_catalog.text, e'(^| )outline \\(([^)]+)\\)', 'g'
   6.755 -    ) AS "m1"
   6.756 -  $$;
   6.757 -
   6.758 -CREATE FUNCTION ecluster_extract_polygons(ecluster)
   6.759 -  RETURNS SETOF epoint[]
   6.760 -  LANGUAGE sql IMMUTABLE STRICT AS $$
   6.761 -    SELECT (
   6.762 -      SELECT pg_catalog.array_agg("m2"[1]::@extschema@.epoint)
   6.763 -      FROM pg_catalog.regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
   6.764 -    )
   6.765 -    FROM pg_catalog.regexp_matches(
   6.766 -      $1::pg_catalog.text, e'(^| )polygon \\(([^)]+)\\)', 'g'
   6.767 -    ) AS "m1"
   6.768 -  $$;
   6.769 -
   6.770 -
   6.771 ----------------
   6.772 --- operators --
   6.773 ----------------
   6.774 -
   6.775 -CREATE FUNCTION epoint_ebox_overlap_proc(epoint, ebox)
   6.776 -  RETURNS boolean
   6.777 -  LANGUAGE C IMMUTABLE STRICT
   6.778 -  AS '$libdir/latlon-v0010', 'pgl_epoint_ebox_overlap';
   6.779 -
   6.780 -CREATE FUNCTION epoint_ecircle_overlap_proc(epoint, ecircle)
   6.781 -  RETURNS boolean
   6.782 -  LANGUAGE C IMMUTABLE STRICT
   6.783 -  AS '$libdir/latlon-v0010', 'pgl_epoint_ecircle_overlap';
   6.784 -
   6.785 -CREATE FUNCTION epoint_ecluster_overlap_proc(epoint, ecluster)
   6.786 -  RETURNS boolean
   6.787 -  LANGUAGE C IMMUTABLE STRICT
   6.788 -  AS '$libdir/latlon-v0010', 'pgl_epoint_ecluster_overlap';
   6.789 -
   6.790 -CREATE FUNCTION epoint_ecluster_may_overlap_proc(epoint, ecluster)
   6.791 -  RETURNS boolean
   6.792 -  LANGUAGE C IMMUTABLE STRICT
   6.793 -  AS '$libdir/latlon-v0010', 'pgl_epoint_ecluster_may_overlap';
   6.794 -
   6.795 -CREATE FUNCTION ebox_overlap_proc(ebox, ebox)
   6.796 -  RETURNS boolean
   6.797 -  LANGUAGE C IMMUTABLE STRICT
   6.798 -  AS '$libdir/latlon-v0010', 'pgl_ebox_overlap';
   6.799 -
   6.800 -CREATE FUNCTION ebox_ecircle_may_overlap_proc(ebox, ecircle)
   6.801 -  RETURNS boolean
   6.802 -  LANGUAGE C IMMUTABLE STRICT
   6.803 -  AS '$libdir/latlon-v0010', 'pgl_ebox_ecircle_may_overlap';
   6.804 -
   6.805 -CREATE FUNCTION ebox_ecluster_may_overlap_proc(ebox, ecluster)
   6.806 -  RETURNS boolean
   6.807 -  LANGUAGE C IMMUTABLE STRICT
   6.808 -  AS '$libdir/latlon-v0010', 'pgl_ebox_ecluster_may_overlap';
   6.809 -
   6.810 -CREATE FUNCTION ecircle_overlap_proc(ecircle, ecircle)
   6.811 -  RETURNS boolean
   6.812 -  LANGUAGE C IMMUTABLE STRICT
   6.813 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_overlap';
   6.814 -
   6.815 -CREATE FUNCTION ecircle_ecluster_overlap_proc(ecircle, ecluster)
   6.816 -  RETURNS boolean
   6.817 -  LANGUAGE C IMMUTABLE STRICT
   6.818 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_ecluster_overlap';
   6.819 -
   6.820 -CREATE FUNCTION ecircle_ecluster_may_overlap_proc(ecircle, ecluster)
   6.821 -  RETURNS boolean
   6.822 -  LANGUAGE C IMMUTABLE STRICT
   6.823 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_ecluster_may_overlap';
   6.824 -
   6.825 -CREATE FUNCTION ecluster_overlap_proc(ecluster, ecluster)
   6.826 -  RETURNS boolean
   6.827 -  LANGUAGE C IMMUTABLE STRICT
   6.828 -  AS '$libdir/latlon-v0010', 'pgl_ecluster_overlap';
   6.829 -
   6.830 -CREATE FUNCTION ecluster_may_overlap_proc(ecluster, ecluster)
   6.831 -  RETURNS boolean
   6.832 -  LANGUAGE C IMMUTABLE STRICT
   6.833 -  AS '$libdir/latlon-v0010', 'pgl_ecluster_may_overlap';
   6.834 -
   6.835 -CREATE FUNCTION ecluster_contains_proc(ecluster, ecluster)
   6.836 -  RETURNS boolean
   6.837 -  LANGUAGE C IMMUTABLE STRICT
   6.838 -  AS '$libdir/latlon-v0010', 'pgl_ecluster_contains';
   6.839 -
   6.840 -CREATE FUNCTION epoint_distance_proc(epoint, epoint)
   6.841 -  RETURNS float8
   6.842 -  LANGUAGE C IMMUTABLE STRICT
   6.843 -  AS '$libdir/latlon-v0010', 'pgl_epoint_distance';
   6.844 -
   6.845 -CREATE FUNCTION epoint_ecircle_distance_proc(epoint, ecircle)
   6.846 -  RETURNS float8
   6.847 -  LANGUAGE C IMMUTABLE STRICT
   6.848 -  AS '$libdir/latlon-v0010', 'pgl_epoint_ecircle_distance';
   6.849 -
   6.850 -CREATE FUNCTION epoint_ecluster_distance_proc(epoint, ecluster)
   6.851 -  RETURNS float8
   6.852 -  LANGUAGE C IMMUTABLE STRICT
   6.853 -  AS '$libdir/latlon-v0010', 'pgl_epoint_ecluster_distance';
   6.854 -
   6.855 -CREATE FUNCTION ecircle_distance_proc(ecircle, ecircle)
   6.856 -  RETURNS float8
   6.857 -  LANGUAGE C IMMUTABLE STRICT
   6.858 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_distance';
   6.859 -
   6.860 -CREATE FUNCTION ecircle_ecluster_distance_proc(ecircle, ecluster)
   6.861 -  RETURNS float8
   6.862 -  LANGUAGE C IMMUTABLE STRICT
   6.863 -  AS '$libdir/latlon-v0010', 'pgl_ecircle_ecluster_distance';
   6.864 -
   6.865 -CREATE FUNCTION ecluster_distance_proc(ecluster, ecluster)
   6.866 -  RETURNS float8
   6.867 -  LANGUAGE C IMMUTABLE STRICT
   6.868 -  AS '$libdir/latlon-v0010', 'pgl_ecluster_distance';
   6.869 -
   6.870 -CREATE FUNCTION fair_distance_operator_proc(ecluster, epoint_with_sample_count)
   6.871 -  RETURNS float8
   6.872 -  LANGUAGE C IMMUTABLE STRICT
   6.873 -  AS '$libdir/latlon-v0010', 'pgl_ecluster_epoint_sc_fair_distance';
   6.874 -
   6.875 -CREATE OPERATOR && (
   6.876 -  leftarg = epoint,
   6.877 -  rightarg = ebox,
   6.878 -  procedure = epoint_ebox_overlap_proc,
   6.879 -  commutator = &&,
   6.880 -  restrict = areasel,
   6.881 -  join = areajoinsel
   6.882 -);
   6.883 -
   6.884 -CREATE FUNCTION epoint_ebox_overlap_commutator(ebox, epoint)
   6.885 -  RETURNS boolean
   6.886 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&) $1';
   6.887 -
   6.888 -CREATE OPERATOR && (
   6.889 -  leftarg = ebox,
   6.890 -  rightarg = epoint,
   6.891 -  procedure = epoint_ebox_overlap_commutator,
   6.892 -  commutator = &&,
   6.893 -  restrict = areasel,
   6.894 -  join = areajoinsel
   6.895 -);
   6.896 -
   6.897 -CREATE OPERATOR && (
   6.898 -  leftarg = epoint,
   6.899 -  rightarg = ecircle,
   6.900 -  procedure = epoint_ecircle_overlap_proc,
   6.901 -  commutator = &&,
   6.902 -  restrict = areasel,
   6.903 -  join = areajoinsel
   6.904 -);
   6.905 -
   6.906 -CREATE FUNCTION epoint_ecircle_overlap_commutator(ecircle, epoint)
   6.907 -  RETURNS boolean
   6.908 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&) $1';
   6.909 -
   6.910 -CREATE OPERATOR && (
   6.911 -  leftarg = ecircle,
   6.912 -  rightarg = epoint,
   6.913 -  procedure = epoint_ecircle_overlap_commutator,
   6.914 -  commutator = &&,
   6.915 -  restrict = areasel,
   6.916 -  join = areajoinsel
   6.917 -);
   6.918 -
   6.919 -CREATE OPERATOR && (
   6.920 -  leftarg = epoint,
   6.921 -  rightarg = ecluster,
   6.922 -  procedure = epoint_ecluster_overlap_proc,
   6.923 -  commutator = &&,
   6.924 -  restrict = areasel,
   6.925 -  join = areajoinsel
   6.926 -);
   6.927 -
   6.928 -CREATE FUNCTION epoint_ecluster_overlap_commutator(ecluster, epoint)
   6.929 -  RETURNS boolean
   6.930 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&) $1';
   6.931 -
   6.932 -CREATE OPERATOR && (
   6.933 -  leftarg = ecluster,
   6.934 -  rightarg = epoint,
   6.935 -  procedure = epoint_ecluster_overlap_commutator,
   6.936 -  commutator = &&,
   6.937 -  restrict = areasel,
   6.938 -  join = areajoinsel
   6.939 -);
   6.940 -
   6.941 -CREATE OPERATOR && (
   6.942 -  leftarg = ebox,
   6.943 -  rightarg = ebox,
   6.944 -  procedure = ebox_overlap_proc,
   6.945 -  commutator = &&,
   6.946 -  restrict = areasel,
   6.947 -  join = areajoinsel
   6.948 -);
   6.949 -
   6.950 -CREATE OPERATOR && (
   6.951 -  leftarg = ecircle,
   6.952 -  rightarg = ecircle,
   6.953 -  procedure = ecircle_overlap_proc,
   6.954 -  commutator = &&,
   6.955 -  restrict = areasel,
   6.956 -  join = areajoinsel
   6.957 -);
   6.958 -
   6.959 -CREATE OPERATOR && (
   6.960 -  leftarg = ecircle,
   6.961 -  rightarg = ecluster,
   6.962 -  procedure = ecircle_ecluster_overlap_proc,
   6.963 -  commutator = &&,
   6.964 -  restrict = areasel,
   6.965 -  join = areajoinsel
   6.966 -);
   6.967 -
   6.968 -CREATE FUNCTION ecircle_ecluster_overlap_commutator(ecluster, ecircle)
   6.969 -  RETURNS boolean
   6.970 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&) $1';
   6.971 -
   6.972 -CREATE OPERATOR && (
   6.973 -  leftarg = ecluster,
   6.974 -  rightarg = ecircle,
   6.975 -  procedure = ecircle_ecluster_overlap_commutator,
   6.976 -  commutator = &&,
   6.977 -  restrict = areasel,
   6.978 -  join = areajoinsel
   6.979 -);
   6.980 -
   6.981 -CREATE OPERATOR && (
   6.982 -  leftarg = ecluster,
   6.983 -  rightarg = ecluster,
   6.984 -  procedure = ecluster_overlap_proc,
   6.985 -  commutator = &&,
   6.986 -  restrict = areasel,
   6.987 -  join = areajoinsel
   6.988 -);
   6.989 -
   6.990 -CREATE FUNCTION ebox_ecircle_overlap_castwrap(ebox, ecircle)
   6.991 -  RETURNS boolean
   6.992 -  LANGUAGE sql IMMUTABLE
   6.993 -  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.&&) $2';
   6.994 -
   6.995 -CREATE OPERATOR && (
   6.996 -  leftarg = ebox,
   6.997 -  rightarg = ecircle,
   6.998 -  procedure = ebox_ecircle_overlap_castwrap,
   6.999 -  commutator = &&,
  6.1000 -  restrict = areasel,
  6.1001 -  join = areajoinsel
  6.1002 -);
  6.1003 -
  6.1004 -CREATE FUNCTION ebox_ecircle_overlap_castwrap(ecircle, ebox)
  6.1005 -  RETURNS boolean
  6.1006 -  LANGUAGE sql IMMUTABLE
  6.1007 -  AS 'SELECT $1 OPERATOR(@extschema@.&&) $2::@extschema@.ecluster';
  6.1008 -
  6.1009 -CREATE OPERATOR && (
  6.1010 -  leftarg = ecircle,
  6.1011 -  rightarg = ebox,
  6.1012 -  procedure = ebox_ecircle_overlap_castwrap,
  6.1013 -  commutator = &&,
  6.1014 -  restrict = areasel,
  6.1015 -  join = areajoinsel
  6.1016 -);
  6.1017 -
  6.1018 -CREATE FUNCTION ebox_ecluster_overlap_castwrap(ebox, ecluster)
  6.1019 -  RETURNS boolean
  6.1020 -  LANGUAGE sql IMMUTABLE
  6.1021 -  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.&&) $2';
  6.1022 -
  6.1023 -CREATE OPERATOR && (
  6.1024 -  leftarg = ebox,
  6.1025 -  rightarg = ecluster,
  6.1026 -  procedure = ebox_ecluster_overlap_castwrap,
  6.1027 -  commutator = &&,
  6.1028 -  restrict = areasel,
  6.1029 -  join = areajoinsel
  6.1030 -);
  6.1031 -
  6.1032 -CREATE FUNCTION ebox_ecluster_overlap_castwrap(ecluster, ebox)
  6.1033 -  RETURNS boolean
  6.1034 -  LANGUAGE sql IMMUTABLE
  6.1035 -  AS 'SELECT $1 OPERATOR(@extschema@.&&) $2::@extschema@.ecluster';
  6.1036 -
  6.1037 -CREATE OPERATOR && (
  6.1038 -  leftarg = ecluster,
  6.1039 -  rightarg = ebox,
  6.1040 -  procedure = ebox_ecluster_overlap_castwrap,
  6.1041 -  commutator = &&,
  6.1042 -  restrict = areasel,
  6.1043 -  join = areajoinsel
  6.1044 -);
  6.1045 -
  6.1046 -CREATE OPERATOR &&+ (
  6.1047 -  leftarg = epoint,
  6.1048 -  rightarg = ecluster,
  6.1049 -  procedure = epoint_ecluster_may_overlap_proc,
  6.1050 -  commutator = &&+,
  6.1051 -  restrict = areasel,
  6.1052 -  join = areajoinsel
  6.1053 -);
  6.1054 -
  6.1055 -CREATE FUNCTION epoint_ecluster_may_overlap_commutator(ecluster, epoint)
  6.1056 -  RETURNS boolean
  6.1057 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&+) $1';
  6.1058 -
  6.1059 -CREATE OPERATOR &&+ (
  6.1060 -  leftarg = ecluster,
  6.1061 -  rightarg = epoint,
  6.1062 -  procedure = epoint_ecluster_may_overlap_commutator,
  6.1063 -  commutator = &&+,
  6.1064 -  restrict = areasel,
  6.1065 -  join = areajoinsel
  6.1066 -);
  6.1067 -
  6.1068 -CREATE OPERATOR &&+ (
  6.1069 -  leftarg = ebox,
  6.1070 -  rightarg = ecircle,
  6.1071 -  procedure = ebox_ecircle_may_overlap_proc,
  6.1072 -  commutator = &&+,
  6.1073 -  restrict = areasel,
  6.1074 -  join = areajoinsel
  6.1075 -);
  6.1076 -
  6.1077 -CREATE FUNCTION ebox_ecircle_may_overlap_commutator(ecircle, ebox)
  6.1078 -  RETURNS boolean
  6.1079 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&+) $1';
  6.1080 -
  6.1081 -CREATE OPERATOR &&+ (
  6.1082 -  leftarg = ecircle,
  6.1083 -  rightarg = ebox,
  6.1084 -  procedure = ebox_ecircle_may_overlap_commutator,
  6.1085 -  commutator = &&+,
  6.1086 -  restrict = areasel,
  6.1087 -  join = areajoinsel
  6.1088 -);
  6.1089 -
  6.1090 -CREATE OPERATOR &&+ (
  6.1091 -  leftarg = ebox,
  6.1092 -  rightarg = ecluster,
  6.1093 -  procedure = ebox_ecluster_may_overlap_proc,
  6.1094 -  commutator = &&+,
  6.1095 -  restrict = areasel,
  6.1096 -  join = areajoinsel
  6.1097 -);
  6.1098 -
  6.1099 -CREATE FUNCTION ebox_ecluster_may_overlap_commutator(ecluster, ebox)
  6.1100 -  RETURNS boolean
  6.1101 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&+) $1';
  6.1102 -
  6.1103 -CREATE OPERATOR &&+ (
  6.1104 -  leftarg = ecluster,
  6.1105 -  rightarg = ebox,
  6.1106 -  procedure = ebox_ecluster_may_overlap_commutator,
  6.1107 -  commutator = &&+,
  6.1108 -  restrict = areasel,
  6.1109 -  join = areajoinsel
  6.1110 -);
  6.1111 -
  6.1112 -CREATE OPERATOR &&+ (
  6.1113 -  leftarg = ecircle,
  6.1114 -  rightarg = ecluster,
  6.1115 -  procedure = ecircle_ecluster_may_overlap_proc,
  6.1116 -  commutator = &&+,
  6.1117 -  restrict = areasel,
  6.1118 -  join = areajoinsel
  6.1119 -);
  6.1120 -
  6.1121 -CREATE FUNCTION ecircle_ecluster_may_overlap_commutator(ecluster, ecircle)
  6.1122 -  RETURNS boolean
  6.1123 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&+) $1';
  6.1124 -
  6.1125 -CREATE OPERATOR &&+ (
  6.1126 -  leftarg = ecluster,
  6.1127 -  rightarg = ecircle,
  6.1128 -  procedure = ecircle_ecluster_may_overlap_commutator,
  6.1129 -  commutator = &&+,
  6.1130 -  restrict = areasel,
  6.1131 -  join = areajoinsel
  6.1132 -);
  6.1133 -
  6.1134 -CREATE OPERATOR &&+ (
  6.1135 -  leftarg = ecluster,
  6.1136 -  rightarg = ecluster,
  6.1137 -  procedure = ecluster_may_overlap_proc,
  6.1138 -  commutator = &&+,
  6.1139 -  restrict = areasel,
  6.1140 -  join = areajoinsel
  6.1141 -);
  6.1142 -
  6.1143 -CREATE OPERATOR @> (
  6.1144 -  leftarg = ebox,
  6.1145 -  rightarg = epoint,
  6.1146 -  procedure = epoint_ebox_overlap_commutator,
  6.1147 -  commutator = <@,
  6.1148 -  restrict = areasel,
  6.1149 -  join = areajoinsel
  6.1150 -);
  6.1151 -
  6.1152 -CREATE OPERATOR <@ (
  6.1153 -  leftarg = epoint,
  6.1154 -  rightarg = ebox,
  6.1155 -  procedure = epoint_ebox_overlap_proc,
  6.1156 -  commutator = @>,
  6.1157 -  restrict = areasel,
  6.1158 -  join = areajoinsel
  6.1159 -);
  6.1160 -
  6.1161 -CREATE OPERATOR @> (
  6.1162 -  leftarg = ecluster,
  6.1163 -  rightarg = epoint,
  6.1164 -  procedure = epoint_ecluster_overlap_commutator,
  6.1165 -  commutator = <@,
  6.1166 -  restrict = areasel,
  6.1167 -  join = areajoinsel
  6.1168 -);
  6.1169 -
  6.1170 -CREATE OPERATOR <@ (
  6.1171 -  leftarg = epoint,
  6.1172 -  rightarg = ecluster,
  6.1173 -  procedure = epoint_ecluster_overlap_proc,
  6.1174 -  commutator = @>,
  6.1175 -  restrict = areasel,
  6.1176 -  join = areajoinsel
  6.1177 -);
  6.1178 -
  6.1179 -CREATE OPERATOR @> (
  6.1180 -  leftarg = ecluster,
  6.1181 -  rightarg = ecluster,
  6.1182 -  procedure = ecluster_contains_proc,
  6.1183 -  commutator = <@,
  6.1184 -  restrict = areasel,
  6.1185 -  join = areajoinsel
  6.1186 -);
  6.1187 -
  6.1188 -CREATE FUNCTION ecluster_contains_commutator(ecluster, ecluster)
  6.1189 -  RETURNS boolean
  6.1190 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.@>) $1';
  6.1191 -
  6.1192 -CREATE OPERATOR <@ (
  6.1193 -  leftarg = ecluster,
  6.1194 -  rightarg = ecluster,
  6.1195 -  procedure = ecluster_contains_commutator,
  6.1196 -  commutator = @>,
  6.1197 -  restrict = areasel,
  6.1198 -  join = areajoinsel
  6.1199 -);
  6.1200 -
  6.1201 -CREATE FUNCTION ebox_contains_castwrap(ebox, ebox)
  6.1202 -  RETURNS boolean
  6.1203 -  LANGUAGE sql IMMUTABLE AS $$
  6.1204 -    SELECT
  6.1205 -    $1::@extschema@.ecluster OPERATOR(@extschema@.@>) $2::@extschema@.ecluster
  6.1206 -  $$;
  6.1207 -
  6.1208 -CREATE OPERATOR @> (
  6.1209 -  leftarg = ebox,
  6.1210 -  rightarg = ebox,
  6.1211 -  procedure = ebox_contains_castwrap,
  6.1212 -  commutator = <@,
  6.1213 -  restrict = areasel,
  6.1214 -  join = areajoinsel
  6.1215 -);
  6.1216 -
  6.1217 -CREATE FUNCTION ebox_contains_swapped_castwrap(ebox, ebox)
  6.1218 -  RETURNS boolean
  6.1219 -  LANGUAGE sql IMMUTABLE AS $$
  6.1220 -    SELECT
  6.1221 -    $2::@extschema@.ecluster OPERATOR(@extschema@.@>) $1::@extschema@.ecluster
  6.1222 -  $$;
  6.1223 -
  6.1224 -CREATE OPERATOR <@ (
  6.1225 -  leftarg = ebox,
  6.1226 -  rightarg = ebox,
  6.1227 -  procedure = ebox_contains_swapped_castwrap,
  6.1228 -  commutator = @>,
  6.1229 -  restrict = areasel,
  6.1230 -  join = areajoinsel
  6.1231 -);
  6.1232 -
  6.1233 -CREATE FUNCTION ebox_ecluster_contains_castwrap(ebox, ecluster)
  6.1234 -  RETURNS boolean
  6.1235 -  LANGUAGE sql IMMUTABLE
  6.1236 -  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.@>) $2';
  6.1237 -
  6.1238 -CREATE OPERATOR @> (
  6.1239 -  leftarg = ebox,
  6.1240 -  rightarg = ecluster,
  6.1241 -  procedure = ebox_ecluster_contains_castwrap,
  6.1242 -  commutator = <@,
  6.1243 -  restrict = areasel,
  6.1244 -  join = areajoinsel
  6.1245 -);
  6.1246 -
  6.1247 -CREATE FUNCTION ebox_ecluster_contains_castwrap(ecluster, ebox)
  6.1248 -  RETURNS boolean
  6.1249 -  LANGUAGE sql IMMUTABLE
  6.1250 -  AS 'SELECT $2::@extschema@.ecluster OPERATOR(@extschema@.@>) $1';
  6.1251 -
  6.1252 -CREATE OPERATOR <@ (
  6.1253 -  leftarg = ecluster,
  6.1254 -  rightarg = ebox,
  6.1255 -  procedure = ebox_ecluster_contains_castwrap,
  6.1256 -  commutator = @>,
  6.1257 -  restrict = areasel,
  6.1258 -  join = areajoinsel
  6.1259 -);
  6.1260 -
  6.1261 -CREATE FUNCTION ecluster_ebox_contains_castwrap(ecluster, ebox)
  6.1262 -  RETURNS boolean
  6.1263 -  LANGUAGE sql IMMUTABLE
  6.1264 -  AS 'SELECT $1 OPERATOR(@extschema@.@>) $2::@extschema@.ecluster';
  6.1265 -
  6.1266 -CREATE OPERATOR @> (
  6.1267 -  leftarg = ecluster,
  6.1268 -  rightarg = ebox,
  6.1269 -  procedure = ecluster_ebox_contains_castwrap,
  6.1270 -  commutator = <@,
  6.1271 -  restrict = areasel,
  6.1272 -  join = areajoinsel
  6.1273 -);
  6.1274 -
  6.1275 -CREATE FUNCTION ecluster_ebox_contains_castwrap(ebox, ecluster)
  6.1276 -  RETURNS boolean
  6.1277 -  LANGUAGE sql IMMUTABLE
  6.1278 -  AS 'SELECT $2 OPERATOR(@extschema@.@>) $1::@extschema@.ecluster';
  6.1279 -
  6.1280 -CREATE OPERATOR <@ (
  6.1281 -  leftarg = ebox,
  6.1282 -  rightarg = ecluster,
  6.1283 -  procedure = ecluster_ebox_contains_castwrap,
  6.1284 -  commutator = @>,
  6.1285 -  restrict = areasel,
  6.1286 -  join = areajoinsel
  6.1287 -);
  6.1288 -
  6.1289 -CREATE OPERATOR <-> (
  6.1290 -  leftarg = epoint,
  6.1291 -  rightarg = epoint,
  6.1292 -  procedure = epoint_distance_proc,
  6.1293 -  commutator = <->
  6.1294 -);
  6.1295 -
  6.1296 -CREATE OPERATOR <-> (
  6.1297 -  leftarg = epoint,
  6.1298 -  rightarg = ecircle,
  6.1299 -  procedure = epoint_ecircle_distance_proc,
  6.1300 -  commutator = <->
  6.1301 -);
  6.1302 -
  6.1303 -CREATE FUNCTION epoint_ecircle_distance_commutator(ecircle, epoint)
  6.1304 -  RETURNS float8
  6.1305 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.<->) $1';
  6.1306 -
  6.1307 -CREATE OPERATOR <-> (
  6.1308 -  leftarg = ecircle,
  6.1309 -  rightarg = epoint,
  6.1310 -  procedure = epoint_ecircle_distance_commutator,
  6.1311 -  commutator = <->
  6.1312 -);
  6.1313 -
  6.1314 -CREATE OPERATOR <-> (
  6.1315 -  leftarg = epoint,
  6.1316 -  rightarg = ecluster,
  6.1317 -  procedure = epoint_ecluster_distance_proc,
  6.1318 -  commutator = <->
  6.1319 -);
  6.1320 -
  6.1321 -CREATE FUNCTION epoint_ecluster_distance_commutator(ecluster, epoint)
  6.1322 -  RETURNS float8
  6.1323 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.<->) $1';
  6.1324 -
  6.1325 -CREATE OPERATOR <-> (
  6.1326 -  leftarg = ecluster,
  6.1327 -  rightarg = epoint,
  6.1328 -  procedure = epoint_ecluster_distance_commutator,
  6.1329 -  commutator = <->
  6.1330 -);
  6.1331 -
  6.1332 -CREATE OPERATOR <-> (
  6.1333 -  leftarg = ecircle,
  6.1334 -  rightarg = ecircle,
  6.1335 -  procedure = ecircle_distance_proc,
  6.1336 -  commutator = <->
  6.1337 -);
  6.1338 -
  6.1339 -CREATE OPERATOR <-> (
  6.1340 -  leftarg = ecircle,
  6.1341 -  rightarg = ecluster,
  6.1342 -  procedure = ecircle_ecluster_distance_proc,
  6.1343 -  commutator = <->
  6.1344 -);
  6.1345 -
  6.1346 -CREATE FUNCTION ecircle_ecluster_distance_commutator(ecluster, ecircle)
  6.1347 -  RETURNS float8
  6.1348 -  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.<->) $1';
  6.1349 -
  6.1350 -CREATE OPERATOR <-> (
  6.1351 -  leftarg = ecluster,
  6.1352 -  rightarg = ecircle,
  6.1353 -  procedure = ecircle_ecluster_distance_commutator,
  6.1354 -  commutator = <->
  6.1355 -);
  6.1356 -
  6.1357 -CREATE OPERATOR <-> (
  6.1358 -  leftarg = ecluster,
  6.1359 -  rightarg = ecluster,
  6.1360 -  procedure = ecluster_distance_proc,
  6.1361 -  commutator = <->
  6.1362 -);
  6.1363 -
  6.1364 -CREATE FUNCTION epoint_ebox_distance_castwrap(epoint, ebox)
  6.1365 -  RETURNS float8
  6.1366 -  LANGUAGE sql IMMUTABLE
  6.1367 -  AS 'SELECT $1 OPERATOR(@extschema@.<->) $2::@extschema@.ecluster';
  6.1368 -
  6.1369 -CREATE OPERATOR <-> (
  6.1370 -  leftarg = epoint,
  6.1371 -  rightarg = ebox,
  6.1372 -  procedure = epoint_ebox_distance_castwrap,
  6.1373 -  commutator = <->
  6.1374 -);
  6.1375 -
  6.1376 -CREATE FUNCTION epoint_ebox_distance_castwrap(ebox, epoint)
  6.1377 -  RETURNS float8
  6.1378 -  LANGUAGE sql IMMUTABLE
  6.1379 -  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.<->) $2';
  6.1380 -
  6.1381 -CREATE OPERATOR <-> (
  6.1382 -  leftarg = ebox,
  6.1383 -  rightarg = epoint,
  6.1384 -  procedure = epoint_ebox_distance_castwrap,
  6.1385 -  commutator = <->
  6.1386 -);
  6.1387 -
  6.1388 -CREATE FUNCTION ebox_distance_castwrap(ebox, ebox)
  6.1389 -  RETURNS float8
  6.1390 -  LANGUAGE sql IMMUTABLE AS $$
  6.1391 -    SELECT
  6.1392 -    $1::@extschema@.ecluster OPERATOR(@extschema@.<->) $2::@extschema@.ecluster
  6.1393 -  $$;
  6.1394 -
  6.1395 -CREATE OPERATOR <-> (
  6.1396 -  leftarg = ebox,
  6.1397 -  rightarg = ebox,
  6.1398 -  procedure = ebox_distance_castwrap,
  6.1399 -  commutator = <->
  6.1400 -);
  6.1401 -
  6.1402 -CREATE FUNCTION ebox_ecircle_distance_castwrap(ebox, ecircle)
  6.1403 -  RETURNS float8
  6.1404 -  LANGUAGE sql IMMUTABLE
  6.1405 -  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.<->) $2';
  6.1406 -
  6.1407 -CREATE OPERATOR <-> (
  6.1408 -  leftarg = ebox,
  6.1409 -  rightarg = ecircle,
  6.1410 -  procedure = ebox_ecircle_distance_castwrap,
  6.1411 -  commutator = <->
  6.1412 -);
  6.1413 -
  6.1414 -CREATE FUNCTION ebox_ecircle_distance_castwrap(ecircle, ebox)
  6.1415 -  RETURNS float8
  6.1416 -  LANGUAGE sql IMMUTABLE
  6.1417 -  AS 'SELECT $1 OPERATOR(@extschema@.<->) $2::@extschema@.ecluster';
  6.1418 -
  6.1419 -CREATE OPERATOR <-> (
  6.1420 -  leftarg = ecircle,
  6.1421 -  rightarg = ebox,
  6.1422 -  procedure = ebox_ecircle_distance_castwrap,
  6.1423 -  commutator = <->
  6.1424 -);
  6.1425 -
  6.1426 -CREATE FUNCTION ebox_ecluster_distance_castwrap(ebox, ecluster)
  6.1427 -  RETURNS float8
  6.1428 -  LANGUAGE sql IMMUTABLE
  6.1429 -  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.<->) $2';
  6.1430 -
  6.1431 -CREATE OPERATOR <-> (
  6.1432 -  leftarg = ebox,
  6.1433 -  rightarg = ecluster,
  6.1434 -  procedure = ebox_ecluster_distance_castwrap,
  6.1435 -  commutator = <->
  6.1436 -);
  6.1437 -
  6.1438 -CREATE FUNCTION ebox_ecluster_distance_castwrap(ecluster, ebox)
  6.1439 -  RETURNS float8
  6.1440 -  LANGUAGE sql IMMUTABLE
  6.1441 -  AS 'SELECT $1 OPERATOR(@extschema@.<->) $2::@extschema@.ecluster';
  6.1442 -
  6.1443 -CREATE OPERATOR <-> (
  6.1444 -  leftarg = ecluster,
  6.1445 -  rightarg = ebox,
  6.1446 -  procedure = ebox_ecluster_distance_castwrap,
  6.1447 -  commutator = <->
  6.1448 -);
  6.1449 -
  6.1450 -CREATE OPERATOR <=> (
  6.1451 -  leftarg = ecluster,
  6.1452 -  rightarg = epoint_with_sample_count,
  6.1453 -  procedure = fair_distance_operator_proc
  6.1454 -);
  6.1455 -
  6.1456 -
  6.1457 -----------------
  6.1458 --- GiST index --
  6.1459 -----------------
  6.1460 -
  6.1461 -CREATE FUNCTION pgl_gist_consistent(internal, internal, smallint, oid, internal)
  6.1462 -  RETURNS boolean
  6.1463 -  LANGUAGE C STRICT
  6.1464 -  AS '$libdir/latlon-v0010', 'pgl_gist_consistent';
  6.1465 -
  6.1466 -CREATE FUNCTION pgl_gist_union(internal, internal)
  6.1467 -  RETURNS internal
  6.1468 -  LANGUAGE C STRICT
  6.1469 -  AS '$libdir/latlon-v0010', 'pgl_gist_union';
  6.1470 -
  6.1471 -CREATE FUNCTION pgl_gist_compress_epoint(internal)
  6.1472 -  RETURNS internal
  6.1473 -  LANGUAGE C STRICT
  6.1474 -  AS '$libdir/latlon-v0010', 'pgl_gist_compress_epoint';
  6.1475 -
  6.1476 -CREATE FUNCTION pgl_gist_compress_ecircle(internal)
  6.1477 -  RETURNS internal
  6.1478 -  LANGUAGE C STRICT
  6.1479 -  AS '$libdir/latlon-v0010', 'pgl_gist_compress_ecircle';
  6.1480 -
  6.1481 -CREATE FUNCTION pgl_gist_compress_ecluster(internal)
  6.1482 -  RETURNS internal
  6.1483 -  LANGUAGE C STRICT
  6.1484 -  AS '$libdir/latlon-v0010', 'pgl_gist_compress_ecluster';
  6.1485 -
  6.1486 -CREATE FUNCTION pgl_gist_decompress(internal)
  6.1487 -  RETURNS internal
  6.1488 -  LANGUAGE C STRICT
  6.1489 -  AS '$libdir/latlon-v0010', 'pgl_gist_decompress';
  6.1490 -
  6.1491 -CREATE FUNCTION pgl_gist_penalty(internal, internal, internal)
  6.1492 -  RETURNS internal
  6.1493 -  LANGUAGE C STRICT
  6.1494 -  AS '$libdir/latlon-v0010', 'pgl_gist_penalty';
  6.1495 -
  6.1496 -CREATE FUNCTION pgl_gist_picksplit(internal, internal)
  6.1497 -  RETURNS internal
  6.1498 -  LANGUAGE C STRICT
  6.1499 -  AS '$libdir/latlon-v0010', 'pgl_gist_picksplit';
  6.1500 -
  6.1501 -CREATE FUNCTION pgl_gist_same(internal, internal, internal)
  6.1502 -  RETURNS internal
  6.1503 -  LANGUAGE C STRICT
  6.1504 -  AS '$libdir/latlon-v0010', 'pgl_gist_same';
  6.1505 -
  6.1506 -CREATE FUNCTION pgl_gist_distance(internal, internal, smallint, oid)
  6.1507 -  RETURNS internal
  6.1508 -  LANGUAGE C STRICT
  6.1509 -  AS '$libdir/latlon-v0010', 'pgl_gist_distance';
  6.1510 -
  6.1511 -CREATE OPERATOR CLASS epoint_ops
  6.1512 -  DEFAULT FOR TYPE epoint USING gist AS
  6.1513 -  OPERATOR  11 = ,
  6.1514 -  OPERATOR  22 &&  (epoint, ebox),
  6.1515 -  OPERATOR 222 <@  (epoint, ebox),
  6.1516 -  OPERATOR  23 &&  (epoint, ecircle),
  6.1517 -  OPERATOR  24 &&  (epoint, ecluster),
  6.1518 -  OPERATOR 124 &&+ (epoint, ecluster),
  6.1519 -  OPERATOR 224 <@  (epoint, ecluster),
  6.1520 -  OPERATOR  31 <-> (epoint, epoint) FOR ORDER BY float_ops,
  6.1521 -  OPERATOR  32 <-> (epoint, ebox) FOR ORDER BY float_ops,
  6.1522 -  OPERATOR  33 <-> (epoint, ecircle) FOR ORDER BY float_ops,
  6.1523 -  OPERATOR  34 <-> (epoint, ecluster) FOR ORDER BY float_ops,
  6.1524 -  FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
  6.1525 -  FUNCTION 2 pgl_gist_union(internal, internal),
  6.1526 -  FUNCTION 3 pgl_gist_compress_epoint(internal),
  6.1527 -  FUNCTION 4 pgl_gist_decompress(internal),
  6.1528 -  FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
  6.1529 -  FUNCTION 6 pgl_gist_picksplit(internal, internal),
  6.1530 -  FUNCTION 7 pgl_gist_same(internal, internal, internal),
  6.1531 -  FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
  6.1532 -  STORAGE ekey_point;
  6.1533 -
  6.1534 -CREATE OPERATOR CLASS ecircle_ops
  6.1535 -  DEFAULT FOR TYPE ecircle USING gist AS
  6.1536 -  OPERATOR  13 = ,
  6.1537 -  OPERATOR  21 &&  (ecircle, epoint),
  6.1538 -  OPERATOR  22 &&  (ecircle, ebox),
  6.1539 -  OPERATOR 122 &&+ (ecircle, ebox),
  6.1540 -  OPERATOR  23 &&  (ecircle, ecircle),
  6.1541 -  OPERATOR  24 &&  (ecircle, ecluster),
  6.1542 -  OPERATOR 124 &&+ (ecircle, ecluster),
  6.1543 -  OPERATOR  31 <-> (ecircle, epoint) FOR ORDER BY float_ops,
  6.1544 -  OPERATOR  32 <-> (ecircle, ebox) FOR ORDER BY float_ops,
  6.1545 -  OPERATOR  33 <-> (ecircle, ecircle) FOR ORDER BY float_ops,
  6.1546 -  OPERATOR  34 <-> (ecircle, ecluster) FOR ORDER BY float_ops,
  6.1547 -  FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
  6.1548 -  FUNCTION 2 pgl_gist_union(internal, internal),
  6.1549 -  FUNCTION 3 pgl_gist_compress_ecircle(internal),
  6.1550 -  FUNCTION 4 pgl_gist_decompress(internal),
  6.1551 -  FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
  6.1552 -  FUNCTION 6 pgl_gist_picksplit(internal, internal),
  6.1553 -  FUNCTION 7 pgl_gist_same(internal, internal, internal),
  6.1554 -  FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
  6.1555 -  STORAGE ekey_area;
  6.1556 -
  6.1557 -CREATE OPERATOR CLASS ecluster_ops
  6.1558 -  DEFAULT FOR TYPE ecluster USING gist AS
  6.1559 -  OPERATOR  21 &&  (ecluster, epoint),
  6.1560 -  OPERATOR 121 &&+ (ecluster, epoint),
  6.1561 -  OPERATOR 221 @>  (ecluster, epoint),
  6.1562 -  OPERATOR  22 &&  (ecluster, ebox),
  6.1563 -  OPERATOR 122 &&+ (ecluster, ebox),
  6.1564 -  OPERATOR 222 @>  (ecluster, ebox),
  6.1565 -  OPERATOR 322 <@  (ecluster, ebox),
  6.1566 -  OPERATOR  23 &&  (ecluster, ecircle),
  6.1567 -  OPERATOR 123 &&+ (ecluster, ecircle),
  6.1568 -  OPERATOR  24 &&  (ecluster, ecluster),
  6.1569 -  OPERATOR 124 &&+ (ecluster, ecluster),
  6.1570 -  OPERATOR 224 @>  (ecluster, ecluster),
  6.1571 -  OPERATOR 324 <@  (ecluster, ecluster),
  6.1572 -  OPERATOR  31 <-> (ecluster, epoint) FOR ORDER BY float_ops,
  6.1573 -  OPERATOR  32 <-> (ecluster, ebox) FOR ORDER BY float_ops,
  6.1574 -  OPERATOR  33 <-> (ecluster, ecircle) FOR ORDER BY float_ops,
  6.1575 -  OPERATOR  34 <-> (ecluster, ecluster) FOR ORDER BY float_ops,
  6.1576 -  OPERATOR 131 <=> (ecluster, epoint_with_sample_count) FOR ORDER BY float_ops,
  6.1577 -  FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
  6.1578 -  FUNCTION 2 pgl_gist_union(internal, internal),
  6.1579 -  FUNCTION 3 pgl_gist_compress_ecluster(internal),
  6.1580 -  FUNCTION 4 pgl_gist_decompress(internal),
  6.1581 -  FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
  6.1582 -  FUNCTION 6 pgl_gist_picksplit(internal, internal),
  6.1583 -  FUNCTION 7 pgl_gist_same(internal, internal, internal),
  6.1584 -  FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
  6.1585 -  STORAGE ekey_area;
  6.1586 -
  6.1587 -
  6.1588 ----------------------
  6.1589 --- alias functions --
  6.1590 ----------------------
  6.1591 -
  6.1592 -CREATE FUNCTION distance(epoint, epoint)
  6.1593 -  RETURNS float8
  6.1594 -  LANGUAGE sql IMMUTABLE AS 'SELECT $1 OPERATOR(@extschema@.<->) $2';
  6.1595 -
  6.1596 -CREATE FUNCTION distance(ecluster, epoint)
  6.1597 -  RETURNS float8
  6.1598 -  LANGUAGE sql IMMUTABLE AS 'SELECT $1 OPERATOR(@extschema@.<->) $2';
  6.1599 -
  6.1600 -CREATE FUNCTION distance_within(epoint, epoint, float8)
  6.1601 -  RETURNS boolean
  6.1602 -  LANGUAGE sql IMMUTABLE
  6.1603 -  AS 'SELECT $1 OPERATOR(@extschema@.&&) @extschema@.ecircle($2, $3)';
  6.1604 -
  6.1605 -CREATE FUNCTION distance_within(ecluster, epoint, float8)
  6.1606 -  RETURNS boolean
  6.1607 -  LANGUAGE sql IMMUTABLE
  6.1608 -  AS 'SELECT $1 OPERATOR(@extschema@.&&) @extschema@.ecircle($2, $3)';
  6.1609 -
  6.1610 -CREATE FUNCTION fair_distance(ecluster, epoint, int4 = 10000)
  6.1611 -  RETURNS float8
  6.1612 -  LANGUAGE sql IMMUTABLE AS $$
  6.1613 -    SELECT
  6.1614 -    $1 OPERATOR(@extschema@.<=>) @extschema@.epoint_with_sample_count($2, $3)
  6.1615 -  $$;
  6.1616 -
  6.1617 -
  6.1618 ---------------------------------
  6.1619 --- other data storage formats --
  6.1620 ---------------------------------
  6.1621 -
  6.1622 -CREATE FUNCTION coords_to_epoint(float8, float8, text = 'epoint')
  6.1623 -  RETURNS epoint
  6.1624 -  LANGUAGE plpgsql IMMUTABLE STRICT AS $$
  6.1625 -    DECLARE
  6.1626 -      "result" @extschema@.epoint;
  6.1627 -    BEGIN
  6.1628 -      IF $3 OPERATOR(pg_catalog.=) 'epoint_lonlat' THEN
  6.1629 -        -- avoid dynamic command execution for better performance
  6.1630 -        RETURN @extschema@.epoint($2, $1);
  6.1631 -      END IF;
  6.1632 -      IF
  6.1633 -        $3 OPERATOR(pg_catalog.=) 'epoint' OR
  6.1634 -        $3 OPERATOR(pg_catalog.=) 'epoint_latlon'
  6.1635 -      THEN
  6.1636 -        -- avoid dynamic command execution for better performance
  6.1637 -        RETURN @extschema@.epoint($1, $2);
  6.1638 -      END IF;
  6.1639 -      EXECUTE
  6.1640 -        'SELECT ' OPERATOR(pg_catalog.||) $3 OPERATOR(pg_catalog.||) '($1, $2)'         INTO STRICT "result" USING $1, $2;
  6.1641 -      RETURN "result";
  6.1642 -    END;
  6.1643 -  $$;
  6.1644 -
  6.1645 -CREATE FUNCTION GeoJSON_LinearRing_vertices(jsonb, text = 'epoint_lonlat')
  6.1646 -  RETURNS SETOF jsonb
  6.1647 -  LANGUAGE sql IMMUTABLE STRICT AS $$
  6.1648 -    SELECT "result" FROM
  6.1649 -      ( SELECT pg_catalog.jsonb_array_length($1) - 1 )
  6.1650 -      AS "lastindex_row" ("lastindex")
  6.1651 -      CROSS JOIN LATERAL pg_catalog.jsonb_array_elements(
  6.1652 -        CASE WHEN
  6.1653 -          @extschema@.coords_to_epoint(
  6.1654 -            ($1 OPERATOR(pg_catalog.->) 0 OPERATOR(pg_catalog.->>) 0)
  6.1655 -            ::pg_catalog.float8,
  6.1656 -            ($1 OPERATOR(pg_catalog.->) 0 OPERATOR(pg_catalog.->>) 1)
  6.1657 -            ::pg_catalog.float8,
  6.1658 -            $2
  6.1659 -          ) OPERATOR(pg_catalog.=) @extschema@.coords_to_epoint(
  6.1660 -            ($1 OPERATOR(pg_catalog.->) "lastindex" OPERATOR(pg_catalog.->>) 0)
  6.1661 -            ::pg_catalog.float8,
  6.1662 -            ($1 OPERATOR(pg_catalog.->) "lastindex" OPERATOR(pg_catalog.->>) 1)
  6.1663 -            ::pg_catalog.float8,
  6.1664 -            $2
  6.1665 -          )
  6.1666 -        THEN
  6.1667 -          $1 - "lastindex"
  6.1668 -        ELSE
  6.1669 -          $1
  6.1670 -        END
  6.1671 -      ) AS "result_row" ("result")
  6.1672 -  $$;
  6.1673 -
  6.1674 -CREATE FUNCTION GeoJSON_to_epoint(jsonb, text = 'epoint_lonlat')
  6.1675 -  RETURNS epoint
  6.1676 -  LANGUAGE sql IMMUTABLE STRICT AS $$
  6.1677 -    SELECT CASE
  6.1678 -    WHEN $1 OPERATOR(pg_catalog.->>) 'type' OPERATOR(pg_catalog.=) 'Point' THEN
  6.1679 -      @extschema@.coords_to_epoint(
  6.1680 -        ($1 OPERATOR(pg_catalog.->) 'coordinates' OPERATOR(pg_catalog.->>) 0)
  6.1681 -        ::pg_catalog.float8,
  6.1682 -        ($1 OPERATOR(pg_catalog.->) 'coordinates' OPERATOR(pg_catalog.->>) 1)
  6.1683 -        ::pg_catalog.float8,
  6.1684 -        $2
  6.1685 -      )
  6.1686 -    WHEN $1->>'type' = 'Feature' THEN
  6.1687 -      @extschema@.GeoJSON_to_epoint($1 OPERATOR(pg_catalog.->) 'geometry', $2)
  6.1688 -    ELSE
  6.1689 -      NULL
  6.1690 -    END
  6.1691 -  $$;
  6.1692 -
  6.1693 -CREATE FUNCTION GeoJSON_to_ecluster(jsonb, text = 'epoint_lonlat')
  6.1694 -  RETURNS ecluster
  6.1695 -  LANGUAGE plpgsql IMMUTABLE STRICT AS $$
  6.1696 -    DECLARE
  6.1697 -      "tp" TEXT = $1 OPERATOR(pg_catalog.->>) 'type';
  6.1698 -    BEGIN
  6.1699 -      IF "tp" = 'Point' THEN RETURN
  6.1700 -        @extschema@.coords_to_epoint(
  6.1701 -          ($1 OPERATOR(pg_catalog.->) 'coordinates' OPERATOR(pg_catalog.->>) 0)
  6.1702 -          ::pg_catalog.float8,
  6.1703 -          ($1 OPERATOR(pg_catalog.->) 'coordinates' OPERATOR(pg_catalog.->>) 1)
  6.1704 -          ::pg_catalog.float8,
  6.1705 -          $2
  6.1706 -        )::@extschema@.ecluster;
  6.1707 -      END IF;
  6.1708 -      raise notice 'DEBUG2';
  6.1709 -      IF "tp" = 'MultiPoint' THEN RETURN
  6.1710 -        ( SELECT @extschema@.ecluster_create_multipoint(pg_catalog.array_agg(
  6.1711 -            @extschema@.coords_to_epoint(
  6.1712 -              ("coord" OPERATOR(pg_catalog.->>) 0)::pg_catalog.float8,
  6.1713 -              ("coord" OPERATOR(pg_catalog.->>) 1)::pg_catalog.float8,
  6.1714 -              $2
  6.1715 -            )
  6.1716 -          ))
  6.1717 -          FROM pg_catalog.jsonb_array_elements(
  6.1718 -            $1 OPERATOR(pg_catalog.->) 'coordinates'
  6.1719 -          ) AS "coord"
  6.1720 -        );
  6.1721 -      END IF;
  6.1722 -      IF "tp" = 'LineString' THEN RETURN
  6.1723 -        ( SELECT @extschema@.ecluster_create_path(pg_catalog.array_agg(
  6.1724 -            @extschema@.coords_to_epoint(
  6.1725 -              ("coord" OPERATOR(pg_catalog.->>) 0)::pg_catalog.float8,
  6.1726 -              ("coord" OPERATOR(pg_catalog.->>) 1)::pg_catalog.float8,
  6.1727 -              $2
  6.1728 -            )
  6.1729 -          ))
  6.1730 -          FROM pg_catalog.jsonb_array_elements(
  6.1731 -            $1 OPERATOR(pg_catalog.->) 'coordinates'
  6.1732 -          ) AS "coord"
  6.1733 -        );
  6.1734 -      END IF;
  6.1735 -      IF "tp" = 'MultiLineString' THEN RETURN
  6.1736 -        ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
  6.1737 -            ( SELECT @extschema@.ecluster_create_path(pg_catalog.array_agg(
  6.1738 -                @extschema@.coords_to_epoint(
  6.1739 -                  ("coord" OPERATOR(pg_catalog.->>) 0)::pg_catalog.float8,
  6.1740 -                  ("coord" OPERATOR(pg_catalog.->>) 1)::pg_catalog.float8,
  6.1741 -                  $2
  6.1742 -                )
  6.1743 -              ))
  6.1744 -              FROM pg_catalog.jsonb_array_elements("coord_array") AS "coord"
  6.1745 -            )
  6.1746 -          ))
  6.1747 -          FROM pg_catalog.jsonb_array_elements(
  6.1748 -            $1 OPERATOR(pg_catalog.->) 'coordinates'
  6.1749 -          ) AS "coord_array"
  6.1750 -        );
  6.1751 -      END IF;
  6.1752 -      IF "tp" = 'Polygon' THEN RETURN
  6.1753 -        ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
  6.1754 -            ( SELECT @extschema@.ecluster_create_polygon(pg_catalog.array_agg(
  6.1755 -                @extschema@.coords_to_epoint(
  6.1756 -                  ("coord" OPERATOR(pg_catalog.->>) 0)::pg_catalog.float8,
  6.1757 -                  ("coord" OPERATOR(pg_catalog.->>) 1)::pg_catalog.float8,
  6.1758 -                  $2
  6.1759 -                )
  6.1760 -              ))
  6.1761 -              FROM @extschema@.GeoJSON_LinearRing_vertices("coord_array", $2)
  6.1762 -              AS "coord"
  6.1763 -            )
  6.1764 -          ))
  6.1765 -          FROM pg_catalog.jsonb_array_elements(
  6.1766 -            $1 OPERATOR(pg_catalog.->) 'coordinates'
  6.1767 -          ) AS "coord_array"
  6.1768 -        );
  6.1769 -      END IF;
  6.1770 -      IF "tp" = 'MultiPolygon' THEN RETURN
  6.1771 -        ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
  6.1772 -            ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
  6.1773 -                ( SELECT @extschema@.ecluster_create_polygon(
  6.1774 -                    pg_catalog.array_agg(
  6.1775 -                      @extschema@.coords_to_epoint(
  6.1776 -                        ("coord" OPERATOR(pg_catalog.->>) 0)
  6.1777 -                        ::pg_catalog.float8,
  6.1778 -                        ("coord" OPERATOR(pg_catalog.->>) 1)
  6.1779 -                        ::pg_catalog.float8,
  6.1780 -                        $2
  6.1781 -                      )
  6.1782 -                    )
  6.1783 -                  )
  6.1784 -                  FROM @extschema@.GeoJSON_LinearRing_vertices(
  6.1785 -                    "coord_array", $2
  6.1786 -                  ) AS "coord"
  6.1787 -                )
  6.1788 -              ))
  6.1789 -              FROM pg_catalog.jsonb_array_elements("coord_array_array")
  6.1790 -              AS "coord_array"
  6.1791 -            )
  6.1792 -          ))
  6.1793 -          FROM jsonb_array_elements(
  6.1794 -            $1 OPERATOR(pg_catalog.->) 'coordinates'
  6.1795 -          ) AS "coord_array_array"
  6.1796 -        );
  6.1797 -      END IF;
  6.1798 -      IF "tp" = 'GeometryCollection' THEN RETURN
  6.1799 -        ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
  6.1800 -            @extschema@.GeoJSON_to_ecluster("geometry", $2)
  6.1801 -          ))
  6.1802 -          FROM pg_catalog.jsonb_array_elements(
  6.1803 -            $1 OPERATOR(pg_catalog.->) 'geometries'
  6.1804 -          ) AS "geometry"
  6.1805 -        );
  6.1806 -      END IF;
  6.1807 -      IF "tp" = 'Feature' THEN RETURN
  6.1808 -        @extschema@.GeoJSON_to_ecluster(
  6.1809 -          $1 OPERATOR(pg_catalog.->) 'geometry', $2
  6.1810 -        );
  6.1811 -      END IF;
  6.1812 -      IF "tp" = 'FeatureCollection' THEN RETURN
  6.1813 -        ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
  6.1814 -            @extschema@.GeoJSON_to_ecluster("feature", $2)
  6.1815 -          ))
  6.1816 -          FROM pg_catalog.jsonb_array_elements(
  6.1817 -            $1 OPERATOR(pg_catalog.->) 'features'
  6.1818 -          ) AS "feature"
  6.1819 -        );
  6.1820 -      END IF;
  6.1821 -      RETURN NULL;
  6.1822 -    END;
  6.1823 -  $$;
  6.1824 -
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/latlon--0.16.sql	Thu Oct 23 15:31:50 2025 +0200
     7.3 @@ -0,0 +1,1821 @@
     7.4 +----------------------------------------
     7.5 +-- forward declarations (shell types) --
     7.6 +----------------------------------------
     7.7 +
     7.8 +CREATE TYPE ekey_point;
     7.9 +CREATE TYPE ekey_area;
    7.10 +CREATE TYPE epoint;
    7.11 +CREATE TYPE epoint_with_sample_count;
    7.12 +CREATE TYPE ebox;
    7.13 +CREATE TYPE ecircle;
    7.14 +CREATE TYPE ecluster;
    7.15 +
    7.16 +
    7.17 +------------------------------------------------------------
    7.18 +-- dummy input/output functions for dummy index key types --
    7.19 +------------------------------------------------------------
    7.20 +
    7.21 +CREATE FUNCTION ekey_point_in_dummy(cstring)
    7.22 +  RETURNS ekey_point
    7.23 +  LANGUAGE C IMMUTABLE STRICT
    7.24 +  AS '$libdir/latlon-v0010', 'pgl_notimpl';
    7.25 +
    7.26 +CREATE FUNCTION ekey_point_out_dummy(ekey_point)
    7.27 +  RETURNS cstring
    7.28 +  LANGUAGE C IMMUTABLE STRICT
    7.29 +  AS '$libdir/latlon-v0010', 'pgl_notimpl';
    7.30 +
    7.31 +CREATE FUNCTION ekey_area_in_dummy(cstring)
    7.32 +  RETURNS ekey_area
    7.33 +  LANGUAGE C IMMUTABLE STRICT
    7.34 +  AS '$libdir/latlon-v0010', 'pgl_notimpl';
    7.35 +
    7.36 +CREATE FUNCTION ekey_area_out_dummy(ekey_area)
    7.37 +  RETURNS cstring
    7.38 +  LANGUAGE C IMMUTABLE STRICT
    7.39 +  AS '$libdir/latlon-v0010', 'pgl_notimpl';
    7.40 +
    7.41 +
    7.42 +--------------------------
    7.43 +-- text input functions --
    7.44 +--------------------------
    7.45 +
    7.46 +CREATE FUNCTION epoint_in(cstring)
    7.47 +  RETURNS epoint
    7.48 +  LANGUAGE C IMMUTABLE STRICT
    7.49 +  AS '$libdir/latlon-v0010', 'pgl_epoint_in';
    7.50 +
    7.51 +CREATE FUNCTION epoint_with_sample_count_in(cstring)
    7.52 +  RETURNS epoint_with_sample_count
    7.53 +  LANGUAGE C IMMUTABLE STRICT
    7.54 +  AS '$libdir/latlon-v0010', 'pgl_epoint_with_sample_count_in';
    7.55 +
    7.56 +CREATE FUNCTION ebox_in(cstring)
    7.57 +  RETURNS ebox
    7.58 +  LANGUAGE C IMMUTABLE STRICT
    7.59 +  AS '$libdir/latlon-v0010', 'pgl_ebox_in';
    7.60 +
    7.61 +CREATE FUNCTION ecircle_in(cstring)
    7.62 +  RETURNS ecircle
    7.63 +  LANGUAGE C IMMUTABLE STRICT
    7.64 +  AS '$libdir/latlon-v0010', 'pgl_ecircle_in';
    7.65 +
    7.66 +CREATE FUNCTION ecluster_in(cstring)
    7.67 +  RETURNS ecluster
    7.68 +  LANGUAGE C IMMUTABLE STRICT
    7.69 +  AS '$libdir/latlon-v0010', 'pgl_ecluster_in';
    7.70 +
    7.71 +
    7.72 +---------------------------
    7.73 +-- text output functions --
    7.74 +---------------------------
    7.75 +
    7.76 +CREATE FUNCTION epoint_out(epoint)
    7.77 +  RETURNS cstring
    7.78 +  LANGUAGE C IMMUTABLE STRICT
    7.79 +  AS '$libdir/latlon-v0010', 'pgl_epoint_out';
    7.80 +
    7.81 +CREATE FUNCTION epoint_with_sample_count_out(epoint_with_sample_count)
    7.82 +  RETURNS cstring
    7.83 +  LANGUAGE C IMMUTABLE STRICT
    7.84 +  AS '$libdir/latlon-v0010', 'pgl_epoint_with_sample_count_out';
    7.85 +
    7.86 +CREATE FUNCTION ebox_out(ebox)
    7.87 +  RETURNS cstring
    7.88 +  LANGUAGE C IMMUTABLE STRICT
    7.89 +  AS '$libdir/latlon-v0010', 'pgl_ebox_out';
    7.90 +
    7.91 +CREATE FUNCTION ecircle_out(ecircle)
    7.92 +  RETURNS cstring
    7.93 +  LANGUAGE C IMMUTABLE STRICT
    7.94 +  AS '$libdir/latlon-v0010', 'pgl_ecircle_out';
    7.95 +
    7.96 +CREATE FUNCTION ecluster_out(ecluster)
    7.97 +  RETURNS cstring
    7.98 +  LANGUAGE C IMMUTABLE STRICT
    7.99 +  AS '$libdir/latlon-v0010', 'pgl_ecluster_out';
   7.100 +
   7.101 +
   7.102 +--------------------------
   7.103 +-- binary I/O functions --
   7.104 +--------------------------
   7.105 +
   7.106 +CREATE FUNCTION epoint_recv(internal)
   7.107 +  RETURNS epoint
   7.108 +  LANGUAGE C IMMUTABLE STRICT
   7.109 +  AS '$libdir/latlon-v0010', 'pgl_epoint_recv';
   7.110 +
   7.111 +CREATE FUNCTION ebox_recv(internal)
   7.112 +  RETURNS ebox
   7.113 +  LANGUAGE C IMMUTABLE STRICT
   7.114 +  AS '$libdir/latlon-v0010', 'pgl_ebox_recv';
   7.115 +
   7.116 +CREATE FUNCTION ecircle_recv(internal)
   7.117 +  RETURNS ecircle
   7.118 +  LANGUAGE C IMMUTABLE STRICT
   7.119 +  AS '$libdir/latlon-v0010', 'pgl_ecircle_recv';
   7.120 +
   7.121 +CREATE FUNCTION epoint_send(epoint)
   7.122 +  RETURNS bytea
   7.123 +  LANGUAGE C IMMUTABLE STRICT
   7.124 +  AS '$libdir/latlon-v0010', 'pgl_epoint_send';
   7.125 +
   7.126 +CREATE FUNCTION ebox_send(ebox)
   7.127 +  RETURNS bytea
   7.128 +  LANGUAGE C IMMUTABLE STRICT
   7.129 +  AS '$libdir/latlon-v0010', 'pgl_ebox_send';
   7.130 +
   7.131 +CREATE FUNCTION ecircle_send(ecircle)
   7.132 +  RETURNS bytea
   7.133 +  LANGUAGE C IMMUTABLE STRICT
   7.134 +  AS '$libdir/latlon-v0010', 'pgl_ecircle_send';
   7.135 +
   7.136 +
   7.137 +-----------------------------------------------
   7.138 +-- type definitions of dummy index key types --
   7.139 +-----------------------------------------------
   7.140 +
   7.141 +CREATE TYPE ekey_point (
   7.142 +  internallength = 8,
   7.143 +  input = ekey_point_in_dummy,
   7.144 +  output = ekey_point_out_dummy,
   7.145 +  alignment = char );
   7.146 +
   7.147 +CREATE TYPE ekey_area (
   7.148 +  internallength = 9,
   7.149 +  input = ekey_area_in_dummy,
   7.150 +  output = ekey_area_out_dummy,
   7.151 +  alignment = char );
   7.152 +
   7.153 +
   7.154 +------------------------------------------
   7.155 +-- definitions of geographic data types --
   7.156 +------------------------------------------
   7.157 +
   7.158 +CREATE TYPE epoint (
   7.159 +  internallength = 16,
   7.160 +  input = epoint_in,
   7.161 +  output = epoint_out,
   7.162 +  receive = epoint_recv,
   7.163 +  send = epoint_send,
   7.164 +  alignment = double );
   7.165 +
   7.166 +CREATE TYPE epoint_with_sample_count (
   7.167 +  internallength = 20,
   7.168 +  input = epoint_with_sample_count_in,
   7.169 +  output = epoint_with_sample_count_out,
   7.170 +  alignment = double );
   7.171 +
   7.172 +CREATE TYPE ebox (
   7.173 +  internallength = 32,
   7.174 +  input = ebox_in,
   7.175 +  output = ebox_out,
   7.176 +  receive = ebox_recv,
   7.177 +  send = ebox_send,
   7.178 +  alignment = double );
   7.179 +
   7.180 +CREATE TYPE ecircle (
   7.181 +  internallength = 24,
   7.182 +  input = ecircle_in,
   7.183 +  output = ecircle_out,
   7.184 +  receive = ecircle_recv,
   7.185 +  send = ecircle_send,
   7.186 +  alignment = double );
   7.187 +
   7.188 +CREATE TYPE ecluster (
   7.189 +  internallength = VARIABLE,
   7.190 +  input = ecluster_in,
   7.191 +  output = ecluster_out,
   7.192 +  alignment = double,
   7.193 +  storage = external );
   7.194 +
   7.195 +
   7.196 +--------------------
   7.197 +-- B-tree support --
   7.198 +--------------------
   7.199 +
   7.200 +-- begin of B-tree support for epoint
   7.201 +
   7.202 +CREATE FUNCTION epoint_btree_lt(epoint, epoint)
   7.203 +  RETURNS boolean
   7.204 +  LANGUAGE C IMMUTABLE STRICT
   7.205 +  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_lt';
   7.206 +
   7.207 +CREATE FUNCTION epoint_btree_le(epoint, epoint)
   7.208 +  RETURNS boolean
   7.209 +  LANGUAGE C IMMUTABLE STRICT
   7.210 +  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_le';
   7.211 +
   7.212 +CREATE FUNCTION epoint_btree_eq(epoint, epoint)
   7.213 +  RETURNS boolean
   7.214 +  LANGUAGE C IMMUTABLE STRICT
   7.215 +  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_eq';
   7.216 +
   7.217 +CREATE FUNCTION epoint_btree_ne(epoint, epoint)
   7.218 +  RETURNS boolean
   7.219 +  LANGUAGE C IMMUTABLE STRICT
   7.220 +  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_ne';
   7.221 +
   7.222 +CREATE FUNCTION epoint_btree_ge(epoint, epoint)
   7.223 +  RETURNS boolean
   7.224 +  LANGUAGE C IMMUTABLE STRICT
   7.225 +  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_ge';
   7.226 +
   7.227 +CREATE FUNCTION epoint_btree_gt(epoint, epoint)
   7.228 +  RETURNS boolean
   7.229 +  LANGUAGE C IMMUTABLE STRICT
   7.230 +  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_gt';
   7.231 +
   7.232 +CREATE OPERATOR <<< (
   7.233 +  leftarg = epoint,
   7.234 +  rightarg = epoint,
   7.235 +  procedure = epoint_btree_lt,
   7.236 +  commutator = >>>,
   7.237 +  negator = >>>=,
   7.238 +  restrict = scalarltsel,
   7.239 +  join = scalarltjoinsel
   7.240 +);
   7.241 +
   7.242 +CREATE OPERATOR <<<= (
   7.243 +  leftarg = epoint,
   7.244 +  rightarg = epoint,
   7.245 +  procedure = epoint_btree_le,
   7.246 +  commutator = >>>=,
   7.247 +  negator = >>>,
   7.248 +  restrict = scalarltsel,
   7.249 +  join = scalarltjoinsel
   7.250 +);
   7.251 +
   7.252 +CREATE OPERATOR = (
   7.253 +  leftarg = epoint,
   7.254 +  rightarg = epoint,
   7.255 +  procedure = epoint_btree_eq,
   7.256 +  commutator = =,
   7.257 +  negator = <>,
   7.258 +  restrict = eqsel,
   7.259 +  join = eqjoinsel,
   7.260 +  merges
   7.261 +);
   7.262 +
   7.263 +CREATE OPERATOR <> (
   7.264 +  leftarg = epoint,
   7.265 +  rightarg = epoint,
   7.266 +  procedure = epoint_btree_ne,
   7.267 +  commutator = <>,
   7.268 +  negator = =,
   7.269 +  restrict = neqsel,
   7.270 +  join = neqjoinsel
   7.271 +);
   7.272 +
   7.273 +CREATE OPERATOR >>>= (
   7.274 +  leftarg = epoint,
   7.275 +  rightarg = epoint,
   7.276 +  procedure = epoint_btree_ge,
   7.277 +  commutator = <<<=,
   7.278 +  negator = <<<,
   7.279 +  restrict = scalargtsel,
   7.280 +  join = scalargtjoinsel
   7.281 +);
   7.282 +
   7.283 +CREATE OPERATOR >>> (
   7.284 +  leftarg = epoint,
   7.285 +  rightarg = epoint,
   7.286 +  procedure = epoint_btree_gt,
   7.287 +  commutator = <<<,
   7.288 +  negator = <<<=,
   7.289 +  restrict = scalargtsel,
   7.290 +  join = scalargtjoinsel
   7.291 +);
   7.292 +
   7.293 +CREATE FUNCTION epoint_btree_cmp(epoint, epoint)
   7.294 +  RETURNS int4
   7.295 +  LANGUAGE C IMMUTABLE STRICT
   7.296 +  AS '$libdir/latlon-v0010', 'pgl_btree_epoint_cmp';
   7.297 +
   7.298 +CREATE OPERATOR CLASS epoint_btree_ops
   7.299 +  DEFAULT FOR TYPE epoint USING btree AS
   7.300 +  OPERATOR 1 <<< ,
   7.301 +  OPERATOR 2 <<<= ,
   7.302 +  OPERATOR 3 = ,
   7.303 +  OPERATOR 4 >>>= ,
   7.304 +  OPERATOR 5 >>> ,
   7.305 +  FUNCTION 1 epoint_btree_cmp(epoint, epoint);
   7.306 +
   7.307 +-- end of B-tree support for epoint
   7.308 +
   7.309 +-- begin of B-tree support for ebox
   7.310 +
   7.311 +CREATE FUNCTION ebox_btree_lt(ebox, ebox)
   7.312 +  RETURNS boolean
   7.313 +  LANGUAGE C IMMUTABLE STRICT
   7.314 +  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_lt';
   7.315 +
   7.316 +CREATE FUNCTION ebox_btree_le(ebox, ebox)
   7.317 +  RETURNS boolean
   7.318 +  LANGUAGE C IMMUTABLE STRICT
   7.319 +  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_le';
   7.320 +
   7.321 +CREATE FUNCTION ebox_btree_eq(ebox, ebox)
   7.322 +  RETURNS boolean
   7.323 +  LANGUAGE C IMMUTABLE STRICT
   7.324 +  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_eq';
   7.325 +
   7.326 +CREATE FUNCTION ebox_btree_ne(ebox, ebox)
   7.327 +  RETURNS boolean
   7.328 +  LANGUAGE C IMMUTABLE STRICT
   7.329 +  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_ne';
   7.330 +
   7.331 +CREATE FUNCTION ebox_btree_ge(ebox, ebox)
   7.332 +  RETURNS boolean
   7.333 +  LANGUAGE C IMMUTABLE STRICT
   7.334 +  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_ge';
   7.335 +
   7.336 +CREATE FUNCTION ebox_btree_gt(ebox, ebox)
   7.337 +  RETURNS boolean
   7.338 +  LANGUAGE C IMMUTABLE STRICT
   7.339 +  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_gt';
   7.340 +
   7.341 +CREATE OPERATOR <<< (
   7.342 +  leftarg = ebox,
   7.343 +  rightarg = ebox,
   7.344 +  procedure = ebox_btree_lt,
   7.345 +  commutator = >>>,
   7.346 +  negator = >>>=,
   7.347 +  restrict = scalarltsel,
   7.348 +  join = scalarltjoinsel
   7.349 +);
   7.350 +
   7.351 +CREATE OPERATOR <<<= (
   7.352 +  leftarg = ebox,
   7.353 +  rightarg = ebox,
   7.354 +  procedure = ebox_btree_le,
   7.355 +  commutator = >>>=,
   7.356 +  negator = >>>,
   7.357 +  restrict = scalarltsel,
   7.358 +  join = scalarltjoinsel
   7.359 +);
   7.360 +
   7.361 +CREATE OPERATOR = (
   7.362 +  leftarg = ebox,
   7.363 +  rightarg = ebox,
   7.364 +  procedure = ebox_btree_eq,
   7.365 +  commutator = =,
   7.366 +  negator = <>,
   7.367 +  restrict = eqsel,
   7.368 +  join = eqjoinsel,
   7.369 +  merges
   7.370 +);
   7.371 +
   7.372 +CREATE OPERATOR <> (
   7.373 +  leftarg = ebox,
   7.374 +  rightarg = ebox,
   7.375 +  procedure = ebox_btree_ne,
   7.376 +  commutator = <>,
   7.377 +  negator = =,
   7.378 +  restrict = neqsel,
   7.379 +  join = neqjoinsel
   7.380 +);
   7.381 +
   7.382 +CREATE OPERATOR >>>= (
   7.383 +  leftarg = ebox,
   7.384 +  rightarg = ebox,
   7.385 +  procedure = ebox_btree_ge,
   7.386 +  commutator = <<<=,
   7.387 +  negator = <<<,
   7.388 +  restrict = scalargtsel,
   7.389 +  join = scalargtjoinsel
   7.390 +);
   7.391 +
   7.392 +CREATE OPERATOR >>> (
   7.393 +  leftarg = ebox,
   7.394 +  rightarg = ebox,
   7.395 +  procedure = ebox_btree_gt,
   7.396 +  commutator = <<<,
   7.397 +  negator = <<<=,
   7.398 +  restrict = scalargtsel,
   7.399 +  join = scalargtjoinsel
   7.400 +);
   7.401 +
   7.402 +CREATE FUNCTION ebox_btree_cmp(ebox, ebox)
   7.403 +  RETURNS int4
   7.404 +  LANGUAGE C IMMUTABLE STRICT
   7.405 +  AS '$libdir/latlon-v0010', 'pgl_btree_ebox_cmp';
   7.406 +
   7.407 +CREATE OPERATOR CLASS ebox_btree_ops
   7.408 +  DEFAULT FOR TYPE ebox USING btree AS
   7.409 +  OPERATOR 1 <<< ,
   7.410 +  OPERATOR 2 <<<= ,
   7.411 +  OPERATOR 3 = ,
   7.412 +  OPERATOR 4 >>>= ,
   7.413 +  OPERATOR 5 >>> ,
   7.414 +  FUNCTION 1 ebox_btree_cmp(ebox, ebox);
   7.415 +
   7.416 +-- end of B-tree support for ebox
   7.417 +
   7.418 +-- begin of B-tree support for ecircle
   7.419 +
   7.420 +CREATE FUNCTION ecircle_btree_lt(ecircle, ecircle)
   7.421 +  RETURNS boolean
   7.422 +  LANGUAGE C IMMUTABLE STRICT
   7.423 +  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_lt';
   7.424 +
   7.425 +CREATE FUNCTION ecircle_btree_le(ecircle, ecircle)
   7.426 +  RETURNS boolean
   7.427 +  LANGUAGE C IMMUTABLE STRICT
   7.428 +  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_le';
   7.429 +
   7.430 +CREATE FUNCTION ecircle_btree_eq(ecircle, ecircle)
   7.431 +  RETURNS boolean
   7.432 +  LANGUAGE C IMMUTABLE STRICT
   7.433 +  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_eq';
   7.434 +
   7.435 +CREATE FUNCTION ecircle_btree_ne(ecircle, ecircle)
   7.436 +  RETURNS boolean
   7.437 +  LANGUAGE C IMMUTABLE STRICT
   7.438 +  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_ne';
   7.439 +
   7.440 +CREATE FUNCTION ecircle_btree_ge(ecircle, ecircle)
   7.441 +  RETURNS boolean
   7.442 +  LANGUAGE C IMMUTABLE STRICT
   7.443 +  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_ge';
   7.444 +
   7.445 +CREATE FUNCTION ecircle_btree_gt(ecircle, ecircle)
   7.446 +  RETURNS boolean
   7.447 +  LANGUAGE C IMMUTABLE STRICT
   7.448 +  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_gt';
   7.449 +
   7.450 +CREATE OPERATOR <<< (
   7.451 +  leftarg = ecircle,
   7.452 +  rightarg = ecircle,
   7.453 +  procedure = ecircle_btree_lt,
   7.454 +  commutator = >>>,
   7.455 +  negator = >>>=,
   7.456 +  restrict = scalarltsel,
   7.457 +  join = scalarltjoinsel
   7.458 +);
   7.459 +
   7.460 +CREATE OPERATOR <<<= (
   7.461 +  leftarg = ecircle,
   7.462 +  rightarg = ecircle,
   7.463 +  procedure = ecircle_btree_le,
   7.464 +  commutator = >>>=,
   7.465 +  negator = >>>,
   7.466 +  restrict = scalarltsel,
   7.467 +  join = scalarltjoinsel
   7.468 +);
   7.469 +
   7.470 +CREATE OPERATOR = (
   7.471 +  leftarg = ecircle,
   7.472 +  rightarg = ecircle,
   7.473 +  procedure = ecircle_btree_eq,
   7.474 +  commutator = =,
   7.475 +  negator = <>,
   7.476 +  restrict = eqsel,
   7.477 +  join = eqjoinsel,
   7.478 +  merges
   7.479 +);
   7.480 +
   7.481 +CREATE OPERATOR <> (
   7.482 +  leftarg = ecircle,
   7.483 +  rightarg = ecircle,
   7.484 +  procedure = ecircle_btree_ne,
   7.485 +  commutator = <>,
   7.486 +  negator = =,
   7.487 +  restrict = neqsel,
   7.488 +  join = neqjoinsel
   7.489 +);
   7.490 +
   7.491 +CREATE OPERATOR >>>= (
   7.492 +  leftarg = ecircle,
   7.493 +  rightarg = ecircle,
   7.494 +  procedure = ecircle_btree_ge,
   7.495 +  commutator = <<<=,
   7.496 +  negator = <<<,
   7.497 +  restrict = scalargtsel,
   7.498 +  join = scalargtjoinsel
   7.499 +);
   7.500 +
   7.501 +CREATE OPERATOR >>> (
   7.502 +  leftarg = ecircle,
   7.503 +  rightarg = ecircle,
   7.504 +  procedure = ecircle_btree_gt,
   7.505 +  commutator = <<<,
   7.506 +  negator = <<<=,
   7.507 +  restrict = scalargtsel,
   7.508 +  join = scalargtjoinsel
   7.509 +);
   7.510 +
   7.511 +CREATE FUNCTION ecircle_btree_cmp(ecircle, ecircle)
   7.512 +  RETURNS int4
   7.513 +  LANGUAGE C IMMUTABLE STRICT
   7.514 +  AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_cmp';
   7.515 +
   7.516 +CREATE OPERATOR CLASS ecircle_btree_ops
   7.517 +  DEFAULT FOR TYPE ecircle USING btree AS
   7.518 +  OPERATOR 1 <<< ,
   7.519 +  OPERATOR 2 <<<= ,
   7.520 +  OPERATOR 3 = ,
   7.521 +  OPERATOR 4 >>>= ,
   7.522 +  OPERATOR 5 >>> ,
   7.523 +  FUNCTION 1 ecircle_btree_cmp(ecircle, ecircle);
   7.524 +
   7.525 +-- end of B-tree support for ecircle
   7.526 +
   7.527 +
   7.528 +----------------
   7.529 +-- type casts --
   7.530 +----------------
   7.531 +
   7.532 +CREATE FUNCTION cast_epoint_to_ebox(epoint)
   7.533 +  RETURNS ebox
   7.534 +  LANGUAGE C IMMUTABLE STRICT
   7.535 +  AS '$libdir/latlon-v0010', 'pgl_epoint_to_ebox';
   7.536 +
   7.537 +CREATE CAST (epoint AS ebox) WITH FUNCTION cast_epoint_to_ebox(epoint);
   7.538 +
   7.539 +CREATE FUNCTION cast_epoint_to_ecircle(epoint)
   7.540 +  RETURNS ecircle
   7.541 +  LANGUAGE C IMMUTABLE STRICT
   7.542 +  AS '$libdir/latlon-v0010', 'pgl_epoint_to_ecircle';
   7.543 +
   7.544 +CREATE CAST (epoint AS ecircle) WITH FUNCTION cast_epoint_to_ecircle(epoint);
   7.545 +
   7.546 +CREATE FUNCTION cast_epoint_to_ecluster(epoint)
   7.547 +  RETURNS ecluster
   7.548 +  LANGUAGE C IMMUTABLE STRICT
   7.549 +  AS '$libdir/latlon-v0010', 'pgl_epoint_to_ecluster';
   7.550 +
   7.551 +CREATE CAST (epoint AS ecluster) WITH FUNCTION cast_epoint_to_ecluster(epoint);
   7.552 +
   7.553 +CREATE FUNCTION cast_ebox_to_ecluster(ebox)
   7.554 +  RETURNS ecluster
   7.555 +  LANGUAGE C IMMUTABLE STRICT
   7.556 +  AS '$libdir/latlon-v0010', 'pgl_ebox_to_ecluster';
   7.557 +
   7.558 +CREATE CAST (ebox AS ecluster) WITH FUNCTION cast_ebox_to_ecluster(ebox);
   7.559 +
   7.560 +
   7.561 +---------------------------
   7.562 +-- constructor functions --
   7.563 +---------------------------
   7.564 +
   7.565 +CREATE FUNCTION epoint(float8, float8)
   7.566 +  RETURNS epoint
   7.567 +  LANGUAGE C IMMUTABLE STRICT
   7.568 +  AS '$libdir/latlon-v0010', 'pgl_create_epoint';
   7.569 +
   7.570 +CREATE FUNCTION epoint_latlon(float8, float8)
   7.571 +  RETURNS epoint
   7.572 +  LANGUAGE SQL IMMUTABLE STRICT AS $$
   7.573 +    SELECT @extschema@.epoint($1, $2)
   7.574 +  $$;
   7.575 +
   7.576 +CREATE FUNCTION epoint_lonlat(float8, float8)
   7.577 +  RETURNS epoint
   7.578 +  LANGUAGE SQL IMMUTABLE STRICT AS $$
   7.579 +    SELECT @extschema@.epoint($2, $1)
   7.580 +  $$;
   7.581 +
   7.582 +CREATE FUNCTION epoint_with_sample_count(epoint, int4)
   7.583 +  RETURNS epoint_with_sample_count
   7.584 +  LANGUAGE C IMMUTABLE STRICT
   7.585 +  AS '$libdir/latlon-v0010', 'pgl_create_epoint_with_sample_count';
   7.586 +
   7.587 +CREATE FUNCTION empty_ebox()
   7.588 +  RETURNS ebox
   7.589 +  LANGUAGE C IMMUTABLE STRICT
   7.590 +  AS '$libdir/latlon-v0010', 'pgl_create_empty_ebox';
   7.591 +
   7.592 +CREATE FUNCTION ebox(float8, float8, float8, float8)
   7.593 +  RETURNS ebox
   7.594 +  LANGUAGE C IMMUTABLE STRICT
   7.595 +  AS '$libdir/latlon-v0010', 'pgl_create_ebox';
   7.596 +
   7.597 +CREATE FUNCTION ebox(epoint, epoint)
   7.598 +  RETURNS ebox
   7.599 +  LANGUAGE C IMMUTABLE STRICT
   7.600 +  AS '$libdir/latlon-v0010', 'pgl_create_ebox_from_epoints';
   7.601 +
   7.602 +CREATE FUNCTION ecircle(float8, float8, float8)
   7.603 +  RETURNS ecircle
   7.604 +  LANGUAGE C IMMUTABLE STRICT
   7.605 +  AS '$libdir/latlon-v0010', 'pgl_create_ecircle';
   7.606 +
   7.607 +CREATE FUNCTION ecircle(epoint, float8)
   7.608 +  RETURNS ecircle
   7.609 +  LANGUAGE C IMMUTABLE STRICT
   7.610 +  AS '$libdir/latlon-v0010', 'pgl_create_ecircle_from_epoint';
   7.611 +
   7.612 +CREATE FUNCTION ecluster_concat(ecluster[])
   7.613 +  RETURNS ecluster
   7.614 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   7.615 +    SELECT pg_catalog.array_to_string($1, ' ')::@extschema@.ecluster
   7.616 +  $$;
   7.617 +
   7.618 +CREATE FUNCTION ecluster_concat(ecluster, ecluster)
   7.619 +  RETURNS ecluster
   7.620 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   7.621 +    SELECT (
   7.622 +      $1::pg_catalog.text OPERATOR(pg_catalog.||) ' ' OPERATOR(pg_catalog.||)
   7.623 +      $2::pg_catalog.text
   7.624 +    )::@extschema@.ecluster
   7.625 +  $$;
   7.626 +
   7.627 +CREATE FUNCTION ecluster_create_multipoint(epoint[])
   7.628 +  RETURNS ecluster
   7.629 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   7.630 +    SELECT
   7.631 +      pg_catalog.array_to_string(
   7.632 +        pg_catalog.array_agg(
   7.633 +          'point (' OPERATOR(pg_catalog.||) unnest OPERATOR(pg_catalog.||) ')'
   7.634 +        ),
   7.635 +        ' '
   7.636 +      )::@extschema@.ecluster
   7.637 +    FROM pg_catalog.unnest($1)
   7.638 +  $$;
   7.639 +
   7.640 +CREATE FUNCTION ecluster_create_path(epoint[])
   7.641 +  RETURNS ecluster
   7.642 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   7.643 +    SELECT CASE WHEN "str" OPERATOR(pg_catalog.=) '' THEN
   7.644 +      'empty'::@extschema@.ecluster
   7.645 +    ELSE
   7.646 +      (
   7.647 +        'path (' OPERATOR(pg_catalog.||) "str" OPERATOR(pg_catalog.||) ')'
   7.648 +      )::@extschema@.ecluster
   7.649 +    END
   7.650 +    FROM pg_catalog.array_to_string($1, ' ') AS "str"
   7.651 +  $$;
   7.652 +
   7.653 +CREATE FUNCTION ecluster_create_outline(epoint[])
   7.654 +  RETURNS ecluster
   7.655 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   7.656 +    SELECT CASE WHEN "str" OPERATOR(pg_catalog.=) '' THEN
   7.657 +      'empty'::@extschema@.ecluster
   7.658 +    ELSE
   7.659 +      (
   7.660 +        'outline (' OPERATOR(pg_catalog.||) "str" OPERATOR(pg_catalog.||) ')'
   7.661 +      )::@extschema@.ecluster
   7.662 +    END
   7.663 +    FROM pg_catalog.array_to_string($1, ' ') AS "str"
   7.664 +  $$;
   7.665 +
   7.666 +CREATE FUNCTION ecluster_create_polygon(epoint[])
   7.667 +  RETURNS ecluster
   7.668 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   7.669 +    SELECT CASE WHEN "str" OPERATOR(pg_catalog.=) '' THEN
   7.670 +      'empty'::@extschema@.ecluster
   7.671 +    ELSE
   7.672 +      (
   7.673 +        'polygon (' OPERATOR(pg_catalog.||) pg_catalog.array_to_string($1, ' ')
   7.674 +        OPERATOR(pg_catalog.||) ')'
   7.675 +      )::@extschema@.ecluster
   7.676 +    END
   7.677 +    FROM pg_catalog.array_to_string($1, ' ') AS "str"
   7.678 +  $$;
   7.679 +
   7.680 +
   7.681 +----------------------
   7.682 +-- getter functions --
   7.683 +----------------------
   7.684 +
   7.685 +CREATE FUNCTION latitude(epoint)
   7.686 +  RETURNS float8
   7.687 +  LANGUAGE C IMMUTABLE STRICT
   7.688 +  AS '$libdir/latlon-v0010', 'pgl_epoint_lat';
   7.689 +
   7.690 +CREATE FUNCTION longitude(epoint)
   7.691 +  RETURNS float8
   7.692 +  LANGUAGE C IMMUTABLE STRICT
   7.693 +  AS '$libdir/latlon-v0010', 'pgl_epoint_lon';
   7.694 +
   7.695 +CREATE FUNCTION min_latitude(ebox)
   7.696 +  RETURNS float8
   7.697 +  LANGUAGE C IMMUTABLE STRICT
   7.698 +  AS '$libdir/latlon-v0010', 'pgl_ebox_lat_min';
   7.699 +
   7.700 +CREATE FUNCTION max_latitude(ebox)
   7.701 +  RETURNS float8
   7.702 +  LANGUAGE C IMMUTABLE STRICT
   7.703 +  AS '$libdir/latlon-v0010', 'pgl_ebox_lat_max';
   7.704 +
   7.705 +CREATE FUNCTION min_longitude(ebox)
   7.706 +  RETURNS float8
   7.707 +  LANGUAGE C IMMUTABLE STRICT
   7.708 +  AS '$libdir/latlon-v0010', 'pgl_ebox_lon_min';
   7.709 +
   7.710 +CREATE FUNCTION max_longitude(ebox)
   7.711 +  RETURNS float8
   7.712 +  LANGUAGE C IMMUTABLE STRICT
   7.713 +  AS '$libdir/latlon-v0010', 'pgl_ebox_lon_max';
   7.714 +
   7.715 +CREATE FUNCTION center(ecircle)
   7.716 +  RETURNS epoint
   7.717 +  LANGUAGE C IMMUTABLE STRICT
   7.718 +  AS '$libdir/latlon-v0010', 'pgl_ecircle_center';
   7.719 +
   7.720 +CREATE FUNCTION radius(ecircle)
   7.721 +  RETURNS float8
   7.722 +  LANGUAGE C IMMUTABLE STRICT
   7.723 +  AS '$libdir/latlon-v0010', 'pgl_ecircle_radius';
   7.724 +
   7.725 +CREATE FUNCTION ecluster_extract_points(ecluster)
   7.726 +  RETURNS SETOF epoint
   7.727 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   7.728 +    SELECT "match"[2]::@extschema@.epoint
   7.729 +    FROM pg_catalog.regexp_matches(
   7.730 +      $1::pg_catalog.text, e'(^| )point \\(([^)]+)\\)', 'g'
   7.731 +    ) AS "match"
   7.732 +  $$;
   7.733 +
   7.734 +CREATE FUNCTION ecluster_extract_paths(ecluster)
   7.735 +  RETURNS SETOF epoint[]
   7.736 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   7.737 +    SELECT (
   7.738 +      SELECT pg_catalog.array_agg("m2"[1]::@extschema@.epoint)
   7.739 +      FROM pg_catalog.regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
   7.740 +    )
   7.741 +    FROM pg_catalog.regexp_matches(
   7.742 +      $1::pg_catalog.text, e'(^| )path \\(([^)]+)\\)', 'g'
   7.743 +    ) AS "m1"
   7.744 +  $$;
   7.745 +
   7.746 +CREATE FUNCTION ecluster_extract_outlines(ecluster)
   7.747 +  RETURNS SETOF epoint[]
   7.748 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   7.749 +    SELECT (
   7.750 +      SELECT pg_catalog.array_agg("m2"[1]::@extschema@.epoint)
   7.751 +      FROM pg_catalog.regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
   7.752 +    )
   7.753 +    FROM pg_catalog.regexp_matches(
   7.754 +      $1::pg_catalog.text, e'(^| )outline \\(([^)]+)\\)', 'g'
   7.755 +    ) AS "m1"
   7.756 +  $$;
   7.757 +
   7.758 +CREATE FUNCTION ecluster_extract_polygons(ecluster)
   7.759 +  RETURNS SETOF epoint[]
   7.760 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   7.761 +    SELECT (
   7.762 +      SELECT pg_catalog.array_agg("m2"[1]::@extschema@.epoint)
   7.763 +      FROM pg_catalog.regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
   7.764 +    )
   7.765 +    FROM pg_catalog.regexp_matches(
   7.766 +      $1::pg_catalog.text, e'(^| )polygon \\(([^)]+)\\)', 'g'
   7.767 +    ) AS "m1"
   7.768 +  $$;
   7.769 +
   7.770 +
   7.771 +---------------
   7.772 +-- operators --
   7.773 +---------------
   7.774 +
   7.775 +CREATE FUNCTION epoint_ebox_overlap_proc(epoint, ebox)
   7.776 +  RETURNS boolean
   7.777 +  LANGUAGE C IMMUTABLE STRICT
   7.778 +  AS '$libdir/latlon-v0010', 'pgl_epoint_ebox_overlap';
   7.779 +
   7.780 +CREATE FUNCTION epoint_ecircle_overlap_proc(epoint, ecircle)
   7.781 +  RETURNS boolean
   7.782 +  LANGUAGE C IMMUTABLE STRICT
   7.783 +  AS '$libdir/latlon-v0010', 'pgl_epoint_ecircle_overlap';
   7.784 +
   7.785 +CREATE FUNCTION epoint_ecluster_overlap_proc(epoint, ecluster)
   7.786 +  RETURNS boolean
   7.787 +  LANGUAGE C IMMUTABLE STRICT
   7.788 +  AS '$libdir/latlon-v0010', 'pgl_epoint_ecluster_overlap';
   7.789 +
   7.790 +CREATE FUNCTION epoint_ecluster_may_overlap_proc(epoint, ecluster)
   7.791 +  RETURNS boolean
   7.792 +  LANGUAGE C IMMUTABLE STRICT
   7.793 +  AS '$libdir/latlon-v0010', 'pgl_epoint_ecluster_may_overlap';
   7.794 +
   7.795 +CREATE FUNCTION ebox_overlap_proc(ebox, ebox)
   7.796 +  RETURNS boolean
   7.797 +  LANGUAGE C IMMUTABLE STRICT
   7.798 +  AS '$libdir/latlon-v0010', 'pgl_ebox_overlap';
   7.799 +
   7.800 +CREATE FUNCTION ebox_ecircle_may_overlap_proc(ebox, ecircle)
   7.801 +  RETURNS boolean
   7.802 +  LANGUAGE C IMMUTABLE STRICT
   7.803 +  AS '$libdir/latlon-v0010', 'pgl_ebox_ecircle_may_overlap';
   7.804 +
   7.805 +CREATE FUNCTION ebox_ecluster_may_overlap_proc(ebox, ecluster)
   7.806 +  RETURNS boolean
   7.807 +  LANGUAGE C IMMUTABLE STRICT
   7.808 +  AS '$libdir/latlon-v0010', 'pgl_ebox_ecluster_may_overlap';
   7.809 +
   7.810 +CREATE FUNCTION ecircle_overlap_proc(ecircle, ecircle)
   7.811 +  RETURNS boolean
   7.812 +  LANGUAGE C IMMUTABLE STRICT
   7.813 +  AS '$libdir/latlon-v0010', 'pgl_ecircle_overlap';
   7.814 +
   7.815 +CREATE FUNCTION ecircle_ecluster_overlap_proc(ecircle, ecluster)
   7.816 +  RETURNS boolean
   7.817 +  LANGUAGE C IMMUTABLE STRICT
   7.818 +  AS '$libdir/latlon-v0010', 'pgl_ecircle_ecluster_overlap';
   7.819 +
   7.820 +CREATE FUNCTION ecircle_ecluster_may_overlap_proc(ecircle, ecluster)
   7.821 +  RETURNS boolean
   7.822 +  LANGUAGE C IMMUTABLE STRICT
   7.823 +  AS '$libdir/latlon-v0010', 'pgl_ecircle_ecluster_may_overlap';
   7.824 +
   7.825 +CREATE FUNCTION ecluster_overlap_proc(ecluster, ecluster)
   7.826 +  RETURNS boolean
   7.827 +  LANGUAGE C IMMUTABLE STRICT
   7.828 +  AS '$libdir/latlon-v0010', 'pgl_ecluster_overlap';
   7.829 +
   7.830 +CREATE FUNCTION ecluster_may_overlap_proc(ecluster, ecluster)
   7.831 +  RETURNS boolean
   7.832 +  LANGUAGE C IMMUTABLE STRICT
   7.833 +  AS '$libdir/latlon-v0010', 'pgl_ecluster_may_overlap';
   7.834 +
   7.835 +CREATE FUNCTION ecluster_contains_proc(ecluster, ecluster)
   7.836 +  RETURNS boolean
   7.837 +  LANGUAGE C IMMUTABLE STRICT
   7.838 +  AS '$libdir/latlon-v0010', 'pgl_ecluster_contains';
   7.839 +
   7.840 +CREATE FUNCTION epoint_distance_proc(epoint, epoint)
   7.841 +  RETURNS float8
   7.842 +  LANGUAGE C IMMUTABLE STRICT
   7.843 +  AS '$libdir/latlon-v0010', 'pgl_epoint_distance';
   7.844 +
   7.845 +CREATE FUNCTION epoint_ecircle_distance_proc(epoint, ecircle)
   7.846 +  RETURNS float8
   7.847 +  LANGUAGE C IMMUTABLE STRICT
   7.848 +  AS '$libdir/latlon-v0010', 'pgl_epoint_ecircle_distance';
   7.849 +
   7.850 +CREATE FUNCTION epoint_ecluster_distance_proc(epoint, ecluster)
   7.851 +  RETURNS float8
   7.852 +  LANGUAGE C IMMUTABLE STRICT
   7.853 +  AS '$libdir/latlon-v0010', 'pgl_epoint_ecluster_distance';
   7.854 +
   7.855 +CREATE FUNCTION ecircle_distance_proc(ecircle, ecircle)
   7.856 +  RETURNS float8
   7.857 +  LANGUAGE C IMMUTABLE STRICT
   7.858 +  AS '$libdir/latlon-v0010', 'pgl_ecircle_distance';
   7.859 +
   7.860 +CREATE FUNCTION ecircle_ecluster_distance_proc(ecircle, ecluster)
   7.861 +  RETURNS float8
   7.862 +  LANGUAGE C IMMUTABLE STRICT
   7.863 +  AS '$libdir/latlon-v0010', 'pgl_ecircle_ecluster_distance';
   7.864 +
   7.865 +CREATE FUNCTION ecluster_distance_proc(ecluster, ecluster)
   7.866 +  RETURNS float8
   7.867 +  LANGUAGE C IMMUTABLE STRICT
   7.868 +  AS '$libdir/latlon-v0010', 'pgl_ecluster_distance';
   7.869 +
   7.870 +CREATE FUNCTION fair_distance_operator_proc(ecluster, epoint_with_sample_count)
   7.871 +  RETURNS float8
   7.872 +  LANGUAGE C IMMUTABLE STRICT
   7.873 +  AS '$libdir/latlon-v0010', 'pgl_ecluster_epoint_sc_fair_distance';
   7.874 +
   7.875 +CREATE OPERATOR && (
   7.876 +  leftarg = epoint,
   7.877 +  rightarg = ebox,
   7.878 +  procedure = epoint_ebox_overlap_proc,
   7.879 +  commutator = &&,
   7.880 +  restrict = areasel,
   7.881 +  join = areajoinsel
   7.882 +);
   7.883 +
   7.884 +CREATE FUNCTION epoint_ebox_overlap_commutator(ebox, epoint)
   7.885 +  RETURNS boolean
   7.886 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&) $1';
   7.887 +
   7.888 +CREATE OPERATOR && (
   7.889 +  leftarg = ebox,
   7.890 +  rightarg = epoint,
   7.891 +  procedure = epoint_ebox_overlap_commutator,
   7.892 +  commutator = &&,
   7.893 +  restrict = areasel,
   7.894 +  join = areajoinsel
   7.895 +);
   7.896 +
   7.897 +CREATE OPERATOR && (
   7.898 +  leftarg = epoint,
   7.899 +  rightarg = ecircle,
   7.900 +  procedure = epoint_ecircle_overlap_proc,
   7.901 +  commutator = &&,
   7.902 +  restrict = areasel,
   7.903 +  join = areajoinsel
   7.904 +);
   7.905 +
   7.906 +CREATE FUNCTION epoint_ecircle_overlap_commutator(ecircle, epoint)
   7.907 +  RETURNS boolean
   7.908 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&) $1';
   7.909 +
   7.910 +CREATE OPERATOR && (
   7.911 +  leftarg = ecircle,
   7.912 +  rightarg = epoint,
   7.913 +  procedure = epoint_ecircle_overlap_commutator,
   7.914 +  commutator = &&,
   7.915 +  restrict = areasel,
   7.916 +  join = areajoinsel
   7.917 +);
   7.918 +
   7.919 +CREATE OPERATOR && (
   7.920 +  leftarg = epoint,
   7.921 +  rightarg = ecluster,
   7.922 +  procedure = epoint_ecluster_overlap_proc,
   7.923 +  commutator = &&,
   7.924 +  restrict = areasel,
   7.925 +  join = areajoinsel
   7.926 +);
   7.927 +
   7.928 +CREATE FUNCTION epoint_ecluster_overlap_commutator(ecluster, epoint)
   7.929 +  RETURNS boolean
   7.930 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&) $1';
   7.931 +
   7.932 +CREATE OPERATOR && (
   7.933 +  leftarg = ecluster,
   7.934 +  rightarg = epoint,
   7.935 +  procedure = epoint_ecluster_overlap_commutator,
   7.936 +  commutator = &&,
   7.937 +  restrict = areasel,
   7.938 +  join = areajoinsel
   7.939 +);
   7.940 +
   7.941 +CREATE OPERATOR && (
   7.942 +  leftarg = ebox,
   7.943 +  rightarg = ebox,
   7.944 +  procedure = ebox_overlap_proc,
   7.945 +  commutator = &&,
   7.946 +  restrict = areasel,
   7.947 +  join = areajoinsel
   7.948 +);
   7.949 +
   7.950 +CREATE OPERATOR && (
   7.951 +  leftarg = ecircle,
   7.952 +  rightarg = ecircle,
   7.953 +  procedure = ecircle_overlap_proc,
   7.954 +  commutator = &&,
   7.955 +  restrict = areasel,
   7.956 +  join = areajoinsel
   7.957 +);
   7.958 +
   7.959 +CREATE OPERATOR && (
   7.960 +  leftarg = ecircle,
   7.961 +  rightarg = ecluster,
   7.962 +  procedure = ecircle_ecluster_overlap_proc,
   7.963 +  commutator = &&,
   7.964 +  restrict = areasel,
   7.965 +  join = areajoinsel
   7.966 +);
   7.967 +
   7.968 +CREATE FUNCTION ecircle_ecluster_overlap_commutator(ecluster, ecircle)
   7.969 +  RETURNS boolean
   7.970 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&) $1';
   7.971 +
   7.972 +CREATE OPERATOR && (
   7.973 +  leftarg = ecluster,
   7.974 +  rightarg = ecircle,
   7.975 +  procedure = ecircle_ecluster_overlap_commutator,
   7.976 +  commutator = &&,
   7.977 +  restrict = areasel,
   7.978 +  join = areajoinsel
   7.979 +);
   7.980 +
   7.981 +CREATE OPERATOR && (
   7.982 +  leftarg = ecluster,
   7.983 +  rightarg = ecluster,
   7.984 +  procedure = ecluster_overlap_proc,
   7.985 +  commutator = &&,
   7.986 +  restrict = areasel,
   7.987 +  join = areajoinsel
   7.988 +);
   7.989 +
   7.990 +CREATE FUNCTION ebox_ecircle_overlap_castwrap(ebox, ecircle)
   7.991 +  RETURNS boolean
   7.992 +  LANGUAGE sql IMMUTABLE
   7.993 +  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.&&) $2';
   7.994 +
   7.995 +CREATE OPERATOR && (
   7.996 +  leftarg = ebox,
   7.997 +  rightarg = ecircle,
   7.998 +  procedure = ebox_ecircle_overlap_castwrap,
   7.999 +  commutator = &&,
  7.1000 +  restrict = areasel,
  7.1001 +  join = areajoinsel
  7.1002 +);
  7.1003 +
  7.1004 +CREATE FUNCTION ebox_ecircle_overlap_castwrap(ecircle, ebox)
  7.1005 +  RETURNS boolean
  7.1006 +  LANGUAGE sql IMMUTABLE
  7.1007 +  AS 'SELECT $1 OPERATOR(@extschema@.&&) $2::@extschema@.ecluster';
  7.1008 +
  7.1009 +CREATE OPERATOR && (
  7.1010 +  leftarg = ecircle,
  7.1011 +  rightarg = ebox,
  7.1012 +  procedure = ebox_ecircle_overlap_castwrap,
  7.1013 +  commutator = &&,
  7.1014 +  restrict = areasel,
  7.1015 +  join = areajoinsel
  7.1016 +);
  7.1017 +
  7.1018 +CREATE FUNCTION ebox_ecluster_overlap_castwrap(ebox, ecluster)
  7.1019 +  RETURNS boolean
  7.1020 +  LANGUAGE sql IMMUTABLE
  7.1021 +  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.&&) $2';
  7.1022 +
  7.1023 +CREATE OPERATOR && (
  7.1024 +  leftarg = ebox,
  7.1025 +  rightarg = ecluster,
  7.1026 +  procedure = ebox_ecluster_overlap_castwrap,
  7.1027 +  commutator = &&,
  7.1028 +  restrict = areasel,
  7.1029 +  join = areajoinsel
  7.1030 +);
  7.1031 +
  7.1032 +CREATE FUNCTION ebox_ecluster_overlap_castwrap(ecluster, ebox)
  7.1033 +  RETURNS boolean
  7.1034 +  LANGUAGE sql IMMUTABLE
  7.1035 +  AS 'SELECT $1 OPERATOR(@extschema@.&&) $2::@extschema@.ecluster';
  7.1036 +
  7.1037 +CREATE OPERATOR && (
  7.1038 +  leftarg = ecluster,
  7.1039 +  rightarg = ebox,
  7.1040 +  procedure = ebox_ecluster_overlap_castwrap,
  7.1041 +  commutator = &&,
  7.1042 +  restrict = areasel,
  7.1043 +  join = areajoinsel
  7.1044 +);
  7.1045 +
  7.1046 +CREATE OPERATOR &&+ (
  7.1047 +  leftarg = epoint,
  7.1048 +  rightarg = ecluster,
  7.1049 +  procedure = epoint_ecluster_may_overlap_proc,
  7.1050 +  commutator = &&+,
  7.1051 +  restrict = areasel,
  7.1052 +  join = areajoinsel
  7.1053 +);
  7.1054 +
  7.1055 +CREATE FUNCTION epoint_ecluster_may_overlap_commutator(ecluster, epoint)
  7.1056 +  RETURNS boolean
  7.1057 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&+) $1';
  7.1058 +
  7.1059 +CREATE OPERATOR &&+ (
  7.1060 +  leftarg = ecluster,
  7.1061 +  rightarg = epoint,
  7.1062 +  procedure = epoint_ecluster_may_overlap_commutator,
  7.1063 +  commutator = &&+,
  7.1064 +  restrict = areasel,
  7.1065 +  join = areajoinsel
  7.1066 +);
  7.1067 +
  7.1068 +CREATE OPERATOR &&+ (
  7.1069 +  leftarg = ebox,
  7.1070 +  rightarg = ecircle,
  7.1071 +  procedure = ebox_ecircle_may_overlap_proc,
  7.1072 +  commutator = &&+,
  7.1073 +  restrict = areasel,
  7.1074 +  join = areajoinsel
  7.1075 +);
  7.1076 +
  7.1077 +CREATE FUNCTION ebox_ecircle_may_overlap_commutator(ecircle, ebox)
  7.1078 +  RETURNS boolean
  7.1079 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&+) $1';
  7.1080 +
  7.1081 +CREATE OPERATOR &&+ (
  7.1082 +  leftarg = ecircle,
  7.1083 +  rightarg = ebox,
  7.1084 +  procedure = ebox_ecircle_may_overlap_commutator,
  7.1085 +  commutator = &&+,
  7.1086 +  restrict = areasel,
  7.1087 +  join = areajoinsel
  7.1088 +);
  7.1089 +
  7.1090 +CREATE OPERATOR &&+ (
  7.1091 +  leftarg = ebox,
  7.1092 +  rightarg = ecluster,
  7.1093 +  procedure = ebox_ecluster_may_overlap_proc,
  7.1094 +  commutator = &&+,
  7.1095 +  restrict = areasel,
  7.1096 +  join = areajoinsel
  7.1097 +);
  7.1098 +
  7.1099 +CREATE FUNCTION ebox_ecluster_may_overlap_commutator(ecluster, ebox)
  7.1100 +  RETURNS boolean
  7.1101 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&+) $1';
  7.1102 +
  7.1103 +CREATE OPERATOR &&+ (
  7.1104 +  leftarg = ecluster,
  7.1105 +  rightarg = ebox,
  7.1106 +  procedure = ebox_ecluster_may_overlap_commutator,
  7.1107 +  commutator = &&+,
  7.1108 +  restrict = areasel,
  7.1109 +  join = areajoinsel
  7.1110 +);
  7.1111 +
  7.1112 +CREATE OPERATOR &&+ (
  7.1113 +  leftarg = ecircle,
  7.1114 +  rightarg = ecluster,
  7.1115 +  procedure = ecircle_ecluster_may_overlap_proc,
  7.1116 +  commutator = &&+,
  7.1117 +  restrict = areasel,
  7.1118 +  join = areajoinsel
  7.1119 +);
  7.1120 +
  7.1121 +CREATE FUNCTION ecircle_ecluster_may_overlap_commutator(ecluster, ecircle)
  7.1122 +  RETURNS boolean
  7.1123 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&+) $1';
  7.1124 +
  7.1125 +CREATE OPERATOR &&+ (
  7.1126 +  leftarg = ecluster,
  7.1127 +  rightarg = ecircle,
  7.1128 +  procedure = ecircle_ecluster_may_overlap_commutator,
  7.1129 +  commutator = &&+,
  7.1130 +  restrict = areasel,
  7.1131 +  join = areajoinsel
  7.1132 +);
  7.1133 +
  7.1134 +CREATE OPERATOR &&+ (
  7.1135 +  leftarg = ecluster,
  7.1136 +  rightarg = ecluster,
  7.1137 +  procedure = ecluster_may_overlap_proc,
  7.1138 +  commutator = &&+,
  7.1139 +  restrict = areasel,
  7.1140 +  join = areajoinsel
  7.1141 +);
  7.1142 +
  7.1143 +CREATE OPERATOR @> (
  7.1144 +  leftarg = ebox,
  7.1145 +  rightarg = epoint,
  7.1146 +  procedure = epoint_ebox_overlap_commutator,
  7.1147 +  commutator = <@,
  7.1148 +  restrict = areasel,
  7.1149 +  join = areajoinsel
  7.1150 +);
  7.1151 +
  7.1152 +CREATE OPERATOR <@ (
  7.1153 +  leftarg = epoint,
  7.1154 +  rightarg = ebox,
  7.1155 +  procedure = epoint_ebox_overlap_proc,
  7.1156 +  commutator = @>,
  7.1157 +  restrict = areasel,
  7.1158 +  join = areajoinsel
  7.1159 +);
  7.1160 +
  7.1161 +CREATE OPERATOR @> (
  7.1162 +  leftarg = ecluster,
  7.1163 +  rightarg = epoint,
  7.1164 +  procedure = epoint_ecluster_overlap_commutator,
  7.1165 +  commutator = <@,
  7.1166 +  restrict = areasel,
  7.1167 +  join = areajoinsel
  7.1168 +);
  7.1169 +
  7.1170 +CREATE OPERATOR <@ (
  7.1171 +  leftarg = epoint,
  7.1172 +  rightarg = ecluster,
  7.1173 +  procedure = epoint_ecluster_overlap_proc,
  7.1174 +  commutator = @>,
  7.1175 +  restrict = areasel,
  7.1176 +  join = areajoinsel
  7.1177 +);
  7.1178 +
  7.1179 +CREATE OPERATOR @> (
  7.1180 +  leftarg = ecluster,
  7.1181 +  rightarg = ecluster,
  7.1182 +  procedure = ecluster_contains_proc,
  7.1183 +  commutator = <@,
  7.1184 +  restrict = areasel,
  7.1185 +  join = areajoinsel
  7.1186 +);
  7.1187 +
  7.1188 +CREATE FUNCTION ecluster_contains_commutator(ecluster, ecluster)
  7.1189 +  RETURNS boolean
  7.1190 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.@>) $1';
  7.1191 +
  7.1192 +CREATE OPERATOR <@ (
  7.1193 +  leftarg = ecluster,
  7.1194 +  rightarg = ecluster,
  7.1195 +  procedure = ecluster_contains_commutator,
  7.1196 +  commutator = @>,
  7.1197 +  restrict = areasel,
  7.1198 +  join = areajoinsel
  7.1199 +);
  7.1200 +
  7.1201 +CREATE FUNCTION ebox_contains_castwrap(ebox, ebox)
  7.1202 +  RETURNS boolean
  7.1203 +  LANGUAGE sql IMMUTABLE AS $$
  7.1204 +    SELECT
  7.1205 +    $1::@extschema@.ecluster OPERATOR(@extschema@.@>) $2::@extschema@.ecluster
  7.1206 +  $$;
  7.1207 +
  7.1208 +CREATE OPERATOR @> (
  7.1209 +  leftarg = ebox,
  7.1210 +  rightarg = ebox,
  7.1211 +  procedure = ebox_contains_castwrap,
  7.1212 +  commutator = <@,
  7.1213 +  restrict = areasel,
  7.1214 +  join = areajoinsel
  7.1215 +);
  7.1216 +
  7.1217 +CREATE FUNCTION ebox_contains_swapped_castwrap(ebox, ebox)
  7.1218 +  RETURNS boolean
  7.1219 +  LANGUAGE sql IMMUTABLE AS $$
  7.1220 +    SELECT
  7.1221 +    $2::@extschema@.ecluster OPERATOR(@extschema@.@>) $1::@extschema@.ecluster
  7.1222 +  $$;
  7.1223 +
  7.1224 +CREATE OPERATOR <@ (
  7.1225 +  leftarg = ebox,
  7.1226 +  rightarg = ebox,
  7.1227 +  procedure = ebox_contains_swapped_castwrap,
  7.1228 +  commutator = @>,
  7.1229 +  restrict = areasel,
  7.1230 +  join = areajoinsel
  7.1231 +);
  7.1232 +
  7.1233 +CREATE FUNCTION ebox_ecluster_contains_castwrap(ebox, ecluster)
  7.1234 +  RETURNS boolean
  7.1235 +  LANGUAGE sql IMMUTABLE
  7.1236 +  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.@>) $2';
  7.1237 +
  7.1238 +CREATE OPERATOR @> (
  7.1239 +  leftarg = ebox,
  7.1240 +  rightarg = ecluster,
  7.1241 +  procedure = ebox_ecluster_contains_castwrap,
  7.1242 +  commutator = <@,
  7.1243 +  restrict = areasel,
  7.1244 +  join = areajoinsel
  7.1245 +);
  7.1246 +
  7.1247 +CREATE FUNCTION ebox_ecluster_contains_castwrap(ecluster, ebox)
  7.1248 +  RETURNS boolean
  7.1249 +  LANGUAGE sql IMMUTABLE
  7.1250 +  AS 'SELECT $2::@extschema@.ecluster OPERATOR(@extschema@.@>) $1';
  7.1251 +
  7.1252 +CREATE OPERATOR <@ (
  7.1253 +  leftarg = ecluster,
  7.1254 +  rightarg = ebox,
  7.1255 +  procedure = ebox_ecluster_contains_castwrap,
  7.1256 +  commutator = @>,
  7.1257 +  restrict = areasel,
  7.1258 +  join = areajoinsel
  7.1259 +);
  7.1260 +
  7.1261 +CREATE FUNCTION ecluster_ebox_contains_castwrap(ecluster, ebox)
  7.1262 +  RETURNS boolean
  7.1263 +  LANGUAGE sql IMMUTABLE
  7.1264 +  AS 'SELECT $1 OPERATOR(@extschema@.@>) $2::@extschema@.ecluster';
  7.1265 +
  7.1266 +CREATE OPERATOR @> (
  7.1267 +  leftarg = ecluster,
  7.1268 +  rightarg = ebox,
  7.1269 +  procedure = ecluster_ebox_contains_castwrap,
  7.1270 +  commutator = <@,
  7.1271 +  restrict = areasel,
  7.1272 +  join = areajoinsel
  7.1273 +);
  7.1274 +
  7.1275 +CREATE FUNCTION ecluster_ebox_contains_castwrap(ebox, ecluster)
  7.1276 +  RETURNS boolean
  7.1277 +  LANGUAGE sql IMMUTABLE
  7.1278 +  AS 'SELECT $2 OPERATOR(@extschema@.@>) $1::@extschema@.ecluster';
  7.1279 +
  7.1280 +CREATE OPERATOR <@ (
  7.1281 +  leftarg = ebox,
  7.1282 +  rightarg = ecluster,
  7.1283 +  procedure = ecluster_ebox_contains_castwrap,
  7.1284 +  commutator = @>,
  7.1285 +  restrict = areasel,
  7.1286 +  join = areajoinsel
  7.1287 +);
  7.1288 +
  7.1289 +CREATE OPERATOR <-> (
  7.1290 +  leftarg = epoint,
  7.1291 +  rightarg = epoint,
  7.1292 +  procedure = epoint_distance_proc,
  7.1293 +  commutator = <->
  7.1294 +);
  7.1295 +
  7.1296 +CREATE OPERATOR <-> (
  7.1297 +  leftarg = epoint,
  7.1298 +  rightarg = ecircle,
  7.1299 +  procedure = epoint_ecircle_distance_proc,
  7.1300 +  commutator = <->
  7.1301 +);
  7.1302 +
  7.1303 +CREATE FUNCTION epoint_ecircle_distance_commutator(ecircle, epoint)
  7.1304 +  RETURNS float8
  7.1305 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.<->) $1';
  7.1306 +
  7.1307 +CREATE OPERATOR <-> (
  7.1308 +  leftarg = ecircle,
  7.1309 +  rightarg = epoint,
  7.1310 +  procedure = epoint_ecircle_distance_commutator,
  7.1311 +  commutator = <->
  7.1312 +);
  7.1313 +
  7.1314 +CREATE OPERATOR <-> (
  7.1315 +  leftarg = epoint,
  7.1316 +  rightarg = ecluster,
  7.1317 +  procedure = epoint_ecluster_distance_proc,
  7.1318 +  commutator = <->
  7.1319 +);
  7.1320 +
  7.1321 +CREATE FUNCTION epoint_ecluster_distance_commutator(ecluster, epoint)
  7.1322 +  RETURNS float8
  7.1323 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.<->) $1';
  7.1324 +
  7.1325 +CREATE OPERATOR <-> (
  7.1326 +  leftarg = ecluster,
  7.1327 +  rightarg = epoint,
  7.1328 +  procedure = epoint_ecluster_distance_commutator,
  7.1329 +  commutator = <->
  7.1330 +);
  7.1331 +
  7.1332 +CREATE OPERATOR <-> (
  7.1333 +  leftarg = ecircle,
  7.1334 +  rightarg = ecircle,
  7.1335 +  procedure = ecircle_distance_proc,
  7.1336 +  commutator = <->
  7.1337 +);
  7.1338 +
  7.1339 +CREATE OPERATOR <-> (
  7.1340 +  leftarg = ecircle,
  7.1341 +  rightarg = ecluster,
  7.1342 +  procedure = ecircle_ecluster_distance_proc,
  7.1343 +  commutator = <->
  7.1344 +);
  7.1345 +
  7.1346 +CREATE FUNCTION ecircle_ecluster_distance_commutator(ecluster, ecircle)
  7.1347 +  RETURNS float8
  7.1348 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.<->) $1';
  7.1349 +
  7.1350 +CREATE OPERATOR <-> (
  7.1351 +  leftarg = ecluster,
  7.1352 +  rightarg = ecircle,
  7.1353 +  procedure = ecircle_ecluster_distance_commutator,
  7.1354 +  commutator = <->
  7.1355 +);
  7.1356 +
  7.1357 +CREATE OPERATOR <-> (
  7.1358 +  leftarg = ecluster,
  7.1359 +  rightarg = ecluster,
  7.1360 +  procedure = ecluster_distance_proc,
  7.1361 +  commutator = <->
  7.1362 +);
  7.1363 +
  7.1364 +CREATE FUNCTION epoint_ebox_distance_castwrap(epoint, ebox)
  7.1365 +  RETURNS float8
  7.1366 +  LANGUAGE sql IMMUTABLE
  7.1367 +  AS 'SELECT $1 OPERATOR(@extschema@.<->) $2::@extschema@.ecluster';
  7.1368 +
  7.1369 +CREATE OPERATOR <-> (
  7.1370 +  leftarg = epoint,
  7.1371 +  rightarg = ebox,
  7.1372 +  procedure = epoint_ebox_distance_castwrap,
  7.1373 +  commutator = <->
  7.1374 +);
  7.1375 +
  7.1376 +CREATE FUNCTION epoint_ebox_distance_castwrap(ebox, epoint)
  7.1377 +  RETURNS float8
  7.1378 +  LANGUAGE sql IMMUTABLE
  7.1379 +  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.<->) $2';
  7.1380 +
  7.1381 +CREATE OPERATOR <-> (
  7.1382 +  leftarg = ebox,
  7.1383 +  rightarg = epoint,
  7.1384 +  procedure = epoint_ebox_distance_castwrap,
  7.1385 +  commutator = <->
  7.1386 +);
  7.1387 +
  7.1388 +CREATE FUNCTION ebox_distance_castwrap(ebox, ebox)
  7.1389 +  RETURNS float8
  7.1390 +  LANGUAGE sql IMMUTABLE AS $$
  7.1391 +    SELECT
  7.1392 +    $1::@extschema@.ecluster OPERATOR(@extschema@.<->) $2::@extschema@.ecluster
  7.1393 +  $$;
  7.1394 +
  7.1395 +CREATE OPERATOR <-> (
  7.1396 +  leftarg = ebox,
  7.1397 +  rightarg = ebox,
  7.1398 +  procedure = ebox_distance_castwrap,
  7.1399 +  commutator = <->
  7.1400 +);
  7.1401 +
  7.1402 +CREATE FUNCTION ebox_ecircle_distance_castwrap(ebox, ecircle)
  7.1403 +  RETURNS float8
  7.1404 +  LANGUAGE sql IMMUTABLE
  7.1405 +  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.<->) $2';
  7.1406 +
  7.1407 +CREATE OPERATOR <-> (
  7.1408 +  leftarg = ebox,
  7.1409 +  rightarg = ecircle,
  7.1410 +  procedure = ebox_ecircle_distance_castwrap,
  7.1411 +  commutator = <->
  7.1412 +);
  7.1413 +
  7.1414 +CREATE FUNCTION ebox_ecircle_distance_castwrap(ecircle, ebox)
  7.1415 +  RETURNS float8
  7.1416 +  LANGUAGE sql IMMUTABLE
  7.1417 +  AS 'SELECT $1 OPERATOR(@extschema@.<->) $2::@extschema@.ecluster';
  7.1418 +
  7.1419 +CREATE OPERATOR <-> (
  7.1420 +  leftarg = ecircle,
  7.1421 +  rightarg = ebox,
  7.1422 +  procedure = ebox_ecircle_distance_castwrap,
  7.1423 +  commutator = <->
  7.1424 +);
  7.1425 +
  7.1426 +CREATE FUNCTION ebox_ecluster_distance_castwrap(ebox, ecluster)
  7.1427 +  RETURNS float8
  7.1428 +  LANGUAGE sql IMMUTABLE
  7.1429 +  AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.<->) $2';
  7.1430 +
  7.1431 +CREATE OPERATOR <-> (
  7.1432 +  leftarg = ebox,
  7.1433 +  rightarg = ecluster,
  7.1434 +  procedure = ebox_ecluster_distance_castwrap,
  7.1435 +  commutator = <->
  7.1436 +);
  7.1437 +
  7.1438 +CREATE FUNCTION ebox_ecluster_distance_castwrap(ecluster, ebox)
  7.1439 +  RETURNS float8
  7.1440 +  LANGUAGE sql IMMUTABLE
  7.1441 +  AS 'SELECT $1 OPERATOR(@extschema@.<->) $2::@extschema@.ecluster';
  7.1442 +
  7.1443 +CREATE OPERATOR <-> (
  7.1444 +  leftarg = ecluster,
  7.1445 +  rightarg = ebox,
  7.1446 +  procedure = ebox_ecluster_distance_castwrap,
  7.1447 +  commutator = <->
  7.1448 +);
  7.1449 +
  7.1450 +CREATE OPERATOR <=> (
  7.1451 +  leftarg = ecluster,
  7.1452 +  rightarg = epoint_with_sample_count,
  7.1453 +  procedure = fair_distance_operator_proc
  7.1454 +);
  7.1455 +
  7.1456 +
  7.1457 +----------------
  7.1458 +-- GiST index --
  7.1459 +----------------
  7.1460 +
  7.1461 +CREATE FUNCTION pgl_gist_consistent(internal, internal, smallint, oid, internal)
  7.1462 +  RETURNS boolean
  7.1463 +  LANGUAGE C STRICT
  7.1464 +  AS '$libdir/latlon-v0010', 'pgl_gist_consistent';
  7.1465 +
  7.1466 +CREATE FUNCTION pgl_gist_union(internal, internal)
  7.1467 +  RETURNS internal
  7.1468 +  LANGUAGE C STRICT
  7.1469 +  AS '$libdir/latlon-v0010', 'pgl_gist_union';
  7.1470 +
  7.1471 +CREATE FUNCTION pgl_gist_compress_epoint(internal)
  7.1472 +  RETURNS internal
  7.1473 +  LANGUAGE C STRICT
  7.1474 +  AS '$libdir/latlon-v0010', 'pgl_gist_compress_epoint';
  7.1475 +
  7.1476 +CREATE FUNCTION pgl_gist_compress_ecircle(internal)
  7.1477 +  RETURNS internal
  7.1478 +  LANGUAGE C STRICT
  7.1479 +  AS '$libdir/latlon-v0010', 'pgl_gist_compress_ecircle';
  7.1480 +
  7.1481 +CREATE FUNCTION pgl_gist_compress_ecluster(internal)
  7.1482 +  RETURNS internal
  7.1483 +  LANGUAGE C STRICT
  7.1484 +  AS '$libdir/latlon-v0010', 'pgl_gist_compress_ecluster';
  7.1485 +
  7.1486 +CREATE FUNCTION pgl_gist_decompress(internal)
  7.1487 +  RETURNS internal
  7.1488 +  LANGUAGE C STRICT
  7.1489 +  AS '$libdir/latlon-v0010', 'pgl_gist_decompress';
  7.1490 +
  7.1491 +CREATE FUNCTION pgl_gist_penalty(internal, internal, internal)
  7.1492 +  RETURNS internal
  7.1493 +  LANGUAGE C STRICT
  7.1494 +  AS '$libdir/latlon-v0010', 'pgl_gist_penalty';
  7.1495 +
  7.1496 +CREATE FUNCTION pgl_gist_picksplit(internal, internal)
  7.1497 +  RETURNS internal
  7.1498 +  LANGUAGE C STRICT
  7.1499 +  AS '$libdir/latlon-v0010', 'pgl_gist_picksplit';
  7.1500 +
  7.1501 +CREATE FUNCTION pgl_gist_same(internal, internal, internal)
  7.1502 +  RETURNS internal
  7.1503 +  LANGUAGE C STRICT
  7.1504 +  AS '$libdir/latlon-v0010', 'pgl_gist_same';
  7.1505 +
  7.1506 +CREATE FUNCTION pgl_gist_distance(internal, internal, smallint, oid)
  7.1507 +  RETURNS internal
  7.1508 +  LANGUAGE C STRICT
  7.1509 +  AS '$libdir/latlon-v0010', 'pgl_gist_distance';
  7.1510 +
  7.1511 +CREATE OPERATOR CLASS epoint_ops
  7.1512 +  DEFAULT FOR TYPE epoint USING gist AS
  7.1513 +  OPERATOR  11 = ,
  7.1514 +  OPERATOR  22 &&  (epoint, ebox),
  7.1515 +  OPERATOR 222 <@  (epoint, ebox),
  7.1516 +  OPERATOR  23 &&  (epoint, ecircle),
  7.1517 +  OPERATOR  24 &&  (epoint, ecluster),
  7.1518 +  OPERATOR 124 &&+ (epoint, ecluster),
  7.1519 +  OPERATOR 224 <@  (epoint, ecluster),
  7.1520 +  OPERATOR  31 <-> (epoint, epoint) FOR ORDER BY float_ops,
  7.1521 +  OPERATOR  32 <-> (epoint, ebox) FOR ORDER BY float_ops,
  7.1522 +  OPERATOR  33 <-> (epoint, ecircle) FOR ORDER BY float_ops,
  7.1523 +  OPERATOR  34 <-> (epoint, ecluster) FOR ORDER BY float_ops,
  7.1524 +  FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
  7.1525 +  FUNCTION 2 pgl_gist_union(internal, internal),
  7.1526 +  FUNCTION 3 pgl_gist_compress_epoint(internal),
  7.1527 +  FUNCTION 4 pgl_gist_decompress(internal),
  7.1528 +  FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
  7.1529 +  FUNCTION 6 pgl_gist_picksplit(internal, internal),
  7.1530 +  FUNCTION 7 pgl_gist_same(internal, internal, internal),
  7.1531 +  FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
  7.1532 +  STORAGE ekey_point;
  7.1533 +
  7.1534 +CREATE OPERATOR CLASS ecircle_ops
  7.1535 +  DEFAULT FOR TYPE ecircle USING gist AS
  7.1536 +  OPERATOR  13 = ,
  7.1537 +  OPERATOR  21 &&  (ecircle, epoint),
  7.1538 +  OPERATOR  22 &&  (ecircle, ebox),
  7.1539 +  OPERATOR 122 &&+ (ecircle, ebox),
  7.1540 +  OPERATOR  23 &&  (ecircle, ecircle),
  7.1541 +  OPERATOR  24 &&  (ecircle, ecluster),
  7.1542 +  OPERATOR 124 &&+ (ecircle, ecluster),
  7.1543 +  OPERATOR  31 <-> (ecircle, epoint) FOR ORDER BY float_ops,
  7.1544 +  OPERATOR  32 <-> (ecircle, ebox) FOR ORDER BY float_ops,
  7.1545 +  OPERATOR  33 <-> (ecircle, ecircle) FOR ORDER BY float_ops,
  7.1546 +  OPERATOR  34 <-> (ecircle, ecluster) FOR ORDER BY float_ops,
  7.1547 +  FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
  7.1548 +  FUNCTION 2 pgl_gist_union(internal, internal),
  7.1549 +  FUNCTION 3 pgl_gist_compress_ecircle(internal),
  7.1550 +  FUNCTION 4 pgl_gist_decompress(internal),
  7.1551 +  FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
  7.1552 +  FUNCTION 6 pgl_gist_picksplit(internal, internal),
  7.1553 +  FUNCTION 7 pgl_gist_same(internal, internal, internal),
  7.1554 +  FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
  7.1555 +  STORAGE ekey_area;
  7.1556 +
  7.1557 +CREATE OPERATOR CLASS ecluster_ops
  7.1558 +  DEFAULT FOR TYPE ecluster USING gist AS
  7.1559 +  OPERATOR  21 &&  (ecluster, epoint),
  7.1560 +  OPERATOR 121 &&+ (ecluster, epoint),
  7.1561 +  OPERATOR 221 @>  (ecluster, epoint),
  7.1562 +  OPERATOR  22 &&  (ecluster, ebox),
  7.1563 +  OPERATOR 122 &&+ (ecluster, ebox),
  7.1564 +  OPERATOR 222 @>  (ecluster, ebox),
  7.1565 +  OPERATOR 322 <@  (ecluster, ebox),
  7.1566 +  OPERATOR  23 &&  (ecluster, ecircle),
  7.1567 +  OPERATOR 123 &&+ (ecluster, ecircle),
  7.1568 +  OPERATOR  24 &&  (ecluster, ecluster),
  7.1569 +  OPERATOR 124 &&+ (ecluster, ecluster),
  7.1570 +  OPERATOR 224 @>  (ecluster, ecluster),
  7.1571 +  OPERATOR 324 <@  (ecluster, ecluster),
  7.1572 +  OPERATOR  31 <-> (ecluster, epoint) FOR ORDER BY float_ops,
  7.1573 +  OPERATOR  32 <-> (ecluster, ebox) FOR ORDER BY float_ops,
  7.1574 +  OPERATOR  33 <-> (ecluster, ecircle) FOR ORDER BY float_ops,
  7.1575 +  OPERATOR  34 <-> (ecluster, ecluster) FOR ORDER BY float_ops,
  7.1576 +  OPERATOR 131 <=> (ecluster, epoint_with_sample_count) FOR ORDER BY float_ops,
  7.1577 +  FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
  7.1578 +  FUNCTION 2 pgl_gist_union(internal, internal),
  7.1579 +  FUNCTION 3 pgl_gist_compress_ecluster(internal),
  7.1580 +  FUNCTION 4 pgl_gist_decompress(internal),
  7.1581 +  FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
  7.1582 +  FUNCTION 6 pgl_gist_picksplit(internal, internal),
  7.1583 +  FUNCTION 7 pgl_gist_same(internal, internal, internal),
  7.1584 +  FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
  7.1585 +  STORAGE ekey_area;
  7.1586 +
  7.1587 +
  7.1588 +---------------------
  7.1589 +-- alias functions --
  7.1590 +---------------------
  7.1591 +
  7.1592 +CREATE FUNCTION distance(epoint, epoint)
  7.1593 +  RETURNS float8
  7.1594 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 OPERATOR(@extschema@.<->) $2';
  7.1595 +
  7.1596 +CREATE FUNCTION distance(ecluster, epoint)
  7.1597 +  RETURNS float8
  7.1598 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 OPERATOR(@extschema@.<->) $2';
  7.1599 +
  7.1600 +CREATE FUNCTION distance_within(epoint, epoint, float8)
  7.1601 +  RETURNS boolean
  7.1602 +  LANGUAGE sql IMMUTABLE
  7.1603 +  AS 'SELECT $1 OPERATOR(@extschema@.&&) @extschema@.ecircle($2, $3)';
  7.1604 +
  7.1605 +CREATE FUNCTION distance_within(ecluster, epoint, float8)
  7.1606 +  RETURNS boolean
  7.1607 +  LANGUAGE sql IMMUTABLE
  7.1608 +  AS 'SELECT $1 OPERATOR(@extschema@.&&) @extschema@.ecircle($2, $3)';
  7.1609 +
  7.1610 +CREATE FUNCTION fair_distance(ecluster, epoint, int4 = 10000)
  7.1611 +  RETURNS float8
  7.1612 +  LANGUAGE sql IMMUTABLE AS $$
  7.1613 +    SELECT
  7.1614 +    $1 OPERATOR(@extschema@.<=>) @extschema@.epoint_with_sample_count($2, $3)
  7.1615 +  $$;
  7.1616 +
  7.1617 +
  7.1618 +--------------------------------
  7.1619 +-- other data storage formats --
  7.1620 +--------------------------------
  7.1621 +
  7.1622 +CREATE FUNCTION coords_to_epoint(float8, float8, text = 'epoint')
  7.1623 +  RETURNS epoint
  7.1624 +  LANGUAGE plpgsql IMMUTABLE STRICT AS $$
  7.1625 +    DECLARE
  7.1626 +      "result" @extschema@.epoint;
  7.1627 +    BEGIN
  7.1628 +      IF $3 OPERATOR(pg_catalog.=) 'epoint_lonlat' THEN
  7.1629 +        -- avoid dynamic command execution for better performance
  7.1630 +        RETURN @extschema@.epoint($2, $1);
  7.1631 +      END IF;
  7.1632 +      IF
  7.1633 +        $3 OPERATOR(pg_catalog.=) 'epoint' OR
  7.1634 +        $3 OPERATOR(pg_catalog.=) 'epoint_latlon'
  7.1635 +      THEN
  7.1636 +        -- avoid dynamic command execution for better performance
  7.1637 +        RETURN @extschema@.epoint($1, $2);
  7.1638 +      END IF;
  7.1639 +      EXECUTE
  7.1640 +        'SELECT ' OPERATOR(pg_catalog.||) $3 OPERATOR(pg_catalog.||) '($1, $2)'         INTO STRICT "result" USING $1, $2;
  7.1641 +      RETURN "result";
  7.1642 +    END;
  7.1643 +  $$;
  7.1644 +
  7.1645 +CREATE FUNCTION GeoJSON_LinearRing_vertices(jsonb, text = 'epoint_lonlat')
  7.1646 +  RETURNS SETOF jsonb
  7.1647 +  LANGUAGE sql IMMUTABLE STRICT AS $$
  7.1648 +    SELECT "result" FROM
  7.1649 +      ( SELECT pg_catalog.jsonb_array_length($1) - 1 )
  7.1650 +      AS "lastindex_row" ("lastindex")
  7.1651 +      CROSS JOIN LATERAL pg_catalog.jsonb_array_elements(
  7.1652 +        CASE WHEN
  7.1653 +          @extschema@.coords_to_epoint(
  7.1654 +            ($1 OPERATOR(pg_catalog.->) 0 OPERATOR(pg_catalog.->>) 0)
  7.1655 +            ::pg_catalog.float8,
  7.1656 +            ($1 OPERATOR(pg_catalog.->) 0 OPERATOR(pg_catalog.->>) 1)
  7.1657 +            ::pg_catalog.float8,
  7.1658 +            $2
  7.1659 +          ) OPERATOR(pg_catalog.=) @extschema@.coords_to_epoint(
  7.1660 +            ($1 OPERATOR(pg_catalog.->) "lastindex" OPERATOR(pg_catalog.->>) 0)
  7.1661 +            ::pg_catalog.float8,
  7.1662 +            ($1 OPERATOR(pg_catalog.->) "lastindex" OPERATOR(pg_catalog.->>) 1)
  7.1663 +            ::pg_catalog.float8,
  7.1664 +            $2
  7.1665 +          )
  7.1666 +        THEN
  7.1667 +          $1 - "lastindex"
  7.1668 +        ELSE
  7.1669 +          $1
  7.1670 +        END
  7.1671 +      ) AS "result_row" ("result")
  7.1672 +  $$;
  7.1673 +
  7.1674 +CREATE FUNCTION GeoJSON_to_epoint(jsonb, text = 'epoint_lonlat')
  7.1675 +  RETURNS epoint
  7.1676 +  LANGUAGE sql IMMUTABLE STRICT AS $$
  7.1677 +    SELECT CASE
  7.1678 +    WHEN $1 OPERATOR(pg_catalog.->>) 'type' OPERATOR(pg_catalog.=) 'Point' THEN
  7.1679 +      @extschema@.coords_to_epoint(
  7.1680 +        ($1 OPERATOR(pg_catalog.->) 'coordinates' OPERATOR(pg_catalog.->>) 0)
  7.1681 +        ::pg_catalog.float8,
  7.1682 +        ($1 OPERATOR(pg_catalog.->) 'coordinates' OPERATOR(pg_catalog.->>) 1)
  7.1683 +        ::pg_catalog.float8,
  7.1684 +        $2
  7.1685 +      )
  7.1686 +    WHEN $1->>'type' = 'Feature' THEN
  7.1687 +      @extschema@.GeoJSON_to_epoint($1 OPERATOR(pg_catalog.->) 'geometry', $2)
  7.1688 +    ELSE
  7.1689 +      NULL
  7.1690 +    END
  7.1691 +  $$;
  7.1692 +
  7.1693 +CREATE FUNCTION GeoJSON_to_ecluster(jsonb, text = 'epoint_lonlat')
  7.1694 +  RETURNS ecluster
  7.1695 +  LANGUAGE plpgsql IMMUTABLE STRICT AS $$
  7.1696 +    DECLARE
  7.1697 +      "tp" TEXT = $1 OPERATOR(pg_catalog.->>) 'type';
  7.1698 +    BEGIN
  7.1699 +      IF "tp" = 'Point' THEN RETURN
  7.1700 +        @extschema@.coords_to_epoint(
  7.1701 +          ($1 OPERATOR(pg_catalog.->) 'coordinates' OPERATOR(pg_catalog.->>) 0)
  7.1702 +          ::pg_catalog.float8,
  7.1703 +          ($1 OPERATOR(pg_catalog.->) 'coordinates' OPERATOR(pg_catalog.->>) 1)
  7.1704 +          ::pg_catalog.float8,
  7.1705 +          $2
  7.1706 +        )::@extschema@.ecluster;
  7.1707 +      END IF;
  7.1708 +      raise notice 'DEBUG2';
  7.1709 +      IF "tp" = 'MultiPoint' THEN RETURN
  7.1710 +        ( SELECT @extschema@.ecluster_create_multipoint(pg_catalog.array_agg(
  7.1711 +            @extschema@.coords_to_epoint(
  7.1712 +              ("coord" OPERATOR(pg_catalog.->>) 0)::pg_catalog.float8,
  7.1713 +              ("coord" OPERATOR(pg_catalog.->>) 1)::pg_catalog.float8,
  7.1714 +              $2
  7.1715 +            )
  7.1716 +          ))
  7.1717 +          FROM pg_catalog.jsonb_array_elements(
  7.1718 +            $1 OPERATOR(pg_catalog.->) 'coordinates'
  7.1719 +          ) AS "coord"
  7.1720 +        );
  7.1721 +      END IF;
  7.1722 +      IF "tp" = 'LineString' THEN RETURN
  7.1723 +        ( SELECT @extschema@.ecluster_create_path(pg_catalog.array_agg(
  7.1724 +            @extschema@.coords_to_epoint(
  7.1725 +              ("coord" OPERATOR(pg_catalog.->>) 0)::pg_catalog.float8,
  7.1726 +              ("coord" OPERATOR(pg_catalog.->>) 1)::pg_catalog.float8,
  7.1727 +              $2
  7.1728 +            )
  7.1729 +          ))
  7.1730 +          FROM pg_catalog.jsonb_array_elements(
  7.1731 +            $1 OPERATOR(pg_catalog.->) 'coordinates'
  7.1732 +          ) AS "coord"
  7.1733 +        );
  7.1734 +      END IF;
  7.1735 +      IF "tp" = 'MultiLineString' THEN RETURN
  7.1736 +        ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
  7.1737 +            ( SELECT @extschema@.ecluster_create_path(pg_catalog.array_agg(
  7.1738 +                @extschema@.coords_to_epoint(
  7.1739 +                  ("coord" OPERATOR(pg_catalog.->>) 0)::pg_catalog.float8,
  7.1740 +                  ("coord" OPERATOR(pg_catalog.->>) 1)::pg_catalog.float8,
  7.1741 +                  $2
  7.1742 +                )
  7.1743 +              ))
  7.1744 +              FROM pg_catalog.jsonb_array_elements("coord_array") AS "coord"
  7.1745 +            )
  7.1746 +          ))
  7.1747 +          FROM pg_catalog.jsonb_array_elements(
  7.1748 +            $1 OPERATOR(pg_catalog.->) 'coordinates'
  7.1749 +          ) AS "coord_array"
  7.1750 +        );
  7.1751 +      END IF;
  7.1752 +      IF "tp" = 'Polygon' THEN RETURN
  7.1753 +        ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
  7.1754 +            ( SELECT @extschema@.ecluster_create_polygon(pg_catalog.array_agg(
  7.1755 +                @extschema@.coords_to_epoint(
  7.1756 +                  ("coord" OPERATOR(pg_catalog.->>) 0)::pg_catalog.float8,
  7.1757 +                  ("coord" OPERATOR(pg_catalog.->>) 1)::pg_catalog.float8,
  7.1758 +                  $2
  7.1759 +                )
  7.1760 +              ))
  7.1761 +              FROM @extschema@.GeoJSON_LinearRing_vertices("coord_array", $2)
  7.1762 +              AS "coord"
  7.1763 +            )
  7.1764 +          ))
  7.1765 +          FROM pg_catalog.jsonb_array_elements(
  7.1766 +            $1 OPERATOR(pg_catalog.->) 'coordinates'
  7.1767 +          ) AS "coord_array"
  7.1768 +        );
  7.1769 +      END IF;
  7.1770 +      IF "tp" = 'MultiPolygon' THEN RETURN
  7.1771 +        ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
  7.1772 +            ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
  7.1773 +                ( SELECT @extschema@.ecluster_create_polygon(
  7.1774 +                    pg_catalog.array_agg(
  7.1775 +                      @extschema@.coords_to_epoint(
  7.1776 +                        ("coord" OPERATOR(pg_catalog.->>) 0)
  7.1777 +                        ::pg_catalog.float8,
  7.1778 +                        ("coord" OPERATOR(pg_catalog.->>) 1)
  7.1779 +                        ::pg_catalog.float8,
  7.1780 +                        $2
  7.1781 +                      )
  7.1782 +                    )
  7.1783 +                  )
  7.1784 +                  FROM @extschema@.GeoJSON_LinearRing_vertices(
  7.1785 +                    "coord_array", $2
  7.1786 +                  ) AS "coord"
  7.1787 +                )
  7.1788 +              ))
  7.1789 +              FROM pg_catalog.jsonb_array_elements("coord_array_array")
  7.1790 +              AS "coord_array"
  7.1791 +            )
  7.1792 +          ))
  7.1793 +          FROM jsonb_array_elements(
  7.1794 +            $1 OPERATOR(pg_catalog.->) 'coordinates'
  7.1795 +          ) AS "coord_array_array"
  7.1796 +        );
  7.1797 +      END IF;
  7.1798 +      IF "tp" = 'GeometryCollection' THEN RETURN
  7.1799 +        ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
  7.1800 +            @extschema@.GeoJSON_to_ecluster("geometry", $2)
  7.1801 +          ))
  7.1802 +          FROM pg_catalog.jsonb_array_elements(
  7.1803 +            $1 OPERATOR(pg_catalog.->) 'geometries'
  7.1804 +          ) AS "geometry"
  7.1805 +        );
  7.1806 +      END IF;
  7.1807 +      IF "tp" = 'Feature' THEN RETURN
  7.1808 +        @extschema@.GeoJSON_to_ecluster(
  7.1809 +          $1 OPERATOR(pg_catalog.->) 'geometry', $2
  7.1810 +        );
  7.1811 +      END IF;
  7.1812 +      IF "tp" = 'FeatureCollection' THEN RETURN
  7.1813 +        ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
  7.1814 +            @extschema@.GeoJSON_to_ecluster("feature", $2)
  7.1815 +          ))
  7.1816 +          FROM pg_catalog.jsonb_array_elements(
  7.1817 +            $1 OPERATOR(pg_catalog.->) 'features'
  7.1818 +          ) AS "feature"
  7.1819 +        );
  7.1820 +      END IF;
  7.1821 +      RETURN NULL;
  7.1822 +    END;
  7.1823 +  $$;
  7.1824 +
     8.1 --- a/latlon.control	Thu Oct 23 15:19:13 2025 +0200
     8.2 +++ b/latlon.control	Thu Oct 23 15:31:50 2025 +0200
     8.3 @@ -1,4 +1,4 @@
     8.4  comment = 'Geographic data types and spatial indexing for the WGS-84 spheroid'
     8.5 -default_version = '0.15'
     8.6 +default_version = '0.16'
     8.7  trusted = true
     8.8  relocatable = false

Impressum / About Us