]> granicus.if.org Git - postgis/commitdiff
Change ST_Equals to use the ~= operator (#1453)
authorSandro Santilli <strk@keybit.net>
Fri, 20 Jan 2012 08:12:15 +0000 (08:12 +0000)
committerSandro Santilli <strk@keybit.net>
Fri, 20 Jan 2012 08:12:15 +0000 (08:12 +0000)
Doing so it will consistently return TRUE for EMPTY-EMPTY, while
previously _ST_Equals returned TRUE but ST_Equals returned FALSE.

The commit also changes signature of the C function
from 'geomequals' to 'ST_Equals' and marks an SQL 'Equals'
signature as a candidate for dropping before 2.0.0 final

git-svn-id: http://svn.osgeo.org/postgis/trunk@8886 b70326c6-7e19-0410-871a-916f4a2858ee

postgis/lwgeom_geos.c
postgis/postgis.sql.in.c
regress/empty.sql
regress/empty_expected

index ce214ca342eb4d4c1e3bf8160fa879627072d20d..c966fea324faf548a056c0a0dbdac9c2d4c6d81c 100644 (file)
@@ -65,7 +65,7 @@ Datum geomunion(PG_FUNCTION_ARGS);
 Datum ST_UnaryUnion(PG_FUNCTION_ARGS);
 Datum issimple(PG_FUNCTION_ARGS);
 Datum isring(PG_FUNCTION_ARGS);
-Datum geomequals(PG_FUNCTION_ARGS);
+Datum ST_Equals(PG_FUNCTION_ARGS);
 Datum pointonsurface(PG_FUNCTION_ARGS);
 Datum GEOSnoop(PG_FUNCTION_ARGS);
 Datum postgis_geos_version(PG_FUNCTION_ARGS);
@@ -2959,8 +2959,8 @@ Datum relate_full(PG_FUNCTION_ARGS)
 }
 
 
-PG_FUNCTION_INFO_V1(geomequals);
-Datum geomequals(PG_FUNCTION_ARGS)
+PG_FUNCTION_INFO_V1(ST_Equals);
+Datum ST_Equals(PG_FUNCTION_ARGS)
 {
        GSERIALIZED *geom1;
        GSERIALIZED *geom2;
@@ -2981,6 +2981,8 @@ Datum geomequals(PG_FUNCTION_ARGS)
        /*
         * short-circuit: Loose test, if geom2 bounding box does not overlap
         * geom1 bounding box we can prematurely return FALSE.
+        *
+        * TODO: use gbox_same_2d instead (not available at time of writing)
         */
        if ( gserialized_get_gbox_p(geom1, &box1) &&
             gserialized_get_gbox_p(geom2, &box2) )
index 136b5e828e280568a977aeccf5ec51eca0d4810e..35a9356aa5ba4a42d68d7fb28434eae5f6dd20af 100644 (file)
@@ -3208,22 +3208,23 @@ CREATE OR REPLACE FUNCTION ST_IsCollection(geometry)
        LANGUAGE 'C' IMMUTABLE STRICT;\r
 \r
 -- Deprecation in 1.2.3\r
+-- TODO: drop in 2.0.0 !\r
 CREATE OR REPLACE FUNCTION Equals(geom1 geometry, geom2 geometry)\r
        RETURNS boolean\r
-       AS 'MODULE_PATHNAME','geomequals'\r
+       AS 'MODULE_PATHNAME','ST_Equals'\r
        LANGUAGE 'C' IMMUTABLE STRICT;\r
 \r
 -- Availability: 1.5.0\r
 CREATE OR REPLACE FUNCTION _ST_Equals(geom1 geometry, geom2 geometry)\r
        RETURNS boolean\r
-       AS 'MODULE_PATHNAME','geomequals'\r
+       AS 'MODULE_PATHNAME','ST_Equals'\r
        LANGUAGE 'C' IMMUTABLE STRICT\r
        COST 100;\r
 \r
 -- Availability: 1.2.1\r
 CREATE OR REPLACE FUNCTION ST_Equals(geom1 geometry, geom2 geometry)\r
        RETURNS boolean\r
-       AS 'SELECT $1 && $2 AND _ST_Equals($1,$2)'\r
+       AS 'SELECT $1 ~= $2 AND _ST_Equals($1,$2)'\r
        LANGUAGE 'SQL' IMMUTABLE;\r
 \r
 \r
index 0e8d6543593937427b31da1b68d9637d4746b7b7..f7f47725b8981b942aa8a305b94959612ae0390e 100644 (file)
@@ -98,6 +98,10 @@ WITH inp AS (SELECT
  'POLYGON EMPTY'::geometry as empty,
  'POLYGON((0 0, 10 0, 5 5, 0 0))'::geometry as geometry
  ) SELECT 'ST_Disjoint(geometry, empty) == TRUE', ST_Disjoint(geometry, empty) FROM inp;
+WITH inp AS (SELECT
+ 'POLYGON EMPTY'::geometry as empty1,
+ 'POINT Z EMPTY'::geometry as empty2
+ ) SELECT 'ST_Equals(empty1, empty2) == TRUE', ST_Equals(empty1, empty2) FROM inp;
 WITH inp AS (SELECT
  'POLYGON EMPTY'::geometry as empty
  ) SELECT 'ST_IsSimple(empty) == TRUE', ST_IsSimple(empty) FROM inp;
index ad42a04d89e2e0985820a98ff335444e0f16ba2a..cf8d4f431ea7755f79a42edb03f1c780861ce7f4 100644 (file)
@@ -40,6 +40,7 @@ ST_Intersects(geometry, empty) == FALSE|f
 ST_Intersects(empty, empty) == FALSE|f
 ST_Disjoint(empty, empty) == TRUE|t
 ST_Disjoint(geometry, empty) == TRUE|t
+ST_Equals(empty1, empty2) == TRUE|t
 ST_IsSimple(empty) == TRUE|t
 ST_IsValid(empty) == TRUE|t
 ST_NumGeometries(empty) == 0|0