From 50e5226bb3272daac1edb13fce9b8e92be302d64 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 7 Jun 2016 11:25:49 -0400 Subject: [PATCH] Update earthdistance extension for parallel query. All functions provided by this extension are PARALLEL SAFE. Andreas Karlsson --- contrib/earthdistance/Makefile | 3 ++- contrib/earthdistance/earthdistance--1.0--1.1.sql | 14 ++++++++++++++ ...rthdistance--1.0.sql => earthdistance--1.1.sql} | 13 ++++++++++--- contrib/earthdistance/earthdistance.control | 2 +- 4 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 contrib/earthdistance/earthdistance--1.0--1.1.sql rename contrib/earthdistance/{earthdistance--1.0.sql => earthdistance--1.1.sql} (92%) diff --git a/contrib/earthdistance/Makefile b/contrib/earthdistance/Makefile index cde1ae630f..765f5e2ef8 100644 --- a/contrib/earthdistance/Makefile +++ b/contrib/earthdistance/Makefile @@ -3,7 +3,8 @@ MODULES = earthdistance EXTENSION = earthdistance -DATA = earthdistance--1.0.sql earthdistance--unpackaged--1.0.sql +DATA = earthdistance--1.1.sql earthdistance--1.0--1.1.sql \ + earthdistance--unpackaged--1.0.sql PGFILEDESC = "earthdistance - calculate distances on the surface of the Earth" REGRESS = earthdistance diff --git a/contrib/earthdistance/earthdistance--1.0--1.1.sql b/contrib/earthdistance/earthdistance--1.0--1.1.sql new file mode 100644 index 0000000000..802f1515a8 --- /dev/null +++ b/contrib/earthdistance/earthdistance--1.0--1.1.sql @@ -0,0 +1,14 @@ +/* contrib/earthdistance/earthdistance--1.0--1.1.sql */ + +-- complain if script is sourced in psql, rather than via ALTER EXTENSION +\echo Use "ALTER EXTENSION earthdistance UPDATE TO '1.1'" to load this file. \quit + +ALTER FUNCTION earth() PARALLEL SAFE; +ALTER FUNCTION sec_to_gc(float8) PARALLEL SAFE; +ALTER FUNCTION gc_to_sec(float8) PARALLEL SAFE; +ALTER FUNCTION ll_to_earth(float8, float8) PARALLEL SAFE; +ALTER FUNCTION latitude(earth) PARALLEL SAFE; +ALTER FUNCTION longitude(earth) PARALLEL SAFE; +ALTER FUNCTION earth_distance(earth, earth) PARALLEL SAFE; +ALTER FUNCTION earth_box(earth, float8) PARALLEL SAFE; +ALTER FUNCTION geo_distance(point, point) PARALLEL SAFE; diff --git a/contrib/earthdistance/earthdistance--1.0.sql b/contrib/earthdistance/earthdistance--1.1.sql similarity index 92% rename from contrib/earthdistance/earthdistance--1.0.sql rename to contrib/earthdistance/earthdistance--1.1.sql index 4af9062e7d..657d328ebb 100644 --- a/contrib/earthdistance/earthdistance--1.0.sql +++ b/contrib/earthdistance/earthdistance--1.1.sql @@ -1,4 +1,4 @@ -/* contrib/earthdistance/earthdistance--1.0.sql */ +/* contrib/earthdistance/earthdistance--1.1.sql */ -- complain if script is sourced in psql, rather than via CREATE EXTENSION \echo Use "CREATE EXTENSION earthdistance" to load this file. \quit @@ -8,7 +8,7 @@ -- in order to use different units (or a better value for the Earth's radius). CREATE FUNCTION earth() RETURNS float8 -LANGUAGE SQL IMMUTABLE +LANGUAGE SQL IMMUTABLE PARALLEL SAFE AS 'SELECT ''6378168''::float8'; -- Astromers may want to change the earth function so that distances will be @@ -37,49 +37,56 @@ CREATE FUNCTION sec_to_gc(float8) RETURNS float8 LANGUAGE SQL IMMUTABLE STRICT +PARALLEL SAFE 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'; CREATE FUNCTION gc_to_sec(float8) RETURNS float8 LANGUAGE SQL IMMUTABLE STRICT +PARALLEL SAFE AS 'SELECT CASE WHEN $1 < 0 THEN 0::float8 WHEN $1/earth() > pi() THEN 2*earth() ELSE 2*earth()*sin($1/(2*earth())) END'; CREATE FUNCTION ll_to_earth(float8, float8) RETURNS earth LANGUAGE SQL IMMUTABLE STRICT +PARALLEL SAFE AS 'SELECT cube(cube(cube(earth()*cos(radians($1))*cos(radians($2))),earth()*cos(radians($1))*sin(radians($2))),earth()*sin(radians($1)))::earth'; CREATE FUNCTION latitude(earth) RETURNS float8 LANGUAGE SQL IMMUTABLE STRICT +PARALLEL SAFE 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'; CREATE FUNCTION longitude(earth) RETURNS float8 LANGUAGE SQL IMMUTABLE STRICT +PARALLEL SAFE AS 'SELECT degrees(atan2(cube_ll_coord($1, 2), cube_ll_coord($1, 1)))'; CREATE FUNCTION earth_distance(earth, earth) RETURNS float8 LANGUAGE SQL IMMUTABLE STRICT +PARALLEL SAFE AS 'SELECT sec_to_gc(cube_distance($1, $2))'; CREATE FUNCTION earth_box(earth, float8) RETURNS cube LANGUAGE SQL IMMUTABLE STRICT +PARALLEL SAFE AS 'SELECT cube_enlarge($1, gc_to_sec($2), 3)'; --------------- geo_distance CREATE FUNCTION geo_distance (point, point) RETURNS float8 -LANGUAGE C IMMUTABLE STRICT AS 'MODULE_PATHNAME'; +LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE AS 'MODULE_PATHNAME'; --------------- geo_distance as operator <@> diff --git a/contrib/earthdistance/earthdistance.control b/contrib/earthdistance/earthdistance.control index afd2ff4f95..5816d22cdd 100644 --- a/contrib/earthdistance/earthdistance.control +++ b/contrib/earthdistance/earthdistance.control @@ -1,6 +1,6 @@ # earthdistance extension comment = 'calculate great-circle distances on the surface of the Earth' -default_version = '1.0' +default_version = '1.1' module_pathname = '$libdir/earthdistance' relocatable = true requires = 'cube'