]> granicus.if.org Git - postgis/commitdiff
Allow passing GEOMETRYCOLLECTION to GEOS relate functions.
authorDarafei Praliaskouski <me@komzpa.net>
Sun, 7 Apr 2019 06:40:18 +0000 (06:40 +0000)
committerDarafei Praliaskouski <me@komzpa.net>
Sun, 7 Apr 2019 06:40:18 +0000 (06:40 +0000)
Patch by Esteban Zimányi.

Closes #4295
Closes https://github.com/postgis/postgis/pull/386

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

NEWS
doc/reference_measure.xml
doc/reference_processing.xml
doc/reference_relationship.xml
postgis/lwgeom_geos.c
regress/core/tickets.sql
regress/core/tickets_expected

diff --git a/NEWS b/NEWS
index 1c07877c986b7d7dd500a273d9b52343fb3299b9..98b3a1a27551c69a93be8470723f2c69d29b6698 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -85,6 +85,9 @@ PostGIS 3.0.0
            POLYHEDRALSURFACE (Darafei Praliaskouski)
   - #4348, ST_AsMVTGeom (GEOS): Enforce validation at all times (Raúl Marín)
   - #4361, Fix postgis_type_name with (GEOMETRYM,3) (Matt Bretl)
+  - #4295, Allow GEOMETRYCOLLECTION in ST_Overlaps, ST_Contains, ST_ContainsProperly,
+           ST_Covers, ST_CoveredBy, ST_Crosses, ST_Touches, ST_Disjoint, ST_Relate,
+           ST_Equals (Esteban Zimányi)
 
 PostGIS 2.5.0
 2018/09/23
index 7abc9529560744b1de83f980996b6b28ef12d20f..08590462520781a632523b2df98405dc180bdc3b 100644 (file)
@@ -255,7 +255,7 @@ SELECT degrees(ST_Azimuth(ST_Point(25, 45), ST_Point(75, 100))) AS degA_B,
                , round(degrees(2*PI()-rad2 -2*PI()+rad1+2*PI()))::int%360 AS reference
        FROM points ;
 
-1 | line | computed_angle | reference
+1 | line | computed_angle | reference
 ------------------+------------------
 1 | LINESTRING(1.511 1.86,1 1,0.896 0.005) | 155.27033848688 | 155
 
@@ -2116,3 +2116,4 @@ SELECT ST_AsEWKT(ST_3DShortestLine(line,pt)) AS shl3d_line_pt,
 
 
 </sect1>
+
index 193e7658251ddb00c66f69b43ceae167cda5cc25..7adddcb1aaa789552a14724b3d6cd461b8e56f93 100644 (file)
@@ -3893,9 +3893,6 @@ GEOMETRYCOLLECTION(
                        </para>
 
                <para>Performed by the GEOS module</para>
-
-               <note><para>Do not call with a GeometryCollection as an argument</para></note>
-
                <para>&sfs_compliant; s2.1.1.3</para>
                <para>&sqlmm_compliant; SQL-MM 3: 5.1.21</para>
                <para>&Z_support; However it seems to only consider x y when
index 759a441012a42a61f997557bde6f3383cb40167c..d3d320085af986a0ad0448950d80d28506151960 100644 (file)
@@ -247,7 +247,7 @@ ST_DWithin(
                <para>Enhanced: 2.3.0 Enhancement to PIP short-circuit extended to support MultiPoints with few points. Prior versions only supported point in polygon.</para>
 
                <important>
-                 <para>Do not call with a <varname>GEOMETRYCOLLECTION</varname> as an argument</para>
+                 <para>Enhanced: 3.0.0 enabled support for <varname>GEOMETRYCOLLECTION</varname></para> 
                </important>
 
                <important>
@@ -435,7 +435,7 @@ ST_Point      | t          | t              | f           | f
                <para>Availability: 1.4.0</para>
 
                <important>
-                 <para>Do not call with a <varname>GEOMETRYCOLLECTION</varname> as an argument</para>
+                 <para>Enhanced: 3.0.0 enabled support for <varname>GEOMETRYCOLLECTION</varname></para> 
                </important>
 
                <important>
@@ -526,7 +526,7 @@ ST_Point      | t          | t              | f           | f
                        Geometry/Geography A</para>
 
                <important>
-                 <para>Do not call with a <varname>GEOMETRYCOLLECTION</varname> as an argument</para>
+                 <para>Enhanced: 3.0.0 enabled support for <varname>GEOMETRYCOLLECTION</varname></para> 
                </important>
 
                <important>
@@ -627,7 +627,7 @@ SELECT ST_Covers(geog_poly, geog_pt) As poly_covers_pt,
                        Geometry/Geography B</para>
 
                <important>
-                 <para>Do not call with a <varname>GEOMETRYCOLLECTION</varname> as an argument</para>
+                 <para>Enhanced: 3.0.0 enabled support for <varname>GEOMETRYCOLLECTION</varname></para> 
                </important>
 
                <important>
@@ -743,9 +743,9 @@ FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 2)'), 10) As smallc,
                Area/Line situations as well. This makes the relation
                symmetric.</para>
 
-         <important>
-               <para>Do not call with a <varname>GEOMETRYCOLLECTION</varname> as an argument</para>
-         </important>
+               <important>
+                 <para>Enhanced: 3.0.0 enabled support for <varname>GEOMETRYCOLLECTION</varname></para> 
+               </important>
 
        <note>
          <para>This function call will automatically include a bounding box
@@ -1060,9 +1060,9 @@ WHERE ST_CrossingDirection(s1.the_geom, s2.the_geom) > 0;
                                returns true, then the geometries are not spatially disjoint.
                                Disjoint implies false for spatial intersection.</para>
 
-                       <important>
-                               <para>Do not call with a <varname>GEOMETRYCOLLECTION</varname> as an argument</para>
-                       </important>
+               <important>
+                 <para>Enhanced: 3.0.0 enabled support for <varname>GEOMETRYCOLLECTION</varname></para> 
+               </important>
 
                        <para>Performed by the GEOS module</para>
                        <note>
@@ -1316,9 +1316,9 @@ SELECT b.tower_id, b.geom
                  <para>This function will return false if either geometry is invalid except in the case where they are binary equal.</para>
                </important>
 
-        <important>
-            <para>Do not call with a GEOMETRYCOLLECTION as an argument.</para>
-               </important>
+               <important>
+                 <para>Enhanced: 3.0.0 enabled support for <varname>GEOMETRYCOLLECTION</varname></para> 
+               </important>
 
                <para>&sfs_compliant; s2.1.1.2</para>
                <para>&sqlmm_compliant; SQL-MM 3: 5.1.24</para>
@@ -1542,7 +1542,9 @@ SELECT ST_OrderingEquals(ST_Reverse(ST_GeomFromText('LINESTRING(0 0, 10 10)')),
 
                 <para>Performed by the GEOS module</para>
 
-               <note><para>Do not call with a GeometryCollection as an argument</para></note>
+               <important>
+                 <para>Enhanced: 3.0.0 enabled support for <varname>GEOMETRYCOLLECTION</varname></para> 
+               </important>
 
                <para>This function call will automatically include a bounding box
                comparison that will make use of any indexes that are available on
@@ -1740,7 +1742,6 @@ FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 0.5)'), 3)  As a,
                                        by the values in the <ulink url="http://en.wikipedia.org/wiki/DE-9IM">DE-9IM matrix pattern</ulink>.</para>
 
                        <para>This is especially useful for testing compound checks of intersection, crosses, etc in one step.</para>
-                       <para>Do not call with a GeometryCollection as an argument</para>
 
                        <note><para>This is the "allowable" version that returns a
                        boolean, not an integer.  This is defined in OGC spec</para></note>
@@ -1754,7 +1755,9 @@ FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 0.5)'), 3)  As a,
 
                        <para>Version 3: same as version 2, but allows to specify a boundary node rule (1:OGC/MOD2, 2:Endpoint, 3:MultivalentEndpoint, 4:MonovalentEndpoint)</para>
 
-                       <note><para>Do not call with a GeometryCollection as an argument</para></note>
+                       <important>
+                         <para>Enhanced: 3.0.0 enabled support for <varname>GEOMETRYCOLLECTION</varname></para> 
+                       </important>
 
                        <para>not in OGC spec, but implied. see s2.1.13.2</para>
                        <para>&sfs_compliant; s2.1.1.2 // s2.1.13.3</para>
@@ -1921,7 +1924,7 @@ SELECT mat.name, pat.name, ST_RelateMatch(mat.val, pat.val) As satisfied
                </itemizedlist>
 
                <important>
-                 <para>Do not call with a <varname>GEOMETRYCOLLECTION</varname> as an argument</para>
+                 <para>Enhanced: 3.0.0 enabled support for <varname>GEOMETRYCOLLECTION</varname></para> 
                </important>
 
                <note>
@@ -2055,7 +2058,7 @@ SELECT ST_Touches('LINESTRING(0 0, 1 1, 0 2)'::geometry, 'POINT(0 2)'::geometry)
                <para>Enhanced: 2.3.0 Enhancement to PIP short-circuit for geometry extended to support MultiPoints with few points. Prior versions only supported point in polygon.</para>
 
                <important>
-                 <para>Do not call with a <varname>GEOMETRYCOLLECTION</varname> as an argument</para>
+                 <para>Enhanced: 3.0.0 enabled support for <varname>GEOMETRYCOLLECTION</varname></para> 
                </important>
 
                <important>
index 8d13abda0d49abeb2911c5cdd64b5ee48113fba8..e09bf7e70e354117ff891b31b2c56898b1961b1c 100644 (file)
@@ -1337,50 +1337,6 @@ Datum ST_ClipByBox2d(PG_FUNCTION_ARGS)
 
 /*---------------------------------------------*/
 
-/**
- * @brief Throws an ereport ERROR if either geometry is a COLLECTIONTYPE.  Additionally
- *             displays a HINT of the first 80 characters of the WKT representation of the
- *             problematic geometry so a user knows which parameter and which geometry
- *             is causing the problem.
- */
-void errorIfGeometryCollection(GSERIALIZED *g1, GSERIALIZED *g2)
-{
-       int t1 = gserialized_get_type(g1);
-       int t2 = gserialized_get_type(g2);
-
-       char *hintmsg;
-       char *hintwkt;
-       size_t hintsz;
-       LWGEOM *lwgeom;
-
-       if ( t1 == COLLECTIONTYPE)
-       {
-               lwgeom = lwgeom_from_gserialized(g1);
-               hintwkt = lwgeom_to_wkt(lwgeom, WKT_SFSQL, DBL_DIG, &hintsz);
-               lwgeom_free(lwgeom);
-               hintmsg = lwmessage_truncate(hintwkt, 0, hintsz-1, 80, 1);
-               ereport(ERROR,
-                       (errmsg("Relate Operation called with a LWGEOMCOLLECTION type.  This is unsupported."),
-                        errhint("Change argument 1: '%s'", hintmsg))
-                      );
-               pfree(hintwkt);
-               pfree(hintmsg);
-       }
-       else if (t2 == COLLECTIONTYPE)
-       {
-               lwgeom = lwgeom_from_gserialized(g2);
-               hintwkt = lwgeom_to_wkt(lwgeom, WKT_SFSQL, DBL_DIG, &hintsz);
-               hintmsg = lwmessage_truncate(hintwkt, 0, hintsz-1, 80, 1);
-               lwgeom_free(lwgeom);
-               ereport(ERROR,
-                       (errmsg("Relate Operation called with a LWGEOMCOLLECTION type.  This is unsupported."),
-                        errhint("Change argument 2: '%s'", hintmsg))
-                      );
-               pfree(hintwkt);
-               pfree(hintmsg);
-       }
-}
-
 PG_FUNCTION_INFO_V1(isvalid);
 Datum isvalid(PG_FUNCTION_ARGS)
 {
@@ -1562,7 +1518,6 @@ Datum overlaps(PG_FUNCTION_ARGS)
        geom1 = PG_GETARG_GSERIALIZED_P(0);
        geom2 = PG_GETARG_GSERIALIZED_P(1);
 
-       errorIfGeometryCollection(geom1,geom2);
        error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
 
        /* A.Overlaps(Empty) == FALSE */
@@ -1619,7 +1574,6 @@ Datum contains(PG_FUNCTION_ARGS)
        GBOX box1, box2;
        PrepGeomCache *prep_cache;
 
-       errorIfGeometryCollection(geom1, geom2);
        error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
 
        /* A.Contains(Empty) == FALSE */
@@ -1760,7 +1714,6 @@ Datum containsproperly(PG_FUNCTION_ARGS)
        geom1 = PG_GETARG_GSERIALIZED_P(0);
        geom2 = PG_GETARG_GSERIALIZED_P(1);
 
-       errorIfGeometryCollection(geom1,geom2);
        error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
 
        /* A.ContainsProperly(Empty) == FALSE */
@@ -1835,7 +1788,6 @@ Datum covers(PG_FUNCTION_ARGS)
        if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
                PG_RETURN_BOOL(false);
 
-       errorIfGeometryCollection(geom1,geom2);
        error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
 
        /*
@@ -1967,7 +1919,6 @@ Datum coveredby(PG_FUNCTION_ARGS)
        geom1 = PG_GETARG_GSERIALIZED_P(0);
        geom2 = PG_GETARG_GSERIALIZED_P(1);
 
-       errorIfGeometryCollection(geom1,geom2);
        error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
 
        /* A.CoveredBy(Empty) == FALSE */
@@ -2082,7 +2033,6 @@ Datum crosses(PG_FUNCTION_ARGS)
        geom1 = PG_GETARG_GSERIALIZED_P(0);
        geom2 = PG_GETARG_GSERIALIZED_P(1);
 
-       errorIfGeometryCollection(geom1,geom2);
        error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
 
        /* A.Crosses(Empty) == FALSE */
@@ -2266,7 +2216,6 @@ Datum touches(PG_FUNCTION_ARGS)
        geom1 = PG_GETARG_GSERIALIZED_P(0);
        geom2 = PG_GETARG_GSERIALIZED_P(1);
 
-       errorIfGeometryCollection(geom1,geom2);
        error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
 
        /* A.Touches(Empty) == FALSE */
@@ -2325,7 +2274,6 @@ Datum disjoint(PG_FUNCTION_ARGS)
        geom1 = PG_GETARG_GSERIALIZED_P(0);
        geom2 = PG_GETARG_GSERIALIZED_P(1);
 
-       errorIfGeometryCollection(geom1,geom2);
        error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
 
        /* A.Disjoint(Empty) == TRUE */
@@ -2387,7 +2335,6 @@ Datum relate_pattern(PG_FUNCTION_ARGS)
 
        /* TODO handle empty */
 
-       errorIfGeometryCollection(geom1,geom2);
        error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
 
        initGEOS(lwpgnotice, lwgeom_geos_error);
@@ -2451,7 +2398,6 @@ Datum relate_full(PG_FUNCTION_ARGS)
                bnr = PG_GETARG_INT32(2);
        }
 
-       errorIfGeometryCollection(geom1,geom2);
        error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
 
        initGEOS(lwpgnotice, lwgeom_geos_error);
@@ -2500,7 +2446,6 @@ Datum ST_Equals(PG_FUNCTION_ARGS)
        geom1 = PG_GETARG_GSERIALIZED_P(0);
        geom2 = PG_GETARG_GSERIALIZED_P(1);
 
-       errorIfGeometryCollection(geom1,geom2);
        error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
 
        /* Empty == Empty */
index c9747a2c21a8f0e557b8c61954fabfec1d0b04f6..af78bc0731537a04314037cccfe0ad966f2757d7 100644 (file)
@@ -1114,6 +1114,118 @@ INSERT INTO bug_4144_table (geom)
 ANALYZE bug_4144_table;
 DROP TABLE IF EXISTS bug_4144_table;
 
+--4295
+-- CIP - collection within polygon
+SELECT 'contains210', ST_contains('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(5 5),LINESTRING(1 1,2 2))'::geometry);
+-- CIP - collection on edge of polygon
+SELECT 'contains211', ST_contains('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(10 10), LINESTRING(0 0, 0 10))'::geometry);
+-- CIP - collection outside polygon
+SELECT 'contains212', ST_contains('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0),LINESTRING(11 5,12 5))'::geometry);
+-- CIP - elements of the collection fully outside and fully inside polygon
+SELECT 'contains213', ST_contains('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0), LINESTRING(4 4,5 5))'::geometry);
+
+-- CIP - collection within polygon
+SELECT 'within210', ST_within('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(5 5),LINESTRING(1 1,2 2))'::geometry);
+-- CIP - collection on edge of polygon
+SELECT 'within211', ST_within('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(10 10), LINESTRING(0 0, 0 10))'::geometry);
+-- CIP - collection outside polygon
+SELECT 'within212', ST_within('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0),LINESTRING(11 5,12 5))'::geometry);
+-- CIP - elements of the collection fully outside and fully inside polygon
+SELECT 'within213', ST_within('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0), LINESTRING(4 4,5 5))'::geometry);
+
+-- CIP - collection within polygon
+SELECT 'containsproperly210', ST_containsproperly('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(5 5),LINESTRING(1 1,2 2))'::geometry);
+-- CIP - collection on edge of polygon
+SELECT 'containsproperly211', ST_containsproperly('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(10 10), LINESTRING(0 0, 0 10))'::geometry);
+-- CIP - collection outside polygon
+SELECT 'containsproperly212', ST_containsproperly('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0),LINESTRING(11 5,12 5))'::geometry);
+-- CIP - elements of the collection fully outside and fully inside polygon
+SELECT 'containsproperly213', ST_containsproperly('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0), LINESTRING(4 4,5 5))'::geometry);
+
+-- CIP - collection within polygon
+SELECT 'overlaps210', ST_overlaps('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(5 5),LINESTRING(1 1,2 2))'::geometry);
+-- CIP - collection on edge of polygon
+SELECT 'overlaps211', ST_overlaps('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(10 10), LINESTRING(0 0, 0 10))'::geometry);
+-- CIP - collection outside polygon
+SELECT 'overlaps212', ST_overlaps('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0),LINESTRING(11 5,12 5))'::geometry);
+-- CIP - elements of the collection fully outside and fully inside polygon
+SELECT 'overlaps213', ST_overlaps('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0), LINESTRING(4 4,5 5))'::geometry);
+
+-- CIP - collection within polygon
+SELECT 'covers210', ST_covers('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(5 5),LINESTRING(1 1,2 2))'::geometry);
+-- CIP - collection on edge of polygon
+SELECT 'covers211', ST_covers('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(10 10), LINESTRING(0 0, 0 10))'::geometry);
+-- CIP - collection outside polygon
+SELECT 'covers212', ST_covers('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0),LINESTRING(11 5,12 5))'::geometry);
+-- CIP - elements of the collection fully outside and fully inside polygon
+SELECT 'covers213', ST_covers('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0), LINESTRING(4 4,5 5))'::geometry);
+
+-- CIP - collection within polygon
+SELECT 'coveredby210', ST_coveredby('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(5 5),LINESTRING(1 1,2 2))'::geometry);
+-- CIP - collection on edge of polygon
+SELECT 'coveredby211', ST_coveredby('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(10 10), LINESTRING(0 0, 0 10))'::geometry);
+-- CIP - collection outside polygon
+SELECT 'coveredby212', ST_coveredby('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0),LINESTRING(11 5,12 5))'::geometry);
+-- CIP - elements of the collection fully outside and fully inside polygon
+SELECT 'coveredby213', ST_coveredby('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0), LINESTRING(4 4,5 5))'::geometry);
+
+-- CIP - collection within polygon
+SELECT 'crosses210', ST_crosses('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(5 5),LINESTRING(1 1,2 2))'::geometry);
+-- CIP - collection on edge of polygon
+SELECT 'crosses211', ST_crosses('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(10 10), LINESTRING(0 0, 0 10))'::geometry);
+-- CIP - collection outside polygon
+SELECT 'crosses212', ST_crosses('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0),LINESTRING(11 5,12 5))'::geometry);
+-- CIP - elements of the collection fully outside and fully inside polygon
+SELECT 'crosses213', ST_crosses('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0), LINESTRING(4 4,5 5))'::geometry);
+
+-- CIP - collection within polygon
+SELECT 'touches210', ST_touches('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(5 5),LINESTRING(1 1,2 2))'::geometry);
+-- CIP - collection on edge of polygon
+SELECT 'touches211', ST_touches('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(10 10), LINESTRING(0 0, 0 10))'::geometry);
+-- CIP - collection outside polygon
+SELECT 'touches212', ST_touches('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0),LINESTRING(11 5,12 5))'::geometry);
+-- CIP - elements of the collection fully outside and fully inside polygon
+SELECT 'touches213', ST_touches('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0), LINESTRING(4 4,5 5))'::geometry);
+
+-- CIP - collection within polygon
+SELECT 'disjoint210', ST_disjoint('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(5 5),LINESTRING(1 1,2 2))'::geometry);
+-- CIP - collection on edge of polygon
+SELECT 'disjoint211', ST_disjoint('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(10 10), LINESTRING(0 0, 0 10))'::geometry);
+-- CIP - collection outside polygon
+SELECT 'disjoint212', ST_disjoint('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0),LINESTRING(11 5,12 5))'::geometry);
+-- CIP - elements of the collection fully outside and fully inside polygon
+SELECT 'disjoint213', ST_disjoint('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0), LINESTRING(4 4,5 5))'::geometry);
+
+-- CIP - collection within polygon
+SELECT 'relate210', ST_relate('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(5 5),LINESTRING(1 1,2 2))'::geometry);
+-- CIP - collection on edge of polygon
+SELECT 'relate211', ST_relate('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(10 10), LINESTRING(0 0, 0 10))'::geometry);
+-- CIP - collection outside polygon
+SELECT 'relate212', ST_relate('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0),LINESTRING(11 5,12 5))'::geometry);
+-- CIP - elements of the collection fully outside and fully inside polygon
+SELECT 'relate213', ST_relate('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0), LINESTRING(4 4,5 5))'::geometry);
+
+-- CIP - collection within polygon
+SELECT 'relate_pattern210', ST_relate('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(5 5),LINESTRING(1 1,2 2))'::geometry, 'FF*FF****');
+-- CIP - collection on edge of polygon
+SELECT 'relate_pattern211', ST_relate('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(10 10), LINESTRING(0 0, 0 10))'::geometry, 'FF*FF****');
+-- CIP - collection outside polygon
+SELECT 'relate_pattern212', ST_relate('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0),LINESTRING(11 5,12 5))'::geometry, 'FF*FF****');
+-- CIP - elements of the collection fully outside and fully inside polygon
+SELECT 'relate_pattern213', ST_relate('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 'GEOMETRYCOLLECTION (POINT(-1 0), LINESTRING(4 4,5 5))'::geometry, 'FF*FF****');
+
+-- equals - element inside polygon
+SELECT 'equals210', ST_equals('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 
+'GEOMETRYCOLLECTION (POLYGON((0 0, 10 0, 10 10, 0 10, 0 0)),LINESTRING(0 2, 0 5))'::geometry);
+-- equals - element on border of polygon
+SELECT 'equals211', ST_equals('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 
+'GEOMETRYCOLLECTION (POLYGON((0 0, 10 0, 10 10, 0 10, 0 0)),MULTIPOINT(0 2, 0 5))'::geometry);
+-- equals - element on border and inside polygon
+SELECT 'equals212', ST_equals('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 
+'GEOMETRYCOLLECTION (POLYGON((0 0, 10 0, 10 10, 0 10, 0 0)),LINESTRING(0 2, 0 5, 5 5))'::geometry);
+SELECT 'equals213', ST_equals('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'::geometry, 
+'GEOMETRYCOLLECTION (POLYGON((0 0, 10 0, 10 10, 0 10, 0 0)),MULTIPOINT(0 2, 5 5))'::geometry);
+
 -- #4299
 SELECT '#4299', ST_Disjoint(ST_GeneratePoints(g, 1000), ST_GeneratePoints(g, 1000))
 FROM (SELECT 'POLYGON((0 0,1 0,1 1,0 1,0 0))'::geometry AS g) AS f;
index 1f09a38be86a4b3fe702df1228ff93c091280a0a..5a7b23516c75aa6e01565d99d0a8c531f6e6a625 100644 (file)
@@ -336,6 +336,54 @@ ERROR:  lwgeom_union: GEOS Error: TopologyException: Input geom 0 is invalid: Se
 #4089|LINESTRING Z (1 1 1,3 3 1)
 #4081|f|t
 NOTICE:  table "bug_4144_table" does not exist, skipping
+contains210|t
+contains211|f
+contains212|f
+contains213|f
+within210|f
+within211|f
+within212|f
+within213|f
+containsproperly210|t
+containsproperly211|f
+containsproperly212|f
+containsproperly213|f
+overlaps210|f
+overlaps211|f
+overlaps212|f
+overlaps213|f
+covers210|t
+covers211|t
+covers212|f
+covers213|f
+coveredby210|f
+coveredby211|f
+coveredby212|f
+coveredby213|f
+crosses210|f
+crosses211|f
+crosses212|f
+crosses213|t
+touches210|f
+touches211|t
+touches212|f
+touches213|f
+disjoint210|f
+disjoint211|f
+disjoint212|t
+disjoint213|f
+relate210|102FF1FF2
+relate211|FF2101FF2
+relate212|FF2FF1102
+relate213|102FF10F2
+relate_pattern210|f
+relate_pattern211|f
+relate_pattern212|t
+relate_pattern213|f
+equals210|t
+equals211|t
+equals212|t
+equals213|t
 #4299|t
 #4304|t|t|t|t
 ERROR:  BOX3D_construct: args can not be empty points