]> granicus.if.org Git - postgis/commitdiff
Added missing operators. Ticket #2532
authorBborie Park <bkpark at ucdavis.edu>
Thu, 7 Nov 2013 15:02:54 +0000 (15:02 +0000)
committerBborie Park <bkpark at ucdavis.edu>
Thu, 7 Nov 2013 15:02:54 +0000 (15:02 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@12108 b70326c6-7e19-0410-871a-916f4a2858ee

NEWS
raster/rt_pg/rtpostgis.sql.in
raster/rt_pg/rtpostgis_upgrade_cleanup.sql.in
raster/test/regress/tickets.sql

diff --git a/NEWS b/NEWS
index 409fecfdd8dd8d82cbf61eb515ec409da9439e24..02098173f6f30ee05ab502bb50b5d4d51c6b4a26 100644 (file)
--- 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 *
 
index 5b03b460f1f2303bb3cc27dcd4200cf6c6e35c1e..bd3b9d7606fb464d8f2638aa1677b0f0d992f5a3 100644 (file)
@@ -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 = '&&',
index 1d0a531efced446d972ab433086277605af90c46..7150443593794a425fca9878e385f54c790cf652 100644 (file)
@@ -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;
+$$;
index 9ea0f447ae32b90d3e4fd0d4ab5ec493acc66b98..7ce9c247448b777ec7413694eeb8b55760d8a65f 100644 (file)
@@ -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;