From 805fb4e986602aab3307d7cabb0f3a6d6aa1e88a Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 9 Aug 2013 06:59:55 +0000 Subject: [PATCH] Fix ST_Multi with COMPOUNDCURVE and CURVEPOLYGON types (#2415) git-svn-id: http://svn.osgeo.org/postgis/trunk@11754 b70326c6-7e19-0410-871a-916f4a2858ee --- liblwgeom/lwgeom.c | 9 --------- postgis/lwgeom_functions_basic.c | 18 ++++++++++++++---- regress/tickets.sql | 7 +++++++ regress/tickets_expected | 2 ++ 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/liblwgeom/lwgeom.c b/liblwgeom/lwgeom.c index 0bff0198d..55a5ccd56 100644 --- a/liblwgeom/lwgeom.c +++ b/liblwgeom/lwgeom.c @@ -288,15 +288,6 @@ lwgeom_as_multi(const LWGEOM *lwgeom) GBOX *box = NULL; int type; - /* - ** This funx is a no-op only if a bbox cache is already present - ** in input. - */ - if ( lwgeom_is_collection(lwgeom) ) - { - return lwgeom_clone(lwgeom); - } - type = lwgeom->type; if ( ! MULTITYPE[type] ) return lwgeom_clone(lwgeom); diff --git a/postgis/lwgeom_functions_basic.c b/postgis/lwgeom_functions_basic.c index a9de2a1f6..bb975e991 100644 --- a/postgis/lwgeom_functions_basic.c +++ b/postgis/lwgeom_functions_basic.c @@ -492,10 +492,20 @@ Datum LWGEOM_force_multi(PG_FUNCTION_ARGS) ** in input. If bbox cache is not there we'll need to handle ** automatic bbox addition FOR_COMPLEX_GEOMS. */ - if ( lwtype_is_collection(gserialized_get_type(geom)) && - gserialized_has_bbox(geom) ) - { - PG_RETURN_POINTER(geom); + if ( gserialized_has_bbox(geom) ) { + switch (gserialized_get_type(geom)) + { + case MULTIPOINTTYPE: + case MULTILINETYPE: + case MULTIPOLYGONTYPE: + case COLLECTIONTYPE: + case MULTICURVETYPE: + case MULTISURFACETYPE: + case TINTYPE: + PG_RETURN_POINTER(geom); + default: + break; + } } /* deserialize into lwgeoms[0] */ diff --git a/regress/tickets.sql b/regress/tickets.sql index 45c49a689..9ef843a00 100644 --- a/regress/tickets.sql +++ b/regress/tickets.sql @@ -822,5 +822,12 @@ round(ST_Length(St_Segmentize(ST_GeographyFromText('LINESTRING(-89.3000030518 28 -- #2307 -- SELECT '#2307', ST_AsText(ST_SnapToGrid(ST_MakeValid('0106000020E6100000010000000103000000010000000A0000004B7DA956B99844C0DB0790FE8B4D1DC010BA74A9AF9444C049AFFC5B8C4D1DC03FC6CC690D9844C0DD67E5628C4D1DC07117B56B0D9844C0C80ABA67C45E1DC0839166ABAF9444C0387D4568C45E1DC010BA74A9AF9444C049AFFC5B8C4D1DC040C3CD74169444C0362EC0608C4D1DC07C1A3B77169444C0DC3ADB40B2641DC03AAE5F68B99844C0242948DEB1641DC04B7DA956B99844C0DB0790FE8B4D1DC0'::geometry),0.0001)); +SELECT '#2415.1', ST_AsText(ST_Multi( + 'COMPOUNDCURVE((0 0, 10 0),CIRCULARSTRING(10 0, 15 1, 20 10))' +)); +SELECT '#2415.2', ST_AsText(ST_Multi( + 'CURVEPOLYGON(CIRCULARSTRING(10 0,15 1,20 0,18 5,20 10,10 10,10 0))' +)); + -- Clean up DELETE FROM spatial_ref_sys; diff --git a/regress/tickets_expected b/regress/tickets_expected index 85f763239..80fe3d652 100644 --- a/regress/tickets_expected +++ b/regress/tickets_expected @@ -244,3 +244,5 @@ ERROR: invalid GML representation #2110.3|t #2145|6792004 #2307|MULTIPOLYGON(((-41.1932 -7.3257,-41.1616 -7.3257,-41.1569 -7.3257,-41.1569 -7.3483,-41.1932 -7.3483,-41.1932 -7.3257),(-41.1616 -7.3257,-41.1879 -7.3257,-41.1879 -7.3425,-41.1616 -7.3425,-41.1616 -7.3257))) +#2415.1|MULTICURVE(COMPOUNDCURVE((0 0,10 0),CIRCULARSTRING(10 0,15 1,20 10))) +#2415.2|MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(10 0,15 1,20 0,18 5,20 10,10 10,10 0))) -- 2.40.0