|
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