From 8a31acd642b7802f51066f476225725e68a91d52 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 20 Jan 2012 08:12:15 +0000 Subject: [PATCH] Change ST_Equals to use the ~= operator (#1453) 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 | 8 +++++--- postgis/postgis.sql.in.c | 7 ++++--- regress/empty.sql | 4 ++++ regress/empty_expected | 1 + 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/postgis/lwgeom_geos.c b/postgis/lwgeom_geos.c index ce214ca34..c966fea32 100644 --- a/postgis/lwgeom_geos.c +++ b/postgis/lwgeom_geos.c @@ -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) ) diff --git a/postgis/postgis.sql.in.c b/postgis/postgis.sql.in.c index 136b5e828..35a9356aa 100644 --- a/postgis/postgis.sql.in.c +++ b/postgis/postgis.sql.in.c @@ -3208,22 +3208,23 @@ CREATE OR REPLACE FUNCTION ST_IsCollection(geometry) LANGUAGE 'C' IMMUTABLE STRICT; -- Deprecation in 1.2.3 +-- TODO: drop in 2.0.0 ! CREATE OR REPLACE FUNCTION Equals(geom1 geometry, geom2 geometry) RETURNS boolean - AS 'MODULE_PATHNAME','geomequals' + AS 'MODULE_PATHNAME','ST_Equals' LANGUAGE 'C' IMMUTABLE STRICT; -- Availability: 1.5.0 CREATE OR REPLACE FUNCTION _ST_Equals(geom1 geometry, geom2 geometry) RETURNS boolean - AS 'MODULE_PATHNAME','geomequals' + AS 'MODULE_PATHNAME','ST_Equals' LANGUAGE 'C' IMMUTABLE STRICT COST 100; -- Availability: 1.2.1 CREATE OR REPLACE FUNCTION ST_Equals(geom1 geometry, geom2 geometry) RETURNS boolean - AS 'SELECT $1 && $2 AND _ST_Equals($1,$2)' + AS 'SELECT $1 ~= $2 AND _ST_Equals($1,$2)' LANGUAGE 'SQL' IMMUTABLE; diff --git a/regress/empty.sql b/regress/empty.sql index 0e8d65435..f7f47725b 100644 --- a/regress/empty.sql +++ b/regress/empty.sql @@ -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; diff --git a/regress/empty_expected b/regress/empty_expected index ad42a04d8..cf8d4f431 100644 --- a/regress/empty_expected +++ b/regress/empty_expected @@ -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 -- 2.40.0