|
1 |
| -/* contrib/earthdistance/earthdistance--1.0.sql */ |
| 1 | +/* contrib/earthdistance/earthdistance--1.1.sql */ |
2 | 2 |
|
3 | 3 | -- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
4 | 4 | \echo Use "CREATE EXTENSION earthdistance" to load this file. \quit
|
|
8 | 8 | -- in order to use different units (or a better value for the Earth's radius).
|
9 | 9 |
|
10 | 10 | CREATE FUNCTION earth() RETURNS float8
|
11 |
| -LANGUAGE SQL IMMUTABLE |
| 11 | +LANGUAGE SQL IMMUTABLE PARALLEL SAFE |
12 | 12 | AS 'SELECT ''6378168''::float8';
|
13 | 13 |
|
14 | 14 | -- Astromers may want to change the earth function so that distances will be
|
@@ -37,49 +37,56 @@ CREATE FUNCTION sec_to_gc(float8)
|
37 | 37 | RETURNS float8
|
38 | 38 | LANGUAGE SQL
|
39 | 39 | IMMUTABLE STRICT
|
| 40 | +PARALLEL SAFE |
40 | 41 | AS 'SELECT CASE WHEN $1 < 0 THEN 0::float8 WHEN $1/(2*earth()) > 1 THEN pi()*earth() ELSE 2*earth()*asin($1/(2*earth())) END';
|
41 | 42 |
|
42 | 43 | CREATE FUNCTION gc_to_sec(float8)
|
43 | 44 | RETURNS float8
|
44 | 45 | LANGUAGE SQL
|
45 | 46 | IMMUTABLE STRICT
|
| 47 | +PARALLEL SAFE |
46 | 48 | AS 'SELECT CASE WHEN $1 < 0 THEN 0::float8 WHEN $1/earth() > pi() THEN 2*earth() ELSE 2*earth()*sin($1/(2*earth())) END';
|
47 | 49 |
|
48 | 50 | CREATE FUNCTION ll_to_earth(float8, float8)
|
49 | 51 | RETURNS earth
|
50 | 52 | LANGUAGE SQL
|
51 | 53 | IMMUTABLE STRICT
|
| 54 | +PARALLEL SAFE |
52 | 55 | AS 'SELECT cube(cube(cube(earth()*cos(radians($1))*cos(radians($2))),earth()*cos(radians($1))*sin(radians($2))),earth()*sin(radians($1)))::earth';
|
53 | 56 |
|
54 | 57 | CREATE FUNCTION latitude(earth)
|
55 | 58 | RETURNS float8
|
56 | 59 | LANGUAGE SQL
|
57 | 60 | IMMUTABLE STRICT
|
| 61 | +PARALLEL SAFE |
58 | 62 | AS 'SELECT CASE WHEN cube_ll_coord($1, 3)/earth() < -1 THEN -90::float8 WHEN cube_ll_coord($1, 3)/earth() > 1 THEN 90::float8 ELSE degrees(asin(cube_ll_coord($1, 3)/earth())) END';
|
59 | 63 |
|
60 | 64 | CREATE FUNCTION longitude(earth)
|
61 | 65 | RETURNS float8
|
62 | 66 | LANGUAGE SQL
|
63 | 67 | IMMUTABLE STRICT
|
| 68 | +PARALLEL SAFE |
64 | 69 | AS 'SELECT degrees(atan2(cube_ll_coord($1, 2), cube_ll_coord($1, 1)))';
|
65 | 70 |
|
66 | 71 | CREATE FUNCTION earth_distance(earth, earth)
|
67 | 72 | RETURNS float8
|
68 | 73 | LANGUAGE SQL
|
69 | 74 | IMMUTABLE STRICT
|
| 75 | +PARALLEL SAFE |
70 | 76 | AS 'SELECT sec_to_gc(cube_distance($1, $2))';
|
71 | 77 |
|
72 | 78 | CREATE FUNCTION earth_box(earth, float8)
|
73 | 79 | RETURNS cube
|
74 | 80 | LANGUAGE SQL
|
75 | 81 | IMMUTABLE STRICT
|
| 82 | +PARALLEL SAFE |
76 | 83 | AS 'SELECT cube_enlarge($1, gc_to_sec($2), 3)';
|
77 | 84 |
|
78 | 85 | --------------- geo_distance
|
79 | 86 |
|
80 | 87 | CREATE FUNCTION geo_distance (point, point)
|
81 | 88 | RETURNS float8
|
82 |
| -LANGUAGE C IMMUTABLE STRICT AS 'MODULE_PATHNAME'; |
| 89 | +LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE AS 'MODULE_PATHNAME'; |
83 | 90 |
|
84 | 91 | --------------- geo_distance as operator <@>
|
85 | 92 |
|
|
0 commit comments