From: Bborie Park Date: Thu, 7 Nov 2013 15:02:54 +0000 (+0000) Subject: Added missing operators. Ticket #2532 X-Git-Tag: 2.2.0rc1~1297 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=71fd0f57b6f821f116afd81b7a62450d92d3c890;p=postgis Added missing operators. Ticket #2532 git-svn-id: http://svn.osgeo.org/postgis/trunk@12108 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/NEWS b/NEWS index 409fecfdd..02098173f 100644 --- a/NEWS +++ b/NEWS @@ -30,6 +30,7 @@ PostGIS 2.2.0 - #2493, Fix behavior of ST_DumpValues when passed an empty raster - #2512, Support for foreign tables and materialized views in raster_columns and raster_overviews + - #2532, Add missing raster/geometry commutator operators * Code refactoring * diff --git a/raster/rt_pg/rtpostgis.sql.in b/raster/rt_pg/rtpostgis.sql.in index 5b03b460f..bd3b9d760 100644 --- a/raster/rt_pg/rtpostgis.sql.in +++ b/raster/rt_pg/rtpostgis.sql.in @@ -5548,6 +5548,11 @@ CREATE OR REPLACE FUNCTION raster_geometry_contain(raster, geometry) AS 'select $1::geometry ~ $2' LANGUAGE 'sql' IMMUTABLE STRICT; +CREATE OR REPLACE FUNCTION raster_contained_by_geometry(raster, geometry) + RETURNS bool + AS 'select $1::geometry @ $2' + LANGUAGE 'sql' IMMUTABLE STRICT; + CREATE OR REPLACE FUNCTION raster_geometry_overlap(raster, geometry) RETURNS bool AS 'select $1::geometry && $2' @@ -5559,6 +5564,11 @@ CREATE OR REPLACE FUNCTION geometry_raster_contain(geometry, raster) AS 'select $1 ~ $2::geometry' LANGUAGE 'sql' IMMUTABLE STRICT; +CREATE OR REPLACE FUNCTION geometry_contained_by_raster(geometry, raster) + RETURNS bool + AS 'select $1 @ $2::geometry' + LANGUAGE 'sql' IMMUTABLE STRICT; + CREATE OR REPLACE FUNCTION geometry_raster_overlap(geometry, raster) RETURNS bool AS 'select $1 && $2::geometry' @@ -5646,7 +5656,13 @@ CREATE OPERATOR ~ ( -- COMMUTATOR = '@', -- see http://trac.osgeo.org/postgis/ticket/2532 RESTRICT = contsel, JOIN = contjoinsel ); - + +CREATE OPERATOR @ ( + LEFTARG = raster, RIGHTARG = geometry, PROCEDURE = raster_contained_by_geometry, + COMMUTATOR = '~', + RESTRICT = contsel, JOIN = contjoinsel + ); + CREATE OPERATOR && ( LEFTARG = raster, RIGHTARG = geometry, PROCEDURE = raster_geometry_overlap, COMMUTATOR = '&&', @@ -5659,7 +5675,13 @@ CREATE OPERATOR ~ ( -- COMMUTATOR = '@', -- see http://trac.osgeo.org/postgis/ticket/2532 RESTRICT = contsel, JOIN = contjoinsel ); - + +CREATE OPERATOR @ ( + LEFTARG = geometry, RIGHTARG = raster, PROCEDURE = geometry_contained_by_raster, + COMMUTATOR = '~', + RESTRICT = contsel, JOIN = contjoinsel + ); + CREATE OPERATOR && ( LEFTARG = geometry, RIGHTARG = raster, PROCEDURE = geometry_raster_overlap, COMMUTATOR = '&&', diff --git a/raster/rt_pg/rtpostgis_upgrade_cleanup.sql.in b/raster/rt_pg/rtpostgis_upgrade_cleanup.sql.in index 1d0a531ef..715044359 100644 --- a/raster/rt_pg/rtpostgis_upgrade_cleanup.sql.in +++ b/raster/rt_pg/rtpostgis_upgrade_cleanup.sql.in @@ -144,3 +144,54 @@ END$$; DROP CAST IF EXISTS (raster AS geometry); CREATE CAST (raster AS geometry) WITH FUNCTION st_convexhull(raster) AS ASSIGNMENT; + +-- add missing OPERATORs +DO LANGUAGE 'plpgsql' $$ +BEGIN + IF NOT EXISTS ( + SELECT + proname + FROM pg_proc f + JOIN pg_type r + ON r.typname = 'raster' + AND (f.proargtypes::oid[])[0] = r.oid + JOIN pg_type g + ON g.typname = 'geometry' + AND (f.proargtypes::oid[])[1] = g.oid + WHERE proname = 'raster_contained_by_geometry' + ) THEN + CREATE OR REPLACE FUNCTION raster_contained_by_geometry(raster, geometry) + RETURNS bool + AS 'select $1::geometry @ $2' + LANGUAGE 'sql' IMMUTABLE STRICT; + CREATE OPERATOR @ ( + LEFTARG = raster, RIGHTARG = geometry, PROCEDURE = raster_contained_by_geometry, + COMMUTATOR = '~', + RESTRICT = contsel, JOIN = contjoinsel + ); + END IF; + + IF NOT EXISTS ( + SELECT + proname + FROM pg_proc f + JOIN pg_type r + ON r.typname = 'raster' + AND (f.proargtypes::oid[])[1] = r.oid + JOIN pg_type g + ON g.typname = 'geometry' + AND (f.proargtypes::oid[])[0] = g.oid + WHERE proname = 'geometry_contained_by_raster' + ) THEN + CREATE OR REPLACE FUNCTION geometry_contained_by_raster(geometry, raster) + RETURNS bool + AS 'select $1 @ $2::geometry' + LANGUAGE 'sql' IMMUTABLE STRICT; + CREATE OPERATOR @ ( + LEFTARG = geometry, RIGHTARG = raster, PROCEDURE = geometry_contained_by_raster, + COMMUTATOR = '~', + RESTRICT = contsel, JOIN = contjoinsel + ); + END IF; +END; +$$; diff --git a/raster/test/regress/tickets.sql b/raster/test/regress/tickets.sql index 9ea0f447a..7ce9c2474 100644 --- a/raster/test/regress/tickets.sql +++ b/raster/test/regress/tickets.sql @@ -1,3 +1,7 @@ -- #1485 SELECT '#1485', count(*) FROM geometry_columns WHERE f_table_name = 'raster_columns'; + +-- #2532 +SELECT NULL::raster @ null::geometry; +SELECT NULL::geometry @ null::raster;