pgLatLon

annotate latlon--0.14--0.15.sql @ 79:16787a19a325

Do not return CSTRING to static memory

Avoids wrong pfree under certain circumstances
(e.g. array_agg on empty EBOX or ECLUSTER).
author jbe
date Thu Oct 23 10:16:01 2025 +0200 (10 days ago)
parents 4f11ccf36fb6
children
rev   line source
jbe@73 1 SET LOCAL search_path TO @extschema@;
jbe@73 2
jbe@0 3
jbe@0 4 ------------------------------------------------------------
jbe@0 5 -- dummy input/output functions for dummy index key types --
jbe@0 6 ------------------------------------------------------------
jbe@0 7
jbe@69 8 CREATE OR REPLACE FUNCTION ekey_point_in_dummy(cstring)
jbe@0 9 RETURNS ekey_point
jbe@0 10 LANGUAGE C IMMUTABLE STRICT
jbe@69 11 AS '$libdir/latlon-v0010', 'pgl_notimpl';
jbe@0 12
jbe@69 13 CREATE OR REPLACE FUNCTION ekey_point_out_dummy(ekey_point)
jbe@0 14 RETURNS cstring
jbe@0 15 LANGUAGE C IMMUTABLE STRICT
jbe@69 16 AS '$libdir/latlon-v0010', 'pgl_notimpl';
jbe@0 17
jbe@69 18 CREATE OR REPLACE FUNCTION ekey_area_in_dummy(cstring)
jbe@0 19 RETURNS ekey_area
jbe@0 20 LANGUAGE C IMMUTABLE STRICT
jbe@69 21 AS '$libdir/latlon-v0010', 'pgl_notimpl';
jbe@0 22
jbe@69 23 CREATE OR REPLACE FUNCTION ekey_area_out_dummy(ekey_area)
jbe@0 24 RETURNS cstring
jbe@0 25 LANGUAGE C IMMUTABLE STRICT
jbe@69 26 AS '$libdir/latlon-v0010', 'pgl_notimpl';
jbe@0 27
jbe@0 28
jbe@0 29 --------------------------
jbe@0 30 -- text input functions --
jbe@0 31 --------------------------
jbe@0 32
jbe@69 33 CREATE OR REPLACE FUNCTION epoint_in(cstring)
jbe@0 34 RETURNS epoint
jbe@0 35 LANGUAGE C IMMUTABLE STRICT
jbe@69 36 AS '$libdir/latlon-v0010', 'pgl_epoint_in';
jbe@46 37
jbe@69 38 CREATE OR REPLACE FUNCTION epoint_with_sample_count_in(cstring)
jbe@46 39 RETURNS epoint_with_sample_count
jbe@46 40 LANGUAGE C IMMUTABLE STRICT
jbe@69 41 AS '$libdir/latlon-v0010', 'pgl_epoint_with_sample_count_in';
jbe@0 42
jbe@69 43 CREATE OR REPLACE FUNCTION ebox_in(cstring)
jbe@0 44 RETURNS ebox
jbe@0 45 LANGUAGE C IMMUTABLE STRICT
jbe@69 46 AS '$libdir/latlon-v0010', 'pgl_ebox_in';
jbe@0 47
jbe@69 48 CREATE OR REPLACE FUNCTION ecircle_in(cstring)
jbe@0 49 RETURNS ecircle
jbe@0 50 LANGUAGE C IMMUTABLE STRICT
jbe@69 51 AS '$libdir/latlon-v0010', 'pgl_ecircle_in';
jbe@0 52
jbe@69 53 CREATE OR REPLACE FUNCTION ecluster_in(cstring)
jbe@0 54 RETURNS ecluster
jbe@0 55 LANGUAGE C IMMUTABLE STRICT
jbe@69 56 AS '$libdir/latlon-v0010', 'pgl_ecluster_in';
jbe@0 57
jbe@0 58
jbe@0 59 ---------------------------
jbe@0 60 -- text output functions --
jbe@0 61 ---------------------------
jbe@0 62
jbe@69 63 CREATE OR REPLACE FUNCTION epoint_out(epoint)
jbe@0 64 RETURNS cstring
jbe@0 65 LANGUAGE C IMMUTABLE STRICT
jbe@69 66 AS '$libdir/latlon-v0010', 'pgl_epoint_out';
jbe@46 67
jbe@69 68 CREATE OR REPLACE FUNCTION epoint_with_sample_count_out(epoint_with_sample_count)
jbe@46 69 RETURNS cstring
jbe@46 70 LANGUAGE C IMMUTABLE STRICT
jbe@69 71 AS '$libdir/latlon-v0010', 'pgl_epoint_with_sample_count_out';
jbe@0 72
jbe@69 73 CREATE OR REPLACE FUNCTION ebox_out(ebox)
jbe@0 74 RETURNS cstring
jbe@0 75 LANGUAGE C IMMUTABLE STRICT
jbe@69 76 AS '$libdir/latlon-v0010', 'pgl_ebox_out';
jbe@0 77
jbe@69 78 CREATE OR REPLACE FUNCTION ecircle_out(ecircle)
jbe@0 79 RETURNS cstring
jbe@0 80 LANGUAGE C IMMUTABLE STRICT
jbe@69 81 AS '$libdir/latlon-v0010', 'pgl_ecircle_out';
jbe@0 82
jbe@69 83 CREATE OR REPLACE FUNCTION ecluster_out(ecluster)
jbe@0 84 RETURNS cstring
jbe@0 85 LANGUAGE C IMMUTABLE STRICT
jbe@69 86 AS '$libdir/latlon-v0010', 'pgl_ecluster_out';
jbe@0 87
jbe@0 88
jbe@0 89 --------------------------
jbe@0 90 -- binary I/O functions --
jbe@0 91 --------------------------
jbe@0 92
jbe@69 93 CREATE OR REPLACE FUNCTION epoint_recv(internal)
jbe@0 94 RETURNS epoint
jbe@0 95 LANGUAGE C IMMUTABLE STRICT
jbe@69 96 AS '$libdir/latlon-v0010', 'pgl_epoint_recv';
jbe@0 97
jbe@69 98 CREATE OR REPLACE FUNCTION ebox_recv(internal)
jbe@0 99 RETURNS ebox
jbe@0 100 LANGUAGE C IMMUTABLE STRICT
jbe@69 101 AS '$libdir/latlon-v0010', 'pgl_ebox_recv';
jbe@0 102
jbe@69 103 CREATE OR REPLACE FUNCTION ecircle_recv(internal)
jbe@0 104 RETURNS ecircle
jbe@0 105 LANGUAGE C IMMUTABLE STRICT
jbe@69 106 AS '$libdir/latlon-v0010', 'pgl_ecircle_recv';
jbe@0 107
jbe@69 108 CREATE OR REPLACE FUNCTION epoint_send(epoint)
jbe@0 109 RETURNS bytea
jbe@0 110 LANGUAGE C IMMUTABLE STRICT
jbe@69 111 AS '$libdir/latlon-v0010', 'pgl_epoint_send';
jbe@0 112
jbe@69 113 CREATE OR REPLACE FUNCTION ebox_send(ebox)
jbe@69 114 RETURNS bytea
jbe@69 115 LANGUAGE C IMMUTABLE STRICT
jbe@69 116 AS '$libdir/latlon-v0010', 'pgl_ebox_send';
jbe@46 117
jbe@69 118 CREATE OR REPLACE FUNCTION ecircle_send(ecircle)
jbe@69 119 RETURNS bytea
jbe@69 120 LANGUAGE C IMMUTABLE STRICT
jbe@69 121 AS '$libdir/latlon-v0010', 'pgl_ecircle_send';
jbe@0 122
jbe@0 123
jbe@0 124 --------------------
jbe@0 125 -- B-tree support --
jbe@0 126 --------------------
jbe@0 127
jbe@0 128 -- begin of B-tree support for epoint
jbe@0 129
jbe@69 130 CREATE OR REPLACE FUNCTION epoint_btree_lt(epoint, epoint)
jbe@0 131 RETURNS boolean
jbe@0 132 LANGUAGE C IMMUTABLE STRICT
jbe@69 133 AS '$libdir/latlon-v0010', 'pgl_btree_epoint_lt';
jbe@0 134
jbe@69 135 CREATE OR REPLACE FUNCTION epoint_btree_le(epoint, epoint)
jbe@0 136 RETURNS boolean
jbe@0 137 LANGUAGE C IMMUTABLE STRICT
jbe@69 138 AS '$libdir/latlon-v0010', 'pgl_btree_epoint_le';
jbe@0 139
jbe@69 140 CREATE OR REPLACE FUNCTION epoint_btree_eq(epoint, epoint)
jbe@0 141 RETURNS boolean
jbe@0 142 LANGUAGE C IMMUTABLE STRICT
jbe@69 143 AS '$libdir/latlon-v0010', 'pgl_btree_epoint_eq';
jbe@0 144
jbe@69 145 CREATE OR REPLACE FUNCTION epoint_btree_ne(epoint, epoint)
jbe@69 146 RETURNS boolean
jbe@69 147 LANGUAGE C IMMUTABLE STRICT
jbe@69 148 AS '$libdir/latlon-v0010', 'pgl_btree_epoint_ne';
jbe@0 149
jbe@69 150 CREATE OR REPLACE FUNCTION epoint_btree_ge(epoint, epoint)
jbe@69 151 RETURNS boolean
jbe@69 152 LANGUAGE C IMMUTABLE STRICT
jbe@69 153 AS '$libdir/latlon-v0010', 'pgl_btree_epoint_ge';
jbe@0 154
jbe@69 155 CREATE OR REPLACE FUNCTION epoint_btree_gt(epoint, epoint)
jbe@69 156 RETURNS boolean
jbe@69 157 LANGUAGE C IMMUTABLE STRICT
jbe@69 158 AS '$libdir/latlon-v0010', 'pgl_btree_epoint_gt';
jbe@0 159
jbe@69 160 CREATE OR REPLACE FUNCTION epoint_btree_cmp(epoint, epoint)
jbe@0 161 RETURNS int4
jbe@0 162 LANGUAGE C IMMUTABLE STRICT
jbe@69 163 AS '$libdir/latlon-v0010', 'pgl_btree_epoint_cmp';
jbe@0 164
jbe@0 165 -- end of B-tree support for epoint
jbe@0 166
jbe@0 167 -- begin of B-tree support for ebox
jbe@0 168
jbe@69 169 CREATE OR REPLACE FUNCTION ebox_btree_lt(ebox, ebox)
jbe@0 170 RETURNS boolean
jbe@0 171 LANGUAGE C IMMUTABLE STRICT
jbe@69 172 AS '$libdir/latlon-v0010', 'pgl_btree_ebox_lt';
jbe@0 173
jbe@69 174 CREATE OR REPLACE FUNCTION ebox_btree_le(ebox, ebox)
jbe@0 175 RETURNS boolean
jbe@0 176 LANGUAGE C IMMUTABLE STRICT
jbe@69 177 AS '$libdir/latlon-v0010', 'pgl_btree_ebox_le';
jbe@0 178
jbe@69 179 CREATE OR REPLACE FUNCTION ebox_btree_eq(ebox, ebox)
jbe@0 180 RETURNS boolean
jbe@0 181 LANGUAGE C IMMUTABLE STRICT
jbe@69 182 AS '$libdir/latlon-v0010', 'pgl_btree_ebox_eq';
jbe@0 183
jbe@69 184 CREATE OR REPLACE FUNCTION ebox_btree_ne(ebox, ebox)
jbe@69 185 RETURNS boolean
jbe@69 186 LANGUAGE C IMMUTABLE STRICT
jbe@69 187 AS '$libdir/latlon-v0010', 'pgl_btree_ebox_ne';
jbe@0 188
jbe@69 189 CREATE OR REPLACE FUNCTION ebox_btree_ge(ebox, ebox)
jbe@69 190 RETURNS boolean
jbe@69 191 LANGUAGE C IMMUTABLE STRICT
jbe@69 192 AS '$libdir/latlon-v0010', 'pgl_btree_ebox_ge';
jbe@0 193
jbe@69 194 CREATE OR REPLACE FUNCTION ebox_btree_gt(ebox, ebox)
jbe@69 195 RETURNS boolean
jbe@69 196 LANGUAGE C IMMUTABLE STRICT
jbe@69 197 AS '$libdir/latlon-v0010', 'pgl_btree_ebox_gt';
jbe@0 198
jbe@69 199 CREATE OR REPLACE FUNCTION ebox_btree_cmp(ebox, ebox)
jbe@0 200 RETURNS int4
jbe@0 201 LANGUAGE C IMMUTABLE STRICT
jbe@69 202 AS '$libdir/latlon-v0010', 'pgl_btree_ebox_cmp';
jbe@0 203
jbe@0 204 -- end of B-tree support for ebox
jbe@0 205
jbe@0 206 -- begin of B-tree support for ecircle
jbe@0 207
jbe@69 208 CREATE OR REPLACE FUNCTION ecircle_btree_lt(ecircle, ecircle)
jbe@0 209 RETURNS boolean
jbe@0 210 LANGUAGE C IMMUTABLE STRICT
jbe@69 211 AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_lt';
jbe@0 212
jbe@69 213 CREATE OR REPLACE FUNCTION ecircle_btree_le(ecircle, ecircle)
jbe@0 214 RETURNS boolean
jbe@0 215 LANGUAGE C IMMUTABLE STRICT
jbe@69 216 AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_le';
jbe@0 217
jbe@69 218 CREATE OR REPLACE FUNCTION ecircle_btree_eq(ecircle, ecircle)
jbe@0 219 RETURNS boolean
jbe@0 220 LANGUAGE C IMMUTABLE STRICT
jbe@69 221 AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_eq';
jbe@0 222
jbe@69 223 CREATE OR REPLACE FUNCTION ecircle_btree_ne(ecircle, ecircle)
jbe@69 224 RETURNS boolean
jbe@69 225 LANGUAGE C IMMUTABLE STRICT
jbe@69 226 AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_ne';
jbe@0 227
jbe@69 228 CREATE OR REPLACE FUNCTION ecircle_btree_ge(ecircle, ecircle)
jbe@69 229 RETURNS boolean
jbe@69 230 LANGUAGE C IMMUTABLE STRICT
jbe@69 231 AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_ge';
jbe@0 232
jbe@69 233 CREATE OR REPLACE FUNCTION ecircle_btree_gt(ecircle, ecircle)
jbe@69 234 RETURNS boolean
jbe@69 235 LANGUAGE C IMMUTABLE STRICT
jbe@69 236 AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_gt';
jbe@0 237
jbe@69 238 CREATE OR REPLACE FUNCTION ecircle_btree_cmp(ecircle, ecircle)
jbe@0 239 RETURNS int4
jbe@0 240 LANGUAGE C IMMUTABLE STRICT
jbe@69 241 AS '$libdir/latlon-v0010', 'pgl_btree_ecircle_cmp';
jbe@0 242
jbe@0 243 -- end of B-tree support for ecircle
jbe@0 244
jbe@0 245
jbe@0 246 ----------------
jbe@0 247 -- type casts --
jbe@0 248 ----------------
jbe@0 249
jbe@69 250 CREATE OR REPLACE FUNCTION cast_epoint_to_ebox(epoint)
jbe@0 251 RETURNS ebox
jbe@0 252 LANGUAGE C IMMUTABLE STRICT
jbe@69 253 AS '$libdir/latlon-v0010', 'pgl_epoint_to_ebox';
jbe@0 254
jbe@69 255 CREATE OR REPLACE FUNCTION cast_epoint_to_ecircle(epoint)
jbe@0 256 RETURNS ecircle
jbe@0 257 LANGUAGE C IMMUTABLE STRICT
jbe@69 258 AS '$libdir/latlon-v0010', 'pgl_epoint_to_ecircle';
jbe@0 259
jbe@69 260 CREATE OR REPLACE FUNCTION cast_epoint_to_ecluster(epoint)
jbe@0 261 RETURNS ecluster
jbe@0 262 LANGUAGE C IMMUTABLE STRICT
jbe@69 263 AS '$libdir/latlon-v0010', 'pgl_epoint_to_ecluster';
jbe@0 264
jbe@69 265 CREATE OR REPLACE FUNCTION cast_ebox_to_ecluster(ebox)
jbe@0 266 RETURNS ecluster
jbe@0 267 LANGUAGE C IMMUTABLE STRICT
jbe@69 268 AS '$libdir/latlon-v0010', 'pgl_ebox_to_ecluster';
jbe@0 269
jbe@0 270
jbe@0 271 ---------------------------
jbe@0 272 -- constructor functions --
jbe@0 273 ---------------------------
jbe@0 274
jbe@69 275 CREATE OR REPLACE FUNCTION epoint(float8, float8)
jbe@0 276 RETURNS epoint
jbe@0 277 LANGUAGE C IMMUTABLE STRICT
jbe@69 278 AS '$libdir/latlon-v0010', 'pgl_create_epoint';
jbe@0 279
jbe@73 280 CREATE OR REPLACE FUNCTION epoint_latlon(float8, float8)
jbe@73 281 RETURNS epoint
jbe@73 282 LANGUAGE SQL IMMUTABLE STRICT AS $$
jbe@73 283 SELECT @extschema@.epoint($1, $2)
jbe@73 284 $$;
jbe@73 285
jbe@73 286 CREATE OR REPLACE FUNCTION epoint_lonlat(float8, float8)
jbe@73 287 RETURNS epoint
jbe@73 288 LANGUAGE SQL IMMUTABLE STRICT AS $$
jbe@73 289 SELECT @extschema@.epoint($2, $1)
jbe@73 290 $$;
jbe@73 291
jbe@69 292 CREATE OR REPLACE FUNCTION epoint_with_sample_count(epoint, int4)
jbe@46 293 RETURNS epoint_with_sample_count
jbe@46 294 LANGUAGE C IMMUTABLE STRICT
jbe@69 295 AS '$libdir/latlon-v0010', 'pgl_create_epoint_with_sample_count';
jbe@46 296
jbe@69 297 CREATE OR REPLACE FUNCTION empty_ebox()
jbe@0 298 RETURNS ebox
jbe@0 299 LANGUAGE C IMMUTABLE STRICT
jbe@69 300 AS '$libdir/latlon-v0010', 'pgl_create_empty_ebox';
jbe@0 301
jbe@69 302 CREATE OR REPLACE FUNCTION ebox(float8, float8, float8, float8)
jbe@0 303 RETURNS ebox
jbe@0 304 LANGUAGE C IMMUTABLE STRICT
jbe@69 305 AS '$libdir/latlon-v0010', 'pgl_create_ebox';
jbe@0 306
jbe@69 307 CREATE OR REPLACE FUNCTION ebox(epoint, epoint)
jbe@69 308 RETURNS ebox
jbe@0 309 LANGUAGE C IMMUTABLE STRICT
jbe@69 310 AS '$libdir/latlon-v0010', 'pgl_create_ebox_from_epoints';
jbe@0 311
jbe@69 312 CREATE OR REPLACE FUNCTION ecircle(float8, float8, float8)
jbe@0 313 RETURNS ecircle
jbe@0 314 LANGUAGE C IMMUTABLE STRICT
jbe@69 315 AS '$libdir/latlon-v0010', 'pgl_create_ecircle';
jbe@0 316
jbe@69 317 CREATE OR REPLACE FUNCTION ecircle(epoint, float8)
jbe@69 318 RETURNS ecircle
jbe@69 319 LANGUAGE C IMMUTABLE STRICT
jbe@69 320 AS '$libdir/latlon-v0010', 'pgl_create_ecircle_from_epoint';
jbe@0 321
jbe@73 322 CREATE OR REPLACE FUNCTION ecluster_concat(ecluster[])
jbe@73 323 RETURNS ecluster
jbe@73 324 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@73 325 SELECT pg_catalog.array_to_string($1, ' ')::@extschema@.ecluster
jbe@73 326 $$;
jbe@73 327
jbe@73 328 CREATE OR REPLACE FUNCTION ecluster_concat(ecluster, ecluster)
jbe@73 329 RETURNS ecluster
jbe@73 330 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@73 331 SELECT (
jbe@73 332 $1::pg_catalog.text OPERATOR(pg_catalog.||) ' ' OPERATOR(pg_catalog.||)
jbe@73 333 $2::pg_catalog.text
jbe@73 334 )::@extschema@.ecluster
jbe@73 335 $$;
jbe@73 336
jbe@73 337 CREATE OR REPLACE FUNCTION ecluster_create_multipoint(epoint[])
jbe@73 338 RETURNS ecluster
jbe@73 339 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@73 340 SELECT
jbe@73 341 pg_catalog.array_to_string(
jbe@73 342 pg_catalog.array_agg(
jbe@73 343 'point (' OPERATOR(pg_catalog.||) unnest OPERATOR(pg_catalog.||) ')'
jbe@73 344 ),
jbe@73 345 ' '
jbe@73 346 )::@extschema@.ecluster
jbe@73 347 FROM pg_catalog.unnest($1)
jbe@73 348 $$;
jbe@73 349
jbe@73 350 CREATE OR REPLACE FUNCTION ecluster_create_path(epoint[])
jbe@73 351 RETURNS ecluster
jbe@73 352 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@73 353 SELECT CASE WHEN "str" OPERATOR(pg_catalog.=) '' THEN
jbe@73 354 'empty'::@extschema@.ecluster
jbe@73 355 ELSE
jbe@73 356 (
jbe@73 357 'path (' OPERATOR(pg_catalog.||) "str" OPERATOR(pg_catalog.||) ')'
jbe@73 358 )::@extschema@.ecluster
jbe@73 359 END
jbe@73 360 FROM pg_catalog.array_to_string($1, ' ') AS "str"
jbe@73 361 $$;
jbe@73 362
jbe@73 363 CREATE OR REPLACE FUNCTION ecluster_create_outline(epoint[])
jbe@73 364 RETURNS ecluster
jbe@73 365 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@73 366 SELECT CASE WHEN "str" OPERATOR(pg_catalog.=) '' THEN
jbe@73 367 'empty'::@extschema@.ecluster
jbe@73 368 ELSE
jbe@73 369 (
jbe@73 370 'outline (' OPERATOR(pg_catalog.||) "str" OPERATOR(pg_catalog.||) ')'
jbe@73 371 )::@extschema@.ecluster
jbe@73 372 END
jbe@73 373 FROM pg_catalog.array_to_string($1, ' ') AS "str"
jbe@73 374 $$;
jbe@73 375
jbe@73 376 CREATE OR REPLACE FUNCTION ecluster_create_polygon(epoint[])
jbe@73 377 RETURNS ecluster
jbe@73 378 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@73 379 SELECT CASE WHEN "str" OPERATOR(pg_catalog.=) '' THEN
jbe@73 380 'empty'::@extschema@.ecluster
jbe@73 381 ELSE
jbe@73 382 (
jbe@73 383 'polygon (' OPERATOR(pg_catalog.||) pg_catalog.array_to_string($1, ' ')
jbe@73 384 OPERATOR(pg_catalog.||) ')'
jbe@73 385 )::@extschema@.ecluster
jbe@73 386 END
jbe@73 387 FROM pg_catalog.array_to_string($1, ' ') AS "str"
jbe@73 388 $$;
jbe@73 389
jbe@0 390
jbe@0 391 ----------------------
jbe@0 392 -- getter functions --
jbe@0 393 ----------------------
jbe@0 394
jbe@69 395 CREATE OR REPLACE FUNCTION latitude(epoint)
jbe@0 396 RETURNS float8
jbe@0 397 LANGUAGE C IMMUTABLE STRICT
jbe@69 398 AS '$libdir/latlon-v0010', 'pgl_epoint_lat';
jbe@0 399
jbe@69 400 CREATE OR REPLACE FUNCTION longitude(epoint)
jbe@0 401 RETURNS float8
jbe@0 402 LANGUAGE C IMMUTABLE STRICT
jbe@69 403 AS '$libdir/latlon-v0010', 'pgl_epoint_lon';
jbe@0 404
jbe@69 405 CREATE OR REPLACE FUNCTION min_latitude(ebox)
jbe@0 406 RETURNS float8
jbe@0 407 LANGUAGE C IMMUTABLE STRICT
jbe@69 408 AS '$libdir/latlon-v0010', 'pgl_ebox_lat_min';
jbe@0 409
jbe@69 410 CREATE OR REPLACE FUNCTION max_latitude(ebox)
jbe@0 411 RETURNS float8
jbe@0 412 LANGUAGE C IMMUTABLE STRICT
jbe@69 413 AS '$libdir/latlon-v0010', 'pgl_ebox_lat_max';
jbe@0 414
jbe@69 415 CREATE OR REPLACE FUNCTION min_longitude(ebox)
jbe@69 416 RETURNS float8
jbe@69 417 LANGUAGE C IMMUTABLE STRICT
jbe@69 418 AS '$libdir/latlon-v0010', 'pgl_ebox_lon_min';
jbe@0 419
jbe@69 420 CREATE OR REPLACE FUNCTION max_longitude(ebox)
jbe@69 421 RETURNS float8
jbe@69 422 LANGUAGE C IMMUTABLE STRICT
jbe@69 423 AS '$libdir/latlon-v0010', 'pgl_ebox_lon_max';
jbe@0 424
jbe@69 425 CREATE OR REPLACE FUNCTION center(ecircle)
jbe@69 426 RETURNS epoint
jbe@69 427 LANGUAGE C IMMUTABLE STRICT
jbe@69 428 AS '$libdir/latlon-v0010', 'pgl_ecircle_center';
jbe@69 429
jbe@69 430 CREATE OR REPLACE FUNCTION radius(ecircle)
jbe@69 431 RETURNS float8
jbe@69 432 LANGUAGE C IMMUTABLE STRICT
jbe@69 433 AS '$libdir/latlon-v0010', 'pgl_ecircle_radius';
jbe@0 434
jbe@73 435 CREATE OR REPLACE FUNCTION ecluster_extract_points(ecluster)
jbe@73 436 RETURNS SETOF epoint
jbe@73 437 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@73 438 SELECT "match"[2]::@extschema@.epoint
jbe@73 439 FROM pg_catalog.regexp_matches(
jbe@73 440 $1::pg_catalog.text, e'(^| )point \\(([^)]+)\\)', 'g'
jbe@73 441 ) AS "match"
jbe@73 442 $$;
jbe@73 443
jbe@73 444 CREATE OR REPLACE FUNCTION ecluster_extract_paths(ecluster)
jbe@73 445 RETURNS SETOF epoint[]
jbe@73 446 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@73 447 SELECT (
jbe@73 448 SELECT pg_catalog.array_agg("m2"[1]::@extschema@.epoint)
jbe@73 449 FROM pg_catalog.regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
jbe@73 450 )
jbe@73 451 FROM pg_catalog.regexp_matches(
jbe@73 452 $1::pg_catalog.text, e'(^| )path \\(([^)]+)\\)', 'g'
jbe@73 453 ) AS "m1"
jbe@73 454 $$;
jbe@73 455
jbe@73 456 CREATE OR REPLACE FUNCTION ecluster_extract_outlines(ecluster)
jbe@73 457 RETURNS SETOF epoint[]
jbe@73 458 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@73 459 SELECT (
jbe@73 460 SELECT pg_catalog.array_agg("m2"[1]::@extschema@.epoint)
jbe@73 461 FROM pg_catalog.regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
jbe@73 462 )
jbe@73 463 FROM pg_catalog.regexp_matches(
jbe@73 464 $1::pg_catalog.text, e'(^| )outline \\(([^)]+)\\)', 'g'
jbe@73 465 ) AS "m1"
jbe@73 466 $$;
jbe@73 467
jbe@73 468 CREATE OR REPLACE FUNCTION ecluster_extract_polygons(ecluster)
jbe@73 469 RETURNS SETOF epoint[]
jbe@73 470 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@73 471 SELECT (
jbe@73 472 SELECT pg_catalog.array_agg("m2"[1]::@extschema@.epoint)
jbe@73 473 FROM pg_catalog.regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
jbe@73 474 )
jbe@73 475 FROM pg_catalog.regexp_matches(
jbe@73 476 $1::pg_catalog.text, e'(^| )polygon \\(([^)]+)\\)', 'g'
jbe@73 477 ) AS "m1"
jbe@73 478 $$;
jbe@73 479
jbe@0 480
jbe@0 481 ---------------
jbe@0 482 -- operators --
jbe@0 483 ---------------
jbe@0 484
jbe@69 485 CREATE OR REPLACE FUNCTION epoint_ebox_overlap_proc(epoint, ebox)
jbe@0 486 RETURNS boolean
jbe@0 487 LANGUAGE C IMMUTABLE STRICT
jbe@69 488 AS '$libdir/latlon-v0010', 'pgl_epoint_ebox_overlap';
jbe@0 489
jbe@69 490 CREATE OR REPLACE FUNCTION epoint_ecircle_overlap_proc(epoint, ecircle)
jbe@0 491 RETURNS boolean
jbe@0 492 LANGUAGE C IMMUTABLE STRICT
jbe@69 493 AS '$libdir/latlon-v0010', 'pgl_epoint_ecircle_overlap';
jbe@0 494
jbe@69 495 CREATE OR REPLACE FUNCTION epoint_ecluster_overlap_proc(epoint, ecluster)
jbe@0 496 RETURNS boolean
jbe@0 497 LANGUAGE C IMMUTABLE STRICT
jbe@69 498 AS '$libdir/latlon-v0010', 'pgl_epoint_ecluster_overlap';
jbe@0 499
jbe@69 500 CREATE OR REPLACE FUNCTION epoint_ecluster_may_overlap_proc(epoint, ecluster)
jbe@10 501 RETURNS boolean
jbe@10 502 LANGUAGE C IMMUTABLE STRICT
jbe@69 503 AS '$libdir/latlon-v0010', 'pgl_epoint_ecluster_may_overlap';
jbe@10 504
jbe@69 505 CREATE OR REPLACE FUNCTION ebox_overlap_proc(ebox, ebox)
jbe@0 506 RETURNS boolean
jbe@0 507 LANGUAGE C IMMUTABLE STRICT
jbe@69 508 AS '$libdir/latlon-v0010', 'pgl_ebox_overlap';
jbe@0 509
jbe@69 510 CREATE OR REPLACE FUNCTION ebox_ecircle_may_overlap_proc(ebox, ecircle)
jbe@0 511 RETURNS boolean
jbe@0 512 LANGUAGE C IMMUTABLE STRICT
jbe@69 513 AS '$libdir/latlon-v0010', 'pgl_ebox_ecircle_may_overlap';
jbe@0 514
jbe@69 515 CREATE OR REPLACE FUNCTION ebox_ecluster_may_overlap_proc(ebox, ecluster)
jbe@10 516 RETURNS boolean
jbe@10 517 LANGUAGE C IMMUTABLE STRICT
jbe@69 518 AS '$libdir/latlon-v0010', 'pgl_ebox_ecluster_may_overlap';
jbe@10 519
jbe@69 520 CREATE OR REPLACE FUNCTION ecircle_overlap_proc(ecircle, ecircle)
jbe@16 521 RETURNS boolean
jbe@16 522 LANGUAGE C IMMUTABLE STRICT
jbe@69 523 AS '$libdir/latlon-v0010', 'pgl_ecircle_overlap';
jbe@16 524
jbe@69 525 CREATE OR REPLACE FUNCTION ecircle_ecluster_overlap_proc(ecircle, ecluster)
jbe@10 526 RETURNS boolean
jbe@10 527 LANGUAGE C IMMUTABLE STRICT
jbe@69 528 AS '$libdir/latlon-v0010', 'pgl_ecircle_ecluster_overlap';
jbe@10 529
jbe@69 530 CREATE OR REPLACE FUNCTION ecircle_ecluster_may_overlap_proc(ecircle, ecluster)
jbe@16 531 RETURNS boolean
jbe@16 532 LANGUAGE C IMMUTABLE STRICT
jbe@69 533 AS '$libdir/latlon-v0010', 'pgl_ecircle_ecluster_may_overlap';
jbe@0 534
jbe@69 535 CREATE OR REPLACE FUNCTION ecluster_overlap_proc(ecluster, ecluster)
jbe@69 536 RETURNS boolean
jbe@0 537 LANGUAGE C IMMUTABLE STRICT
jbe@69 538 AS '$libdir/latlon-v0010', 'pgl_ecluster_overlap';
jbe@0 539
jbe@69 540 CREATE OR REPLACE FUNCTION ecluster_may_overlap_proc(ecluster, ecluster)
jbe@69 541 RETURNS boolean
jbe@0 542 LANGUAGE C IMMUTABLE STRICT
jbe@69 543 AS '$libdir/latlon-v0010', 'pgl_ecluster_may_overlap';
jbe@0 544
jbe@69 545 CREATE OR REPLACE FUNCTION ecluster_contains_proc(ecluster, ecluster)
jbe@69 546 RETURNS boolean
jbe@16 547 LANGUAGE C IMMUTABLE STRICT
jbe@69 548 AS '$libdir/latlon-v0010', 'pgl_ecluster_contains';
jbe@46 549
jbe@69 550 CREATE OR REPLACE FUNCTION epoint_distance_proc(epoint, epoint)
jbe@46 551 RETURNS float8
jbe@46 552 LANGUAGE C IMMUTABLE STRICT
jbe@69 553 AS '$libdir/latlon-v0010', 'pgl_epoint_distance';
jbe@16 554
jbe@69 555 CREATE OR REPLACE FUNCTION epoint_ecircle_distance_proc(epoint, ecircle)
jbe@69 556 RETURNS float8
jbe@69 557 LANGUAGE C IMMUTABLE STRICT
jbe@69 558 AS '$libdir/latlon-v0010', 'pgl_epoint_ecircle_distance';
jbe@10 559
jbe@69 560 CREATE OR REPLACE FUNCTION epoint_ecluster_distance_proc(epoint, ecluster)
jbe@69 561 RETURNS float8
jbe@69 562 LANGUAGE C IMMUTABLE STRICT
jbe@69 563 AS '$libdir/latlon-v0010', 'pgl_epoint_ecluster_distance';
jbe@16 564
jbe@69 565 CREATE OR REPLACE FUNCTION ecircle_distance_proc(ecircle, ecircle)
jbe@69 566 RETURNS float8
jbe@69 567 LANGUAGE C IMMUTABLE STRICT
jbe@69 568 AS '$libdir/latlon-v0010', 'pgl_ecircle_distance';
jbe@20 569
jbe@69 570 CREATE OR REPLACE FUNCTION ecircle_ecluster_distance_proc(ecircle, ecluster)
jbe@69 571 RETURNS float8
jbe@69 572 LANGUAGE C IMMUTABLE STRICT
jbe@69 573 AS '$libdir/latlon-v0010', 'pgl_ecircle_ecluster_distance';
jbe@0 574
jbe@69 575 CREATE OR REPLACE FUNCTION ecluster_distance_proc(ecluster, ecluster)
jbe@0 576 RETURNS float8
jbe@69 577 LANGUAGE C IMMUTABLE STRICT
jbe@69 578 AS '$libdir/latlon-v0010', 'pgl_ecluster_distance';
jbe@16 579
jbe@69 580 CREATE OR REPLACE FUNCTION fair_distance_operator_proc(ecluster, epoint_with_sample_count)
jbe@16 581 RETURNS float8
jbe@69 582 LANGUAGE C IMMUTABLE STRICT
jbe@69 583 AS '$libdir/latlon-v0010', 'pgl_ecluster_epoint_sc_fair_distance';
jbe@42 584
jbe@73 585 CREATE OR REPLACE FUNCTION epoint_ebox_overlap_commutator(ebox, epoint)
jbe@73 586 RETURNS boolean
jbe@73 587 LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&) $1';
jbe@73 588
jbe@73 589 CREATE OR REPLACE FUNCTION epoint_ecircle_overlap_commutator(ecircle, epoint)
jbe@73 590 RETURNS boolean
jbe@73 591 LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&) $1';
jbe@73 592
jbe@73 593 CREATE OR REPLACE FUNCTION epoint_ecluster_overlap_commutator(ecluster, epoint)
jbe@73 594 RETURNS boolean
jbe@73 595 LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&) $1';
jbe@73 596
jbe@73 597 CREATE OR REPLACE FUNCTION ecircle_ecluster_overlap_commutator(ecluster, ecircle)
jbe@73 598 RETURNS boolean
jbe@73 599 LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&) $1';
jbe@73 600
jbe@73 601 CREATE OR REPLACE FUNCTION ebox_ecircle_overlap_castwrap(ebox, ecircle)
jbe@73 602 RETURNS boolean
jbe@73 603 LANGUAGE sql IMMUTABLE
jbe@73 604 AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.&&) $2';
jbe@73 605
jbe@73 606 CREATE OR REPLACE FUNCTION ebox_ecircle_overlap_castwrap(ecircle, ebox)
jbe@73 607 RETURNS boolean
jbe@73 608 LANGUAGE sql IMMUTABLE
jbe@73 609 AS 'SELECT $1 OPERATOR(@extschema@.&&) $2::@extschema@.ecluster';
jbe@73 610
jbe@73 611 CREATE OR REPLACE FUNCTION ebox_ecluster_overlap_castwrap(ebox, ecluster)
jbe@73 612 RETURNS boolean
jbe@73 613 LANGUAGE sql IMMUTABLE
jbe@73 614 AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.&&) $2';
jbe@73 615
jbe@73 616 CREATE OR REPLACE FUNCTION ebox_ecluster_overlap_castwrap(ecluster, ebox)
jbe@73 617 RETURNS boolean
jbe@73 618 LANGUAGE sql IMMUTABLE
jbe@73 619 AS 'SELECT $1 OPERATOR(@extschema@.&&) $2::@extschema@.ecluster';
jbe@73 620
jbe@73 621 CREATE OR REPLACE FUNCTION epoint_ecluster_may_overlap_commutator(ecluster, epoint)
jbe@73 622 RETURNS boolean
jbe@73 623 LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&+) $1';
jbe@73 624
jbe@73 625 CREATE OR REPLACE FUNCTION ebox_ecircle_may_overlap_commutator(ecircle, ebox)
jbe@73 626 RETURNS boolean
jbe@73 627 LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&+) $1';
jbe@73 628
jbe@73 629 CREATE OR REPLACE FUNCTION ebox_ecluster_may_overlap_commutator(ecluster, ebox)
jbe@73 630 RETURNS boolean
jbe@73 631 LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&+) $1';
jbe@73 632
jbe@73 633 CREATE OR REPLACE FUNCTION ecircle_ecluster_may_overlap_commutator(ecluster, ecircle)
jbe@73 634 RETURNS boolean
jbe@73 635 LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.&&+) $1';
jbe@73 636
jbe@73 637 CREATE OR REPLACE FUNCTION ecluster_contains_commutator(ecluster, ecluster)
jbe@73 638 RETURNS boolean
jbe@73 639 LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.@>) $1';
jbe@73 640
jbe@73 641 CREATE OR REPLACE FUNCTION ebox_contains_castwrap(ebox, ebox)
jbe@73 642 RETURNS boolean
jbe@73 643 LANGUAGE sql IMMUTABLE AS $$
jbe@73 644 SELECT
jbe@73 645 $1::@extschema@.ecluster OPERATOR(@extschema@.@>) $2::@extschema@.ecluster
jbe@73 646 $$;
jbe@73 647
jbe@73 648 CREATE OR REPLACE FUNCTION ebox_contains_swapped_castwrap(ebox, ebox)
jbe@73 649 RETURNS boolean
jbe@73 650 LANGUAGE sql IMMUTABLE AS $$
jbe@73 651 SELECT
jbe@73 652 $2::@extschema@.ecluster OPERATOR(@extschema@.@>) $1::@extschema@.ecluster
jbe@73 653 $$;
jbe@73 654
jbe@73 655 CREATE OR REPLACE FUNCTION ebox_ecluster_contains_castwrap(ebox, ecluster)
jbe@73 656 RETURNS boolean
jbe@73 657 LANGUAGE sql IMMUTABLE
jbe@73 658 AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.@>) $2';
jbe@73 659
jbe@73 660 CREATE OR REPLACE FUNCTION ebox_ecluster_contains_castwrap(ecluster, ebox)
jbe@73 661 RETURNS boolean
jbe@73 662 LANGUAGE sql IMMUTABLE
jbe@73 663 AS 'SELECT $2::@extschema@.ecluster OPERATOR(@extschema@.@>) $1';
jbe@73 664
jbe@73 665 CREATE OR REPLACE FUNCTION ecluster_ebox_contains_castwrap(ecluster, ebox)
jbe@73 666 RETURNS boolean
jbe@73 667 LANGUAGE sql IMMUTABLE
jbe@73 668 AS 'SELECT $1 OPERATOR(@extschema@.@>) $2::@extschema@.ecluster';
jbe@73 669
jbe@73 670 CREATE OR REPLACE FUNCTION ecluster_ebox_contains_castwrap(ebox, ecluster)
jbe@73 671 RETURNS boolean
jbe@73 672 LANGUAGE sql IMMUTABLE
jbe@73 673 AS 'SELECT $2 OPERATOR(@extschema@.@>) $1::@extschema@.ecluster';
jbe@73 674
jbe@73 675 CREATE OR REPLACE FUNCTION epoint_ecircle_distance_commutator(ecircle, epoint)
jbe@73 676 RETURNS float8
jbe@73 677 LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.<->) $1';
jbe@73 678
jbe@73 679 CREATE OR REPLACE FUNCTION epoint_ecluster_distance_commutator(ecluster, epoint)
jbe@73 680 RETURNS float8
jbe@73 681 LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.<->) $1';
jbe@73 682
jbe@73 683 CREATE OR REPLACE FUNCTION ecircle_ecluster_distance_commutator(ecluster, ecircle)
jbe@73 684 RETURNS float8
jbe@73 685 LANGUAGE sql IMMUTABLE AS 'SELECT $2 OPERATOR(@extschema@.<->) $1';
jbe@73 686
jbe@73 687 CREATE OR REPLACE FUNCTION epoint_ebox_distance_castwrap(epoint, ebox)
jbe@73 688 RETURNS float8
jbe@73 689 LANGUAGE sql IMMUTABLE
jbe@73 690 AS 'SELECT $1 OPERATOR(@extschema@.<->) $2::@extschema@.ecluster';
jbe@73 691
jbe@73 692 CREATE OR REPLACE FUNCTION epoint_ebox_distance_castwrap(ebox, epoint)
jbe@73 693 RETURNS float8
jbe@73 694 LANGUAGE sql IMMUTABLE
jbe@73 695 AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.<->) $2';
jbe@73 696
jbe@73 697 CREATE OR REPLACE FUNCTION ebox_distance_castwrap(ebox, ebox)
jbe@73 698 RETURNS float8
jbe@73 699 LANGUAGE sql IMMUTABLE AS $$
jbe@73 700 SELECT
jbe@73 701 $1::@extschema@.ecluster OPERATOR(@extschema@.<->) $2::@extschema@.ecluster
jbe@73 702 $$;
jbe@73 703
jbe@73 704 CREATE OR REPLACE FUNCTION ebox_ecircle_distance_castwrap(ebox, ecircle)
jbe@73 705 RETURNS float8
jbe@73 706 LANGUAGE sql IMMUTABLE
jbe@73 707 AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.<->) $2';
jbe@73 708
jbe@73 709 CREATE OR REPLACE FUNCTION ebox_ecircle_distance_castwrap(ecircle, ebox)
jbe@73 710 RETURNS float8
jbe@73 711 LANGUAGE sql IMMUTABLE
jbe@73 712 AS 'SELECT $1 OPERATOR(@extschema@.<->) $2::@extschema@.ecluster';
jbe@73 713
jbe@73 714 CREATE OR REPLACE FUNCTION ebox_ecluster_distance_castwrap(ebox, ecluster)
jbe@73 715 RETURNS float8
jbe@73 716 LANGUAGE sql IMMUTABLE
jbe@73 717 AS 'SELECT $1::@extschema@.ecluster OPERATOR(@extschema@.<->) $2';
jbe@73 718
jbe@73 719 CREATE OR REPLACE FUNCTION ebox_ecluster_distance_castwrap(ecluster, ebox)
jbe@73 720 RETURNS float8
jbe@73 721 LANGUAGE sql IMMUTABLE
jbe@73 722 AS 'SELECT $1 OPERATOR(@extschema@.<->) $2::@extschema@.ecluster';
jbe@73 723
jbe@42 724
jbe@0 725 ----------------
jbe@0 726 -- GiST index --
jbe@0 727 ----------------
jbe@0 728
jbe@69 729 CREATE OR REPLACE FUNCTION pgl_gist_consistent(internal, internal, smallint, oid, internal)
jbe@0 730 RETURNS boolean
jbe@0 731 LANGUAGE C STRICT
jbe@69 732 AS '$libdir/latlon-v0010', 'pgl_gist_consistent';
jbe@0 733
jbe@69 734 CREATE OR REPLACE FUNCTION pgl_gist_union(internal, internal)
jbe@0 735 RETURNS internal
jbe@0 736 LANGUAGE C STRICT
jbe@69 737 AS '$libdir/latlon-v0010', 'pgl_gist_union';
jbe@0 738
jbe@69 739 CREATE OR REPLACE FUNCTION pgl_gist_compress_epoint(internal)
jbe@0 740 RETURNS internal
jbe@0 741 LANGUAGE C STRICT
jbe@69 742 AS '$libdir/latlon-v0010', 'pgl_gist_compress_epoint';
jbe@0 743
jbe@69 744 CREATE OR REPLACE FUNCTION pgl_gist_compress_ecircle(internal)
jbe@0 745 RETURNS internal
jbe@0 746 LANGUAGE C STRICT
jbe@69 747 AS '$libdir/latlon-v0010', 'pgl_gist_compress_ecircle';
jbe@0 748
jbe@69 749 CREATE OR REPLACE FUNCTION pgl_gist_compress_ecluster(internal)
jbe@0 750 RETURNS internal
jbe@0 751 LANGUAGE C STRICT
jbe@69 752 AS '$libdir/latlon-v0010', 'pgl_gist_compress_ecluster';
jbe@0 753
jbe@69 754 CREATE OR REPLACE FUNCTION pgl_gist_decompress(internal)
jbe@69 755 RETURNS internal
jbe@69 756 LANGUAGE C STRICT
jbe@69 757 AS '$libdir/latlon-v0010', 'pgl_gist_decompress';
jbe@0 758
jbe@69 759 CREATE OR REPLACE FUNCTION pgl_gist_penalty(internal, internal, internal)
jbe@69 760 RETURNS internal
jbe@69 761 LANGUAGE C STRICT
jbe@69 762 AS '$libdir/latlon-v0010', 'pgl_gist_penalty';
jbe@0 763
jbe@69 764 CREATE OR REPLACE FUNCTION pgl_gist_picksplit(internal, internal)
jbe@69 765 RETURNS internal
jbe@69 766 LANGUAGE C STRICT
jbe@69 767 AS '$libdir/latlon-v0010', 'pgl_gist_picksplit';
jbe@0 768
jbe@69 769 CREATE OR REPLACE FUNCTION pgl_gist_same(internal, internal, internal)
jbe@69 770 RETURNS internal
jbe@69 771 LANGUAGE C STRICT
jbe@69 772 AS '$libdir/latlon-v0010', 'pgl_gist_same';
jbe@0 773
jbe@69 774 CREATE OR REPLACE FUNCTION pgl_gist_distance(internal, internal, smallint, oid)
jbe@69 775 RETURNS internal
jbe@69 776 LANGUAGE C STRICT
jbe@69 777 AS '$libdir/latlon-v0010', 'pgl_gist_distance';
jbe@69 778
jbe@73 779
jbe@73 780 ---------------------
jbe@73 781 -- alias functions --
jbe@73 782 ---------------------
jbe@73 783
jbe@73 784 CREATE OR REPLACE FUNCTION distance(epoint, epoint)
jbe@73 785 RETURNS float8
jbe@73 786 LANGUAGE sql IMMUTABLE AS 'SELECT $1 OPERATOR(@extschema@.<->) $2';
jbe@73 787
jbe@73 788 CREATE OR REPLACE FUNCTION distance(ecluster, epoint)
jbe@73 789 RETURNS float8
jbe@73 790 LANGUAGE sql IMMUTABLE AS 'SELECT $1 OPERATOR(@extschema@.<->) $2';
jbe@73 791
jbe@73 792 CREATE OR REPLACE FUNCTION distance_within(epoint, epoint, float8)
jbe@73 793 RETURNS boolean
jbe@73 794 LANGUAGE sql IMMUTABLE
jbe@73 795 AS 'SELECT $1 OPERATOR(@extschema@.&&) @extschema@.ecircle($2, $3)';
jbe@73 796
jbe@73 797 CREATE OR REPLACE FUNCTION distance_within(ecluster, epoint, float8)
jbe@73 798 RETURNS boolean
jbe@73 799 LANGUAGE sql IMMUTABLE
jbe@73 800 AS 'SELECT $1 OPERATOR(@extschema@.&&) @extschema@.ecircle($2, $3)';
jbe@73 801
jbe@73 802 CREATE OR REPLACE FUNCTION fair_distance(ecluster, epoint, int4 = 10000)
jbe@73 803 RETURNS float8
jbe@73 804 LANGUAGE sql IMMUTABLE AS $$
jbe@73 805 SELECT
jbe@73 806 $1 OPERATOR(@extschema@.<=>) @extschema@.epoint_with_sample_count($2, $3)
jbe@73 807 $$;
jbe@73 808
jbe@73 809
jbe@73 810 --------------------------------
jbe@73 811 -- other data storage formats --
jbe@73 812 --------------------------------
jbe@73 813
jbe@73 814 CREATE OR REPLACE FUNCTION coords_to_epoint(float8, float8, text = 'epoint')
jbe@73 815 RETURNS epoint
jbe@73 816 LANGUAGE plpgsql IMMUTABLE STRICT AS $$
jbe@73 817 DECLARE
jbe@73 818 "result" @extschema@.epoint;
jbe@73 819 BEGIN
jbe@73 820 IF $3 OPERATOR(pg_catalog.=) 'epoint_lonlat' THEN
jbe@73 821 -- avoid dynamic command execution for better performance
jbe@73 822 RETURN @extschema@.epoint($2, $1);
jbe@73 823 END IF;
jbe@73 824 IF
jbe@73 825 $3 OPERATOR(pg_catalog.=) 'epoint' OR
jbe@73 826 $3 OPERATOR(pg_catalog.=) 'epoint_latlon'
jbe@73 827 THEN
jbe@73 828 -- avoid dynamic command execution for better performance
jbe@73 829 RETURN @extschema@.epoint($1, $2);
jbe@73 830 END IF;
jbe@73 831 EXECUTE
jbe@73 832 'SELECT ' OPERATOR(pg_catalog.||) $3 OPERATOR(pg_catalog.||) '($1, $2)' INTO STRICT "result" USING $1, $2;
jbe@73 833 RETURN "result";
jbe@73 834 END;
jbe@73 835 $$;
jbe@73 836
jbe@73 837 CREATE OR REPLACE FUNCTION GeoJSON_LinearRing_vertices(jsonb, text = 'epoint_lonlat')
jbe@73 838 RETURNS SETOF jsonb
jbe@73 839 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@73 840 SELECT "result" FROM
jbe@73 841 ( SELECT pg_catalog.jsonb_array_length($1) - 1 )
jbe@73 842 AS "lastindex_row" ("lastindex")
jbe@73 843 CROSS JOIN LATERAL pg_catalog.jsonb_array_elements(
jbe@73 844 CASE WHEN
jbe@73 845 @extschema@.coords_to_epoint(
jbe@73 846 ($1 OPERATOR(pg_catalog.->) 0 OPERATOR(pg_catalog.->>) 0)
jbe@73 847 ::pg_catalog.float8,
jbe@73 848 ($1 OPERATOR(pg_catalog.->) 0 OPERATOR(pg_catalog.->>) 1)
jbe@73 849 ::pg_catalog.float8,
jbe@73 850 $2
jbe@73 851 ) OPERATOR(pg_catalog.=) @extschema@.coords_to_epoint(
jbe@73 852 ($1 OPERATOR(pg_catalog.->) "lastindex" OPERATOR(pg_catalog.->>) 0)
jbe@73 853 ::pg_catalog.float8,
jbe@73 854 ($1 OPERATOR(pg_catalog.->) "lastindex" OPERATOR(pg_catalog.->>) 1)
jbe@73 855 ::pg_catalog.float8,
jbe@73 856 $2
jbe@73 857 )
jbe@73 858 THEN
jbe@73 859 $1 - "lastindex"
jbe@73 860 ELSE
jbe@73 861 $1
jbe@73 862 END
jbe@73 863 ) AS "result_row" ("result")
jbe@73 864 $$;
jbe@73 865
jbe@73 866 CREATE OR REPLACE FUNCTION GeoJSON_to_epoint(jsonb, text = 'epoint_lonlat')
jbe@73 867 RETURNS epoint
jbe@73 868 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@73 869 SELECT CASE
jbe@73 870 WHEN $1 OPERATOR(pg_catalog.->>) 'type' OPERATOR(pg_catalog.=) 'Point' THEN
jbe@73 871 @extschema@.coords_to_epoint(
jbe@73 872 ($1 OPERATOR(pg_catalog.->) 'coordinates' OPERATOR(pg_catalog.->>) 0)
jbe@73 873 ::pg_catalog.float8,
jbe@73 874 ($1 OPERATOR(pg_catalog.->) 'coordinates' OPERATOR(pg_catalog.->>) 1)
jbe@73 875 ::pg_catalog.float8,
jbe@73 876 $2
jbe@73 877 )
jbe@73 878 WHEN $1->>'type' = 'Feature' THEN
jbe@73 879 @extschema@.GeoJSON_to_epoint($1 OPERATOR(pg_catalog.->) 'geometry', $2)
jbe@73 880 ELSE
jbe@73 881 NULL
jbe@73 882 END
jbe@73 883 $$;
jbe@73 884
jbe@73 885 CREATE OR REPLACE FUNCTION GeoJSON_to_ecluster(jsonb, text = 'epoint_lonlat')
jbe@73 886 RETURNS ecluster
jbe@76 887 LANGUAGE plpgsql IMMUTABLE STRICT AS $$
jbe@76 888 DECLARE
jbe@76 889 "tp" TEXT = $1 OPERATOR(pg_catalog.->>) 'type';
jbe@76 890 BEGIN
jbe@76 891 IF "tp" = 'Point' THEN RETURN
jbe@76 892 @extschema@.coords_to_epoint(
jbe@76 893 ($1 OPERATOR(pg_catalog.->) 'coordinates' OPERATOR(pg_catalog.->>) 0)
jbe@76 894 ::pg_catalog.float8,
jbe@76 895 ($1 OPERATOR(pg_catalog.->) 'coordinates' OPERATOR(pg_catalog.->>) 1)
jbe@76 896 ::pg_catalog.float8,
jbe@76 897 $2
jbe@76 898 )::@extschema@.ecluster;
jbe@76 899 END IF;
jbe@76 900 raise notice 'DEBUG2';
jbe@76 901 IF "tp" = 'MultiPoint' THEN RETURN
jbe@76 902 ( SELECT @extschema@.ecluster_create_multipoint(pg_catalog.array_agg(
jbe@76 903 @extschema@.coords_to_epoint(
jbe@76 904 ("coord" OPERATOR(pg_catalog.->>) 0)::pg_catalog.float8,
jbe@76 905 ("coord" OPERATOR(pg_catalog.->>) 1)::pg_catalog.float8,
jbe@76 906 $2
jbe@76 907 )
jbe@76 908 ))
jbe@76 909 FROM pg_catalog.jsonb_array_elements(
jbe@76 910 $1 OPERATOR(pg_catalog.->) 'coordinates'
jbe@76 911 ) AS "coord"
jbe@76 912 );
jbe@76 913 END IF;
jbe@76 914 IF "tp" = 'LineString' THEN RETURN
jbe@76 915 ( SELECT @extschema@.ecluster_create_path(pg_catalog.array_agg(
jbe@76 916 @extschema@.coords_to_epoint(
jbe@76 917 ("coord" OPERATOR(pg_catalog.->>) 0)::pg_catalog.float8,
jbe@76 918 ("coord" OPERATOR(pg_catalog.->>) 1)::pg_catalog.float8,
jbe@76 919 $2
jbe@76 920 )
jbe@76 921 ))
jbe@76 922 FROM pg_catalog.jsonb_array_elements(
jbe@76 923 $1 OPERATOR(pg_catalog.->) 'coordinates'
jbe@76 924 ) AS "coord"
jbe@76 925 );
jbe@76 926 END IF;
jbe@76 927 IF "tp" = 'MultiLineString' THEN RETURN
jbe@76 928 ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
jbe@76 929 ( SELECT @extschema@.ecluster_create_path(pg_catalog.array_agg(
jbe@76 930 @extschema@.coords_to_epoint(
jbe@76 931 ("coord" OPERATOR(pg_catalog.->>) 0)::pg_catalog.float8,
jbe@76 932 ("coord" OPERATOR(pg_catalog.->>) 1)::pg_catalog.float8,
jbe@76 933 $2
jbe@76 934 )
jbe@76 935 ))
jbe@76 936 FROM pg_catalog.jsonb_array_elements("coord_array") AS "coord"
jbe@76 937 )
jbe@76 938 ))
jbe@76 939 FROM pg_catalog.jsonb_array_elements(
jbe@76 940 $1 OPERATOR(pg_catalog.->) 'coordinates'
jbe@76 941 ) AS "coord_array"
jbe@76 942 );
jbe@76 943 END IF;
jbe@76 944 IF "tp" = 'Polygon' THEN RETURN
jbe@76 945 ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
jbe@76 946 ( SELECT @extschema@.ecluster_create_polygon(pg_catalog.array_agg(
jbe@76 947 @extschema@.coords_to_epoint(
jbe@76 948 ("coord" OPERATOR(pg_catalog.->>) 0)::pg_catalog.float8,
jbe@76 949 ("coord" OPERATOR(pg_catalog.->>) 1)::pg_catalog.float8,
jbe@76 950 $2
jbe@76 951 )
jbe@76 952 ))
jbe@76 953 FROM @extschema@.GeoJSON_LinearRing_vertices("coord_array", $2)
jbe@76 954 AS "coord"
jbe@76 955 )
jbe@76 956 ))
jbe@76 957 FROM pg_catalog.jsonb_array_elements(
jbe@76 958 $1 OPERATOR(pg_catalog.->) 'coordinates'
jbe@76 959 ) AS "coord_array"
jbe@76 960 );
jbe@76 961 END IF;
jbe@76 962 IF "tp" = 'MultiPolygon' THEN RETURN
jbe@76 963 ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
jbe@76 964 ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
jbe@76 965 ( SELECT @extschema@.ecluster_create_polygon(
jbe@76 966 pg_catalog.array_agg(
jbe@76 967 @extschema@.coords_to_epoint(
jbe@76 968 ("coord" OPERATOR(pg_catalog.->>) 0)
jbe@76 969 ::pg_catalog.float8,
jbe@76 970 ("coord" OPERATOR(pg_catalog.->>) 1)
jbe@76 971 ::pg_catalog.float8,
jbe@76 972 $2
jbe@76 973 )
jbe@75 974 )
jbe@73 975 )
jbe@76 976 FROM @extschema@.GeoJSON_LinearRing_vertices(
jbe@76 977 "coord_array", $2
jbe@76 978 ) AS "coord"
jbe@75 979 )
jbe@76 980 ))
jbe@76 981 FROM pg_catalog.jsonb_array_elements("coord_array_array")
jbe@76 982 AS "coord_array"
jbe@76 983 )
jbe@76 984 ))
jbe@76 985 FROM jsonb_array_elements(
jbe@76 986 $1 OPERATOR(pg_catalog.->) 'coordinates'
jbe@76 987 ) AS "coord_array_array"
jbe@76 988 );
jbe@76 989 END IF;
jbe@76 990 IF "tp" = 'GeometryCollection' THEN RETURN
jbe@76 991 ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
jbe@76 992 @extschema@.GeoJSON_to_ecluster("geometry", $2)
jbe@76 993 ))
jbe@76 994 FROM pg_catalog.jsonb_array_elements(
jbe@76 995 $1 OPERATOR(pg_catalog.->) 'geometries'
jbe@76 996 ) AS "geometry"
jbe@76 997 );
jbe@76 998 END IF;
jbe@76 999 IF "tp" = 'Feature' THEN RETURN
jbe@76 1000 @extschema@.GeoJSON_to_ecluster(
jbe@76 1001 $1 OPERATOR(pg_catalog.->) 'geometry', $2
jbe@76 1002 );
jbe@76 1003 END IF;
jbe@76 1004 IF "tp" = 'FeatureCollection' THEN RETURN
jbe@76 1005 ( SELECT @extschema@.ecluster_concat(pg_catalog.array_agg(
jbe@76 1006 @extschema@.GeoJSON_to_ecluster("feature", $2)
jbe@76 1007 ))
jbe@76 1008 FROM pg_catalog.jsonb_array_elements(
jbe@76 1009 $1 OPERATOR(pg_catalog.->) 'features'
jbe@76 1010 ) AS "feature"
jbe@76 1011 );
jbe@76 1012 END IF;
jbe@76 1013 RETURN NULL;
jbe@76 1014 END;
jbe@73 1015 $$;
jbe@73 1016

Impressum / About Us